If you would rather not build the publishing flow yourself, PostWharf, the tool we make, publishes to Instagram from one API call and gives every post a delivery receipt that says, network by network, whether it went out and why not if it did not.
Instagram API limits at a glance
Every figure in this table comes from Meta's developer documentation, read on 10 November 2026. The sections below explain the main rows and link the pages they come from.
| Limit | Figure | Counted per | Window |
|---|---|---|---|
| Posts published through the API | 100 or 50, depending on the page | Instagram account | Moving 24 hours |
| Media containers created | 400 | Instagram account | Rolling 24 hours |
| Life of an unpublished container | 24 hours, then it expires | Container | Not applicable |
| Images and videos in one carousel | 20 in the publishing guide; the error message for subcode 2207028 still says no more than 10 | Post | Not applicable |
| API calls, apart from the two rows below | 4,800 × impressions | App and account pair | Rolling 24 hours |
| Business Discovery and Hashtag Search calls | Meta's Platform Rate Limits, not the formula above | App or user | Rolling hour |
| Messaging calls | Their own limits, such as 2 calls a second for the Conversations API | Instagram account | Per second or per hour |
Posts per day: Meta publishes both 100 and 50
Four lines in Meta's documentation state the daily publishing cap, and they do not agree.
| Meta page | Where on the page | Figure it gives | Page last updated |
|---|---|---|---|
| Content publishing guide | Rate Limit | 100 API-published posts in a 24-hour moving period | 20 October 2026 |
| Content publishing guide | Create a carousel container, Limitations | 50 published posts in a 24-hour period | 20 October 2026 |
| IG User Media Publish reference | Limitations | 50 posts in a 24-hour moving period | 28 September 2026 |
| IG User Content Publishing Limit reference | The quota_total field | Currently 50 | 23 July 2024 |
The updated date belongs to the whole page, so it cannot settle which sentence is current. The guide contradicts itself a few screens apart, under one date.
Other guides add a third number. The three top results we read for this search on 10 November 2026 give 25, 50 and 100 between them. None of the Meta pages above gives 25 as a publishing cap.
Two working rules follow. First, do not hard-code any of these numbers: ask Instagram for the account's own ceiling, as described below. Second, if you have to budget before you can ask, plan to 50, because a queue that never goes over 50 is inside the limit whichever line turns out to be right.
What counts against the daily cap
- The count is taken when you publish, not when you upload. Meta enforces the cap on
POST /<IG_ID>/media_publish. Creating a container uses none of it, though containers have a ceiling of their own: 400 per account in a rolling 24 hours, according to the IG User Media reference. - A carousel is one post. The 100 line and the guide's 50 line both say so. Its items are a different matter. Each image or video in a carousel is its own container and the carousel is one more, so a carousel at the guide's maximum of 20 items is 21 containers against the 400, and Meta states no exception for carousel items.
- Every published container counts the same. The limit endpoint counts how many times the account has published a container, and Meta's pages name no media type that is exempt. Read that way, a Reel or a Story uses one post just as a photo does.
- Only API publishing is counted. The guide's wording is a limit on API-published posts. It says nothing about posts made in the Instagram app.
- The cap sits on the account. Meta words it as a limit on the Instagram account, not on the app. Read that way, two tools publishing to the same account draw on one allowance.
- The window moves. There is no reset at midnight. A post stops counting 24 hours after it was published, so the allowance comes back one post at a time.
How to check an account's remaining allowance
Meta gives the allowance its own endpoint, on the same host you publish through:
GET https://graph.facebook.com/<API_VERSION>/<IG_USER_ID>/content_publishing_limit
?fields=quota_usage,config
&access_token=<ACCESS_TOKEN>
Apps that use Instagram Login call graph.instagram.com instead. The token needs the same permissions as publishing: instagram_business_basic and instagram_business_content_publish with Instagram Login, or instagram_basic, instagram_content_publish and pages_read_engagement with Facebook Login. Which of the two an account uses, and the account type it has to be, is covered in Instagram API publishing: accounts, Pages and breaks.
| Field | What it holds |
|---|---|
quota_usage | How many times the account has published a container in the last 24 hours, or since the since timestamp if you send one. Returned by default. |
config.quota_total | The most the account can publish in the window. This is the account's real ceiling. |
config.quota_duration | The length of the window in seconds, currently 86,400, which is 24 hours. |
The remaining allowance is config.quota_total minus quota_usage. If you leave fields out you get quota_usage alone, which tells you how many posts have gone out but not out of how many. The optional since parameter takes a Unix timestamp no older than 24 hours.
One oddity in the reference is worth knowing before you copy from it. Its sample request asks for a field named rate_limit_settings, which its own field table does not list. The table and the sample response both use config.
Meta also recommends that your app enforce the limit itself, especially if it lets people schedule posts ahead. For a scheduler that means three things: count the posts due for one account across any 24-hour span, not per calendar day; read the endpoint before a large batch; and stop the batch at the first refusal instead of sending the rest.
The separate cap on API calls
The daily post cap is not the only way to be refused. Almost every call to an Instagram endpoint also counts towards a call allowance that Meta's rate limiting page works out like this:
Calls within 24 hours = 4800 × Number of Impressions
The count is kept separately for each pairing of app and Instagram account, over a rolling 24 hours. Impressions are the number of times any content from that account appeared on someone's screen in the last 24 hours. An account whose content was seen 1,000 times in the past day therefore gives your app 4.8 million calls for it, and one seen 10 times gives 48,000.
Meta's formula for Threads is identical and adds a floor of 10 impressions. The Instagram section states no floor, so the documentation does not say what an account with nothing seen in the last day is allowed.
Three details decide how fast the allowance is spent:
- Each ID is a call. One request that names three IDs counts as three calls, not one.
- Publishing takes several calls. A photo is two: create the container, then publish it. A carousel at the guide's maximum of 20 items is at least 22: 20 item containers, the carousel container and the publish. Video adds one call for every status check, and Meta recommends checking once a minute for no more than five minutes.
- Time counts as well as calls. Responses under this limit carry an
X-Business-Use-Case-Usageheader. Its entry of typeinstagramreportscall_count,total_cputimeandtotal_timeas percentages, and calls may be throttled when either time figure reaches 100.
Two groups of endpoints sit outside the formula. Business Discovery and Hashtag Search follow Meta's Platform Rate Limits, which allow 200 calls an hour multiplied by the app's users for calls made with an app token, and an undisclosed number for each user token. Messaging endpoints have fixed limits for each Instagram account, such as 2 calls a second for the Conversations API and 750 calls an hour for private replies to comments on posts and Reels.
What the refusal looks like
The two limits fail with different codes, and the wait is different too. The table also lists the platform rate limit and the spam block, which are refused differently again.
| Limit reached | Code | Subcode | What Meta says it means | When to send again |
|---|---|---|---|---|
| Daily publishing cap | 9 | 2207042 | The account has reached its daily publishing limit. | Once the window has moved on. Meta's advice is to try again the following day. |
| Call allowance for an Instagram account | 80002 | None listed | The app has reached its Business Use Case rate limit for Instagram. | After the minutes given in the header's estimated_time_to_regain_access. |
| Platform rate limit | 4 for the app, 17 for the user | None | The app or the user behind the token has reached its rate limit. | When the call count has dropped back under the limit. |
| Suspected spam | 4 | 2207051 | Instagram suspects the publishing activity is spam. This is a block, not a quota. | Not on a timer. Slow down, and tell Meta if the block is a mistake. |
Meta lists subcode 2207042 under HTTP status 400. Its user message begins "You reached maximum number of posts", but that text follows the locale of the request, so match on the subcode, not on the sentence.
The cap is refused at the publish call, so by then the container already exists. Meta says an unpublished container expires after 24 hours. It does not say whether a container refused with 2207042 can still be published later, so read its status_code before you reuse it and create a new one if it reads EXPIRED or ERROR.
For the call allowance Meta's guidance is blunt: stop calling. Further calls keep adding to the count and lengthen the wait, which makes a tight retry loop the worst answer to either refusal. Which failures are worth sending again at all is covered in our guide to publishing retry rules. Throttling on other networks can be harder to see, because it sometimes hides behind a success response, which is the subject of rate limits that look like success.
What PostWharf does at Instagram's limits
With PostWharf you do not write the container, publish and status calls yourself. You send one post to the Instagram scheduling API, and each network it goes to gets its own row on the post's delivery receipt.
- PostWharf publishes no rate limit per API key. Throughput is bounded by each network's own limits. Plans carry a monthly post allowance, which is shown on the pricing page.
- Retries are kept for failures in transit. Those are sent again with backoff, without you. A rejection that would fail the same way again is left alone, and the reason stays on its row of the receipt.
- One network failing does not hide the others. A post that reached your other networks but not Instagram is marked
partial, andGET /v1/posts/:idreturns a delivery for each channel with its status, attempts, live URL and error text. - A carousel carries up to 10 files here. That is the lower of Meta's two figures, so a carousel that is accepted is inside both.
- Instagram's allowance stays the same. Meta words the cap as a limit on the Instagram account, so posts sent through PostWharf count towards it like any other API-published post.
PostWharf charges per brand, not per connected channel, and the REST API comes with every plan.
Sources consulted: Meta for Developers (developers.facebook.com): Content publishing, updated 20 October 2026 · Meta for Developers (developers.facebook.com): IG User Content Publishing Limit, updated 23 July 2024 · Meta for Developers (developers.facebook.com): IG User Media Publish, updated 28 September 2026 · Meta for Developers (developers.facebook.com): IG User Media, updated 28 September 2026 · Meta for Developers (developers.facebook.com): Graph API rate limits, no date shown on the page · Meta for Developers (developers.facebook.com): Instagram Platform overview, updated 29 October 2026 · Meta for Developers (developers.facebook.com): Instagram Platform error codes, updated 2 June 2026 · Meta for Developers (developers.facebook.com): Graph API error handling, no date shown on the page · All eight were read on 10 November 2026. Meta changes these pages without notice, so read the limit endpoint for the account before you rely on any figure here.
Common questions
How many posts a day can the Instagram API publish?
Meta's own pages give two figures, 100 and 50 API-published posts in a moving 24 hours, and a carousel counts as one post. Read the account's content publishing limit to see the ceiling that applies to it.
What happens when an Instagram account reaches its daily publishing limit?
The publish call is refused with code 9 and subcode 2207042. Meta's advice is to try again the following day, once the 24-hour window has moved on.
Is the limit on API calls separate from the limit on posts?
Yes. Instagram caps how many posts an account can publish in a moving 24 hours and, separately, how many API calls an app can make for that account. Reaching the call allowance is refused with code 80002, and the response header says how many minutes to wait.
PostWharf is priced per workspace rather than per connected channel, and every plan carries unlimited channels. See per-brand pricing.