TikTok 516 kbps minimum bitrate: a 30 second ad is at least 1.94 MB
TikTok's non-Spark spec lists bitrate of 516 kbps or more. The smallest file for 15, 30 and 60 seconds is shown with the math, plus how to check a Sume render.

A non-Spark TikTok ad must have a bitrate of 516 kbps or more, and the smallest file that meets this for 30 seconds is 516 x 30 = 15,480 kilobits, which is 1.935 MB, or about 1.94 MB. The figure comes from TikTok's auction in-feed ad page, read 2026-10-08, which lists the bitrate as greater than or equal to 516 kbps next to a 500 MB maximum and a 10 minute maximum length.
Smallest file at each length
The floor is the bitrate times the length. Divide kilobits by 8,000 for decimal megabytes.
| Length | Kilobits | Megabytes |
|---|---|---|
| 15 s | 7,740 | 0.97 |
| 30 s | 15,480 | 1.94 |
| 60 s | 30,960 | 3.87 |
| 10 min (600 s) | 309,600 | 38.70 |
Why this matters on a Sume render
Sume Timeline and video trim do not take a bitrate: the docs refuse codec and crf fields because the server compiles ffmpeg itself. So you cannot set 516 kbps. You can measure it. A render that is mostly a still image with audio may encode very small, so after the render read the byte count and divide.
The check is simple: average bitrate in kbps = bytes x 8 / seconds / 1000. A 30 second file of 1,500,000 bytes is 1,500,000 x 8 / 30 / 1000 = 400 kbps, below the floor. A file of 2,000,000 bytes is 533 kbps, above it.
ffprobe -v error -show_entries format=duration,bit_rate \
-of default=noprint_wrappers=1 ad.mp4If the file is under the floor
The bit_rate that ffprobe prints is in bits per second, so compare it with 516,000. Sume does not document a way to raise it, so the options on the Sume side are to change the content or the size: a clip with more motion and a larger output block tends to carry more data, but that is a rule of thumb and not a documented guarantee. The upper bound is in the 500 MB post.
A Python helper
This helper turns a file size and a length into kilobits per second and compares it with the 516 kbps floor from TikTok's page. It uses decimal units, as the table does.
Run it on the file you plan to upload, not on the source. If it prints below, change the content or the render settings, then measure again.
import os, sys
FLOOR_KBPS = 516
def kbps(path, seconds):
return os.path.getsize(path) * 8 / seconds / 1000
if __name__ == "__main__":
path, seconds = sys.argv[1], float(sys.argv[2])
rate = kbps(path, seconds)
verdict = "ok" if rate >= FLOOR_KBPS else "below the floor"
print(f"{rate:.0f} kbps: {verdict}")Reading the result
The helper prints a rounded figure. A result such as 540 kbps passes by 24 kbps, which is a narrow margin; if you are that close, re-render with a slightly longer or busier clip, or shorten the clip and test again, and keep the check in your upload routine.
Sources
Related posts
More in Developers
- TikTok ad caption rules: no links, @ or hashtags, and a 4-line limit
TikTok's in-feed ad page says captions can't hold links, @ symbols or hashtags, and Spark captions max out at 4 lines. A Python lint to run before you submit.
- Timeline sizes for TikTok's three ad ratios: 540x960, 960x540, 640x640
TikTok's non-Spark minimums are 540x960 (9:16), 960x540 (16:9) and 640x640 (1:1). All three fit Timeline's even 256 to 2160 px output range at $0.10 a minute.
- Timeline audio concat or audio.parts: which join for narration takes?
Use audio.parts when the narration only feeds one render; use Timeline audio concat when you need a reusable file. Concat is $0.01 per job, up to 1,800 s.
- Timeline plan call: price a narrated render before you spend
POST /v1/timeline-1.0/plan is unbilled and returns billable_minutes and estimated_cost_usd_micros. How to price a narration plus music render first.
Written by Sume