Instagram API rate limit: Meta's quotas and usage headers
The Instagram API rate limit from Meta's own sample code: the daily publishing quota, the Threads quotas, the X-App-Usage headers and the error codes to watch.
The Instagram API rate limit you're most likely to hit is the per-account publishing quota: Meta's own sample code puts it at 100, 50 or 25 API-published posts in 24 hours, depending on which file you read, and tells apps to check content_publishing_limit instead of trusting a number. Separately, every call counts against a usage budget that Meta reports back in the X-App-Usage or X-Business-Use-Case-Usage response header.
This reference is part of Meta API use cases: which one your app needs. It uses only what Meta publishes on GitHub (Postman collections, sample apps and SDK source) and the Meta entries in our API changelog. Meta's general rate-limit formulas live on Meta's developer site, which we don't read for these guides, so this page says plainly where its sources stop.
What this means for you
Two separate limits apply to a scheduling tool on Meta's platforms:
- A quota per account or profile. Instagram counts API-published posts per professional account. Threads counts posts, replies, deletions and location searches per profile. Both have an endpoint that tells you where you stand.
- A call budget for your app. Every request counts, including the status checks and insights reads around a post. Meta returns your usage in a response header on each call.
A tool that posts a few times a day for each client stays well under every posting quota Meta's samples quote. A tool that bulk-imports a content calendar, polls for comments or retries failed posts in a loop can meet both, and when it does, posts stop going out.
The details: how the Instagram API rate limit works
The limits in Meta's sources
| Limit | Counted per | How you check it | Figure in Meta's GitHub sources |
|---|---|---|---|
| Instagram publishing | Instagram professional account, 24 hours | GET /{ig-user-id}/content_publishing_limit | 100, 50 or 25 posts (they disagree, see below) |
| Threads posts | Threads profile | GET /me/threads_publishing_limit | 250 per 86,400 seconds (example response) |
| Threads replies | Threads profile | same call, reply_config | 1,000 per 86,400 seconds (example response) |
| Threads deletions and location search | Threads profile | same call, delete_config, location_search_config | No figure given |
| App call usage | Your app | X-App-Usage response header | No limit stated |
| Business use case usage | The ID in the request (a Page, in Meta's examples) | X-Business-Use-Case-Usage response header | No limit stated |
| Messenger user-level settings | Person, 10 minutes | Not stated | 10 calls per user per 10 minutes |
Instagram content publishing limit: 100, 50 or 25 a day?
Meta's own files give three different caps:
- The publishing guide in Meta's Instagram Postman collection says "Instagram accounts are limited to 100 API-published posts within a 24-hour moving period". It adds that carousels count as a single post and that the limit is enforced on
POST /media_publish. - The carousel request in the same collection says "Accounts are limited to 50 published posts within a 24-hour period."
- Meta's Reels publishing sample, written for its version 2.0.0 in February 2023, says 25.
The 100 and the 50 were added in the same commit on September 10, 2025, so the newer files still disagree with each other. The Instagram Content Publishing API guide sets out the three side by side. The guide also asks apps to "enforce the publishing rate limit, especially if your app allows app users to schedule posts to be published in the future", which is every scheduler.
Reading content_publishing_limit
Ask each account for its quota rather than picking one of the three numbers:
GET /{ig-user-id}/content_publishing_limit?fields=config,quota_usage
Meta's Reels sample reads config.quota_total and quota_usage from the first item in data and subtracts one from the other to show "Publishes remaining". The Python Business SDK has this call on both Instagram user classes, with the fields config and quota_usage and an optional since date. Both login paths have it, so it works whichever login your app uses (Instagram Login or Facebook Login).
Checking costs calls too. Meta's publishing guide recommends querying a container's status "once per minute, for no more than 5 minutes", which is a useful ceiling for the polling loop around each post.
Threads API rate limit: threads_publishing_limit
Threads has its own quota call:
GET /me/threads_publishing_limit?fields=quota_usage,config,reply_quota_usage,reply_config,delete_quota_usage,delete_config,location_search_quota_usage,location_search_config
That field list is the one Meta's Postman collection and its Threads sample app both request. Each *_config holds a quota_total and a quota_duration. Meta's example response shows quota_total 250 for posts and 1,000 for replies, both with quota_duration 86,400 seconds, which is 24 hours.
The delete and location search quotas were added on July 14, 2025, and Meta's example response doesn't show a figure for either. The collection itself sends readers to Meta's online documentation for "the most accurate and up-to-date details" on Threads limits. For the rest of the Threads flow, see Threads API publishing.
The X-App-Usage header
Meta's collections include example responses with their headers, which show what the usage headers look like. Sixteen example responses in the Instagram API with Instagram Login folder carry it, all with the same value:
x-app-usage: {"call_volume":0,"cpu_time":0}
The Messenger collection's examples, which call graph.facebook.com, show the same header with different keys:
x-app-usage: {"call_count":0,"total_cputime":0,"total_time":2}
So the key names depend on which API answered. Parse the header as JSON and log every key you get, rather than expecting one shape. Meta's GitHub sources don't say what unit the values are in, what value triggers throttling, or how long the window is.
The X-Business-Use-Case-Usage header
47 of the Messenger collection's example responses return a second header instead:
x-business-use-case-usage: {"106259855420533":[{"type":"messenger","call_count":1,"total_cputime":1,"total_time":1,"estimated_time_to_regain_access":0}]}
The top-level key is an object ID; in the persistent menu examples it's the Page ID from the request path. Each entry has a type, and the examples show three: messenger, pages (on the webhook subscription calls and some persistent menu calls) and messenger_utility_messages. The field to watch is estimated_time_to_regain_access. Its name suggests the wait before calls work again, but it's 0 in every example and Meta's samples don't give its unit.
In Meta's examples, the Instagram Login calls return only X-App-Usage, and the Instagram calls through Facebook Login show no usage header at all. The collections don't say whether that's how Instagram always behaves or just what these examples captured. They also don't say which header wins when both appear on the same response.
Error codes when you're throttled
Meta's GitHub sources name two rate-limit error codes:
| Code | Meta's explanation | Where |
|---|---|---|
| 4 | "Application request limit reached." Suggestion: "Reduce the frequency of API calls or request a rate limit increase." | JavaScript SDK sample (fbrell) |
| 341 | "Too many post requests." Suggestion: "Reduce posting frequency. Rate limits apply per user and per app." | same file |
Meta's WhatsApp tech provider sample treats code 4, or subcode 2388093, as rate limited and answers its own front end with HTTP 429 and "Too many requests. Please wait and try again." That 429 is the sample's own response to its users; the sources don't show what HTTP status the Graph API itself returns.
Third-party guides also list codes 17, 32, 613 and 80000-series codes for business use case limits. None of them appears in the Meta GitHub sources we read, so we don't describe them. Meta's Instagram publishing guide points to an error codes reference without listing codes.
What Meta's SDKs do with limits
Neither of Meta's Business SDKs throttles for you. Both give you what you need to do it yourself:
- Python:
FacebookResponse.headers()returns the response headers, and aFacebookRequestErrorexposeshttp_headers(),api_error_code(),api_error_subcode()andapi_transient_error(), which reads Meta'sis_transientflag. The SDK's own video uploader waits one second and retries when an error is marked transient. - Node.js:
api.setShowHeader(true)adds the response headers to each result underheaders, andFacebookRequestErrorcarriesheaderstoo. - Batches: the Python README warns that "a batch call simply improves network performance and each call does count individually towards rate limiting."
Neither SDK reads X-App-Usage or X-Business-Use-Case-Usage itself.
Facebook Pages
Meta's GitHub sources give no publishing quota or call limit for Facebook Page posts. What they show for Pages is the X-Business-Use-Case-Usage header with type pages on the webhook subscription calls, and one feature limit from Page messaging: Messenger's user-level persistent menu settings "are rate limited to 10 calls per user per 10 min."
Both Meta collections give the same advice for reacting to activity. The Instagram collection "strongly recommend[s] using webhooks to prevent rate limiting" when reading comments, and the Messenger collection says webhooks "avoid rate limits" that polling would cause. Meta webhooks covers the setup.
What this page doesn't cover
Meta's public GitHub sources don't state:
- the formula for the app-level limit or for business use case limits;
- the length of the window either header measures;
- whether Meta's Marketing API and Instagram use business use case limits, or which limit applies when both do;
- the HTTP status of a throttled response;
- any per-hour call limit for Instagram, Threads or Pages.
Those are on Meta's rate limiting page in its developer documentation. Read them there, and treat any number you find quoted elsewhere as unconfirmed until you do.
What to do next
- Business owners: If posts from a scheduling tool sometimes fail on busy days, ask the vendor whether it checks Instagram's
content_publishing_limitbefore publishing. A tool that does can hold a post back instead of losing it. - Marketers and agencies: Spread bulk uploads across the day. The publishing quotas run per account over 24 hours, so a full week queued for one Instagram or Threads account at once can run into them.
- Developers: Call
content_publishing_limitorthreads_publishing_limitbefore each publish and skip or delay when the quota is used. ParseX-App-UsageandX-Business-Use-Case-Usageas JSON on every response and log them, back off whenestimated_time_to_regain_accessis above 0 or you get code 4 or 341, use webhooks instead of polling, and keep your Graph API version current.
Questions people ask
What is the Instagram API rate limit for publishing?
Meta's own GitHub sources give three numbers per Instagram account: 100 API-published posts in a 24-hour moving period (Postman publishing guide), 50 (the same collection's carousel request) and 25 (an older Reels sample). Don't hard-code any of them. Read the account's live quota from GET /{ig-user-id}/content_publishing_limit with fields=config,quota_usage.
How many posts can the Threads API publish per day?
The example response in Meta's Threads Postman collection shows a quota of 250 posts and 1,000 replies, each with a quota_duration of 86,400 seconds (24 hours). It's an example, so read each profile's real figures from GET /me/threads_publishing_limit before a bulk job.
What does the X-App-Usage header mean?
It's a response header that reports how much of its call budget your app has used. Meta's Instagram Login examples show it as {"call_volume":0,"cpu_time":0}, and the Messenger examples as call_count, total_cputime and total_time. Meta's GitHub sources don't say what the numbers are measured in or at what value calls are blocked.
Which error code means I hit a Graph API rate limit?
Meta's samples name two. Its JavaScript SDK sample explains code 4 as "Application request limit reached" and code 341 as "Too many post requests", and its WhatsApp sample treats code 4 as rate limited. Codes 17, 32 and 613, which third-party guides list, don't appear in any Meta GitHub source we read.
Do batch requests get around Graph API rate limits?
No. The README of Meta's Python Business SDK says a batch call "simply improves network performance and each call does count individually towards rate limiting."
Sources
- Meta on GitHub: Instagram Platform API Postman collection (fbsamples/messenger-platform-samples)
- Meta on GitHub: Messenger Platform API Postman collection (fbsamples/messenger-platform-samples)
- Meta on GitHub: Threads API Postman collection (fbsamples/threads_api)
- Meta on GitHub: Threads API sample app, publishing limit route (fbsamples/threads_api)
- Meta on GitHub: Instagram Reels publishing sample README (fbsamples/reels_publishing_apis)
- Meta on GitHub: Instagram Reels publishing sample app (fbsamples/reels_publishing_apis)
- Meta on GitHub: Python Business SDK exceptions (facebook/facebook-python-business-sdk)
- Meta on GitHub: Python Business SDK README (facebook/facebook-python-business-sdk)
- Meta on GitHub: Node.js Business SDK API client (facebook/facebook-nodejs-business-sdk)
- Meta on GitHub: JavaScript SDK sample error explanations (fbsamples/fbrell)
- Meta on GitHub: WhatsApp tech provider sample, Graph API error mapping (fbsamples/business-messaging-sample-tech-provider-app)
- Our changelog: Threads publishing limit adds quotas for deletions and location search
Related
- API
LinkedIn Posts API: what you can schedule and how
LinkedIn's Posts API publishes text, images, video, documents, polls and multi-image posts but has no schedule field. How tools schedule, permissions, limits.
- Tools
Open-source social media schedulers you can self-host
Four open-source schedulers you can run yourself: Postiz, TryPost, Mixpost Lite and SkyScheduler. Licences, networks, what self-hosting takes, hosted prices.
- Tools
Free social media schedulers: all 39 free plans, verified
The best free social media scheduler for most people is Zoho Social (6 accounts) or Buffer (any 3 of 11 networks). All 39 free plans compared, with check dates.
- API
Instagram Content Publishing API: posts, reels, carousels
How the Instagram Content Publishing API works on both logins: containers, reels, carousels of up to 10, stories, and why Meta gives 100, 50 or 25 posts a day.