APIドキュメント

MailBrew REST APIリファレンス

はじめに

MailBrewには2つの使い方があります。

SMTP
SMTPモード(メール送信テスト)

アプリのSMTP送信先をMailBrew(smtp.mailbrew.dev)に設定するだけ。送信したメールをダッシュボードの共有メールボックスでリアルタイム確認できます。

SMTP設定へ →
Cloud API
Cloud APIモード(E2E・CIテスト)

APIでテスト用メールアドレスを発行し、実際にメールを受信。OTP抽出、リンク検証、メールアサーションなどをAPIで自動化できます。CI/CDパイプラインに組み込み可能。

Cloud API →

SMTP設定

アプリケーションの環境変数を以下のように設定してください。

ダッシュボードの「SMTP設定」で生成したSMTP認証情報を使用すると、宛先アドレスに関係なく送信メールが企業の共有メールボックスに自動的に振り分けられます。テスト時に宛先を意識する必要がなくなります。

Laravel (.env)

通信は暗号化されます。ポート 587(STARTTLS・推奨)または 465(SSL/TLS)を使ってください。587 は暗号化してからでないと認証できません。

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailbrew.dev
MAIL_PORT=587
MAIL_USERNAME=mb_smtp_xxxxx
MAIL_PASSWORD=your_smtp_password
MAIL_ENCRYPTION=tls

Laravel 11 以降は MAIL_PORT=587 だけで自動的に暗号化されます(MAIL_ENCRYPTION=tls は Laravel 10 以前用)。465 を使う場合は MAIL_PORT=465 と MAIL_SCHEME=smtps(Laravel 10 以前は MAIL_ENCRYPTION=ssl)。

Node.js (Nodemailer) の場合:

const transporter = nodemailer.createTransport({
  host: 'smtp.mailbrew.dev',
  port: 587,
  secure: false,      // STARTTLS on 587 (for 465: port: 465, secure: true)
  requireTLS: true,
  auth: {
    user: 'mb_smtp_xxxxx',
    pass: 'your_smtp_password',
  },
});

Web UI

MailBrewに送信されたメールはWeb UIでリアルタイムに確認できます。HTMLメールのプレビュー、添付ファイルのダウンロード、全文検索が可能です。

https://tokyo-rehearsal.mailbrew.dev

クラウドAPI

以下はMailBrewクラウドサービスのAPIエンドポイントです。APIキーによる認証が必要です。

SDK

公式SDKを使うとAPIを簡単に呼び出せます。

npm install @mailbrew/sdk
const { MailBrew } = require('@mailbrew/sdk');
const client = new MailBrew('mb_your_key_here');

メソッド一覧

アドレス管理
createAddress(options?)

一時メールアドレスを作成

const addr = await client.createAddress({ ttl: 3600 });
console.log(addr.address); // "ax7k2m@acme.mailbrew.dev"
listAddresses()

アドレス一覧を取得

const addresses = await client.listAddresses();
deleteAddress(address)

アドレスを削除

await client.deleteAddress('ax7k2m@acme.mailbrew.dev');
メール操作
waitForEmail(address, options?)

メール受信を待機(ロングポーリング)

const email = await client.waitForEmail(addr.address, { timeout: 30000 });
listEmails(address)

メール一覧を取得

const emails = await client.listEmails(addr.address);
getEmail(address, emailId)

メール詳細を取得

const detail = await client.getEmail(addr.address, email.id);
データ抽出
extractOtp(address, emailId, options?)

メール本文からOTP/認証コードを抽出

const code = await client.extractOtp(addr.address, email.id);
// Custom pattern: { pattern: '\\d{4}' }
extractLinks(address, emailId, options?)

メール本文からリンクを抽出

const links = await client.extractLinks(addr.address, email.id);
// Filter: { pattern: 'verify' }
assertEmail(address, emailId, assertions)

メール内容のアサーション(件名・送信元・本文など)

const result = await client.assertEmail(addr.address, email.id, {
  subject_contains: 'Welcome',
  body_contains: 'verify',
});
console.log(result.passed); // true
便利メソッド
captureOtp(options?)

アドレス作成〜OTP抽出を一括で行う

const { address, waitAndExtract } = await client.captureOtp({ ttl: 120 });
// ... trigger email ...
const { code, email } = await waitAndExtract();
forwardEmail(address, emailId, to)

会社の有効かつメール確認済みメンバーへメールを転送

await client.forwardEmail(addr.address, email.id, 'dev@example.com');
Webhook
createWebhook(url, options?)

グローバルWebhookを作成

const wh = await client.createWebhook('https://example.com/hook', {
  events: ['email.received'],
});
listWebhooks()

Webhook一覧を取得

const webhooks = await client.listWebhooks();
deleteWebhook(id)

Webhookを削除

await client.deleteWebhook(wh.id);

認証

すべてのAPIリクエストにはAPIキーが必要です。X-API-Key ヘッダーに含めてください。

X-API-Key: mb_your_key_here

スコープ

APIキーにスコープが設定されている場合、該当する権限がないリクエストは403エラーになります。スコープ未設定のキーは全権限を持ちます。

addresses:read— アドレスの一覧・詳細の取得
addresses:write— アドレスの作成
addresses:delete— アドレスの削除
emails:read— メールの一覧・待機・OTPとリンクの取り出し・検査・比較・配信性
emails:forward— 会社のメンバー(有効かつメール確認済み)への転送
webhooks:read— Webhookの一覧の取得
webhooks:write— Webhookの登録・変更
webhooks:delete— Webhookの削除

アドレス形式

発行されるアドレスは企業のサブドメインを使用します。カスタムドメインが設定されている場合はそちらが使用されます。

{random}@{company-slug}.mailbrew.dev

ベースURL

https://tokyo-rehearsal.mailbrew.dev/api/mailbrew

APIのエラー

ステータスごとに、よくある原因です。

401
APIキーが間違っているか、削除されています。X-API-Key ヘッダーで送っているか確認してください。
403
キーのスコープにその操作が入っていないか、IPアドレス制限の外から呼んでいるか、アドレス数や月間の上限に達したか、アカウントが停止しています。
404
アドレスが無い・他社のアドレス・別のAPIキーで作ったアドレス・保存期間を過ぎて消えた・メールのIDが違う・OTPが見つかりません。届く前のアドレスは、自社のドメインなら新着を待つAPI(wait)で待てます。
410
APIで作ったアドレスの期限が切れた状態で wait を呼びました。期限が切れても会社の保存期間(既定7日)の間はメールを読めます。
422
送った値が足りないか、形が違います。local_part がすでに使われているか、検査(assert)の条件が空です。JSON には Content-Type: application/json を付けてください。
429
1分あたりの回数、または同時に待てる数を超えました。Retry-After の秒数だけ待ってください。

エラーメッセージの言語は Accept-Language ヘッダで決まります(日本語にするには Accept-Language: ja を付けます)。指定が無ければ英語です。スコープ名(emails:read など)やコードは、どちらの言語でもそのまま書かれます。

回数の上限のヘッダ

応答のヘッダで、残り何回呼べるかが分かります。

Retry-After
429のとき、何秒待てばよいか(秒)。
X-RateLimit-Limit
1分あたりの上限(回)。
X-RateLimit-Remaining
1分のあいだに残っている回数(回)。

Webhookの署名の確かめ方

すべての通知に X-Mailbrew-Timestamp(送信時刻のUNIX秒)と X-Mailbrew-Signature: sha256=… が付きます。"{タイムスタンプ}.{本文}" を署名の鍵でHMAC-SHA256した値と、受け取った署名を定数時間で比べてください。本文は加工前の生のバイト列を使い、現在時刻との差が300秒(5分)を超えるものは拒否してください。

X-Mailbrew-Timestamp
送信時刻のUNIX秒。
X-Mailbrew-Signature
sha256=HMAC-SHA256(鍵, "タイムスタンプ.本文")。
const timestamp = req.get('X-Mailbrew-Timestamp') || '';
if (!/^\d+$/.test(timestamp)) return res.sendStatus(401);
if (Math.abs(Math.floor(Date.now() / 1000) - Number(timestamp)) > 300) return res.sendStatus(401);

const expected = 'sha256=' + crypto.createHmac('sha256', process.env.MAILBREW_WEBHOOK_SECRET)
  .update(timestamp + '.').update(req.body).digest('hex');

const received = Buffer.from(req.get('X-Mailbrew-Signature') || '');
const expectedBuffer = Buffer.from(expected);
if (received.length !== expectedBuffer.length || !crypto.timingSafeEqual(received, expectedBuffer)) {
  return res.sendStatus(401);
}

鍵はダッシュボードの Webhook の画面(オーナーだけに表示)で確認できます。アドレスごとの webhook_url への通知は、会社の署名鍵で署名します。

エンドポイント

POST
/api/mailbrew/addresses
addresses:write

アドレス発行 — 一時メールアドレスを生成します。ttl=0で常設(無期限)アドレスを作成できます。

パラメータ

ttlinteger
任意
有効期間(秒)。デフォルト3600。上限は 31536000(1 年)。0で常設アドレス
webhook_urlstring
任意
メール受信時の通知先URL(アドレス単位)
local_partstring
任意
カスタムローカルパート

レスポンス

{
  "data": {
    "id": 1,
    "address": "ax7k2m@acme.mailbrew.dev",
    "webhook_url": null,
    "expires_at": "2026-03-29T13:00:00+00:00",
    "is_permanent": false,
    "created_at": "2026-03-29T12:00:00+00:00"
  }
}
GET
/api/mailbrew/addresses
addresses:read

アドレス一覧 — このAPIキーと、同じ会社の受信で自動で作られたアドレスを返します。自動で作られたアドレスは、同じ会社のどのAPIキーからも読めます。

レスポンス

{
  "data": [
    {
      "id": 1,
      "address": "ax7k2m@acme.mailbrew.dev",
      "webhook_url": null,
      "expires_at": "2026-03-29T13:00:00+00:00",
      "is_permanent": false,
      "created_at": "2026-03-29T12:00:00+00:00"
    }
  ]
}
GET
/api/mailbrew/addresses/{address}
addresses:read

アドレス詳細 — アドレスの詳細を取得します。

レスポンス

{
  "data": {
    "id": 1,
    "address": "ax7k2m@acme.mailbrew.dev",
    "webhook_url": null,
    "expires_at": "2026-03-29T13:00:00+00:00",
    "is_permanent": false,
    "created_at": "2026-03-29T12:00:00+00:00"
  }
}
GET
/api/mailbrew/addresses/{address}/emails
emails:read

メール一覧 — 指定アドレスに届いたメールの一覧を取得します。受信メールは保存期間(全プラン 7 日。組織のセキュリティ設定で短くできます)を過ぎると削除されます。

レスポンス

{
  "data": [
    {
      "id": 1,
      "from_address": "noreply@example.com",
      "subject": "Your verification code",
      "text_body": "Your code is: 847291",
      "received_at": "2026-03-29T12:05:00+00:00"
    }
  ]
}
GET
/api/mailbrew/addresses/{address}/emails/{id}
emails:read

メール詳細 — 特定のメールの詳細を取得します。

レスポンス

{
  "data": {
    "id": 1,
    "from_address": "noreply@example.com",
    "subject": "Your verification code",
    "text_body": "Your code is: 847291",
    "html_body": "<p>Your code is: <b>847291</b></p>",
    "received_at": "2026-03-29T12:05:00+00:00"
  }
}
GET
/api/mailbrew/addresses/{address}/emails/{id}/otp
emails:read

OTP抽出 — メール本文から認証コード(OTP)を自動抽出します。E2Eテストに最適。

パラメータ

patternstring
任意
カスタム正規表現パターン。キャプチャグループ ( ) を書くと、一致全体ではなくその部分を返します(例: Code: (\d{6}))

レスポンス

{
  "data": {
    "code": "847291",
    "email_id": 1,
    "source": "text_body"
  }
}
GET
/api/mailbrew/addresses/{address}/emails/{id}/links
emails:read

リンク抽出 — メール本文からリンク(URL)を自動抽出します。招待リンクやパスワードリセットリンクの取得に最適。

パラメータ

patternstring
任意
ドメインフィルタ用の正規表現パターン

レスポンス

{
  "data": {
    "links": [
      "https://example.com/verify?token=abc123",
      "https://example.com/unsubscribe"
    ],
    "email_id": 1,
    "source": "text_body"
  }
}
POST
/api/mailbrew/addresses/{address}/emails/{id}/assert
emails:read

メールアサーション — メールの内容を検証します。件名、送信元、宛先、本文の部分一致など、複数条件を同時にチェック。

パラメータ

subjectstring
任意
件名の完全一致
subject_containsstring
任意
件名の部分一致
fromstring
任意
送信元アドレスの完全一致
tostring
任意
宛先アドレスに含まれるか
body_containsstring
任意
本文の部分一致

レスポンス

{
  "data": {
    "passed": true,
    "email_id": 1,
    "results": [
      { "field": "subject", "passed": true, "expected": "Welcome", "actual": "Welcome" },
      { "field": "body_contains", "passed": true, "expected": "verify" }
    ]
  }
}
POST
/api/mailbrew/addresses/{address}/emails/{id}/forward
emails:forward

メール転送 — 受信メールを会社の有効かつメール確認済みメンバーのアドレスにのみ転送します。

パラメータ

tostring
必須
会社の有効かつメール確認済みメンバーのメールアドレス

レスポンス

{
  "data": {
    "forwarded": true,
    "to": "dev@example.com"
  },
  "success": true
}
DELETE
/api/mailbrew/addresses/{address}
addresses:delete

アドレス削除 — アドレスを削除します。

レスポンス

204 No Content
GET
/api/mailbrew/addresses/{address}/emails/wait
emails:read

メール受信待機 — ロングポーリングでメール受信を待機します。

パラメータ

timeoutinteger
任意
待機秒数(1〜60、既定30)
sincestring
任意
このISO8601日時(秒に丸める)以降のメール。同じ秒に届いたメールも含む
countinteger
任意
待機する件数(1〜100、既定1)

レスポンス

{ "data": [] }
POST
/api/mailbrew/addresses/{address}/sequence
emails:read

メール順序の検証 — 条件に合うメールが順序どおり届くか検証します。

パラメータ

stepsarray
必須
各メールのアサーション条件の配列
timeoutinteger
任意
待機秒数(1〜60、既定30)

レスポンス

{ "data": { "passed": true, "steps": [] } }
POST
/api/mailbrew/addresses/{address}/emails/{id}/diff
emails:read

メール差分 — 2通のメールの差分を取得します。

パラメータ

againstinteger
必須
比較対象のメールID

レスポンス

{ "data": { "email_id": 1, "against_id": 2, "fields": {} } }
GET
/api/mailbrew/addresses/{address}/emails/{id}/deliverability
emails:read

配信性の解析 — SPF・DKIM・DMARCなどの配信性を解析します。

レスポンス

{ "data": { "score": 100, "checks": [], "recommendations": [] } }
GET
/api/mailbrew/emails
emails:read

外部宛メールの一覧 — SMTP認証で送った外部宛(gmail.comなど)のメールを、封筒の宛先(RCPT TO)で引きます。BCCの宛先でも引けます。MailBrewのアドレスを to に指定しても引けません(アドレスのAPIで取得)。1通ずつの取得・OTP・リンク抽出は /api/mailbrew/emails/{id}・/otp・/links で行えます。

パラメータ

tostring
必須
封筒の宛先のメールアドレス
sincestring
任意
このISO8601日時(秒に丸める)以降のメール。同じ秒に届いたメールも含む

レスポンス

{
  "data": [
    {
      "id": 1,
      "from_address": "noreply@example.com",
      "subject": "Your verification code",
      "text_body": "Your code is: 847291",
      "received_at": "2026-03-29T12:05:00+00:00"
    }
  ]
}
GET
/api/mailbrew/emails/wait
emails:read

外部宛メールの受信待機 — 外部宛のメールが届くまでロングポーリングで待機します。パラメータはアドレスの受信待機と同じです。

パラメータ

tostring
必須
封筒の宛先のメールアドレス
timeoutinteger
任意
待機秒数(1〜60、既定30)
sincestring
任意
このISO8601日時(秒に丸める)以降のメール。同じ秒に届いたメールも含む
countinteger
任意
待機する件数(1〜100、既定1)

レスポンス

{ "data": [] }
GET
/api/mailbrew/webhooks
webhooks:read

Webhook一覧 — グローバルWebhookの一覧を取得します。

レスポンス

{
  "data": [
    {
      "id": 1,
      "url": "https://example.com/hook",
      "events": ["email.received"],
      "is_active": true
    }
  ]
}
POST
/api/mailbrew/webhooks
webhooks:write

Webhook登録 — グローバルWebhookを登録します。全アドレスのメール受信を通知。

パラメータ

urlstring
必須
Webhook URL
eventsarray
任意
イベント配列。未指定で全イベント

レスポンス

{
  "data": {
    "id": 1,
    "url": "https://example.com/hook",
    "secret": "abc123...",
    "events": ["email.received"],
    "is_active": true
  }
}
PUT
/api/mailbrew/webhooks/{id}
webhooks:write

Webhook更新 — WebhookのURL・イベント・有効状態を更新します。

パラメータ

urlstring
任意
Webhook URL
eventsarray
任意
イベント配列
is_activeboolean
任意
有効状態

レスポンス

{ "data": { "id": 1, "url": "https://example.com/hook", "events": ["email.received"], "is_active": true } }
DELETE
/api/mailbrew/webhooks/{id}
webhooks:delete

Webhook削除 — Webhookを削除します。

レスポンス

204 No Content

コード例

const { MailBrew } = require('@mailbrew/sdk');
const client = new MailBrew('mb_your_key_here');

// E2E test: create address, wait for email, extract OTP
const { address, waitAndExtract } = await client.captureOtp({ ttl: 120 });

// ... trigger email send to `address` ...

const { code, email } = await waitAndExtract();
console.log(code); // "847291"