Rate Limits
Each plan ships with its own request budget. When you exceed it, the API returns 429 Too Many Requests with the message Rate limit exceeded for this resource.
Limits by plan
| Plan | Rate limit |
|---|---|
| Growth | 300 requests / minute |
| Advanced | 600 requests / minute |
| Enterprise | Configurable — capped at Meta’s allowed rate |
Public APIs are not available on the Starter plan. Upgrade to Growth or higher to call any endpoint in this section.
Retry strategy
When you receive a 429, retry with exponential backoff:
async function callWithRetry(req, attempt = 0) {
const resp = await fetch(url, req);
if (resp.status !== 429) return resp;
if (attempt >= 5) throw new Error('rate-limit retries exhausted');
const delay = Math.min(1000 * 2 ** attempt, 30000); // 1s, 2s, 4s, 8s, 16s, max 30s
await new Promise(r => setTimeout(r, delay));
return callWithRetry(req, attempt + 1);
}Tips:
- Spread bursts — instead of firing 300 requests in the first second of every minute, even out the load.
- Use broadcasts for one-to-many sends. A 50,000-recipient campaign through
/app/broadcastsuses one API call; the same campaign as 50,000 individual/public/messagecalls will exceed your budget. - Persist the message
idso retries idempotently reference the same logical message.
What counts toward the limit
Every authenticated request to /api/v1/public/* (and the CAPI endpoint /api/v1/app/meta-ads/capi/send-event) counts. The rate limit is per workspace, not per API key — regenerating a key does not reset the counter.
Beyond the limit
If you genuinely need more than 600 req/min sustained, talk to your account manager about Enterprise. The ceiling there is Meta’s WABA messaging cap — typically the messaging tier (TIER_1K → TIER_UNLIMITED) on your phone number.