グローバル制限
Brevo は API リクエストをエンドポイントごとに制限しています。各上限は、1 秒あたり(RPS)、1 時間あたり(RPH)、またはその両方のリクエスト数で示されます。以下の数値は Brevo のレート制限のページに基づくもので、2026 年 10 月 7 日に確認しました。大規模なジョブの規模を見積もる前に、そのページを確認してください。
レート制限のティア
| ティア | 利用できるプラン |
|---|---|
| General | Free、Starter、Standard、Professional、Enterprise |
| Advanced | Professional と Enterprise |
| Extended | Enterprise |
ティアごとの上限
| エンドポイント | General | Advanced | Extended |
|---|---|---|---|
POST /v3/smtp/email, GET /v3/smtp/blockedContacts | 1,000 RPS, 3,600,000 RPH | 2,000 RPS, 7,200,000 RPH | 6,000 RPS |
GET /v3/smtp/emails | 2 RPS, 7,200 RPH | 3 RPS, 10,800 RPH | 18,000 RPH |
POST /v3/transactionalSMS/send | 150 RPS, 540,000 RPH | 200 RPS, 720,000 RPH | 250 RPS |
POST /v3/events | 10 RPS, 36,000 RPH | 20 RPS, 72,000 RPH | 60 RPS |
POST /v3/orders/status | 5 RPS, 18,000 RPH | 10 RPS, 36,000 RPH | 15 RPS |
POST /v3/products | 2 RPS, 7,200 RPH | 4 RPS, 14,400 RPH | 21,600 RPH |
/v3/smtp 配下のその他のエンドポイント | 300 RPH | 600 RPH | 1,800 RPH |
/v3/contacts 配下のすべてのエンドポイント | 10 RPS, 36,000 RPH | 20 RPS, 72,000 RPH | 60 RPS |
/v3/loyalty 配下のすべてのエンドポイント | 600 RPH | 1,200 RPH | 100,000 RPH |
| その他のすべてのエンドポイント | 100 RPH | 200 RPH | 600 RPH |
エンドポイントに RPS と RPH の両方の上限がある場合は、両方を下回るようにしてください。
レート制限のヘッダー
レート制限のあるエンドポイントは、次のヘッダーを返します。
HTTP/1.1 200 OKx-sib-ratelimit-limit: 1000x-sib-ratelimit-remaining: 750x-sib-ratelimit-reset: 1ヘッダーの説明
x-sib-ratelimit-limit: 現在のウィンドウで許可されるリクエスト数x-sib-ratelimit-remaining: 現在のウィンドウで残っているリクエスト数x-sib-ratelimit-reset: ウィンドウがリセットされるまでの時間(通常は秒)
Brevo はこれらのヘッダーをレート制限ヘッダーのページで説明しています。
使用状況の監視
現在の使用状況を確認する
const checkRateLimit = async () => { const response = await fetch('https://api.brevo.com/v3/account', { headers: { 'api-key': process.env.BREVO_API_KEY } });
console.log({ limit: response.headers.get('x-sib-ratelimit-limit'), remaining: response.headers.get('x-sib-ratelimit-remaining'), resetInSeconds: Number(response.headers.get('x-sib-ratelimit-reset')) });};レート制限への対処
指数バックオフ
const makeRequestWithBackoff = async (url, options, maxRetries = 3) => { for (let i = 0; i < maxRetries; i++) { const response = await fetch(url, options);
if (response.status !== 429) return response;
const resetSeconds = Number(response.headers.get('x-sib-ratelimit-reset') || 1); const delay = Math.max(resetSeconds * 1000, 1000 * Math.pow(2, i));
console.log(`Rate limited. Waiting ${delay}ms before retry ${i + 1}`); await new Promise(resolve => setTimeout(resolve, delay)); } throw new Error('Rate limit retries exhausted');};上限に繰り返し達する場合
- リクエストを均等に分散させる: 1,000 RPS の上限で 1 分あたり最大 60,000 リクエストを処理できるのは、リクエストが均等に分散されている場合に限ります。
- バッチ処理とキャッシュ: バルク用のエンドポイントを使い、すでに持っているデータの再取得を避けます。
- 統計情報には Webhook を使う: 統計用のエンドポイントをポーリングする代わりに、イベントを受信します。
- 上位のティアを検討する: Advanced と Extended のティアは、Professional と Enterprise のプランに含まれます。