Errors & blockers

Instagram API error code 9007

What error code 9007 means for an Instagram media container, and how to tell a genuinely failed container from one that is simply not ready yet.

Quick answer

Error 9007 with subcode 2207027 means an Instagram media container is not currently publishable — but that one message covers three situations: still processing, expired after the 24-hour window, or already published. Check the container's status_code (IN_PROGRESS, FINISHED, PUBLISHED, EXPIRED, ERROR) before reacting: only IN_PROGRESS justifies waiting and retrying the publish call.

Error 9007, almost always paired with subcode 2207027, tells you a media container is not currently publishable — but that single message covers a container that is genuinely still processing, one that already finished processing but expired, and one that already published. Treating all three the same way is how a working integration ends up either giving up too early on a container that would have succeeded, or endlessly retrying one that never will.

PostGate handles OAuth, publishing and delivery evidence for every network through one API. Start free or read the docs.

01

What does Meta's documentation say?

Meta's own Instagram Platform error-codes reference documents subcode 2207027 under code 9007 with the message "The media is not ready for publishing, please wait for a moment." That framing is explicitly a not-yet-ready state — Meta's guidance is to wait and retry the publish call, not to treat it as a hard failure.

In practice, developers commonly report this same code/subcode pair on containers that are not merely slow — including ones that already expired or were already published. Meta's documentation does not distinguish those cases from the genuinely-still-processing one at the error level, so "not ready for publishing" is more accurately read as "not currently publishable, for one of a few possible reasons" than as a guarantee that waiting will resolve it.

02

How do you check which case you are actually in?

Rather than guessing from the error alone, query GET /{ig-container-id}?fields=status_code and read the actual state. Per Meta's content-publishing documentation, a container moves through IN_PROGRESS, FINISHED, PUBLISHED, EXPIRED, and ERROR. That single field tells you which of the three situations behind a 9007 you are actually in:

  • IN_PROGRESS — the container genuinely is not ready yet. This is the case Meta's 9007 message describes literally. See Instagram media container stuck in QUEUE for how to tell normal processing time from a genuinely stuck container.
  • EXPIRED — the container was not published within the 24-hour window and is gone. No amount of retrying the publish call will succeed; you need a fresh container from the original asset.
  • PUBLISHED — the container already published successfully, and this publish attempt is a duplicate call against an object that has nothing left to do. Check your own system for a double-submit before assuming Instagram is at fault.
  • ERROR — processing failed outright. This is a distinct terminal state from the other three, and it means the asset itself was rejected, not that timing is the issue.
03

What should you do for each case?

Once you know the actual status_code, the right response stops being a guess:

  • IN_PROGRESS: back off and retry the publish call after a short wait, using the same polling cadence you would use to check any container's status — Meta recommends roughly once a minute.
  • EXPIRED: stop retrying. Create a new container from the original media and publish that instead.
  • PUBLISHED: stop retrying, and check your own idempotency handling — a duplicate publish attempt on an already-published container is usually a client-side bug, not a platform issue.
  • ERROR: stop retrying the same container. Inspect the original asset against Instagram's format requirements and create a new container from a corrected file.

The common thread: a bare 9007 is retryable exactly once you have confirmed the container is actually IN_PROGRESS. Retrying blindly on every 9007 is what turns an expired or already-published container into a wasted retry loop.

04

How does PostGate handle error 9007?

PostGate tracks each platform destination as an independent target and checks the container's actual status_code internally before deciding whether to retry, rather than reacting to a bare 9007 at face value. A target that is genuinely still processing shows a distinct in-progress state in your delivery logs; one that expired or already published surfaces as a specific, terminal outcome instead of an endless retry loop.

Frequently asked questions

Should I retry Instagram error 9007?

Only after confirming the container is actually still processing. Query GET /{ig-container-id}?fields=status_code first: if it returns IN_PROGRESS, back off and retry the publish call on the polling cadence Meta recommends — roughly once a minute. If the status is EXPIRED, PUBLISHED, or ERROR, no retry of the same container will ever succeed, and retrying blindly on every 9007 just turns those cases into a wasted retry loop.

What does Instagram container status EXPIRED mean?

The container was not published within its 24-hour window and is gone. No amount of retrying the publish call will succeed against it — create a fresh container from the original media asset and publish that instead.

Why do I get error 9007 on a container that already published?

Because the publish attempt is a duplicate call against an object with nothing left to do — the container status is PUBLISHED. That is usually a client-side bug rather than a platform issue, so stop retrying and check your own idempotency handling for a double-submit before assuming Instagram is at fault.

What does Meta officially say error 9007 means?

Meta's Instagram Platform error-codes reference documents subcode 2207027 under code 9007 with the message "The media is not ready for publishing, please wait for a moment," and its guidance is to wait and retry. In practice, developers commonly report the same code on containers that already expired or already published, and Meta's docs do not distinguish those cases at the error level — so read it as "not currently publishable, for one of a few possible reasons," not a guarantee that waiting will resolve it.

Build it with PostGate

One API for every social platform your customers care about — sandboxed, documented, and ready today.

Start building Read the docs