TikTok's 5-10 words per second text tip: check your caption cues
TikTok's creative best-practice page suggests 5 to 10 words per second when using text. A short Python check flags cues outside that range before you burn them.

TikTok's page on creative best practices for performance ads says to use 5 to 10 words per second when using text. If you author Sume caption cues with start, end and text, a ten-line Python script can count words per second for each cue and flag the ones outside that range before you pay for a render.
What the TikTok page says
"Creative best practices for performance ads" (read 2026-10-05) recommends vertical 9:16 video at 720P or higher, keeping content inside the UI safe zone, a hook in the first 6 seconds and the content proposition in the first 3 seconds. For text it suggests 5 to 10 words per second.
The page treats that as guidance, not a rule that TikTok enforces, so use the check as a warning and not as a gate.
A cue checker
Sume's video captions endpoint accepts cues with text, start and end. That is the same shape this script reads, so you can run it on the list you are about to send.
import json, sys
cues = json.load(open(sys.argv[1])) # [{"text","start","end"}, ...]
for c in cues:
secs = c["end"] - c["start"]
words = len(c["text"].split())
rate = words / secs if secs > 0 else float("inf")
flag = "" if 5 <= rate <= 10 else " <-- outside 5-10"
print(f'{c["start"]:6.2f}-{c["end"]:6.2f} {rate:5.1f} w/s {c["text"]}{flag}')Reading the result
A low rate on a long cue means the line sits on screen for a while with few words. That can be fine for a call to action. A high rate means the viewer has to read fast; split the cue into two or shorten the words.
If you would rather let Sume split lines for you, the caption design.phrasing group has max_words, max_chars and pause_seconds. The docs note that the punch and tiktok-green styles do not support design.
Order of work
Write cues, run the check, fix the outliers, then send the request. A caption job is billed per accepted job; the docs quote $0.20 for videos up to 60 seconds and point to GET /v1/catalog for the live price.
- Keep the first cue short so the hook lands.
- Check the first 3 seconds against your offer.
- Re-run the check after any trim that moves times.
Sources
Related posts
More in Developers
- TikTok bans some AI content even if labeled: lint prompts first
TikTok prohibits AI that shows fake authoritative sources, crisis events, endorsements or under-18 likeness. A small Python check to run before a Sume render.
- TikTok Direct Post init: 6 requests a minute per token, queue clips
TikTok limits each user access_token to 6 init requests per minute on Direct Post. Queue finished Sume clips and release them at that pace.
- TikTok ad file types: mp4, mov, mpeg, 3gp, avi, and Sume's MP4 output
TikTok's non-Spark spec lists .mp4, .mov, .mpeg, .3gp and .avi. Sume Timeline renders an MP4, so you can skip conversion and just check the size and bitrate.
- TikTok publish_id status: poll it after the Sume job webhook fires
The TikTok Direct Post page I read returns a publish_id to check status and mentions no webhook. Let Sume's webhook trigger the post, then poll TikTok.
Written by Sume