# Meta Marketing API Rate Limits: Quotas, Headers, Errors

Meta Marketing API rate limits: Business Use Case quotas by access tier, ad account scores, usage headers, error codes 17, 613, and 80004, and backoff.

Canonical page: https://www.tryadeli.com/blog/meta-marketing-api-rate-limit
Last updated: 2026-10-26

By Mika Reyes, Co-founder, Adeli. Published 2026-10-26.

## The short answer

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](https://www.tryadeli.com/blog/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](https://developers.facebook.com/docs/marketing-api/overview/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](https://developers.facebook.com/docs/marketing-api/get-started/authorization):

| 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](https://developers.meta.com/blog/updates-to-ads-management-standard-access-feature/) 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_budget` or `lifetime_budget` can 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](https://developers.facebook.com/docs/marketing-api/overview/rate-limiting) and [Graph API](https://developers.facebook.com/docs/graph-api/overview/rate-limiting) rate limiting pages. The Instagram and Pages codes are in our [Instagram API rate limit guide](https://www.tryadeli.com/blog/instagram-api-rate-limit).

## 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.

```ts
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 `level` on 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](https://www.tryadeli.com/docs/api/ads).

```json
{
  "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](https://www.tryadeli.com/docs/api/ads/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](https://www.tryadeli.com/use-cases/ai-marketing-platforms) call these endpoints with the same API key they use for Adeli's [social media analytics API](https://www.tryadeli.com/social-media-analytics-api) on other networks. The same Facebook connection also [publishes Facebook Page posts](https://www.tryadeli.com/product/facebook) through Adeli's [posting API](https://www.tryadeli.com/social-media-posting-api).

## Frequently asked questions

### How long does a Meta Marketing API rate limit last?

The windows roll, so there's no fixed reset time. The X-Business-Use-Case-Usage header includes estimated_time_to_regain_access in minutes. An ad account score block lasts 300 seconds on Limited Access and 60 seconds on Full Access.

### Is the Facebook Ads API rate limit per app or per ad account?

Mostly per ad account. Business Use Case quotas, the ad account score, and the 100 requests-per-second write limit are counted per ad account. Ads Insights and app-level platform limits are counted per app, so one busy customer can't use up another customer's ads management quota, but heavy insights traffic can slow every customer.

### How do I raise my Meta Marketing API rate limit?

Upgrade the Marketing API Access Tier from Limited Access to Full Access through App Review. Meta asks for 500 or more Marketing API calls in the past 15 days and an error rate under 15% over the last 500 calls.

### Does the Meta Marketing API return HTTP 429?

Meta's rate limiting docs describe throttling by error code and subcode in the response body, not by HTTP status. Branch on the code: 80004 for ads management, 80000 for insights, 17 with subcode 2446079 for the ad account score, and 613 for several other limits.

## Related Adeli pages

- [Social Media and Ads API for AI Marketing Platforms](https://www.tryadeli.com/use-cases/ai-marketing-platforms.md): Run posting, analytics, inbox, and Meta ads for your customers' accounts through one API, without months of platform reviews.
- [Facebook API for Developers](https://www.tryadeli.com/product/facebook.md): Publish, schedule, and read analytics for Facebook Pages through one API. Adeli owns the Facebook developer app, token refresh, and Meta review. Free to start.
- [Social Media Analytics API](https://www.tryadeli.com/social-media-analytics-api.md): Adeli's analytics API: Instagram, TikTok, Facebook Page, and YouTube insights endpoints, plus per-post engagement on every post an account has made.
- [All posts on the Adeli blog](https://www.tryadeli.com/blog.md)

## About the author

Mika Reyes is the CEO behind Adeli and a tech and AI content creator. She was previously co-founder and CEO of Parallax, which was acquired by Phantom, and a product lead at LinkedIn. She is a Forbes 30 Under 30 honoree.
