The mailbox, as an API

Every inbox is an endpoint.

A REST API, a typed SDK, a command line, webhooks and an MCP server over the same mailbox the app uses. Code, agents and people all drive one inbox.

npm install @openemail/sdk

Runs where you deploy, and inside the tools you build with.

  • Node.js
  • Bun
  • Deno
  • Cloudflare Workers
  • TypeScript
  • Python
  • Ruby
  • PHP
  • Go
  • Java
  • C#
  • Claude Code
  • Cursor
  • Codex
  • GitHub Copilot
  • Windsurf
  • Gemini CLI
  • v0
  • Bolt
  • Lovable
  • Base44
  • Modulify
  • Replit
  • MCP

Four doors.
One mailbox behind them.

REST, the SDK, the command line and MCP reach the same operations, with the same scopes and the same limits.

Your mailbox

msg_4b7e05d3862c1f0a44b19e2csent

Same mailbox, whichever door the message came through.

Write one call.
Delivery is on us.

Anything that speaks HTTP can send. TypeScript, Python, Ruby, PHP, Go, Java and C# get typed clients, and every message reports back as it is queued, sent and delivered.

npm install @openemail/sdk
import { init, openemail } from '@openemail/sdk' init({ apiKey: process.env.OPENEMAIL_API_KEY }) const email = await openemail.emails.send({  from: 'Acme Billing <[email protected]>',  to: '[email protected]',  subject: 'Your September invoice',  html: '<p>The invoice is attached.</p>',}) console.log(email.id, email.status)

What happens next

  1. Request acceptedmsg_4b7e…
  2. Queuedemail.queued
  3. Sentemail.sent
  4. Deliveredemail.delivered

Everything the app does,
your code does.

Threads, search, labels, drafts and contacts are calls too, on the mailbox your team already reads.

Inbox

Everything addressed to you, minus spam.

Question about invoice 4192

9:41

Ada Lovelace

Your September invoice

9:12

Northwind Cloud

Refund for order 7731

8:47

Linus Chen

Invoice 4188 is paid

8:30

Grace Hopper

Quote for the spring order

7:20

Margaret Hamilton

Question about invoice 4192

Invoices

Ada Lovelace

To: Acme Billing

Hello,

The VAT line on invoice 4192 looks doubled, so the total is higher than the quote. Could you check it before Friday?

Thanks, Ada

What your clicks call

Numbers you can
check from a terminal.

The OpenAPI 3.1 document is public and needs no key, and the SDK has to match it before a release.

documented operations
548
GET /openapi.json
paths on one host
404
jq '.paths | length'
SDK methods
684
Matched to the spec before every release
MCP tools
501
openemail mcp tools
webhook events
51
Matched to the spec before every release

Send once.
Exactly when you meant to.

A retry never sends twice, a send can wait up to a year, and an undo window lasts up to fifteen minutes.

invoice.ts
await openemail.emails.send({
from: 'Acme Billing <[email protected]>',
subject: 'Your September invoice',
html: invoiceHtml,
1 attachments: [{ fileId: invoicePdf.id }],
}, {
2 idempotencyKey: 'invoice:inv_2026_09_4192',
})

What happens

  1. 09:41:02status: sent

    Accepted and sent. The PDF is large, so it travels as a download link.

  2. 09:41:07timeout

    The connection drops before your code reads the answer.

  3. 09:41:08Idempotency-Key

    The SDK sends it again with the same key.

  4. 09:41:08replayed: true

    Nextmail returns the first result instead of sending twice.

A retry never sends twice.

Every delivery signed.
Every retry, the same id.

51 events, signed with HMAC, retried up to eight times over about 27 hours, and replayable.

Deliveries

Every POST to acme.com, newest first.

https://acme.com/webhooks
EventStatus

Every door,
up close.

Use the typed SDK, script the CLI, connect an agent over MCP, or speak plain HTTP.

TypeScript SDK

A client with zero dependencies for Node 20 and up, Bun, Deno and Cloudflare Workers.

Read the docs: TypeScript SDK

Command line

Every SDK method is a command, with --json, --dry-run and exit codes.

Read the docs: Command line
501 tools

MCP server

Point a client at one URL and sign in. The tools follow what you approve.

Read the docs: MCP server

API keys

Scoped keys with a sending address, an expiry and a log of every request.

Read the docs: API keys

OpenAPI 3.1

The whole contract is one public document, readable without a key.

Read the docs: OpenAPI 3.1

Switching

Coming from another provider?
Keep your code.

Pick the one you are leaving. Your code converts call by call, contacts, templates and webhooks come across with one key where the provider allows it, and old mail arrives from an export.

All migrations

Who it is for

One mailbox.
Four ways in.

Developers

The same mailbox over an API, an SDK, a CLI and MCP.

AI & agents

An inbox your agent can work, with access you approve.

Personal

A free address at openemail.uk, with the client behind it.