ドキュメント
Mailera API
Microsoft のメールボックス(Outlook、Hotmail、Microsoft 365)を REST で一元管理できます。メールボックスの追加、稼働確認、メールの閲覧、OTP コードの取得、メールの送信、迷惑メールからの移動、webhook の受信に対応しています。
概要
すべてのエンドポイントは共通のベース URL 配下にあり、JSON を送受信します。
- 1アカウントと専用のワークスペースを無料で作成します。
- 2設定 → API key を開き、キーを作成してスコープを選択します。
- 3すべてのリクエストで X-API-Key ヘッダーにキーを指定します。
成功時のレスポンスには data フィールドが含まれます。エラー時には code と message を含む error フィールドが返されます。
無料のワークスペースを作成https://mailera.app/api/public/v1# 200{ "data": [ ... ], "next_cursor": "..." }# 4xx / 5xx{ "error": { "code": "not_found", "message": "..." } }認証
X-API-Key ヘッダーに API key を指定します。キーは mh_live_ で始まり、作成時に一度だけ表示されます。紛失した場合は、新しいキーを作成して古いキーを失効させてください。
同じキーを Bearer token として指定した Authorization ヘッダーも使用できます。
キーは IP 許可リストで制限できます。リスト外の IP からの呼び出しには 403 が返されます。
curl https://mailera.app/api/public/v1/mailboxes \ -H "X-API-Key: mh_live_..."キーのスコープ
各キーには 1 つ以上のスコープが付与されます。キーに必要なスコープがないエンドポイントを呼び出すと、403 forbidden が返されます。
| スコープ | 許可される操作 |
|---|---|
read | メールボックス、メール、OTP コード、受信トレイ/迷惑メールへの振り分け結果の取得 |
move | 迷惑メールからの移動とフォルダー間のメール移動 |
import | メールボックスの追加 |
sync | 即時同期のリクエスト |
send | メールの送信、返信、転送 |
manage | メールボックスの一時停止、再開、削除 |
webhooks | webhook の管理 |
エラー
エラーには常に固定の code と英語の message が含まれます。エラー処理は message の文面ではなく、必ず code に基づいて行ってください。
| HTTP | コード | 意味 |
|---|---|---|
| 401 | unauthorized | API key が未指定、無効、期限切れ、または失効済みです |
| 403 | forbidden | キーに必要なスコープがないか、IP が許可リストに含まれていません |
| 404 | not_found | メールボックスまたはメールが存在しないか、キーのワークスペースに属していません |
| 409 | mailbox_unavailable | メールボックスは再接続が必要、一時停止中、または IMAP 専用(未対応)です |
| 422 | validation_error | リクエストデータの形式が正しくありません |
| 429 | rate_limited | このキーのリクエスト数が毎分 300 件を超えています。Retry-After ヘッダーで指定された時間だけ待機してください |
| 503 | upstream_error | Microsoft 側でエラーまたはレート制限が発生しています。しばらくしてから再試行してください |
| 500 | internal_error | システムエラー |
制限とページネーション
キーごとに毎分 300 件までリクエストできます。超過すると、Retry-After ヘッダー付きの 429 が返されます。
一覧には next_cursor が返されます。その値を cursor パラメーターに指定すると、次のページを取得できます。データがなくなると next_cursor は null になります。
limit パラメーターで 1 ページあたりの件数を指定します。
curl "https://mailera.app/api/public/v1/mailboxes?limit=50&cursor=NEXT_CURSOR" \ -H "X-API-Key: mh_live_..."メールボックス
メールボックスの追加、確認、同期、一時停止、削除を行います。
- GET
/mailboxesメールボックス一覧を取得
- スコープ:
read- クエリ:
- status, q, cursor, limit
- POST
/mailboxes/importメールボックスを一括インポート(email:password:refresh_token:client_id、または | 区切り)
- スコープ:
import- ボディ:
- lines, text, group_id, duplicate_mode
- GET
/mailboxes/importインポートの進捗と行ごとの結果を取得
- スコープ:
import- クエリ:
- job_id
- GET
/mailboxes/{id}メールボックスの詳細とフォルダーごとの件数を取得
- スコープ:
read
- PATCH
/mailboxes/{id}メールボックスを一時停止または再開
- スコープ:
manage- ボディ:
- action (必須)
- DELETE
/mailboxes/{id}メールボックスを削除
- スコープ:
manage
- GET
/mailboxes/{id}/statusメールボックスが稼働中か Microsoft に直接確認
- スコープ:
read
- POST
/mailboxes/{id}/sync今すぐ同期
- スコープ:
sync- ボディ:
- wait
curl -X POST https://mailera.app/api/public/v1/mailboxes/import \ -H "X-API-Key: mh_live_xxx" -H "content-type: application/json" \ -d '{"lines":["user@hotmail.com:pass:M.C5_refresh...:9e5f94bc-..."]}'# → { "data": { "job_id": "..." } }curl "https://mailera.app/api/public/v1/mailboxes/import?job_id=JOB_ID" -H "X-API-Key: mh_live_xxx"メール
メールの閲覧、検索、OTP コードの取得、メールの送信を行います。
- GET
/mailboxes/{id}/messagesフォルダー内のメール一覧を取得
- スコープ:
read- クエリ:
- folder, unread, cursor, limit
- GET
/mailboxes/{id}/messages/{msgId}メール 1 件を本文とともに取得
- スコープ:
read
- GET
/mailboxes/{id}/otp最新の OTP コードを取得
- スコープ:
read- クエリ:
- from, subject, since_minutes
- POST
/mailboxes/{id}/send送信、返信、転送
- スコープ:
send- ボディ:
- to, cc, bcc, subject, html, text, importance, reply_to_message_id, mode, attachments
- GET
/messages/searchすべてのメールボックスからメールを検索
- スコープ:
read- クエリ:
- q, folder, limit
curl -X POST https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/send \ -H "X-API-Key: mh_live_xxx" -H "content-type: application/json" \ -d '{"to":["customer@example.com"],"subject":"Hello","text":"Message body"}'迷惑メール
受信トレイ/迷惑メールへの振り分け結果を確認し、迷惑メールから移動します。
- POST
/mailboxes/{id}/messages/{msgId}/moveメールを移動(例:迷惑メールから受信トレイへ)
- スコープ:
move- ボディ:
- destination (必須)
- POST
/mailboxes/{id}/unspamすべてのメール、または特定の送信者のメールを迷惑メールから移動
- スコープ:
move- ボディ:
- filter
- GET
/mailboxes/{id}/placement受信トレイと迷惑メールのどちらに届いたかを確認
- スコープ:
read- クエリ:
- from, subject, since_minutes
curl "https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/placement?from=me@example.com" -H "X-API-Key: mh_live_xxx"curl -X POST https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/unspam -H "X-API-Key: mh_live_xxx" \ -H "content-type: application/json" -d '{"filter":{"type":"sender","value":"me@example.com"}}'webhook
イベントを受信する URL を登録します。
イベントごとに、Mailera は指定の URL に JSON を POST します。エンドポイントがエラーを返すか応答しない場合、待機時間を徐々に延ばしながら再送します。
| イベント | 発生条件 |
|---|---|
message.received | 受信トレイに新着メールが届いたとき |
message.junk | 迷惑メールに新着メールが届いたとき |
mailbox.disconnected | メールボックスの接続が切れたとき(token の失効、パスワードの変更など) |
検証するには、タイムスタンプ、ドット、ボディを連結した文字列の HMAC-SHA256 を webhook のシークレットで計算し、署名ヘッダーと比較します。
送信されるヘッダー: X-MailHub-Event X-MailHub-Delivery X-MailHub-Timestamp X-MailHub-Signature
- GET
/webhookswebhook 一覧を取得
- スコープ:
webhooks
- POST
/webhookswebhook を作成(署名用シークレットは一度だけ返されます)
- スコープ:
webhooks- ボディ:
- url (必須), events, group_id
- PATCH
/webhooks/{id}webhook の有効化/無効化、イベントや URL の変更
- スコープ:
webhooks
- DELETE
/webhooks/{id}webhook を削除
- スコープ:
webhooks
import crypto from "node:crypto";// X-MailHub-Signature: sha256=<hex> X-MailHub-Timestamp: <unix seconds>const expected = "sha256=" + crypto.createHmac("sha256", SECRET) .update(timestamp + "." + rawBody).digest("hex");const ok = expected.length === signature.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));使用例
MAILBOX_ID とキーを実際の値に置き換えてください。
curl -X POST https://mailera.app/api/public/v1/mailboxes/import \ -H "X-API-Key: mh_live_xxx" -H "content-type: application/json" \ -d '{"lines":["user@hotmail.com:pass:M.C5_refresh...:9e5f94bc-..."]}'# → { "data": { "job_id": "..." } }curl "https://mailera.app/api/public/v1/mailboxes/import?job_id=JOB_ID" -H "X-API-Key: mh_live_xxx"curl https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/status -H "X-API-Key: mh_live_xxx"curl "https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/otp?from=noreply@service.com&since_minutes=15" \ -H "X-API-Key: mh_live_xxx"# → { "data": { "code": "482913", "folder": "inbox", ... } } or { "data": { "code": null } }curl -X POST https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/send \ -H "X-API-Key: mh_live_xxx" -H "content-type: application/json" \ -d '{"to":["customer@example.com"],"subject":"Hello","text":"Message body"}'curl "https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/placement?from=me@example.com" -H "X-API-Key: mh_live_xxx"curl -X POST https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/unspam -H "X-API-Key: mh_live_xxx" \ -H "content-type: application/json" -d '{"filter":{"type":"sender","value":"me@example.com"}}'const res = await fetch("https://mailera.app/api/public/v1/mailboxes?limit=50", { headers: { "X-API-Key": process.env.MAILERA_API_KEY },});const { data, next_cursor } = await res.json();import os, requestsr = requests.get( "https://mailera.app/api/public/v1/mailboxes/MAILBOX_ID/messages", params={"folder": "inbox", "limit": 20}, headers={"X-API-Key": os.environ["MAILERA_API_KEY"]},)print(r.json()["data"])import crypto from "node:crypto";// X-MailHub-Signature: sha256=<hex> X-MailHub-Timestamp: <unix seconds>const expected = "sha256=" + crypto.createHmac("sha256", SECRET) .update(timestamp + "." + rawBody).digest("hex");const ok = expected.length === signature.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
