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.

5 min readSume
All posts

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.

Smallest file that meets a 516 kbps minimum (computed, decimal MB)
LengthKilobitsMegabytes
15 s7,7400.97
30 s15,4801.94
60 s30,9603.87
10 min (600 s)309,60038.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.mp4

If 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

All Developers posts

Written by Sume