Skip to Content
Public APIRate Limits

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

PlanRate limit
Growth300 requests / minute
Advanced600 requests / minute
EnterpriseConfigurable — 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/broadcasts uses one API call; the same campaign as 50,000 individual /public/message calls will exceed your budget.
  • Persist the message id so 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.