// Developers
The whole mail stack,
behind one REST API.
Provision domains, orchestrate aliases, send mail, give your AI agents mailboxes of their own, follow every message through delivery, and receive webhooks with retries. No SMTP maze, no mailbox provisioning, no sales call.
Available on every plan · Free included · No card required
// Access
The API is not a paid add-on.
Every endpoint below works on the free plan. Nothing is reserved for a higher tier — what a plan buys is request rate, and how many keys, webhook endpoints and agent inboxes you may hold.
| Plan | Requests / hour | Requests / day | API keys | Webhooks | Agent inboxes | Emails handled / month |
|---|---|---|---|---|---|---|
| Free | 200 | 1,000 | 1 | 1 | 3 | 3,000 |
| Solo | 1,000 | 5,000 | 3 | 3 | 10 | 10,000 |
| Starter | 5,000 | 25,000 | 10 | 10 | 30 | 25,000 |
| Pro | 20,000 | 100,000 | 30 | 30 | 150 | 75,000 |
| Scale | 80,000 | 400,000 | 100 | 100 | 500 | 200,000 |
The monthly email pool counts mail handled, both directions: what an inbox costs is every message that moves through it, received as much as sent.
A request past the rate limit answers 429 with the reset time. A stock limit answers 403 QUOTA_EXCEEDED carrying the resource, the amount used and the ceiling — so a client can react without parsing English.
// Surface
What you can drive.
Domains
Add a domain, trigger verification, read its DNS state.
Aliases
Create, route, suspend. Forward, store, catch-all or blackhole.
Sending
Send from an alias, then follow the message through its events.
Webhooks & campaigns
HTTPS endpoints with signed payloads and retries. Campaigns too.
// Agent inboxes
Give your agent an
address of its own.
One POST creates a real, deliverable mailbox on agent.useinbox.email. Your agent can sign up for a service, receive the confirmation, and answer the reply — without a human forwarding mail into it.
Incoming mail is threaded on its Message-ID, In-Reply-To and References headers, so a reply arrives inside the conversation it belongs to. An agent reads a thread, not a flat list it has to reassemble.
Inboxes
Create one per agent, per customer, or per task. Delete when the task is done.
Conversations
Threads across one inbox or all of them, paginated by cursor.
Send & reply
Open a conversation, or answer one. Replies keep the headers that hold the thread together.
Self-awareness
An agent can read its own consumption and back off before it hits the ceiling mid-conversation.
curl -X POST https://api.useinbox.email/api/v1/inboxes \ -H "Authorization: Bearer neus_..." \ -H "Content-Type: application/json" \ -d '{ "username": "research-bot", "display_name": "Research Bot" }' # => research-bot@agent.useinbox.email
curl -X POST https://api.useinbox.email/api/v1/threads/{id}/reply \ -H "Authorization: Bearer neus_..." \ -d '{ "text": "Confirmed — shipping Tuesday." }'
The reply carries the thread's References chain, so it lands in the recipient's existing conversation rather than starting a second one beside it.
// Permissions
A key you hand an agent
should not do everything.
An API key can be narrowed to a set of scopes, and pinned to specific inboxes. A key that may read and answer mail in one mailbox cannot create a second one, delete anything, or read a conversation belonging elsewhere.
| Scope | Grants |
|---|---|
| inboxes:read | List inboxes and read their settings. |
| inboxes:write | Create and delete inboxes. |
| messages:read | Read threads, message bodies and labels. |
| messages:send | Send a new message and reply in a thread. |
| analytics:read | Usage, per-inbox activity and deliverability. |
A key with no scopes is unrestricted
That default is what keeps every key issued before scopes existed working exactly as it did. It also means a key meant for an agent has to be given its scopes on purpose — leaving the boxes unticked grants everything, not nothing.
Refused, with a reason
A call outside a key's scopes answers 403 FORBIDDEN naming the scope it wanted. An inbox the key is not pinned to answers 404 — a key that cannot reach a mailbox learns nothing about whether it exists.
// Clients
REST, SDK,
or MCP.
The MCP server exposes twelve tools over stdio, so an assistant that speaks Model Context Protocol can hold an email conversation without any glue code of yours.
Base URL
https://api.useinbox.email
npm install @zenderock/useinbox-sdk import { UseInbox } from '@zenderock/useinbox-sdk' const client = new UseInbox({ apiKey: process.env.USEINBOX_API_KEY }) const inbox = await client.inboxes.create({ username: 'support-bot' })
claude mcp add useinbox \
--env USEINBOX_API_KEY=neus_... \
-- npx -y @zenderock/useinbox-mcp
// Quickstart
One call to a
working alias.
Create a key in the dashboard, point it at a verified domain, and route the address wherever your product needs it. Bearer auth, JSON in, JSON out.
Base URL
https://api.useinbox.email
curl -X POST https://api.useinbox.email/api/v1/aliases \ -H "Authorization: Bearer neus_..." \ -H "Content-Type: application/json" \ -d '{ "domain_id": "d4f1...", "prefix": "support", "destinations": ["queue@acme.app"], "rule_type": "fixed" }'
{
"event": "email.delivered",
"alias": "support@acme.dev",
"message_id": "msg_4820f",
"occurred_at": "2026-07-31T07:05:51Z"
}
// Reliability
Built so a failure is visible.
When email is part of activation or support, silence is the worst outcome. Every message keeps a trace you can query.
Delivery events
6
Sent, delivered, opened, clicked, bounced, complained.
Webhook retries
Backoff
A failed delivery is retried on an exponential schedule, then logged.
Suppression list
422
A send to an address a hard bounce took out of service is refused, not silently dropped.
Infrastructure
AWS SES
Routing runs on SES, with Cloudflare managing DNS for delegated domains.
// Start building
Get a key in a minute.
The free plan includes a key, 500 requests a day, a webhook endpoint and an agent inbox. Enough to build the integration before deciding anything.