Skip to content

Engineering

Fix: Instagram "Media ID is not available" on media_publish

Meta's Instagram Content Publishing API returns "Media ID is not available" (listed in Meta's error reference as code 9007, subcode 2207027, "media not ready", and also seen as code 100) when a `media_publish` call arrives before the container it references has finished processing. It affects single images and carousel parents as well as video.

By Angelina F. · Updated · 7 min read

Instagram's "Media ID is not available" error means media_publish was called before the media container finished processing; Meta lists it as error 9007, subcode 2207027, and it can also come back as code 100. Fix it by polling the container's status_code until it reads FINISHED, about once a minute for up to five minutes, then publishing.

Key takeaways

  • Instagram's Content Publishing API is URL ingestion, not a byte upload — POST /{ig-user}/media returns a container id the moment the request is ACCEPTED, before Meta has fetched or assembled anything.
  • Meta requires polling GET /{container-id}?fields=status_code until it reads FINISHED before calling media_publish; publishing early returns exactly "Media ID is not available" (code 100).
  • A common bug: an integration polls for readiness, but gates the wait on a video-only check — so only video posts ever wait, and every other shape (single image, image story, every carousel child, and the carousel parent itself) is published unguarded.
  • The carousel PARENT is the likeliest of all of them to still be IN_PROGRESS at publish time, because Meta has to assemble it out of N already-uploaded children — and an integration that only waits for video never waits for it.
On this page

Which Instagram posts get "Media ID is not available"?

The error is not limited to video. A single image and a five-image carousel can both fail with Meta's "Media ID is not available" at media_publish even when the media itself is fine: every carousel card can be a clean 1080×1350 JPEG, and the same account can publish other posts without issue the same day.

That pattern is the tell. The one shape that never fails is the one shape the integration always waits for.

Illustration: a stack of photo cards inside a container box on a conveyor with a green status ring, one card slipping out early with a coral warning dot, and a hand waiting by a publish button.
Publish only once Instagram says the container is ready.

Why does Instagram need a readiness check before publishing?

Instagram's Content Publishing API never receives file bytes from a third-party app directly — your app hands Meta a URL, and POST /{ig-user}/media returns a container id the instant the request is ACCEPTED, well before Meta has actually fetched or processed anything from that URL. Meta's documented contract is to poll GET /{container-id}?fields=status_code until it reads FINISHED, and only then call media_publish — publishing against a container that is still IN_PROGRESS is refused with error code 100 and exactly the message "Media ID is not available".

The defect is narrower than "no poll at all" and easy to miss: when the code that decides whether to wait is gated on a video-only check, the only content shape that ever actually waits is the only shape that never fails.

Instagram media container status_code values (Meta developer docs, November 2026)
status_codeWhat it meansWhat to do
IN_PROGRESSMeta is still fetching or processing the mediaWait and poll again
FINISHEDThe container is ready to publishCall media_publish
PUBLISHEDThe container's media is already liveTreat as done; do not publish again
ERRORProcessing failedFix the media and create a new container
EXPIREDNot published in its 24-hour windowCreate a new container
  1. Create the container

    POST /{ig-user-id}/media with the media URL; keep the container id it returns.

  2. Poll its status

    GET /{container-id}?fields=status_code, about once a minute for up to five minutes, as Meta recommends.

  3. Publish on FINISHED

    Call media_publish only when the status is FINISHED (or skip it if PUBLISHED).

  4. Handle the rest

    On ERROR or EXPIRED, fix the media and start a new container instead of retrying the old one.

How do you fix "Media ID is not available"?

Left unguarded: the single feed image, the image story, every carousel child, and — the case most integrations never wait for — the carousel PARENT, which Meta has to assemble out of N already-processed children and is therefore the single most likely container of all of them to still be IN_PROGRESS when media_publish arrives.

The fix is to make the readiness poll unconditional across every call site instead of video-only, with one hardening rule: a container that already reads PUBLISHED counts as ready too, since it is a terminal state and waiting for it to further become FINISHED would hang forever on a container Meta has already moved past.

Diagram: create the media container, poll its status_code until FINISHED, publish with media_publish, and for a carousel wait for the parent container too.
Publishing an Instagram container without the race.

What should every Instagram integration do?

If your integration polls container status only for video, and you have not seen this error on an image post yet, that is very likely luck rather than correctness — images typically process faster than video, so the readiness race is narrower but not absent. Poll every container to FINISHED (or PUBLISHED) before calling media_publish, with no exception for content type, and remember that a carousel parent is its own container with its own readiness state, separate from its children's. If a container ends in ERROR instead, check the file against the Instagram media specs.

How does SkedCast avoid "Media ID is not available"?

Every Instagram container SkedCast creates, image, story, each carousel card and the carousel parent, waits for a terminal status before it is published, within the five-minute window Meta suggests. A container that reports ERROR or EXPIRED is flagged with Meta's reason rather than retried, and one still processing at the deadline is tried again on the next attempt, which cannot double-post because an unpublished container is never live. See the Instagram scheduler for every format, and why scheduled social posts fail for the other common causes.

instagram media id is not availableinstagrammeta graph apimedia_publishtroubleshooting

FAQ

How long should I wait before publishing an Instagram container?
Until its status_code reads FINISHED. Meta recommends checking about once a minute for up to five minutes; an unpublished container expires after 24 hours.
What error code is "Media ID is not available"?
Meta's error reference lists it as code 9007 with subcode 2207027, media not ready. It can also come back as code 100 with the same message.
What does Instagram's "Media ID is not available" error (code 100) actually mean?
It means media_publish was called against a container Meta has not finished processing: the container has an id, but its status_code is not FINISHED. Meta's error reference lists it as code 9007, subcode 2207027 (media not ready); it can also arrive as code 100 with this message.
Does this error only happen with video posts?
No. It is often assumed to be video-only because video containers take visibly longer to process, but a single image, an image story, and — especially — a carousel's parent container can all still be IN_PROGRESS at publish time under the wrong timing.
How do I check if an Instagram media container is ready to publish?
Call GET /{container-id}?fields=status_code and check for FINISHED (or PUBLISHED, which is also terminal) before calling media_publish against that container id. Poll on an interval rather than a single check, since processing time varies.
Why would a carousel be more likely to fail than a single image?
A carousel's parent container is assembled out of every child container after each child has already processed, which makes the parent's own readiness a separate, following event — and the one most integrations forget to wait for since attention naturally goes to the children.
Is this a rate-limit or authentication problem?
No — it is purely a timing/readiness issue local to one container. It is unrelated to OAuth token validity or Instagram's publishing rate limits, and re-authenticating will not fix it.
Will retrying the same media_publish call fix it?
It can appear to, purely by luck, if enough time has passed between the failed attempt and the retry for the container to finish processing on its own — but the reliable fix is to poll status_code to a terminal state before ever calling media_publish, not to retry blind.

Ready to broadcast everywhere?

Sign up free — no credit card. You land on the Free plan, and you can start a one-time 7-day Studio trial from your workspace whenever you are ready. Connect your first accounts, import a batch, and watch one post fan out across every platform.