Meta Marketing API Rate Limits: Quotas, Headers, Errors
Meta Marketing API rate limits are counted per ad account per hour. Ads management allows 300 + 40 × active ads calls on Limited Access and 100,000 + 40 × active ads on Full Access. Insights get a larger quota. The X-Business-Use-Case-Usage header shows usage and minutes to recovery, and errors 80004, 80000, 17, and 613 mean you're throttled.
Meta Marketing API rate limits are Business Use Case (BUC) quotas counted per ad account over a rolling hour, with a separate quota for each type of call. Ads management calls get 300 + 40 × active ads an hour on Limited Access and 100,000 + 40 × active ads on Full Access. On top of that sit an ad account score, a write limit per second, and caps on budget changes.
This page lists every limit with its number, the headers that report usage, the error code for each, and how to back off. It's part of our Meta Ads API series.
How do Meta Marketing API rate limits work?
Meta Marketing API rate limits stack in three layers: Business Use Case quotas, ad account limits, and platform limits. A call can be throttled by any one of them, and each layer reports in its own header and error code.
| Layer | Counted per | What it caps |
|---|---|---|
| Business Use Case (BUC) | Ad account, per use case, rolling hour | Calls by type: ads management, insights, custom audiences |
| Ad account limits | Ad account | A points score, writes per second, edits per object, budget changes |
| Platform limits | App | All Ads Insights calls, and all calls by app user count |
Source: Meta's Marketing API rate limiting page. Meta notes that endpoints sharing a use case share one quota per ad account, so a heavy reporting job can throttle your campaign edits on the same account.
What are the Business Use Case rate limits?
Business Use Case rate limits are hourly call quotas per ad account, and they grow with the number of active ads. Meta's formulas, by Marketing API Access Tier:
| Use case | Limited Access | Full Access |
|---|---|---|
ads_management |
300 + 40 × active ads | 100,000 + 40 × active ads |
ads_insights |
600 + 400 × active ads − 0.001 × user errors | 190,000 + 400 × active ads − 0.001 × user errors |
custom_audience |
5,000 + 40 × active custom audiences | 190,000 + 40 × active custom audiences, capped at 700,000 |
On Limited Access, an account with 5 active ads gets 500 ads management calls an hour. A sync job that reads campaigns, ad sets, and ads one by one across a few accounts can spend that in minutes. Total CPU time and wall time count against the quota too, so a few heavy queries can throttle you before the call count does.
What changed in Meta's access tiers in 2026?
On May 4, 2026, Meta renamed Ads Management Standard Access to the Marketing API Access Tier and lowered the bar for Full Access. The labels changed from Standard and Advanced to Limited and Full, and the qualifying volume fell from 1,500 to 500 Marketing API calls in the past 15 days.
The error-rate rule stayed at under 15%, measured differently. Jiaqi Sun wrote in Meta's announcement that it is now:
"calculated over a rolling window of your last 500 calls rather than a fixed time period."
For platforms with bursty traffic, an overnight batch that fails half its calls can sink your error rate before review, so fix throttling before you apply for Full Access.
What are the ad account limits?
Ad account limits cap how fast you can call and write to one ad account, regardless of your hourly quota. All of these come from Meta's rate limiting page:
- Ad account score. Reads cost 1 point and writes 3. Limited Access tops out at 60 points, decays over 300 seconds, and blocks for 300 seconds at the max. Full Access tops out at 9,000, with a 60-second block.
- Writes per second. 100 requests per second per app and ad account on create and edit calls for campaigns, ad sets, and ads.
- Edits per object. By default, one edit per object every 30 seconds.
- Budget changes. An ad set's
daily_budgetorlifetime_budgetcan change 4 times per hour, then budget edits are blocked for an hour. - Spend limits. Spend cap fields can change 10 times per day.
- Ad creation. Limited by the account's daily spend limit.
The budget cap catches AI tools that adjust budgets on every optimization pass. Batch the decision and write once.
Which headers show Meta Marketing API usage?
The X-Business-Use-Case-Usage header shows usage as a percentage per ad account and the minutes until access returns. Read it on every response and slow down before you reach 100.
| Header | Fields | What it tells you |
|---|---|---|
X-Business-Use-Case-Usage |
call_count, total_cputime, total_time, type, estimated_time_to_regain_access, ads_api_access_tier |
BUC usage by ad account and use case |
X-Ad-Account-Usage |
acc_id_util_pct, reset_time_duration, ads_api_access_tier |
Ad account score usage |
X-FB-Ads-Insights-Throttle |
app_id_util_pct, acc_id_util_pct, ads_api_access_tier |
Insights usage for the app and the account |
X-App-Usage |
call_count, total_time, total_cputime |
Platform limits for the app |
X-Business-Use-Case-Usage is keyed by business object ID, and one response can report several. Parse it as a map, and check ads_api_access_tier to confirm which tier Meta thinks you're on.
What do Meta Marketing API error codes 17, 613, and 80004 mean?
Error 80004 means the ads management quota is used up, 80000 means insights, and 17 or 613 point to an ad account limit you identify by subcode. Error 613 is shared across several limits, so log the subcode with every failure.
| Code | Subcode | Limit hit |
|---|---|---|
| 80004 | 2446079 | Ads management BUC quota |
| 80000 | 2446079 | Ads Insights BUC quota |
| 80003 | 2446079 | Custom audience BUC quota |
| 80014 | none | Catalog batch BUC quota |
| 17 | 2446079 | Ad account score ("User request limit reached") |
| 17 | 1885172 | Spend limit changed more than 10 times a day |
| 613 | 1487742 | Too many calls from this ad account |
| 613 | 5044001 | Over 100 writes per second |
| 613 | 4841018 | Concurrent edits to one object |
| 613 | 1487632 | Ad set budget changed more than 4 times an hour |
| 613 | 1487225 | Ad creation limit |
| 4 | 1504022 or 1504039 | Too many Ads Insights calls from the app |
| 4 | none | App-level limit |
Source: Meta's Marketing API and Graph API rate limiting pages. The Instagram and Pages codes are in our Instagram API rate limit guide.
How should I back off from Meta Marketing API throttling?
Back off per ad account, using the header's recovery estimate, and stop sending calls to a throttled account until it clears. Every call you make while throttled still counts.
async function callWithBackoff(url: string, attempt = 0): Promise<Response> {
const res = await fetch(url);
const body = await res.clone().json().catch(() => null);
const code = body?.error?.code;
const throttled = [4, 17, 613, 80000, 80003, 80004, 80014].includes(code);
if (!throttled || attempt >= 5) return res;
const usage = JSON.parse(res.headers.get("x-business-use-case-usage") ?? "{}");
const minutes = Object.values(usage).flat()
.map((u: any) => u.estimated_time_to_regain_access ?? 0)
.reduce((a: number, b: number) => Math.max(a, b), 0);
const waitMs = minutes > 0
? minutes * 60_000
: Math.min(2 ** attempt * 30_000, 600_000) + Math.random() * 5_000;
await new Promise((r) => setTimeout(r, waitMs));
return callWithBackoff(url, attempt + 1);
}In a real queue, park the job for that ad account rather than sleeping a worker. Meta's own recommendations, from the rate limiting page:
- Spread calls evenly instead of bursting.
- Batch. Pass lists of IDs, use
levelon insights instead of one call per ad, and run large insights reports asynchronously. - Space edits to one object at least 30 seconds apart, increasing the gap on each retry.
- Cut calls you don't need, such as re-reading structure that hasn't changed.
How does Adeli report Meta throttling?
Adeli's Ads endpoints turn Meta throttling into one response: 429 rate_limited with a Retry-After header and structured limit details. Your code handles one status code instead of a table of Meta codes and subcodes, per Adeli's Ads docs.
{
"error": {
"code": "rate_limited",
"message": "Facebook is rate limiting this ad account; try again in a minute",
"details": { "retryAfterSeconds": 60, "limit": "ad_account" }
}
}That example is from Get campaign tree, which returns the campaign, ad set, and ad hierarchy with spend, impressions, reach, and clicks rolled up at every level. A provider refusal that isn't throttling returns 422 provider_rejected instead. Adeli also reuses the ad account list for up to 15 minutes rather than asking Meta on every call.
AI marketing platforms call these endpoints with the same API key they use for Adeli's social media analytics API on other networks. The same Facebook connection also publishes Facebook Page posts through Adeli's posting API.