Instagram Reels resumable upload (rupload) vs a public video_url

Instagram Reels can publish from a public video_url or a resumable rupload. Resumable is Facebook Login only; check your Sume media link is reachable first.

5 min readSume
All posts

To publish a Reel you can either give Instagram a video_url on a publicly reachable server, or upload the bytes yourself with upload_type=resumable to rupload.facebook.com. The resumable route is documented for Facebook Login only; with Instagram Login you use video_url.

These facts come from Meta's Instagram Platform content publishing pages, read 2026-10-02. Sume facts come from media inputs. Sume does not publish to Instagram; it produces the MP4 you hand to either route.

What does each route need?

Both start with a container: POST /<IG_ID>/media with media_type=REELS. Then POST /<IG_ID>/media_publish, and GET /<IG_CONTAINER_ID>?fields=status_code in between to see IN_PROGRESS, FINISHED, ERROR, EXPIRED or PUBLISHED.

video_url versus resumable upload (read 2026-10-02)
Itemvideo_urlResumable
Container parametervideo_url=<public URL>upload_type=resumable
Upload callNone; Instagram fetches itPOST to rupload.facebook.com/ig-api-upload/<container id>
HeadersNot applicableAuthorization, offset, file_size
LoginFacebook Login or Instagram LoginFacebook Login only
File locationPublic server at publish attemptLocal file or publicly hosted video

Is a Sume media link public enough?

Meta's page says the media must be on a publicly accessible server at the moment of the publishing attempt. Sume results are media.sume.com HTTPS URLs, but the docs we read do not promise that Instagram's fetcher can reach every artifact, so do not assume it.

Test it the way Instagram would: request the URL with no Authorization header and no cookies, and confirm a 200 with a video content type. If that fails, download the file and use the resumable route (Facebook Login) or host it somewhere you control.

# 1. Reachability check, no credentials
curl -sI "https://media.sume.com/artifacts/artf_demo/reel-a.mp4" | head -5

# 2. Create the Reels container from that URL
curl -X POST "https://graph.facebook.com/v26.0/$IG_ID/media" \
  -d media_type=REELS \
  -d video_url="https://media.sume.com/artifacts/artf_demo/reel-a.mp4" \
  -d caption="Test" \
  -d access_token="$IG_TOKEN"

# 3. Poll until FINISHED, then publish
curl "https://graph.facebook.com/v26.0/$CONTAINER_ID?fields=status_code&access_token=$IG_TOKEN"

What does the resumable route look like?

After creating the container with upload_type=resumable, send the file to POST https://rupload.facebook.com/ig-api-upload/<IG_MEDIA_CONTAINER_ID> with the Authorization, offset and file_size headers. Meta's page says it supports local files and hosted videos. The page does not give per-chunk size rules, so read the full reference before writing a chunked client.

Use it when your file lives behind auth or on a machine Instagram cannot reach. Skip it when video_url already works: fewer moving parts.

What does the page not tell me?

The pages we fetched list no video length, file size, aspect ratio, frame rate or codec limits for Reels. Do not invent them; preflight your file with video inspect, whose probe is unbilled, and compare against the requirements in Instagram Reels API video requirements.

Rate limit on the publishing page: 100 API-published posts within a 24-hour moving period. See the bulk-run sizing post before queuing a batch.

How do I decide in practice?

Start with video_url. It is one fewer call and works under both logins. Move to resumable only when the reachability test fails or when the file is large enough that you want control over the transfer, and only if your app uses Facebook Login.

Whichever route you pick, create a new container on ERROR or EXPIRED rather than reusing the old one, and log the container id next to your Sume job id so a failed publish can be traced back to the exact artifact that produced it.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume