Free checks before a TikTok ad: Timeline plan, filter check, not trim
Timeline plan and Video filter check are unbilled on Sume. Trim has no check. A 10-minute ad with one trim, one filter and one render totals $1.04.

Two Sume media steps have a free check and one does not. POST /v1/timeline-1.0/plan and POST /v1/video-filter/check create no job, reserve no credits and run no encoder. The Video trim docs describe no check route, so a trim is validated only by sending it. For a 10-minute TikTok ad with one trim ($0.02), one filter encode ($0.02) and one render (10 minutes x $0.10 = $1.00), the paid total is $1.04 as of 2026-10-08, and the checks add nothing.
What each step offers
TikTok's non-Spark specs allow up to 10 minutes, 500 MB or less, at least 516 kbps, and the file types .mp4, .mov, .mpeg, .3gp and .avi. A paid mistake on a long file is more annoying than on a short one, so it is worth knowing which Sume calls you can test first.
| Step | Free check | Paid price | What the check returns |
|---|---|---|---|
| Timeline render | Yes, /v1/timeline-1.0/plan | $0.10 per output minute, ceil | duration_seconds, segment_count, billable_minutes, estimated cost, filtergraph summary |
| Video filter | Yes, /v1/video-filter/check | $0.02 per encode job | valid, diagnostics, compiled filter names, estimate, next_action |
| Video trim | None documented | $0.02 per job | Not applicable |
| Timeline compose | None documented | $0.02 per job | Not applicable |
The 10-minute example
Say you build a 600-second ad from a 25-minute recording. Trim one 200-second clip out of it (the output cap is 900 seconds, the source cap 1800). Dim that clip with a Video filter op, since the filter accepts sources up to 300 seconds. Then render the sequence as 600 seconds of output.
- Video trim, one job: $0.02
- Video filter, one encode job: $0.02 (the check before it: $0.00)
- Timeline render, 600 s: ceil(600 / 60) = 10 minutes x $0.10 = $1.00 (the plan before it: $0.00)
- Total: $0.02 + $0.02 + $1.00 = $1.04
What a passing check does not promise
Both docs say so. A filter program that passes the check can still fail on the worker box because of a bad expression, memory or time, and you then get a structured job error. A plan cannot predict warnings about short sources being padded or looped. Neither check looks at TikTok's 516 kbps floor or the 500 MB cap, because Sume does not let you set bitrate and does not report the file size in the plan.
So use the checks for what they cover (schema, allowlists, host preflight, minutes and cost), and measure the finished MP4 yourself against the TikTok page before you upload. The trim has no check, but it is also the cheapest step, and the same $0.02 whether it cuts 5 seconds or 500.
A habit that keeps the bill at $1.04
Order the calls so that the free ones come first and the expensive one comes last. Check the filter program, run the filter, trim, and only then plan and render. A bad crop fraction or a filtergraph with an unknown filter is caught for nothing before a single job exists. The one step that can still cost you is the render itself, at $1.00 for 600 seconds, which is why the plan call, with its billable_minutes figure, goes right before it. Sixteen-hundred-second sources and 200-slot lists are accepted by Timeline, but each extra started minute is another $0.10.
Sources
Related posts
More in Developers
- Write the Lyria brief from your shot list: a Python timestamp builder
Lyria responds to [m:ss-m:ss] section markers. A short Python script turns a 6-shot, 59-second shot list into a brief under the 5000-character limit.
- 11 common sizes vs GPT Image 2.5 custom rules: 6 pass, 5 fail
GPT Image 2.5 custom sizes need edges in multiples of 16, an edge up to 3840, 655,360 to 8,294,400 pixels and 3:1 or less. 1280x720 passes; 1920x1080 fails.
- A $12.50 balance fails a 15-second Seedance 2.0 1080p job by 26 cents
A 15-second Seedance 2.0 job at 1080p holds $12.7575, so a $12.50 balance gets 402 insufficient_credits; 480p ($2.64) and 720p ($5.67) go through.
- A 1,300-second narration fails tts_duration_exceeded: split the script
Sume TTS fails a request whose audio runs past 1,200 seconds with tts_duration_exceeded and captures no credit. Split the script at sentence ends.
Written by Sume