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
- TikTok PULL_FROM_URL times out after one hour: keep the URL live
TikTok pulls a PULL_FROM_URL file at up to 100 Mbps and times out one hour after it starts. The URL must stay live; a Sume durable URL has no expiry.
- Concatenate audio files by API: parts, and no top-level url
Sume Timeline audio concat needs a parts array and refuses a top-level url or ranges. Each operation accepts its own keys; mixing them returns a stable code.
- Split audio into segments by timestamps: url and ranges
Sume Timeline audio split needs a top-level url and 1 to 20 ranges. A range with end at or before start is refused; each segment gets its own audio_url.
- Image over video longer than the clip: compose's 300 s ceiling
Sume Timeline compose length comes from the video layer, capped at 300 seconds. Asking for more than the file clamps with a warning and the job still succeeds.
Written by Sume