Complete stack
Everything your agent needs to work with email.
Every part of a mail client, rebuilt as clean data and scoped keys for software without a browser.
Inside the inbox
Five parts that understand the context.
An agent inbox is not a raw mail pipe. It joins messages, threads, attachments, events and permissions into one working whole.
Active agent inbox
support@doorman.fyi
5 primitives connected
Messages
Every email arrives with clean text, sender names, a category, and a safety verdict. Outbound sends and replies carry a key so retries never duplicate mail.
Your agent never parses raw mail headers or answers a bounce by mistake.
{
"id": "msg_01j9x8k2m4",
"direction": "inbound",
"from": "dana@example.net",
"subject": "Invoice 2847",
"category": "personal",
"verdict": "clean",
"auto_replyable": true
}Programmatic inboxes
An address in a single call.
Create a named mailbox like support@doorman.fyi or generate a fresh address for each job.
- Pick a name between 3 and 30 characters, or let Doorman generate one.
- Works the instant the call returns, with no domain records to configure.
- Delete an inbox at any time to release the address and revoke its keys.
Why it helps: Mailbox setup lives inside your agent code instead of an operations checklist.
POST /v1/inboxes
{ "mailboxName": "support", "displayName": "Support Agent" }
-> 201 Created
{ "id": "inb_01j9x7a0q2", "address": "support@doorman.fyi" }Automatic threading
Every exchange kept in order.
Replies and forwards group into conversations automatically, so your agent always reads the full story.
- Matches standard reply headers first, then subject and known participants within 14 days.
- Filter threads by unread status to process only conversations waiting on your agent.
- Replying to a thread sets the subject and reply headers and marks the thread read.
Why it helps: Your agent never loses track of who said what, even across restarts.
GET /v1/inboxes/inb_01j9x7a0q2/threads?isRead=false
GET /v1/threads/thr_01j9x8k1p0/messages
PATCH /v1/threads/thr_01j9x8k1p0 { "isRead": true }Messages and safety verdicts
Know what landed before you act.
Inbound messages are classified and checked at the door; outbound sends are protected against duplicate retries.
- Every inbound message carries a category: personal, automated, marketing, bounce, spam or malicious.
- Sender verification checks produce a clean, unverified or suspicious verdict.
- An auto-replyable flag tells your agent when to stay quiet on bounces and bulk mail.
Why it helps: Prevents infinite auto-responder loops and shields agents from spoofed mail.
POST /v1/inboxes/inb_01j9x7a0q2/send
Idempotency-Key: send-2026-11-06-quote-48
{ "threadId": "thr_01j9x8k1p0", "text": "Approved, thank you." }Attachments and extraction
Documents arrive already read.
Your agent gets both the original file bytes and the extracted text the moment a message lands.
- Extracts text from PDFs, images, Office documents, spreadsheets, web pages and plain text files.
- Includes extracted text right inside the webhook event and on the attachment address.
- Send up to 32 attachments or inline images up to 25 MB per message.
Why it helps: Removes separate document parsing steps from your agent code.
GET /v1/attachments/msg_01j9x8k2m4/invoice-2847.pdf
GET /v1/attachments/msg_01j9x8k2m4/invoice-2847.pdf/text
-> { "filename": "invoice-2847.pdf", "extractionMethod": "pdf", "text": "..." }Webhooks and live stream
Push delivery with built-in replay.
React in milliseconds over a persistent socket or receive signed webhook calls with automatic retries.
- Webhooks carry cryptographic signatures and retry five times across backoff intervals.
- The live stream sleeps at the edge when idle and wakes the instant mail commits.
- Reconnect with your last event id to replay up to 100 missed events in order.
Why it helps: Your agent works in real time without losing events during restarts.
GET wss://api.doorman.fyi/v1/ws
-> { "type": "subscribe", "inbox_ids": ["inb_01j9x7a0q2"], "last_event_id": "evt_01j9x0" }
<- { "type": "subscribed", "inbox_ids": ["inb_01j9x7a0q2"], "event_types": [] }Permissions and scoped keys
Fences between every worker.
Give your coordinator an account key and hand each worker a key locked to its own inbox.
- Account keys manage inboxes, webhooks and threads across the whole account.
- Inbox keys can only read threads, messages and attachments or send from that one inbox.
- Up to 20 active keys per inbox so you can rotate credentials without downtime.
Why it helps: Enforces least privilege across multi-agent fleets and customer tenants.
POST /v1/inboxes/inb_01j9x7a0q2/api-keys
{ "name": "support-worker-prod" }
-> { "token": "dm_...", "key": { "id": "key_01j9x8k9b2", "inboxId": "inb_01j9x7a0q2" } }Scale in two dimensions
Grow across inboxes, or deeper inside each one.
Human mail breaks when one account sends too much or mixes ten jobs together. Doorman scales horizontally and vertically at once.
Up to 100 active inboxes per account out of the box
Dimension 1: Horizontal fleet scale
One inbox per agent, role, or customer.
Spin up dedicated addresses on demand. Give support, billing, intake, and each customer tenant its own door, key, and history.
- support@doorman.fyiScoped key
Support agent
Answers product questions
- billing@doorman.fyiScoped key
Finance agent
Reads PDF invoices
- intake@doorman.fyiScoped key
Onboarding agent
Collects documents
- ops-482@doorman.fyiScoped key
Tenant worker
Receives 2FA codes
For builders
Three calls and you are reading mail.
Sign up, create a key in the console, and use it. The API answers on api.doorman.fyi.
- Base URL
- https://api.doorman.fyi
- Limits
- Ten messages a minute and two hundred a day per inbox. Messages up to 25 MB with up to 32 attachments.
- Events
- Events arrive by signed webhook (Standard Webhooks headers, five attempts) or over a WebSocket that replays from the last event id.
API=https://api.doorman.fyi # 1. Create an inbox curl -X POST $API/v1/inboxes \ -H "Authorization: Bearer dm_..." \ -H "Content-Type: application/json" \ -d '{"mailboxName": "support"}' # 2. Read what arrived curl $API/v1/inboxes/inb_.../threads \ -H "Authorization: Bearer dm_..." # 3. Reply in the same thread curl -X POST $API/v1/inboxes/inb_.../send \ -H "Authorization: Bearer dm_..." \ -H "Content-Type: application/json" \ -d '{"threadId": "thr_...", "text": "Thanks, on it."}'
Get started
Open the door.
Create an account with an address you own. The console gives you your first key, and your agent is reading mail.
Already have an account? Open the console