What size should a TikTok video be? 2026 ad minimums by type

TikTok's own ad pages list 9:16 at 540x960 minimum for in-feed and 720x1280 for App Bundle. See the table and the Sume parameters that hit each one.

5 min readSume
All posts

For TikTok ads, vertical 9:16 is the recommended shape on both pages I read, and the pixel floor depends on the placement: at least 540x960 for non-Spark in-feed ads and at least 720x1280 for Global App Bundle ads. A 1080x1920 vertical MP4 clears both, and Sume timeline renders 1080x1920 by default.

The two TikTok pages side by side

The two TikTok Business Help Center pages disagree on the minimum, which is why the question has no single answer. The table lists exactly what each page says. I did not read a TikTok page for organic uploads, so this post covers ads only.

TikTok video ad minimums, TikTok Business Help Center (read 2026-10-05)
Placement pageVertical 9:16Horizontal 16:9Square 1:1
In-feed, non-Spark ads9:16, at least 540x960 (recommended)16:9, at least 960x5401:1, at least 640x640
Global App Bundle9:16, at least 720x1280 (recommended)16:9, at least 1280x7201:1, at least 640x640

Format, file size and bitrate

Sources: In-feed ads and Global App Bundle video specs. The in-feed page lists .mp4, .mov, .mpeg, .3gp .avi, a file size of 500 MB or less and a bitrate of at least 516 kbps. The App Bundle page lists .mp4, .mov, .mpeg, .avi, within 500 MB and at least 516 kbps.

Choosing aspect_ratio and resolution on Sume

On a video model call you pick the shape with aspect_ratio and the quality tier with resolution. The video generation docs list 9:16 as a vertical value and 480p, 720p, 1080p among the tiers, and each model reports the subset it accepts in supported_aspect_ratios and supported_resolutions. The size field is not available: each v1 model reports supported_sizes: null, so size returns 400 unsupported_parameter.

A model's tier name is not a pixel guarantee. The docs do not give the pixel width of a 720p vertical clip for every model, so I would not assume it equals 720x1280. Measure the result instead; the video inspect stills return width and height.

Pin the exact pixels with a timeline plan

Timeline 1.0 accepts output.width and output.height as even integers from 256 to 2160, and its default output is 1080x1920 MP4. A plan call is unbilled, so you can check the compile before paying for the render:

curl -X POST https://api.sume.com/v1/timeline-1.0/plan \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "audio": { "mode": "silence", "duration_seconds": 24 },
    "video": [
      { "source_url": "https://media.sume.com/artifacts/artf_demo/clip.mp4",
        "start": 0, "duration": 24 }
    ],
    "output": { "width": 1080, "height": 1920, "fps": 30 }
  }'

What it costs

The plan returns duration_seconds, segment_count, billable_minutes and an estimated cost. A real render is $0.10 per ceil output minute, so a 24 second file is one billable minute.

A three-shape variant set

Each of the three shapes TikTok lists has its own floor, so a variant set needs three different checks. A vertical clip that is 720x1280 passes both vertical floors, a 960x540 horizontal clip passes only the in-feed horizontal floor, and 1280x720 passes both horizontal floors. Square needs 640x640 on both pages.

Use fit to reach the other ratios

Timeline slots have a fit field: cover (the default), contain, stretch or blur. When you want a horizontal source inside a vertical frame, blur fills the empty bars with a blurred copy of the clip instead of black. When you want a vertical clip inside a square, contain keeps all of it. Set the output size once and the same slot list renders all three variants with different output.width and output.height.

Remember that a timeline's width and height must be even integers between 256 and 2160, and the job rejects ffmpeg fields such as codec or crf. If you need a frame rate that matches the source, omit output.fps; otherwise the job warns output_fps_resamples_sources.

Verify before you upload

Check the result, not the request. After a render, run video inspect with frames: { at: [1] } and read the still's width and height. If the numbers are below the floor for your placement, re-render at a higher output.width and output.height rather than hoping the upload form will accept it. This one extra read costs very little and avoids a rejected ad.

Two caveats from the TikTok page

The in-feed page says non-Spark captions are displayed in white with a uniform font that cannot be customized, and that the safe zone depends on dimension and caption length. Treat burned-in text as a design choice, and keep key text away from the bottom third until you have downloaded TikTok's own safe-zone files.

Rule of thumb

Render 1080x1920 and you clear both TikTok floors with room to spare. Drop to 720x1280 only when file size matters, and keep it above the App Bundle minimum.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume