INBOXMAIL

// 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.

GET    /api/v1/domains POST   /api/v1/domains POST   /api/v1/domains/{id}/verify

Aliases

Create, route, suspend. Forward, store, catch-all or blackhole.

POST   /api/v1/aliases PUT    /api/v1/aliases/{id} GET    /api/v1/aliases/{id}/logs

Sending

Send from an alias, then follow the message through its events.

POST   /api/v1/emails/send GET    /api/v1/emails/{id} GET    /api/v1/emails/{id}/events

Webhooks & campaigns

HTTPS endpoints with signed payloads and retries. Campaigns too.

POST   /api/v1/webhooks POST   /api/v1/webhooks/{id}/test POST   /api/v1/campaigns/{id}/send

// 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.

POST   /api/v1/inboxes GET    /api/v1/inboxes DELETE /api/v1/inboxes/{id}

Conversations

Threads across one inbox or all of them, paginated by cursor.

GET    /api/v1/threads GET    /api/v1/threads/{id} GET    /api/v1/inboxes/{id}/threads

Send & reply

Open a conversation, or answer one. Replies keep the headers that hold the thread together.

POST   /api/v1/inboxes/{id}/messages POST   /api/v1/threads/{id}/reply PUT    /api/v1/threads/{id}/labels

Self-awareness

An agent can read its own consumption and back off before it hits the ceiling mid-conversation.

GET    /api/v1/agent-usage GET    /api/v1/inboxes/{id}/analytics GET    /api/v1/inboxes/{id}/deliverability
Create an inbox 201
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
Answer inside the thread 200
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

TypeScript SDK npm
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' })
MCP server 12 tools
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

Full reference
Create an alias 201
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"
  }'
Webhook payload signed
{
  "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.