TikTok ad safe zones vs burned-in captions: anchor_ratio
TikTok says its safe zone varies with ratio, caption length and format. Sume caption design has an anchor_ratio to move a burned-in line.

TikTok's ad specification page says safe zones depend on aspect ratio, caption length and format, and it links downloadable safe-zone files. It prints no numbers for them. Sume burns captions with design.placement.anchor_ratio, the centre of the line as a fraction of the frame height, so you can move captions out of the area the file marks as covered.
The method
Download the safe-zone file from TikTok's page for your ratio. Burn a test caption on a still or a short clip. Lay the file over the frame. If the line sits in a marked area, change anchor_ratio and render again. Do not copy a fraction from a blog post, including this one: the file is the authority, and the right value changes with the format and caption length that TikTok lists as variables.
What you can change per request
The caption doc lists these override groups. Sume validates each field and a value outside its range returns a 400, so a wrong override fails at request time and you do not pay for a bad render.
| Group | Fields | Use for safe zones |
|---|---|---|
| placement | anchor_ratio, landscape_anchor_ratio | Move the line up or down |
| typography | font_size_ratio, safe_width_ratio, stroke_width_px | Shrink text, keep it off the edges |
| phrasing | max_words, max_chars, pause_seconds | Shorter lines (caption length is a TikTok variable) |
{
"video_url": "https://example.com/clean.mp4",
"style": "black-outline",
"design": { "placement": { "anchor_ratio": 0.6 } }
}A test frame before the batch
Burn the caption on one representative clip, not on all fifty. Take a frame from the output, open it next to TikTok's safe-zone file for the same ratio, and see whether the line is clear. If you run several languages, test the longest line you expect, since the page names caption length as a factor.
Phrasing matters as much as position. max_words, max_chars and pause_seconds set how much text sits on screen at once. Shorter chunks are easier to keep clear of the areas the file marks, and they read faster on a phone. Raise safe_width_ratio or font_size_ratio only after the first test shows room.
A caption job is cheap to repeat: the doc lists $0.20 per accepted job for clips up to 60 seconds, so two or three test renders cost less than one failed batch. Confirm the live price in the catalog before you build a budget around it.
Limits
The 0.6 above is an example of the field's shape, not a recommendation. The doc defines the value as a fraction of frame height but this post did not test which direction is up, so check one render. The punch and tiktok-green styles do not support design, so if you need to move the line, pick another style such as slam or black-outline. The caption doc also notes the job needs a public HTTPS video URL.
For why on-screen text from the model itself is a poor substitute, see readable on-screen text from Kling 3 and Seedance 2.5.
Sources
Related posts
More in Use cases
- TikTok 6-slide 9:16 carousel: Qwen Image n=4 plus n=2 is 15 cents
A six-slide 9:16 slideshow takes two Sume image calls because n caps at 4. Qwen Image bills $0.025 per slide, so the set is $0.15. Code and cost table.
- TikTok Spark Ads vs standard ad video specs: what to render
TikTok lists .mp4 or .mov and no duration limit for Spark Ads, but 9:16 minimums, 500 MB and up to 10 minutes for non-Spark ads. Sume returns MP4.
- Make a Top 5 vertical video from five stills with Sume Timeline
Five images, a 30-second silent Timeline at 1080x1920, then burned captions: the slot math, the still-motion limit and the cost in Sume.
- Tote bag mockup with an AI image API: your logo on a canvas bag
Send your logo as a reference to GPT Image 2.5 on Sume and ask for a canvas tote on a plain studio set. Check the logo against the original before you list it.
Written by Sume