TikTok ad length: 10 minutes in-feed, 5 to 60 seconds App Bundle
TikTok's in-feed page allows up to 10 minutes and Spark ads have no limit, while App Bundle says 5 to 60 seconds. Which length to render, and how to trim it.

TikTok's two ad pages give two different answers. The in-feed page says non-Spark ads can run up to 10 minutes, with no duration restriction for Spark ads, and the Global App Bundle page says 5 to 60 seconds and recommends 21 to 30 seconds. If one file has to serve both, render 21 to 30 seconds.
What each page says
I read these two TikTok Business Help Center pages on 2026-10-05. I did not fetch a TikTok page about organic uploads, so I do not state an organic length limit here.
| Placement | Duration stated | Other detail on the page |
|---|---|---|
| In-feed, Spark ads | No restrictions | .mp4 or .mov; caption up to 4 lines |
| In-feed, non-Spark ads | Up to 10 minutes | .mp4, .mov, .mpeg, .3gp, .avi; 500 MB or less |
| Global App Bundle | Between 5 and 60 s, recommend 21 to 30 s | .mp4, .mov, .mpeg, .avi; within 500 MB |
Where the two answers come from
Sources: In-feed ads and Global App Bundle video ad specifications.
How the Sume catalog lines up
Most AI video clips are shorter than any of these ceilings, so the real problem is the floor and the sweet spot. On Sume's catalog, seedance-2.5 accepts 4 to 30 seconds at 480p, 720p and 1080p, and wan-3.0 accepts 2 to 30 seconds, per the Video Router docs. Every other catalog model has a 15 second limit, apart from the special-purpose Motion Transfer and Recast models. A single seedance-2.5 call can therefore land inside TikTok's recommended 21 to 30 second window without any stitching.
Trim to the shorter ceiling
When a long source needs to become a short ad, cut it instead of regenerating. The video trim API takes start and either end or duration and returns a new MP4. It accepts a source up to 1800 seconds and writes an output up to 900 seconds, with a minimum of 0.2 seconds. The rate is $0.02 per job. For an App Bundle file, cut to at most 60 seconds:
curl -X POST https://api.sume.com/v1/video-trim \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: bundle-cut-001" \
-d '{
"video_url": "https://media.sume.com/artifacts/artf_demo/long.mp4",
"start": 12,
"duration": 28,
"precision": "exact"
}'Reading the result
The result is read from GET /v1/jobs/:id/result as kind: video_trim, with duration_seconds and a new video_url. If the request has no end and no duration, the API refuses it with video_trim_range_required; if it has both, you get video_trim_range_conflict.
Why shorter is also cheaper downstream
There is a cost reason to pick the shorter file too. A TikTok ad file is judged on its first seconds, and a 28 second cut is cheaper to caption than a 3 minute one. A standalone caption job reserves $0.20 for a clip of up to 60 seconds. Longer clips are billed differently, so confirm the live rate in GET /v1/catalog before you caption a 10 minute file.
A simple rule per placement
Spark ads reuse an organic post, so a file prepared for a Spark placement is whatever your organic video already is. For non-Spark placements, make the length decision per placement:
- App Bundle: 21 to 30 seconds, never above 60.
- In-feed non-Spark: the page allows up to 10 minutes, but nothing requires you to use it.
- Spark: keep the organic cut and check it is .mp4 or .mov.
Why the mismatch matters
The two pages are written for different buying paths. Global App Bundle is a placement for app promotion, where TikTok recommends a short window, and in-feed covers the general case. A creative team that buys both will get a rejection if it uploads a 90 second cut to the bundle placement, even though the same file is accepted in-feed. The cheapest way to avoid that is to keep a naming convention: one file per placement, with the length in the name.
A cutdown plan from one master
Plan the cutdowns from one longer master. The table shows a sensible set, built only from the limits above and the Sume trim limits. Every row is one trim job at $0.02, so a three-file set costs 6 cents before captions.
| File | Length | Placement | Trim cost |
|---|---|---|---|
| A | 28 s | Global App Bundle | $0.02 |
| B | 60 s | Global App Bundle upper bound | $0.02 |
| C | Full cut | In-feed non-Spark, up to 10 minutes | None |
One habit
If you are unsure which file a platform will accept, test with the smaller one first. A rejected upload costs more than a trim job.
Re-read before a launch
Both numbers are only as current as the date on the table caption. Before a large campaign, open the two TikTok pages again, compare them with the rows above, and note the date you checked. If a page has changed, update your master length first and only then re-cut the variants.
The takeaway
The in-feed and App Bundle pages differ on length by a factor of ten. If you build one master, build it for the stricter page.
Sources
Related posts
More in Use cases
- TikTok ad text allows no links, @ or hashtags: a Python lint
TikTok's in-feed spec says ad text shows in white, uncustomizable, with no clickable links, @ symbols, or hashtags. A short check catches them before upload.
- TikTok's AI-generated content switch: video and photo paths
Posting a Sume clip to TikTok: turn on AI-generated content under More options. The photo path differs. Steps, what the switch does and what it never changes.
- TikTok AI labels now say why: detection, creator or TikTok's tools
TikTok's Nov 2025 update adds context on whether a label came from AI detection, a creator label or a TikTok AI tool. Which one your Sume clip will show.
- TikTok AI Outline splits a video in six: plan six slots in Sume first
TikTok's AI Outline breaks a video into six parts. Mirror that outline in Sume with six timeline slots and the unbilled plan call, then render once.
Written by Sume