Meta Graph API Rate Limits: Error Codes, Quota Tiers, and the App Review Fix
Two Separate Rate Limit Systems
Meta's Graph API does not use one universal rate limit. Depending on which API you are calling and which token type you use, your requests fall under one of two completely different systems. Graph API versions expire on a two-year clock and expired calls quietly fall back to an older version, which our Meta Graph API version deprecation guide explains in full. (For a plain-English map of which API is which, see the What Is Meta API guide.)
Applies to standard Graph API calls made with an app or user access token. App-level quota is calculated as 200 × daily active users in a rolling one-hour window. User-level quota is not disclosed by Meta.
Applies to Marketing API and Instagram Platform requests. Also covers Pages API calls made with page or system user tokens. The quota depends on your app's access tier and the specific Business Use Case endpoint group. This is where most throttling problems live.
All endpoints that share the same Business Use Case type (e.g., Ads Management) draw from the same quota pool for a given ad account. If one endpoint exhausts the limit, all other Ads Management endpoints for that ad account are also throttled — even if those other endpoints made very few calls.
The Access Tier Problem — Why Your Quota Is So Low
Every new Meta app starts on development_access tier by default. This tier gives you a minimal quota designed for testing — not production traffic. To get a quota that can handle real clients and real ad accounts, you need to upgrade through Meta Advanced Access — and that requires App Review.
| Tier | Ads Management (calls/hr) | Ads Insights (calls/hr) | How to Get It |
|---|---|---|---|
| development_access | Very low (default) | Very low (default) | Default — all new apps |
| standard_access | 300 + (40 × active ads) | 600 + (400 × active ads) | Apply for Ads Management Standard Access feature |
| advanced_access | 100,000 + (40 × active ads) | 190,000 + (400 × active ads) | App Review required — apply for Advanced Access to Ads Management Standard Access |
Source: Meta for Developers — Graph API Rate Limits documentation. Formulas apply to rolling one-hour windows. Active ads = number of ads currently running per ad account.
A Standard Access app managing 100 active ads gets approximately 4,300 Ads Management calls per hour. The same app with Advanced Access gets approximately 104,000 calls per hour. That is a 24× difference — and Advanced Access requires passing App Review. There is no way to pay for more quota on Standard Access alone.
Rate Limit Error Codes — What Each One Means
When your app hits a rate limit, the API returns a specific error code. Knowing which code you received tells you exactly which limit was hit and which system applies.
How to Read the Rate Limit Headers
Meta includes rate limit usage data in API response headers before you actually hit the limit. Reading these headers is the only way to monitor quota proactively. Two headers matter:
Returns call_count, total_cputime, and total_time as percentages. When any value reaches 100, throttling begins. Available in the App Dashboard too.
Returns per-BUC usage including call_count, total_cputime, total_time, ads_api_access_tier, and critically — estimated_time_to_regain_access in minutes. Up to 32 objects per call.
Why Error 80004 Cannot Be Fixed by Code Alone
Most developers try to fix rate limiting with exponential backoff, request batching, and spreading calls over time. These are valid best practices — but they treat a symptom, not the cause. If your app is on development_access or standard_access, the quota ceiling is structurally low. Here is what actually determines your ceiling:
Development, Standard, or Advanced Access. This is set by your App Review status — not by any setting you can configure yourself.
The BUC formula includes an "active ads multiplier" — more active ads = more quota. But this only applies after you have standard or advanced access.
Even within your call count quota, complex queries that take too much CPU time or processing time will be throttled. This is a secondary factor on top of the call count limit.
All Ads Management endpoints share the same pool per ad account. If your reporting module burns quota, your campaign creation module hits the same limit — even if it made few calls itself.
To unlock a quota ceiling that actually supports production traffic at scale, you must apply for Advanced Access to the Ads Management Standard Access feature. This goes through Meta's App Review process. It is not automatic. If throttling is blocking a launch, you can hire a Facebook API developer to audit the call pattern and fix it.
Common Reasons App Review Stalls on Rate Limit Requests
- App is still in Development Mode — reviewers cannot test a Development Mode app against real ad accounts
- No screencasts showing the full Ads Management workflow end-to-end with real API calls visible
- Privacy policy missing data retention, data deletion, or Ads data handling language
- Business Verification not completed — required before Advanced Access submissions are even reviewed
- Use case description does not explain why the app cannot operate on Standard Access limits
- Test credentials do not give reviewers access to an ad account with active ads (so the quota formula looks broken to them)
- App is flagged for inconsistent request volume (error 613 subcode 1996) — this triggers extra scrutiny before App Review even proceeds
Not affiliated with Meta Platforms, Inc. Meta makes all App Review and access tier decisions independently. Rate limit quotas and formulas sourced from official Meta for Developers documentation.