---
title: "Developers"
description: "The same mailbox over a REST API, typed clients for TypeScript, Python, Ruby, PHP, Go, Java and C#, a command line and an MCP server. 548 documented operations across 404 paths, an OpenAPI 3.1 document you can read without a key, and signed webhooks."
url: "https://openemail.uk/developers"
---

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.

[Open mail](https://openemail.uk/mail/inbox) [Get Started](https://openemail.uk/signup.md)[Read the API quickstart](https://openemail.uk/docs/api/quickstart.md)

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

- [REST POST /emails](https://openemail.uk/docs/api/reference.md)
- [SDK openemail.emails.send()](https://openemail.uk/docs/sdk.md)
- [CLI openemail send](https://openemail.uk/docs/cli.md)
- [MCP sendEmail](https://openemail.uk/docs/mcp/overview.md)

Your mailbox

msg\_4b7e05d3862c1f0a44b19e2c sent

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.

[Open mail](https://openemail.uk/mail/inbox) [Get Started](https://openemail.uk/signup.md)[Read the API reference](https://openemail.uk/docs/api/reference.md)

`npm install @openemail/sdk`

```
1import { init, openemail } from '@openemail/sdk'2 3init({ apiKey: process.env.OPENEMAIL_API_KEY })4 5const email = await openemail.emails.send({6  from: 'Acme Billing <billing@acme.com>',7  to: 'ada@example.de',8  subject: 'Your September invoice',9  html: '<p>The invoice is attached.</p>',10})11 12console.log(email.id, email.status)
```

What happens next

1. Request accepted msg\_4b7e…
2. Queued email.queued
3. Sent email.sent
4. Delivered email.delivered

## Everything the app does, your code does.

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

Acme billing@acme.com

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

Ada Lovelace

To: Acme Billing

9:41

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

Open a thread, star it, search or reply.

## 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 <billing@acme.com>',`

`to: 'ada@example.de',`

`subject: 'Your September invoice',`

`html: invoiceHtml,`

1`attachments: [{ fileId: invoicePdf.id }],`

`}, {`

2`idempotencyKey: 'invoice:inv_2026_09_4192',`

`})`

What happens

1. 09:41:02 status: sent
   
   Accepted and sent. The PDF is large, so it travels as a download link.
2. 09:41:07 timeout
   
   The connection drops before your code reads the answer.
3. 09:41:08 Idempotency-Key
   
   The SDK sends it again with the same key.
4. 09:41:08 replayed: 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

| When | Event | Status | Try | Took |
| --- | --- | --- | --- | --- |
|  |  |  |  |  |
|  |  |  |  |  |
|  |  |  |  |  |
|  |  |  |  |  |

## 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](https://openemail.uk/docs/sdk.md)

### Command line

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

[Read the docs : Command line](https://openemail.uk/docs/cli.md)

501 tools

### MCP server

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

[Read the docs : MCP server](https://openemail.uk/docs/mcp/overview.md)

### API keys

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

[Read the docs : API keys](https://openemail.uk/docs/api/keys.md)

### OpenAPI 3.1

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

[Read the docs : OpenAPI 3.1](https://openemail.uk/docs/api/reference/openapi.md)

[Developer features](https://openemail.uk/developers/features.md)

## Paste one prompt into the tool you build with.

Coding agents and app builders wire up sending from a single prompt. Your key stays on the server.

- [Claude Code Coding agent Ask Claude Code to add sending to your codebase.](https://openemail.uk/developers/claude-code.md)
- [Cursor Coding agent Let the Cursor agent wire up sending in your repo.](https://openemail.uk/developers/cursor.md)
- [Codex Coding agent Hand Codex the prompt and review the change it makes.](https://openemail.uk/developers/codex.md)
- [GitHub Copilot Coding agent Paste the prompt into Copilot agent mode in VS Code.](https://openemail.uk/developers/github-copilot.md)
- [Windsurf Coding agent Let Cascade add sending to your project.](https://openemail.uk/developers/windsurf.md)
- [Gemini CLI Coding agent Run the prompt in Gemini CLI from your project folder.](https://openemail.uk/developers/gemini-cli.md)
- [T3 Code Coding agent Paste the prompt into a T3 Code thread and review the diff.](https://openemail.uk/developers/t3-code.md)
- [v0 App builder Add a send route to the Next.js app v0 builds.](https://openemail.uk/developers/v0.md)
- [Bolt App builder Give the app Bolt builds a server route that sends.](https://openemail.uk/developers/bolt.md)
- [Lovable App builder Send from a Supabase Edge Function in your Lovable app.](https://openemail.uk/developers/lovable.md)
- [Replit App builder Add an Express route that sends from your Replit app.](https://openemail.uk/developers/replit.md)
- [Modulify App builder Add a send route to the Next.js site Modulify builds.](https://openemail.uk/developers/modulify.md)

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.

- [Resend](https://openemail.uk/migrate/resend.md)
- [SendGrid](https://openemail.uk/migrate/sendgrid.md)
- [Postmark](https://openemail.uk/migrate/postmark.md)
- [Mailgun](https://openemail.uk/migrate/mailgun.md)
- [Amazon SES](https://openemail.uk/migrate/amazon-ses.md)
- [Gmail](https://openemail.uk/migrate/gmail.md)
- [Fastmail](https://openemail.uk/migrate/fastmail.md)
- [Proton Mail](https://openemail.uk/migrate/proton.md)
- [HEY](https://openemail.uk/migrate/hey.md)

[All migrations](https://openemail.uk/migrate.md)

Who it is for

## One mailbox. Four ways in.

### Business

Addresses for everyone, members never counted as seats.

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