# Instagram API Rate Limits: Every Limit and Error Code

Instagram API rate limits explained: the 4,800 × impressions call cap, the 100-post cap, usage headers, and what error codes 4, 17, 613, and 80002 mean.

Canonical page: https://www.tryadeli.com/blog/instagram-api-rate-limit
Last updated: 2026-10-09

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

## The short answer

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](https://www.tryadeli.com/blog/instagram-api-guide) 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](https://developers.facebook.com/docs/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](https://developers.facebook.com/docs/graph-api/overview/rate-limiting), [content publishing](https://developers.facebook.com/docs/instagram-platform/content-publishing), and the [overview](https://developers.facebook.com/docs/instagram-platform/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](https://developers.facebook.com/docs/graph-api/overview/rate-limiting).

**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](https://developers.facebook.com/docs/instagram-platform/content-publishing). 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](https://developers.facebook.com/documentation/instagram-platform/instagram-graph-api/reference/ig-user/content_publishing_limit) 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](https://developers.facebook.com/documentation/instagram-platform/instagram-graph-api/reference/error-codes) says to have the user try again the following day. For the full publishing flow, see [how to post to Instagram via API](https://www.tryadeli.com/blog/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](https://developers.facebook.com/docs/graph-api/overview/rate-limiting) and [`content_publishing_limit`](https://developers.facebook.com/documentation/instagram-platform/instagram-graph-api/reference/ig-user/content_publishing_limit) docs.

- **`X-Business-Use-Case-Usage`.** A JSON string keyed by business object ID. Each entry has `type` (`instagram` for Instagram calls), `call_count`, `total_cputime`, `total_time`, and `estimated_time_to_regain_access` in minutes.
- **`X-App-Usage`.** Your app's platform usage: `call_count`, `total_cputime`, and `total_time`, each a whole-number percentage of the limit over a rolling hour.
- **`content_publishing_limit`.** Returns `quota_usage`, the containers published in the window. Add `fields=quota_usage,config` to also get `quota_total` and `quota_duration` (86400 seconds).

```bash
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](https://developers.facebook.com/docs/graph-api/overview/rate-limiting) |
| **17** | | The user whose token made the call hit their rate limit | [Rate limiting](https://developers.facebook.com/docs/graph-api/overview/rate-limiting) |
| **32** | | Rate limit on a Pages API request (user or app) | [Rate limiting](https://developers.facebook.com/docs/graph-api/overview/rate-limiting) |
| **613** | | A custom rate limit was reached | [Rate limiting](https://developers.facebook.com/docs/graph-api/overview/rate-limiting) |
| **613** | 1996 | Meta noticed inconsistent request volume from your app | [Rate limiting](https://developers.facebook.com/docs/graph-api/overview/rate-limiting) |
| **80002** | | Instagram business use case limit reached | [Rate limiting](https://developers.facebook.com/docs/graph-api/overview/rate-limiting) |
| **9** | 2207042 | The account hit its daily publishing limit | [Error codes](https://developers.facebook.com/documentation/instagram-platform/instagram-graph-api/reference/error-codes) |
| **4** | 2207051 | Publishing action suspected to be spam | [Error codes](https://developers.facebook.com/documentation/instagram-platform/instagram-graph-api/reference/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](https://developers.facebook.com/documentation/instagram-platform/instagram-graph-api/reference/error-codes) 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](https://developers.facebook.com/docs/graph-api/overview/rate-limiting) say continued calls keep raising your call count, which pushes recovery further out. A tight retry loop makes a throttle last longer.

1. **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.
2. **Pause per account.** BUC limits are per app and user pair, so pause the one account, not your whole queue.
3. **Wait the time Meta gives you.** Use `estimated_time_to_regain_access` from `X-Business-Use-Case-Usage` as your backoff.
4. **Spread requests out.** Meta recommends spreading queries evenly to avoid spikes, which also keeps you clear of subcode 1996.
5. **Ask for less.** Use `fields` filters to shrink responses and avoid calls that fetch overlapping data.
6. **Use webhooks over polling** for comments and messages, so you aren't spending calls to discover nothing changed.

```javascript
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](https://developers.facebook.com/docs/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](https://developers.facebook.com/docs/instagram-platform/private-replies) 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](https://www.tryadeli.com/blog/instagram-messaging-api) 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](https://www.tryadeli.com/product/instagram) 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](https://www.tryadeli.com/social-media-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](https://www.tryadeli.com/docs/api/posts/publish-instagram) 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?](https://www.tryadeli.com/blog/is-instagram-api-free) covers what building directly costs in time.

## Frequently asked questions

### How long until the Instagram API rate limit resets?

The windows roll, so there's no fixed reset time. For Instagram's business use case limit, the X-Business-Use-Case-Usage header includes estimated_time_to_regain_access, in minutes. For platform limits, Meta says to watch X-App-Usage. Either way, every call you make while throttled adds to the count and pushes recovery further out.

### Does the Instagram API return HTTP 429 when rate limited?

Meta's rate limiting docs don't mention HTTP 429. They describe throttling by error code in the response body: 4, 17, 32, 613, and 80002 for Instagram. Branch on the error code, not the HTTP status.

### Does a carousel count as one post toward the publishing limit?

Yes. Meta's content publishing docs say a carousel counts as a single post, whether it holds 2 items or 10. The limit is checked when you call media_publish, not when you create containers.

## Related Adeli pages

- [Instagram API for Developers](https://www.tryadeli.com/product/instagram.md): Publish, schedule, and read analytics for Instagram through one API. Adeli owns the Instagram developer app, token refresh, and Meta review. Free to start.
- [Social Media Posting & Scheduling API](https://www.tryadeli.com/social-media-posting-api.md): Adeli's social media posting and scheduling API publishes to Instagram, TikTok, YouTube, Facebook, X, and Bluesky in one request, now or at a set time. Free to start.
- [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.
