開発者
メールボックスは問わない、
誰が操作しているか。
アプリにできることは、すべてコードからもできます。68 のパスにまたがる 104 のドキュメント化されたオペレーションが、キーなしで読める OpenAPI 3.1 ドキュメントの背後にあります。TypeScript クライアントはビルドのたびにそのドキュメントと照合されます。
MCP に貼り付けるキーは不要です。クライアントはエンドポイントから認可サーバーを見つけ、自身を登録し、サインインのためにここへ誘導します。
104
ドキュメント化されたオペレーション
68
1 つのホスト配下のパス
116
SDK メソッド、そのすべてを網羅
20
Webhook イベント、3 系統
OpenAPI 3.1 ドキュメントは GET /openapi.json にあり、読むのにキーは要りません。
接点
3 つの入口、
1 つのメールボックス。
ワークスペースのキーが、呼び出しでできることと、差出人にできるアドレスを決めます。失効は削除ではなく更新なので、以降の呼び出しにはキーが失効したと伝わります。
1 つのキーで差出人にできるのは最大 25 ドメインと 50 アドレスです。GET /ping はキーが持つスコープと、ロールが残したスコープを返します。
クライアントをエンドポイントに向けてサインインするだけ。クライアントが自身を登録してここへ誘導するので、貼り付けるキーはありません。
ツールは呼び出し側にできることから組み立てられるため、読み取りだけに絞ったクライアントには送信ツールが現れません。ただしトークンはメールボックス全体に届きます。
https のエンドポイントを登録すれば、メールボックスがそこへ POST します。配信を起こすのは API 呼び出しではなくメールボックス自身なので、アプリで作成しても API に POST しても同じものが発生します。
3 系統で20イベント、メールボックスごとに 10 エンドポイント。
一致
クライアントが遅れることはない、
API からは。
一致チェックはビルドのたびに OpenAPI ドキュメントを読み、ずれがあれば失敗します。仕様にないオペレーションを指すメソッド、メソッドのないドキュメント化済みオペレーション、オペレーションの要求と食い違うスコープ一覧が対象です。検証した内容は出力され、現時点では 104 のドキュメント化された全オペレーションに対して 116 の SDK メソッドと表示されます。
設定、リクエスト、呼び出しは、同じオペレーションを 3 通りに書いたものです。
エージェント、API、MCP
OpenEmail は人だけでなくソフトウェアからも操作されることを前提にしています。どちらから使っても同じメールボックスです。
MCP サーバー
Claude や任意の MCP クライアントを、自分のメールボックスに向けられます。
サードパーティ製クライアント向けOAuth
近日公開PKCE対応のセルフサービス型クライアント登録。アプリが正しい手順でアクセスを要求できます。
同意と失効は用意されていますが、スコープはまだありません。そのためトークンはアプリが求めた範囲ではなく、メールボックス全体に届きます。
REST API
発行・スコープ設定・失効ができるキーを備えた、ドキュメント付きの HTTP API。
クイックスタート
ゼロから送信済みメールまで。
3 ステップ。
- 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
クライアントをインストール
依存関係ゼロの TypeScript クライアント。ESM と CommonJS で公開され、キーは OPENEMAIL_API_KEY から読み込みます。自分で JSON を POST したいなら不要です。どのエンドポイントもただの HTTP です。
Node 18 以上、Workers、Deno、Bun、ブラウザー。 bun add @openemail/sdk - 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つ。
キーを発行。
何か送ってみる。
Full API, MCP and SDK accessはすべてのプランで。Freeには50 AI actions a dayが付きます。