- POST/v1/identities201
- POST/v1/messages202
- GET/v1/messages/await200
- POST/v1/messages/{id}/reply202
- GET/v1/threads/{id}200
- POST/v1/webhooks201
- GET/v1/events/socket101
- POST/v1/api-keys201
Features
Everything an agent needs to work by email.
Send, receive, search, organise and act on mail, through an API built for agents rather than for people.
The complete inbox
What a person’s inbox does, an agent’s does too.
To ops@helio.frSendingDelivered
Order: 400 units
sales@helio.frreplied
01Send and receive
A real address that sends, receives and answers.
Re: Quote for 400 units3
Confirmed at €3.20 each. Please ship.
scout@acme.devThu 14:42
02Threads
Every reply and forward kept in one conversation.
- total
- €1,280.00
- due
- 14 days
03Attachments
Files in and out, read without opening a browser.
Draft · waiting for review
Confirmed at €3.20 each. Please ship.
EditApprove
04Drafts
Write it now; a person approves it before it goes.
Tue 09:00
Follow-up to ops@helio.fr
Leaves in 2 days
05Scheduled send
Follow-ups that leave on their own, at the hour you set.
scout@acme.dev
SPFDKIMDMARC
06Your domain
Addresses on a domain you own, signed with your DKIM.
The platform
Three things you build with.
Reach it from anything, act the moment mail arrives, and keep every customer apart.
- 01 · Plug in
Works with the tools you already have.
The same call from TypeScript, Python, the CLI or an agent through MCP, and ordinary mail apps over IMAP and SMTP.
TypeScriptPythonCLIMCP await messagesSend({ body: { from: 'scout@acme.dev', to: 'ops@helio.fr', text: 'Confirmed at €3.20 each.', } });
messages_send.sync(client=client, body={ "from": "scout@acme.dev", "to": "ops@helio.fr", "text": "Confirmed at €3.20 each.", })
$ pidgeon messages send \ --from scout@acme.dev \ --to ops@helio.fr \ --text "Confirmed at €3.20 each."
send_message from scout@acme.dev to ops@helio.fr text Confirmed at €3.20 each.
- 02 · React
An email arrives. Your app gets to work.
Every change is an event, delivered the moment it happens to a webhook or a WebSocket.
GET/v1/eventsLive - message.receivedsales@helio.fr → scout@acme.devwebhook
- thread.assignedRe: Quote → Lena Parkwebsocket
- message.sentscout@acme.dev → ops@helio.frwebhook
- message.deliveredops@helio.fr accepted itwebhook
- message.handed_offthe agent steps backwebsocket
- 03 · Run
Same platform. Separate customers.
Give each customer a pod: their own addresses, their own domain, and keys that cannot reach anyone else’s.
Pod ACustomer A - scout@acme.example
- billing@acme.example
- support@acme.example
Pod BCustomer B - agent@nova.example
- sales@nova.example
- help@nova.example
Scale
Grow in two directions.
More inboxes, more mail per inbox, or both.
More customers, more agents.
A pod for every customer, an address for every agent, a key for every job. Each is one call.
- lena@parkstudio.deInvoice 2209answered
- tom@orbit.ioRefund for order 5512working
- ana@kite.esChange of addressanswered
- ops@helio.frRe: Quote for 400 unitsworking
- jo@nova.devCan’t sign inwith Lena
- max@acme.exampleDelivery date?answered
One inbox becomes a worker.
One address can hold hundreds of conversations at once, each in its own thread, and hand any of them to a person.
Give your agent an address.
Paste one prompt, or make the call yourself. It is free to start.
Read https://pidgeon.ai/skill.md and follow the instructions to get your own inbox.
The full API reference is at https://pidgeon.ai/openapi.json