Developer quickstart

A REST API and an MCP server for sending, receiving, reading threads, and managing domains and mailboxes. Both run on your own server.

Start with your coding agent

Paste this into Claude Code, Codex, Cursor or any coding agent working in your app's repository:

Add email to this app with eMailPlane.
Read https://emailplane.com/llms-full.txt before writing code.
The API address is in the EMAILPLANE_API environment variable and the token
is in EMAILPLANE_TOKEN. Never print, log or commit the token.

1. Call GET $EMAILPLANE_API/v1/tokens/self and show me the token's scopes.
2. Add one sendEmail() helper that POSTs to /v1/emails and sends an
   Idempotency-Key derived from the business event (for example the order id),
   so retries never send twice.
3. Before sending to a list, call POST /v1/sends/preflight and respect its answer.
4. Read replies with GET /v1/inbound, paging with next_cursor.
5. Handle errors from the { "error": { "code", "message" } } envelope.
Ask me before sending to any address that isn't mine.

One-prompt install on your own server, run by your coding agent, is Coming soon.

API basics

Your apps call the API on your own server. It is never exposed to the public internet, and every request carries a bearer token with only the scopes it needs.

CallWhat it does
GET /v1/tokens/selfWho am I: the token's scopes, quota and usage
POST /v1/emailsSend an email. Returns 202 with id, message_id and state
POST /v1/sends/preflightAsk whether a send would be accepted, where it would stop and how much headroom is left, without sending
GET /v1/emails/:idThe state of one message
GET /v1/eventsDelivery events for your service (accepted, delivered, deferred, bounced, complained), filterable
GET /v1/inboundMail your service received, newest first, with next_cursor paging
GET /v1/inbound/threadsReceived mail grouped into conversations
GET /v1/inbound/threads/:idOne conversation, every message in order
POST /v1/webhooksRegister a URL that gets a signed message.received event when a reply arrives
POST /v1/mail-domainsAdd a domain; POST /v1/mail-domains/:id/verify checks its DNS
POST /v1/mailboxesCreate a mailbox a person can use in any mail app
GET /v1/templatesVersioned templates you can render and promote

Send an email

curl -sS "$EMAILPLANE_API/v1/emails" \
  -H "Authorization: Bearer $EMAILPLANE_TOKEN" \
  -H "Idempotency-Key: order-1042-shipped" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "orders@yourapp.com",
    "to": ["customer@example.com"],
    "subject": "Your order has shipped",
    "text": "It is on the way."
  }'

202 Accepted means the message is safely queued, not yet delivered. Follow it with GET /v1/emails/:id or GET /v1/events. Sending the same Idempotency-Key again returns the first answer instead of sending twice.

Errors

Every error has the same shape, with a machine-readable code and, where it helps, the field that caused it. Errors never repeat an email address back to you, so they are safe to paste into a bug report or an agent transcript.

{ "error": { "code": "request.invalid", "message": "...", "field": "cursor" } }

MCP

The eMailPlane MCP server gives an agent 41 tools over the same API and the same token scopes: sending, preflight, reading inbound mail and threads, waiting for a reply, templates, domains, mailboxes and API keys. MCP setup

Status

CapabilityStatus
Send API with idempotency keys, preflight, suppression and delivery eventsIn private beta
Receive mail and read it as threads through the APIIn private beta
Domains, mailboxes for people, and IMAP login from any mail appIn private beta
Virus scanning of inbound mail on your serverIn private beta
MCP server (41 tools)In private beta
Reply to a message in its thread (in_reply_to)In private beta
Signed webhooks when mail arrives (message.received, message and thread ids only)In private beta
wait_for_reply: wait up to 50 seconds for the answer in one call, and call again to keep waitingIn private beta
Remote MCP endpoint at https://mail.<your-domain>/mcpComing soon
Separate addresses and keys for each agentComing soon
Sender trust labels and untrusted-content wrapping for agentsComing soon
Drafts and approval policies (approve by reply or passkey)Coming soon
An event streamComing soon
npx emailplane CLI and a local sandboxComing soon
OpenAPI descriptionComing soon

Machine-readable versions

This site publishes /llms.txt, a full-text /llms-full.txt, and a Markdown version of every page: add index.html.md to any page's address, for example /pricing/index.html.md.