Instagram API Rate Limits: Every Limit and Error Code
Instagram API rate limits come in three layers. Most calls are capped at 4,800 × the account's impressions per rolling 24 hours. Hashtag Search and Business Discovery are capped at 200 × your app's users per hour. Publishing is capped at 100 API posts per account per 24 hours. Response headers show your usage, and errors 4, 17, 613, or 80002 mean you're throttled.
There are several Instagram API rate limits. The Instagram API caps most calls at 4,800 × the account's impressions per rolling 24 hours. It caps Hashtag Search and Business Discovery at 200 × your app's users per hour, and publishing at 100 API posts per account per 24 hours. Messaging has its own per-second limits.
The figure most guides repeat, "200 calls per user per hour", is the platform formula. For Instagram, Meta applies it only to Business Discovery and Hashtag Search.
What is the Instagram API rate limit?
Meta's Instagram Platform overview says every endpoint falls under Instagram's business use case (BUC) limit, except Business Discovery and Hashtag Search, which fall under platform limits. Publishing and messaging add their own caps on top.
| Limit | What it covers | Meta's rule | Window |
|---|---|---|---|
| Instagram BUC | Almost every Instagram endpoint | 4,800 × impressions | Rolling 24 hours |
| Platform | Business Discovery, Hashtag Search | 200 × number of users | Rolling 1 hour |
| Publishing | media_publish |
100 API-published posts per account | 24-hour moving period |
| Messaging | Conversations, Send API, private replies | Per-second or per-hour calls per account | Per second or per hour |
Sources: Rate limiting, content publishing, and the overview.
How is the Instagram rate limit calculated?
For most calls, the cap is 4,800 multiplied by the account's impressions in the last 24 hours. Meta defines impressions as the number of times any content from the account entered a person's screen. A busy account gets a big budget, and a new account with almost no reach gets a small one.
| Instagram BUC limit | Platform limit | |
|---|---|---|
| Formula | Calls within 24 hours = 4,800 × impressions | Calls within one hour = 200 × number of users |
| Counted per | Each app and app user pair | Your app (and each user's calls) |
| Instagram endpoints | Everything except the two below | Business Discovery, Hashtag Search |
| Usage header | X-Business-Use-Case-Usage |
X-App-Usage |
| Throttle error code | 80002 | 4 (app) or 17 (user) |
Source: Meta's rate limiting docs.
Because the BUC count is unique to each app and app user pair, one heavy account can't drain the budget of another. It also means a test account with few impressions can hit the cap well before a real customer would.
How many posts can I publish per day via the API?
100 API-published posts per Instagram account in a 24-hour moving period, per Meta's content publishing docs. Meta enforces the cap on POST /<IG_ID>/media_publish, and a carousel counts as one post.
Meta's own pages disagree on the number. The same content publishing page says 100 in its rate limit section and 50 in its carousel section, and the content_publishing_limit reference lists quota_total as 50. Read quota_total for each account rather than hard-coding either figure.
When an account hits the cap, publishing fails with code 9, subcode 2207042: "You reached maximum number of posts that is allowed to be published by Content Publishing API." Meta's error codes reference says to have the user try again the following day. For the full publishing flow, see how to post to Instagram via API.
How do I check my Instagram API usage?
Read the usage headers on every response, and call content_publishing_limit before you publish. Both come from Meta's rate limiting and content_publishing_limit docs.
X-Business-Use-Case-Usage. A JSON string keyed by business object ID. Each entry hastype(instagramfor Instagram calls),call_count,total_cputime,total_time, andestimated_time_to_regain_accessin minutes.X-App-Usage. Your app's platform usage:call_count,total_cputime, andtotal_time, each a whole-number percentage of the limit over a rolling hour.content_publishing_limit. Returnsquota_usage, the containers published in the window. Addfields=quota_usage,configto also getquota_totalandquota_duration(86400 seconds).
curl -G "https://graph.instagram.com/v25.0/<IG_USER_ID>/content_publishing_limit" \
--data-urlencode "fields=quota_usage,config" \
--data-urlencode "access_token=<ACCESS_TOKEN>"Use graph.instagram.com with Instagram Login and graph.facebook.com with Facebook Login. The optional since parameter takes a Unix timestamp no older than 24 hours.
What do Instagram rate limit error codes mean?
The error code in the response body tells you which limit you hit. Meta's rate limiting docs don't document an HTTP 429 for these, so branch on error.code.
| Code | Subcode | Meaning | Source |
|---|---|---|---|
| 4 | The app whose token made the call hit its rate limit | Rate limiting | |
| 17 | The user whose token made the call hit their rate limit | Rate limiting | |
| 32 | Rate limit on a Pages API request (user or app) | Rate limiting | |
| 613 | A custom rate limit was reached | Rate limiting | |
| 613 | 1996 | Meta noticed inconsistent request volume from your app | Rate limiting |
| 80002 | Instagram business use case limit reached | Rate limiting | |
| 9 | 2207042 | The account hit its daily publishing limit | Error codes |
| 4 | 2207051 | Publishing action suspected to be spam | Error codes |
Subcode 1996 is the one bursty apps hit. Meta saw irregular request volume from your app, so the fix is to even out your traffic.
Why do I get "Application request limit reached"?
If that message arrives with code 4, your app has hit its platform rate limit, even when your dashboard shows plenty of headroom. On Instagram, platform limits only cover Business Discovery and Hashtag Search, and they're counted separately from the BUC budget most dashboards show.
So an app can be fine on its 4,800 × impressions budget and still be throttled on Business Discovery, which allows 200 × users per hour. Check X-App-Usage on those responses, not X-Business-Use-Case-Usage.
Is error 2207051 a rate limit?
No. Code 4 with subcode 2207051 is an action block, not a quota. Meta's error codes reference says the publishing action is suspected to be spam, with the message "We restrict certain activity to protect our community."
Retrying the same post on a timer won't clear it, because no counter is running down. Change what you're posting (repeated near-identical captions or media are a common trigger developers report), slow the cadence, and if the block looks wrong, the account owner can tell Instagram it made a mistake.
How should I handle Instagram API rate limits?
Stop calling the moment you're throttled. Meta's rate limiting docs say continued calls keep raising your call count, which pushes recovery further out. A tight retry loop makes a throttle last longer.
- Branch on the error code. Treat 4, 17, 32, 613, and 80002 as throttles. Treat 2207051 as a content problem and 2207042 as a daily cap.
- Pause per account. BUC limits are per app and user pair, so pause the one account, not your whole queue.
- Wait the time Meta gives you. Use
estimated_time_to_regain_accessfromX-Business-Use-Case-Usageas your backoff. - Spread requests out. Meta recommends spreading queries evenly to avoid spikes, which also keeps you clear of subcode 1996.
- Ask for less. Use
fieldsfilters to shrink responses and avoid calls that fetch overlapping data. - Use webhooks over polling for comments and messages, so you aren't spending calls to discover nothing changed.
const THROTTLE_CODES = new Set([4, 17, 32, 613, 80002]);
function backoffMinutes(response, body) {
const code = body?.error?.code;
const subcode = body?.error?.error_subcode;
if (code === 4 && subcode === 2207051) return null; // action block: don't retry
if (!THROTTLE_CODES.has(code)) return 0;
const usage = JSON.parse(response.headers.get("x-business-use-case-usage") ?? "{}");
const waits = Object.values(usage).flat().map((u) => u.estimated_time_to_regain_access ?? 0);
return Math.max(5, ...waits); // fall back to 5 minutes when no estimate is given
}The 5-minute floor is our own default, not a Meta number. Tune it to your traffic.
What are the Instagram DM and private reply limits?
Messaging is limited per Instagram professional account, per second or per hour, separately from the call cap. The figures below are from Meta's Instagram Platform overview.
| Endpoint | Limit per account |
|---|---|
| Conversations API | 2 calls per second |
| Send API: text, links, reactions, stickers | 100 calls per second |
| Send API: audio or video | 10 calls per second |
| Private replies: posts and Reels | 750 calls per hour |
| Private replies: Instagram Live | 100 calls per second |
The private replies docs add two timing rules. You can send one message to the commenter, within 7 days of the comment (or during the broadcast, for Live). Follow-ups are allowed only after the person responds, within 24 hours of that response. The Instagram messaging API guide covers those windows in full.
Where does Adeli fit?
Meta's limits still apply when you publish through Adeli. What Adeli takes off your plate is the setup. Adeli holds the Meta developer app, carried Meta's review, and refreshes every connected account's tokens, so you hold one API key. It publishes feed posts, Reels, Stories, and carousels to Instagram from the same posting API endpoint as every other network, and returns a per-platform status on every publish plus a webhook when anything changes. The Instagram publish reference has the request format.
On cost, your first 3 connected accounts are free, and there are no per-post fees on Instagram. Is the Instagram API free? covers what building directly costs in time.