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.

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.
| Item | video_url | Resumable |
|---|---|---|
| Container parameter | video_url=<public URL> | upload_type=resumable |
| Upload call | None; Instagram fetches it | POST to rupload.facebook.com/ig-api-upload/<container id> |
| Headers | Not applicable | Authorization, offset, file_size |
| Login | Facebook Login or Instagram Login | Facebook Login only |
| File location | Public server at publish attempt | Local 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
- reels_skip_rate: what the 3-second metric means and how to test hooks
reels_skip_rate is the share of Reel views that skipped in the first 3 seconds. Pull the opening frames and words with Sume video inspect to compare hooks.
- Reels views vs crossposted_views vs facebook_views: which to report
Instagram Reels insights list views, crossposted_views and facebook_views separately. Which to report, and how to trace Sume-made variants.
- Clickable transcript from Sume STT word timestamps in Python
Turn a Sume speech-to-text result into HTML where each word seeks the audio player to its start time. Runnable Python, with the result envelope handled safely.
- Sume job error category quota or queue vs 402 and 429
A Sume job error category quota means add funds or lower cost; queue means retry with the same key. They sit on the job, apart from 402 and 429 at submit.
Written by Sume