Instagram Reels over 15 minutes: split for the API with video trim
The app allows Reels up to 20 minutes; the Reels API stops at 15. Sume trim outputs up to 900 seconds, exactly 15 minutes. How to split a 20-minute video.

A Reel published through the Instagram API can be at most 15 minutes, while Instagram's own Reels page says Reels can be up to 20 minutes in the app. To publish a 16 to 20 minute video through the API you have to cut it into parts, and Sume's video trim can make each part: its output limit is 900 seconds, the same 15 minutes.
The numbers come from Meta's IG User Media reference ("15 mins maximum, 3 seconds minimum") and Instagram's Reels page, both read on 2026-10-02, plus Sume's video trim docs.
Which limit applies where?
The limits differ by surface, which is why a Reel that posts fine from the app can be rejected by a scheduler that uses the API.
| Surface | Maximum length | Source |
|---|---|---|
| Instagram app | 20 minutes | Instagram Reels page |
| Reels API | 15 minutes | Meta IG User Media reference |
| Sume video trim output | 900 seconds (15 minutes) | Sume docs |
| Sume video trim source | 1800 seconds (30 minutes) | Sume docs |
Should a long Reel be split at all?
Often yes, for reach rather than the limit. Instagram's page says Reels over 3 minutes will not be recommended to new audiences. A 20-minute lecture as one Reel is therefore a post for people who already follow you; four 5-minute parts, or a handful of 90-second parts, are candidates for discovery.
If you do need one long Reel, keep it to the app, or accept a 15-minute cut. Then check the file size too: 15 minutes must average about 2.7 Mbps to fit 300 MB, as worked out in the 300 MB post.
How do I plan the cuts?
Trim takes start and exactly one of end or duration, with duration from 0.2 to 900 seconds and sources up to 1800 seconds. The script below plans equal parts that each stay under a limit you choose, and prints the request bodies. It makes no network call, so it runs as is.
import json, math
def plan(total_s, max_part_s=900):
parts = math.ceil(total_s / max_part_s)
size = total_s / parts
return [{"start": round(i * size, 3), "duration": round(size, 3)}
for i in range(parts)]
for i, cut in enumerate(plan(1200)):
body = {"video_url": "https://media.sume.com/artifacts/artf_demo/talk.mp4", **cut}
print(f"part-{i + 1}", json.dumps(body))How do I send the cuts?
POST each body to /v1/video-trim with its own Idempotency-Key, such as talk-part-1, so a retry does not create a second job. Default mode is async: poll /v1/jobs/:id/status and read /v1/jobs/:id/result, which returns a new video_url and duration_seconds for each part. Each job costs $0.02.
Cut at a pause rather than at an exact midpoint. An exact trim is frame-accurate, but a cut in the middle of a word is still a cut in the middle of a word. A probe with transcription gives sentence boundaries if you want to place the split there.
What does Sume not do?
It does not publish the parts, number them, or link them as a series on Instagram. Each part is a normal file you publish with your own container call. The precision: "keyframe" option is faster and can start up to one GOP early, so for parts that must start on a given word, keep the default exact.
How should the parts be named and ordered?
Put the order in the caption and the first on-screen words, such as 'Part 1 of 2', because the files themselves carry no sequence. Publish part 1 first and wait for it to reach FINISHED and PUBLISHED before part 2, so the feed shows them in order. Instagram's guide describes Collab and Remix but nothing that links two Reels as a series, so do not promise viewers a Watch Next button.
One more limit to keep in mind: the source for a trim is capped at 1800 seconds, so a 45-minute recording cannot be trimmed in one step. Cut it into pieces under 30 minutes with keyframe precision first, which is a stream copy and fast, then use exact trims for the final Reels. Check each intermediate file with a probe-only inspect so you know its true duration before you plan the next range.
Sources
Related posts
More in Developers
- Is there an Instagram webhook when a Reel finishes processing?
Instagram's webhook field list has no Reel-finished event, so poll status_code. Sume job webhooks are signed; verify them with a secret that cannot be empty.
- 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.
- 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.
- Instagram Reels thumb_offset is in milliseconds: pick the frame first
thumb_offset takes milliseconds, defaults to 0, and loses to cover_url. Preview candidate frames with Sume video_frames before you publish the Reel.
Written by Sume