Most email APIs are built to send receipts. send0 starts from the inbox: each agent gets a real address that receives, sends and holds threaded conversations, and every message arrives parsed, with the parts an agent needs already pulled out.
import { Send0 } from "@send0/sdk";
const send0 = new Send0(process.env.SEND0_API_KEY);
const inbox = await send0.inboxes.create({ name: "signup-agent" });
// → [email protected]
await browser.fill("#email", inbox.address);
await browser.click("Create account");
// Blocks until the email lands, then returns it with the code already extracted.
const msg = await send0.inboxes.wait(inbox.id, { from: "*@github.com", timeout: 60 });
msg?.extracted?.otp; // "482913"
await send0.messages.reply(msg.id, { text: "Thanks, confirmed." }); // threads in Gmail and Outlook
Features
- An address in one call.
[email protected]is ready in milliseconds (custom domains are coming). Plus-addressing (bot+task42@) tags mail without more inboxes. - Wait, don't poll. One long-poll call blocks until the email you need arrives and returns the one-time code and verification link.
- Clean, structured messages. The new reply text without quoted history, SPF/DKIM/DMARC verdicts, and a prompt-injection flag on every inbound message.
- Real threads. Outbound mail carries
Message-ID,In-Reply-ToandReferences, so conversations stay threaded for your agent and for the person on the other side. - Webhooks and live events on every plan. Signed webhooks (
send0-signature, Stripe-style HMAC) with automatic retries and manual redelivery, plus a Server-Sent Events stream. - Built for agents, safe by default. Inbox-scoped API keys, human approval for outgoing mail, reply-only sending on the free tier, automatic suppression of bounces and complaints, and sending that pauses itself when complaint or bounce rates spike.
- MCP server. Plug inboxes into Claude, Cursor, VS Code or any MCP client, locally or at
https://api.send0.dev/mcp. - Agent framework tools. The same tools for the Vercel AI SDK, LangChain.js and LangChain for Python, with errors returned to the model and optional approval before sending.
- A dashboard for the humans. Read threads, approve drafts, manage keys, webhooks and teammates at app.send0.dev.
Use it
curl https://api.send0.dev/v1/inboxes \
-H "Authorization: Bearer $SEND0_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{ "name": "research-agent" }'
curl "https://api.send0.dev/v1/inboxes/ibx_…/messages/wait?from=*@acme.dev&timeout=60" \
-H "Authorization: Bearer $SEND0_API_KEY"
curl https://api.send0.dev/v1/messages/msg_…/reply \
-H "Authorization: Bearer $SEND0_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{ "text": "Thanks, confirmed." }'
Full guides and the API reference are at send0.dev/docs.
How it works
Inbound sender ─▶ MX (send0.email) ─▶ accept/refuse during SMTP ─▶ store raw .eml
─▶ parse, extract code + links, check SPF/DKIM/DMARC, flag injection
─▶ thread ─▶ webhook + live stream + any waiting wait() call
Outbound your agent ─▶ policy checks (reply-only, suppression, daily cap)
─▶ MIME with threading headers, DKIM-signed ─▶ Amazon SES
─▶ delivered / bounced / complained events ─▶ webhooks
The hosted service runs on Cloudflare Workers (API, inbound mail, Durable Objects for real-time, Queues), Postgres (Neon) and Amazon SES. Everything is TypeScript; the HTTP layer is Hono, so the same app can run on Node.
Repository
apps/api REST API, webhooks, real-time, remote MCP (api.send0.dev)
apps/inbound Inbound mail Worker: SMTP accept/refuse → store → ingest
apps/web Dashboard SPA and its Worker (app.send0.dev)
apps/docs Documentation (send0.dev/docs)
apps/www Marketing site (send0.dev)
packages/core Parsing, threading, extraction, safety: pure TypeScript
packages/db Postgres schema and migrations (Drizzle)
packages/pipeline Inbound ingest and event fan-out
packages/adapters Blob storage and mail transport behind interfaces
packages/auth Dashboard accounts, sessions, workspaces, roles
packages/sdk @send0/sdk, the TypeScript SDK (MIT)
packages/sdk-python send0, the Python SDK (MIT)
packages/mcp @send0/mcp, the MCP server (MIT)
packages/ai-sdk @send0/ai-sdk, Vercel AI SDK tools (MIT)
packages/langchain @send0/langchain, LangChain.js tools (MIT)
packages/langchain-python langchain-send0, LangChain for Python (MIT)
fixtures/emails Real-world .eml corpus used by the tests
Development
Requires Node 22, pnpm 9, and uv for the Python SDK.
pnpm install
pnpm verify # format check, lint, typecheck, tests
pnpm --filter @send0/web dev:local # the whole product locally at http://localhost:5199
No accounts or services needed: tests and the local server use an in-memory Postgres and record outgoing email instead of sending it. See CONTRIBUTING.md to get started and CLAUDE.md for the architecture and conventions.
Self-hosting
Run the same API, SDKs, MCP server and dashboard on your own domain. Two editions, from v0.2.1:
- Docker Compose: Postgres, the send0 server (with its own SMTP server for inbound mail) and Caddy on one machine. Sends through any SMTP relay or Amazon SES. Image:
ghcr.io/send0-dev/send0. Files inselfhost/. - Cloudflare: one Worker on your account, with Email Routing, R2, Queues, a Durable Object, your Postgres through Hyperdrive, and Amazon SES. Deploy to Cloudflare.
The guide: send0.dev/docs/self-hosting.
Contributing
Issues and pull requests are welcome. Please read CONTRIBUTING.md; contributors sign a CLA once, through a bot on the first pull request. For security issues, see SECURITY.md.
License
- The send0 server and apps are licensed under the GNU Affero General Public License v3.0. If you run a modified version as a network service, you must offer its source to your users.
- The SDKs (
packages/sdk,packages/sdk-python) the MCP server (packages/mcp) and the agent framework integrations (packages/ai-sdk,packages/langchain,packages/langchain-python) are MIT, so you can use them in any project.
Copyright © 2026 Kunal Dholiya.