開発者

メールボックスは問わない、
誰が操作しているか。

アプリにできることは、すべてコードからもできます。68 のパスにまたがる 104 のドキュメント化されたオペレーションが、キーなしで読める OpenAPI 3.1 ドキュメントの背後にあります。TypeScript クライアントはビルドのたびにそのドキュメントと照合されます。

どの MCP クライアントに貼っても、自分で登録されます。
{ "mcpServers": {
    "openemail": {
      "url": "https://api.openemail.uk/mcp"
    } } }

MCP に貼り付けるキーは不要です。クライアントはエンドポイントから認可サーバーを見つけ、自身を登録し、サインインのためにここへ誘導します。

104

ドキュメント化されたオペレーション

68

1 つのホスト配下のパス

116

SDK メソッド、そのすべてを網羅

20

Webhook イベント、3 系統

OpenAPI 3.1 ドキュメントは GET /openapi.json にあり、読むのにキーは要りません。

接点

3 つの入口、
1 つのメールボックス。

REST API

ワークスペースのキーが、呼び出しでできることと、差出人にできるアドレスを決めます。失効は削除ではなく更新なので、以降の呼び出しにはキーが失効したと伝わります。

/threads?query=invoice
/emails
emails:sendthreads:readwebhooks:write

1 つのキーで差出人にできるのは最大 25 ドメインと 50 アドレスです。GET /ping はキーが持つスコープと、ロールが残したスコープを返します。

MCP サーバー

クライアントをエンドポイントに向けてサインインするだけ。クライアントが自身を登録してここへ誘導するので、貼り付けるキーはありません。

listThreads
threads:reademails:sendlabels:write

ツールは呼び出し側にできることから組み立てられるため、読み取りだけに絞ったクライアントには送信ツールが現れません。ただしトークンはメールボックス全体に届きます。

Webhook

https のエンドポイントを登録すれば、メールボックスがそこへ POST します。配信を起こすのは API 呼び出しではなくメールボックス自身なので、アプリで作成しても API に POST しても同じものが発生します。

/webhooks
email.receivedemail.sentemail.failedemail.openeddomain.verifiedsuppression.added

3 系統で20イベント、メールボックスごとに 10 エンドポイント。

一致

クライアントが遅れることはない、
API からは。

一致チェックはビルドのたびに OpenAPI ドキュメントを読み、ずれがあれば失敗します。仕様にないオペレーションを指すメソッド、メソッドのないドキュメント化済みオペレーション、オペレーションの要求と食い違うスコープ一覧が対象です。検証した内容は出力され、現時点では 104 のドキュメント化された全オペレーションに対して 116 の SDK メソッドと表示されます。

1 つの送信、3 つの書き方

設定、リクエスト、呼び出しは、同じオペレーションを 3 通りに書いたものです。

MCPAPISDK
{ "mcpServers": {
"openemail": {
"url": "https://api.openemail.uk/mcp"
} } }
01 · 5件の機能、1件が近日公開

エージェント、API、MCP

OpenEmail は人だけでなくソフトウェアからも操作されることを前提にしています。どちらから使っても同じメールボックスです。

/threads?query=invoice
{ "threads": 12 }
人が使っていてもプログラムが使っていても、同じメールボックス。

MCP サーバー

Claude や任意の MCP クライアントを、自分のメールボックスに向けられます。

/threads?query=invoice
{ "threads": 12 }
人が使っていてもプログラムが使っていても、同じメールボックス。

サードパーティ製クライアント向けOAuth

近日公開

PKCE対応のセルフサービス型クライアント登録。アプリが正しい手順でアクセスを要求できます。

同意と失効は用意されていますが、スコープはまだありません。そのためトークンはアプリが求めた範囲ではなく、メールボックス全体に届きます。

/threads?query=invoice
{ "threads": 12 }
人が使っていてもプログラムが使っていても、同じメールボックス。

REST API

発行・スコープ設定・失効ができるキーを備えた、ドキュメント付きの HTTP API。

/threads?query=invoice
{ "threads": 12 }
人が使っていてもプログラムが使っていても、同じメールボックス。

型付きSDK

まずTypeScriptクライアント、その後に他の言語を。

/threads?query=invoice
{ "threads": 12 }
人が使っていてもプログラムが使っていても、同じメールボックス。

Webhook

メールの到着をエンドポイントに通知。ポーリングは不要です。

/threads?query=invoice
{ "threads": 12 }
人が使っていてもプログラムが使っていても、同じメールボックス。

クイックスタート

ゼロから送信済みメールまで。
3 ステップ。

  1. 1

    キーを発行

    自分のメールボックスの「設定」→「API キー」から。スコープを選び、差出人にできる範囲をドメイン全体や個別アドレスに絞れます。シークレットは一度だけ表示され、保存されるのは一方向ハッシュです。

    GET /ping はキーに付いたスコープと、ロールが残したスコープを返します。
    export OPENEMAIL_API_KEY=oe_live_9f2c1a4b7e05d3862c1f0a44_kX7… curl https://api.openemail.uk/ping \  -H "Authorization: Bearer $OPENEMAIL_API_KEY"
  2. 2

    クライアントをインストール

    依存関係ゼロの TypeScript クライアント。ESM と CommonJS で公開され、キーは OPENEMAIL_API_KEY から読み込みます。自分で JSON を POST したいなら不要です。どのエンドポイントもただの HTTP です。

    Node 18 以上、Workers、Deno、Bun、ブラウザー。
    bun add @openemail/sdk
  3. 3

    送信

    レスポンスには id が入っています。GET /emails/{id}で解決でき、/events に宛先ごとの履歴、/tracking に開封とクリックがあります。

    同じ Idempotency-Key で再試行すると、最初の結果が Idempotency-Replayed: true 付きで返ります。
    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>Invoice attached.</p>',}) console.log(email.id, email.status)

未実装

まだできないこと、
今のところは。

これを相手に作り始める前に知っておくべき 5 つのこと。あとからではなく。

アップロード用エンドポイントがない
インライン添付は base64 で、合計 5 MB が上限です。それより大きいファイルは、ワークスペースにすでにあるファイルを id で指定して送り、ダウンロードリンクとして届きます。
バウンスはメールボックス止まり
配信レポートは解析され、Message-ID で照合され、スレッドにラベル付けされ、email.bounced Webhook として送出されます。ただし送信レコードには何も書き戻されないため、GET /emails 経由ではバウンスしたメッセージも送信済みのまま見えます。
コンポーザーのメールは GET /emails に出ない
アプリのコンポーザーから送ったメールはその一覧に現れません。コンポーザーは同じ送信経路を通らないためです。
OAuth にあるのは同意で、スコープではない
許可の前にリクエストが表示され、「接続済みアプリ」から取り消せます。ただしトークンはアプリが求めた範囲ではなく、メールボックス全体に届きます。
リリースワークフローがない
クライアントの公開は、プリフライト、ビルド、bun publish を手動で実行する作業です。そのため npm にバージョンが出るのは、変更が入った時ではなく誰かが実行した時です。

配信の検証

すべての配信に署名が付き、
再試行はどれも同じ id を運ぶ。

署名はタイムスタンプ、ドット、生のボディに対する HMAC-SHA-256 です。届いたままのバイト列で検証してください。パースして再シリアライズするとキーの順序が変わり、検証が壊れます。

すべての配信に付くヘッダー
X-OpenEmail-Signature: t=1758240000,v1=9f0c4b2e7d1a86c3X-OpenEmail-Event: email.deliveredX-OpenEmail-Delivery: evt_4b7e05d3862c1f0a
リプレイ許容時間
300 秒で、強制するのは受信側の役目です。SDK の検証機能は既定でこの値を使います。
Idempotency-Key
キーと API キーの組に対する一意インデックスで確保されるため、タイムアウト後の再試行は二重送信にならず、最初の結果が Idempotency-Replayed: true 付きで返ります。
再試行
試行は 5 回。イベント発生時、その後 1 分後、5 分後、25 分後、2 時間後です。再試行されるのはタイムアウト、接続拒否、408、425、429、5xx のみです。
X-OpenEmail-Delivery
イベント id は一度だけ発行され、すべての試行がそれを運びます。同じ id を 2 回受け取った側は、2 回目を処理せず捨てられます。

対象となる方

メールボックスは1つ。
入り口は3つ。

個人

openemail.ukの無料アドレスと、クライアントのすべて。

acme.comacme.devstudio.acme.com
hello@acme.com配信済み
billing@acme.com配信済み
oct-2026-signup@acme.com配信済み
anything-at-all@acme.com配信済み
企業

全員にアドレスを。メンバーはシートに数えません。

SSarahAAliJJamieNNadia
シートは増えません。料金も変わりません。
開発者

同じメールボックスをAPI、SDK、MCPから。

/threads?query=invoice
{ "threads": 12 }
人が使っていてもプログラムが使っていても、同じメールボックス。

キーを発行。
何か送ってみる。

Full API, MCP and SDK accessはすべてのプランで。Freeには50 AI actions a dayが付きます。

API クイックスタートを読む

受信トレイを、
あなたの思いどおりに。

企業、AI、エージェント、個人利用のためのメールインフラ。スケール、プライバシー、コントロールのために設計。メールが最初から備えているべきだったすべて。

OpenEmail

企業、AI、エージェント、個人利用のためのメールインフラ。スケール、プライバシー、コントロールのために設計。メールが最初から備えているべきだったすべて。

© 2026 OpenEmail. 無断転載を禁じます。
ステータス