要点
Brevo APIを使用すると、マーケティングメール、トランザクションメール、SMSメッセージをプログラムで送信できます。APIキーで認証し、api.brevo.comにリクエストを送信し、Webフックを使用して配信とエンゲージメントを追跡します。テストには、Apidogを使用してペイロードを検証し、Webフックハンドラをテストし、統合がバウンスと購読解除を正しく処理することを確認します。
はじめに
Brevo(旧Sendinblue)は、50万以上の企業のために毎日数百万通のメールを処理しています。マーケティングキャンペーン、トランザクションメール、SMSマーケティング、自動化ワークフローを扱っています。
メールAPIはシンプルに見えます。メッセージを送信すれば完了です。しかし、本番のメールシステムでは、バウンス、スパム報告、購読解除、配信タイミングなどを処理する必要があります。Brevoは、これらの複雑さを管理してくれるため、ユーザーがその手間をかける必要はありません。
このAPIは、主に3つのユースケースに対応しています。
- マーケティングキャンペーン - 連絡先リストへの一括メール送信
- トランザクションメール - パスワードのリセット、注文確認、通知
- SMSメッセージ - 認証コード、アラート、マーケティングテキスト
認証とセットアップ
APIキーの取得
- Brevoにログインします。
- 「SMTP & API」→「APIキー」に移動します。
- 適切な権限を持つ新しいキーを作成します。
- それを安全に保管します。
APIキーはapi-keyヘッダーに含めます。
curl -X GET "https://api.brevo.com/v3/account" \
-H "accept: application/json" \
-H "api-key: your-api-key-here"
APIベースURL
すべてのリクエストは以下に送信されます。
https://api.brevo.com/v3/
レート制限
Brevoはプランによってリクエストを制限します。
- 無料プラン: 300リクエスト/分
- Starterプラン: 600リクエスト/分
- Businessプラン: 1200リクエスト/分
使用状況を追跡するには、X-RateLimit-Remainingヘッダーを確認してください。
トランザクションメールの送信
トランザクションメールは、ユーザーのアクションによってトリガーされる個別のメッセージです。パスワードのリセット、注文確認、ウェルカムメールなどを想像してください。
シンプルなメールの送信
curl -X POST "https://api.brevo.com/v3/smtp/email" \
-H "accept: application/json" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"sender": {
"name": "Your App",
"email": "noreply@yourapp.com"
},
"to": [
{
"email": "user@example.com",
"name": "John Doe"
}
],
"subject": "Welcome to Our Platform",
"htmlContent": "<html><body><h1>Welcome!</h1><p>Thanks for signing up.</p></body></html>",
"textContent": "Welcome! Thanks for signing up."
}'
応答:
{
"messageId": "<20260324123456.123456@relay.brevo.com>"
}
テンプレートの使用
Brevoのビジュアルエディターでテンプレートを作成し、IDで送信します。
curl -X POST "https://api.brevo.com/v3/smtp/email" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"templateId": 15,
"to": [
{
"email": "user@example.com",
"name": "John Doe"
}
],
"params": {
"name": "John",
"order_number": "ORD-12345",
"tracking_url": "https://tracking.example.com/ORD-12345"
}
}'
テンプレート変数は二重括弧を使用します。
<p>こんにちは {{params.name}} 様、</p>
<p>ご注文番号 {{params.order_number}} の商品が発送されました。</p>
<p><a href="{{params.tracking_url}}">荷物を追跡する</a></p>
添付ファイル付きで送信
const response = await fetch('https://api.brevo.com/v3/smtp/email', {
method: 'POST',
headers: {
'api-key': process.env.BREVO_API_KEY,
'content-type': 'application/json'
},
body: JSON.stringify({
sender: { name: 'Your App', email: 'noreply@yourapp.com' },
to: [{ email: 'user@example.com' }],
subject: 'Your Invoice',
htmlContent: '<p>請求書を添付いたしました。</p>',
attachment: [
{
name: 'invoice.pdf',
content: base64EncodedPdfContent
}
]
})
})
マーケティングキャンペーン
マーケティングメールは、連絡先リストに送信されます。Brevoは購読解除リンク、スケジュール設定、分析を処理します。
キャンペーンの作成
curl -X POST "https://api.brevo.com/v3/emailCampaigns" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"name": "March Newsletter",
"subject": "What'\''s New in March",
"sender": {
"name": "Your Brand",
"email": "newsletter@yourbrand.com"
},
"type": "classic",
"htmlContent": "<html><body>Newsletter content here...</body></html>",
"recipients": {
"listIds": [12, 15]
},
"scheduledAt": "2026-03-25T09:00:00+00:00"
}'
即時送信
curl -X POST "https://api.brevo.com/v3/emailCampaigns/{campaignId}/sendNow" \
-H "api-key: your-api-key"
キャンペーン統計の取得
curl -X GET "https://api.brevo.com/v3/emailCampaigns/{campaignId}" \
-H "api-key: your-api-key"
応答に含まれるもの:
{
"statistics": {
"delivered": 4850,
"opened": 1455,
"clicked": 291,
"unsubscribed": 12,
"bounces": 150
}
}
連絡先管理
連絡先は、メールを送信する相手です。連絡先をリストに整理し、カスタム属性を追加します。
連絡先の作成
curl -X POST "https://api.brevo.com/v3/contacts" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"email": "new.user@example.com",
"attributes": {
"FIRSTNAME": "Jane",
"LASTNAME": "Smith",
"PLAN": "premium"
},
"listIds": [12, 15],
"updateEnabled": true
}'
updateEnabled: trueフラグは、既存の連絡先を更新し、失敗を防ぎます。
連絡先の詳細の取得
curl -X GET "https://api.brevo.com/v3/contacts/user@example.com" \
-H "api-key: your-api-key"
リストに追加
curl -X POST "https://api.brevo.com/v3/contacts/lists/12/contacts/add" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"emails": ["user1@example.com", "user2@example.com"]
}'
リストから削除
curl -X DELETE "https://api.brevo.com/v3/contacts/lists/12/contacts/remove" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"emails": ["user@example.com"]
}'
連絡先の購読解除
curl -X PUT "https://api.brevo.com/v3/contacts/user@example.com" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"emailBlacklisted": true
}'
SMSマーケティング
BrevoはSMS APIを通じて、世界中でSMSメッセージを送信します。
SMSの送信
curl -X POST "https://api.brevo.com/v3/transactionalSMS/sms" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"sender": "YourApp",
"recipient": "+15551234567",
"content": "Your verification code is: 123456",
"type": "transactional"
}'
マーケティングSMSの送信
curl -X POST "https://api.brevo.com/v3/transactionalSMS/sms" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"sender": "YourBrand",
"recipient": "+15551234567",
"content": "Flash sale! 50% off today only. Reply STOP to unsubscribe.",
"type": "marketing"
}'
SMS統計の取得
curl -X GET "https://api.brevo.com/v3/transactionalSMS/statistics?startDate=2026-03-01&endDate=2026-03-31" \
-H "api-key: your-api-key"
追跡のためのWebhook
Webフックは、配信済み、開封済み、クリック、バウンス、購読解除など、メールイベントについてアプリに通知します。
Webhookの設定
Brevoダッシュボード内: 設定 → Webhook → Webhookを追加
追跡するイベント:
delivered- メールが受信トレイに届いたopened- 受信者がメールを開封したclicked- 受信者がリンクをクリックしたbounced- メールがバウンスした(ハードまたはソフト)spam- スパムとしてマークされたunsubscribed- 受信者が購読解除した
Webhookペイロードの処理
app.post('/webhooks/brevo', (req, res) => {
const event = req.body
switch (event.event) {
case 'delivered':
console.log(`Email ${event.messageId} delivered to ${event.email}`)
break
case 'opened':
console.log(`Email opened by ${event.email} at ${event.date}`)
break
case 'bounced':
console.log(`Bounce: ${event.email} - ${event.reason}`)
// Mark contact as invalid
markContactBounced(event.email)
break
case 'spam':
console.log(`Spam complaint from ${event.email}`)
// Remove from all lists
removeFromAllLists(event.email)
break
case 'unsubscribed':
console.log(`Unsubscribed: ${event.email}`)
break
}
res.status(200).send('OK')
})
Apidogでのテスト
メールAPIには複雑な障害モードがあります。テンプレート、バウンス、Webフックをテストする必要があります。Apidogが役立ちます。

1. メール送信のモック
開発中は、実際のメールを送信しないでください。応答をモックします。
pm.test('Email API accepts valid payload', () => {
const response = pm.response.json()
pm.expect(response).to.have.property('messageId')
pm.expect(response.messageId).to.match(/<.*@relay\.brevo\.com>/)
})

2. Webhook処理のテスト
ApidogでモックWebフックペイロードを作成します。
{
"event": "bounced",
"email": "invalid@example.com",
"messageId": "<12345@relay.brevo.com>",
"reason": "hard_bounce",
"date": "2026-03-24T12:00:00Z",
"subject": "Welcome to Our Platform"
}
これをWebフックエンドポイントに送信し、コードが正しく処理することを確認します。
3. テンプレートの検証
テンプレートペイロードを保存し、変数が正しく置き換えられていることをテストします。
pm.test('Template variables are valid', () => {
const payload = pm.request.body.toJSON()
pm.expect(payload.params).to.have.property('name')
pm.expect(payload.params).to.have.property('order_number')
})
4. 環境の分離
# Development
BREVO_API_KEY: xkeysib-dev-xxx
BREVO_SENDER: dev@yourapp.com
# Production
BREVO_API_KEY: xkeysib-prod-xxx
BREVO_SENDER: noreply@yourapp.com
ApidogでBrevoメールAPIをテスト - 無料
よくあるエラーとその解決策
400 Bad Request - 必須フィールドの欠落
原因: ペイロードに必須フィールドが欠落しています。
修正: エラーメッセージで詳細を確認してください。
{
"code": "invalid_parameter",
"message": "sender.email is required"
}
401 Unauthorized (認証なし)
原因: APIキーが無効であるか、欠落しています。
修正: api-keyヘッダーが正しく設定されていることを確認してください。キーが取り消されていないか確認してください。
402 Payment Required (支払いが必要)
原因: アカウントが制限を超過しているか、クレジットが不足しています。
修正:
- メールの場合: プランのメール制限を確認してください。
- SMSの場合: SMSクレジットを購入してください。
429 Too Many Requests (リクエストが多すぎます)
原因: レート制限を超過しました。
修正: 指数バックオフを実装してください。
async function sendWithRetry(email, retries = 3) {
for (let i = 0; i < retries; i++) {
const response = await sendEmail(email)
if (response.status === 429) {
await sleep(Math.pow(2, i) * 1000)
} else {
return response
}
}
throw new Error('Rate limit exceeded')
}
404 Contact not found (連絡先が見つかりません)
原因: 存在しない連絡先を更新しようとしています。
修正: 連絡先を作成する際にupdateEnabled: trueを使用してください。
{
"email": "new@example.com",
"updateEnabled": true
}
これにより、連絡先が作成または更新されます。
代替サービスと比較
| 機能 | Brevo | SendGrid | Mailchimp | Postmark |
|---|---|---|---|---|
| 料金 | 1日300通まで無料 | 1日100通まで無料 | 1ヶ月500通まで無料 | 1ヶ月100通まで無料 |
| マーケティングメール | はい | はい | はい | いいえ |
| トランザクションメール | はい | はい | 限定的 | はい(特化型) |
| SMS | はい | いいえ | いいえ | いいえ |
| 自動化 | はい | はい | はい | 限定的 |
| テンプレートエディター | ビジュアル + コード | コード | ビジュアル | コード |
Brevoは、メールとSMSの統合サポートを競争力のある価格で提供することで際立っています。
実際の使用例
Eコマースの注文フロー。 オンラインストアはBrevoを次のように使用しています: 注文確認(トランザクション)、発送通知(トランザクション)、カート放棄回復(マーケティング自動化)、および週刊プロモーション(マーケティングキャンペーン)。これらすべてを1つの統合から行います。
SaaSオンボーディング。 プロジェクト管理ツールは、ウェルカムメール、パスワードリセット、チーム招待をトランザクションAPI経由で送信します。マーケティングメールは、オプトインユーザーに新機能を告知します。
SMS認証。 フィンテックアプリは、BrevoのSMS APIを二要素認証コードに使用しています。トランザクションSMSエンドポイントは数秒以内にコードを配信し、Webフックは再試行ロジックのために配信失敗を追跡します。
結論
学んだことは次のとおりです。
- Brevo APIは、マーケティング、トランザクションメール、SMSを処理します。
api-keyヘッダーで認証します。- 一貫性があり、保守しやすいメールにはテンプレートを使用します。
- ターゲットキャンペーンのために連絡先とリストを管理します。
- Webフックは配信、開封、クリック、バウンスを追跡します。
- 実際のユーザーに送信する前にApidogでテストします。
次のステップ:
- Brevoアカウントを作成し、APIキーを取得します。
- 最初のトランザクションメールを送信します。
- ビジュアルエディターでテンプレートを作成します。
- バウンスと購読解除のWebフックハンドラを設定します。
- 開発中にApidogでテストします。
ApidogでBrevoメールAPIをテスト - 無料
よくある質問
BrevoとSendinblueの違いは何ですか?同じ製品で、新しい名前です。Sendinblueは2023年にBrevoにブランド変更しました。APIは引き続きapi.brevo.comを使用しますが、古いドキュメントにはSendinblueの記述が見られます。
無料で何通のメールを送信できますか?無料プランでは1日300通のメールを送信できます。これは1ヶ月あたり9,000通です。さらに多く送信するには、20,000通で月額25ドルから始まる有料プランにアップグレードしてください。
Brevoをコールドメールに使用できますか?技術的には可能ですが、リスクが伴います。コールドメールはバウンス率とスパム率が高くなります。Brevoは送信者の評判を監視しています。高い苦情率の場合、アカウントが停止されることがあります。まずドメインをウォームアップし、メールのベストプラクティスに従ってください。
メールのバウンスはどのように処理しますか?bounced Webフックをリッスンしてください。ハードバウンス(無効なメール)は連絡先を永久に削除すべきです。ソフトバウンス(メールボックスがいっぱい、一時的な問題)は再試行できます。バウンス率を追跡してください。5%を超えると、送信者の評判が低下します。
マーケティングメールとトランザクションメールの違いは何ですか?トランザクションメールは、ユーザーのアクション(購入、サインアップ)によってトリガーされ、1人の受信者に送信されます。マーケティングメールは、同時に多くの受信者に送信されるキャンペーンです。Brevoは、配信可能性とコンプライアンスの理由からこれらを区別しています。
購読解除リンクを追加するにはどうすればよいですか?Brevoは、マーケティングメールに購読解除リンクを自動的に追加します。トランザクションメールには、独自のリンクを追加してください。
<a href="{{ unsubscribe_url }}">購読解除</a>
自分のドメインからメールを送信できますか?はい。SPF、DKIM、DMARCレコードを設定してください。Brevoは設定 → 送信者とIPで値を提供します。適切な認証がないと、メールがスパムとして扱われることがあります。
特定のタイムゾーンでメールをスケジュールするにはどうすればよいですか?scheduledAtパラメータをISO 8601タイムスタンプとともに使用します。
{
"scheduledAt": "2026-03-25T09:00:00-05:00"
}
レート制限に達するとどうなりますか?429エラーが発生します。応答には、リセットまでの秒数を示すX-RateLimit-Resetヘッダーが含まれています。指数バックオフを実装するか、メールを後でキューに入れます。
