One length gate for six ad platforms: caps table and Sume plan
Reels 15 min, Stories 60 min, TikTok 10 min, LinkedIn 30 min, Pinterest 5 min, Snap 180 s. Check one Sume Timeline length against all six with the plan call.

The longest video that fits six platforms at once is the shortest cap among them, which is Snapchat's 180 seconds for its single video ad. Sume Timeline's unbilled plan call returns the planned duration, so you can compare it with each platform's cap before paying for a render at $0.10 per output minute.
Caps are quoted from each platform's own spec page (read 2026-10-10). The Sume figures come from the Timeline and Video trim docs.
The caps
Instagram Reels ads list a video duration of 0 seconds to 15 minutes. Instagram Stories ads list 1 second to 60 minutes. TikTok non-Spark ads list up to 10 minutes. LinkedIn video ads list 3 seconds to 30 minutes. Pinterest video Pins list a minimum of 4 seconds and a maximum of 5 minutes. Snapchat's single image or video ad lists 3 to 180 seconds.
| Placement | Cap on the page | Longest Sume output that fits |
|---|---|---|
| Instagram Reels ad | 0 s to 15 min | 900 s (trim output cap) |
| Instagram Stories ad | 1 s to 60 min | 1800 s (Timeline cap) |
| TikTok non-Spark ad | Up to 10 min | 600 s |
| LinkedIn video ad | 3 s to 30 min | 1800 s (Timeline cap) |
| Pinterest video Pin | 4 s to 5 min | 300 s |
| Snapchat single video ad | 3 s to 180 s | 180 s |
Where Sume's own limits sit
Timeline takes an audio duration_seconds from 1 to 1800 and up to 200 video slots. Video trim takes a source up to 1800 seconds and outputs up to 900 seconds, with a minimum of 0.2 seconds. So the table's last column is the smaller of the platform cap and the Sume cap. A 15-minute Reels ad and a 30-minute LinkedIn ad both fit a Timeline render, and a 15-minute trim output equals the Reels cap exactly.
The gate
POST /v1/timeline-1.0/plan runs the schema, the Sume-host URL checks and the compiler. It returns duration_seconds, segment_count, billable_minutes and an estimated cost, and creates no job. The Timeline docs add that a plan cannot predict short-source pad or loop warnings, so the real result still matters.
A gate can be a few lines in your own pipeline: read duration_seconds from the plan, compare it with a dictionary of caps, and refuse to render when the cap is exceeded. Keep the minimums too, such as 3 seconds for LinkedIn and Snapchat and 4 seconds for Pinterest.
- Plan is free and needs no Idempotency-Key.
- Render needs an Idempotency-Key and costs $0.10 per output minute, rounded up.
- Trim costs $0.02 per job.
Using the shortest cap as a default
If you make one master that must post everywhere, cut it to 180 seconds or less and 4 seconds or more, and you clear all six lengths. Most paid social ads are far shorter, so the practical issue is usually the minimum, not the maximum. The pages also differ on ratio, size and codec, which this table does not cover; read each page for the placement you are buying.
The same table drives a simple release rule. Before a render, call the plan endpoint and read duration_seconds. If the value is above a platform's maximum, trim or shorten the audio spine and plan again; if it is below a minimum, lengthen it. Because the plan is unbilled and needs no Idempotency-Key, you can iterate as often as you need and pay only for the final render.
Keep in mind that the plan is a compile check, not a promise about the finished file. Timeline can pad or loop short sources and snap transitions, and the plan cannot predict those warnings, so the real duration_seconds in the result is the final word. Re-run your length check on that value, not on the plan, before you upload anywhere.
Sources
Related posts
More in Developers
- openapi-fetch with Sume's OpenAPI JSON: a typed client in 20 lines
Generate types from Sume's reference JSON with openapi-typescript, then call it with openapi-fetch and an x-api-key middleware. A type-checked sample.
- OpenRouter: poll video every 30 s. Sume: obey next_poll_after_seconds
OpenRouter recommends a 30 second poll on video. Sume's jobs API returns next_poll_after_seconds, else backoff. A Python poller that does both.
- OpenRouter's video expired event has no Sume twin: one normalizer
OpenRouter sends completed, failed, cancelled and expired video events; Sume sends three job events. A Python normalizer and verifier for both.
- Pick the cheapest Sume image row for a ratio and 3 refs (Python)
A 24-line Python script reads GET /v1/images/models and the endpoints route, filters by aspect ratio and reference count, and sorts by billed price.
Written by Sume