Global Limits

Brevo limits API requests per endpoint. Each limit is a number of requests per second (RPS), per hour (RPH), or both. The figures below come from Brevo’s rate limits page, checked on 7 October 2026. Check that page before you size a large job.

Rate Limit Tiers

TierAvailable on
GeneralFree, Starter, Standard, Professional and Enterprise
AdvancedProfessional and Enterprise
ExtendedEnterprise

Limits by Tier

EndpointGeneralAdvancedExtended
POST /v3/smtp/email, GET /v3/smtp/blockedContacts1,000 RPS, 3,600,000 RPH2,000 RPS, 7,200,000 RPH6,000 RPS
GET /v3/smtp/emails2 RPS, 7,200 RPH3 RPS, 10,800 RPH18,000 RPH
POST /v3/transactionalSMS/send150 RPS, 540,000 RPH200 RPS, 720,000 RPH250 RPS
POST /v3/events10 RPS, 36,000 RPH20 RPS, 72,000 RPH60 RPS
POST /v3/orders/status5 RPS, 18,000 RPH10 RPS, 36,000 RPH15 RPS
POST /v3/products2 RPS, 7,200 RPH4 RPS, 14,400 RPH21,600 RPH
Other endpoints under /v3/smtp300 RPH600 RPH1,800 RPH
All endpoints under /v3/contacts10 RPS, 36,000 RPH20 RPS, 72,000 RPH60 RPS
All endpoints under /v3/loyalty600 RPH1,200 RPH100,000 RPH
All other endpoints100 RPH200 RPH600 RPH

When an endpoint has both an RPS and an RPH limit, stay under both.

Rate Limit Headers

Rate-limited endpoints return these headers:

HTTP/1.1 200 OK
x-sib-ratelimit-limit: 1000
x-sib-ratelimit-remaining: 750
x-sib-ratelimit-reset: 1

Header Descriptions

  • x-sib-ratelimit-limit: requests allowed in the current window
  • x-sib-ratelimit-remaining: requests left in the current window
  • x-sib-ratelimit-reset: time until the window resets, usually in seconds

Brevo documents these headers on its rate limit headers page.

Monitoring Usage

Check Current Usage

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'))
});
};

Handling Rate Limits

Exponential Backoff

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');
};

When You Keep Hitting Limits

  1. Spread requests evenly: a 1,000 RPS limit allows up to 60,000 requests a minute only when they are spread evenly.
  2. Batch and cache: use bulk endpoints and avoid re-reading data you already have.
  3. Use webhooks for statistics: receive events instead of polling statistics endpoints.
  4. Consider a higher tier: the advanced and extended tiers come with Professional and Enterprise plans.

Request early access

Enter your first name and business email address. We will email you a link to confirm your request for Tajo access.

AI Assistant

Hi! Ask me anything about the docs.