TikTok photo post title length: 90 runes, description 4000
TikTok's photo post API caps the title at 90 UTF-16 runes and the description at 4000, unlike video posts. How to count them and where Sume fits in.

For a photo post, the TikTok Content Posting API allows a title of at most 90 UTF-16 runes and a description of at most 4000. Both fields are optional. Sume has no TikTok publish route, so you write and count both strings yourself and send them with your own TikTok request.
Limits are from TikTok's photo reference, "Last updated August 24, 2026", read 2026-10-01.
What are the two limits?
Both are measured in UTF-16 runes, not bytes and not visible characters. A Korean syllable is one rune; many emoji are two. The video post limit in the video caption post is a different number, so do not reuse a video validator for photos.
| Field | Max (UTF-16 runes) | Required |
|---|---|---|
post_info.title | 90 | No |
post_info.description | 4000 | No |
How do I count UTF-16 runes?
In JavaScript, string.length already counts UTF-16 code units, so title.length <= 90 is the check. Do not use the spread or Array.from length, which counts code points and would let long emoji titles through.
const fits = (title, description = "") =>
title.length <= 90 && description.length <= 4000;
console.log(fits("봄 신상 룩북"), fits("x".repeat(91)));Do burned-in captions count toward the title?
No. Sume's video captions burn text onto an existing public video URL and apply to video, not to the post's title field. The docs say black-outline is the default style for Korean wording and language takes a hint such as ko. A photo post has no video to caption, so text on a slide has to be part of the generated image itself or added in your own tooling.
Where does the image come from?
Generated images are returned as media.sume.com URLs, for example https://media.sume.com/img/01J.../0.png; the images docs show the response shape. Put those URLs in photo_images and keep the post text in your own fields.
Sources
Related posts
More in Developers
- Fade out music at the end of a video: two fades, two caps
In Timeline 1.0, soundtrack.fade_out_seconds fades only the music bed (max 10 s). output.fade_out_seconds fades the whole render (0 to 5 s). Which to use.
- Crossfade longer than 1 second: the Timeline transition limit
Timeline 1.0 transitions are capped at 1 second and 50 percent of the shorter neighbouring clip. Longer ones return transition_too_long. What to do instead.
- Video starts on a black frame: fix the first Timeline segment
A render that opens on black usually has a fade or a late first clip. Timeline 1.0 refuses a first start other than 0 and any first-segment transition.
- WhatsApp audio message format: AAC, MP3, OGG Opus mono, 16 MB
WhatsApp accepts AAC, AMR, MP3, M4A and OGG (Opus, mono) up to 16 MB. Sume's audio detach returns mp3 or wav, so mp3 fits; ogg needs another tool.
Written by Sume