TikTok Direct Post post_info fields: title, is_aigc, duet, stitch
A checked list of TikTok post_info fields as of October 2026, with a validator for title length in UTF-16 units, privacy level and the is_aigc AI label.

TikTok's Direct Post post_info object has one required field, privacy_level, and several optional ones that matter for AI video: is_aigc, title, the three disable flags and the two brand toggles. The table lists them as the vendor page reads today. The validator after it catches the mistakes that waste an upload, in particular a title counted in the wrong unit.
Field table
| Field | Type | Notes |
|---|---|---|
privacy_level | string, required | One of the options from the creator info query; the list names PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY |
title | string | Max 2200 in UTF-16 runes; hashtags and mentions supported |
is_aigc | bool | True if the video is AI generated; it is labeled accordingly |
disable_comment | bool | True blocks comments |
disable_duet | bool | True blocks Duets |
disable_stitch | bool | True blocks Stitches |
brand_content_toggle | bool | Paid partnership content |
brand_organic_toggle | bool | Self-promotion content |
video_cover_timestamp_ms | int32 | Cover frame; first frame if invalid |
A validator that runs
Python's len() counts code points, not UTF-16 units, so an emoji outside the basic plane counts as two on TikTok's side. Encode to UTF-16 to count.
def utf16_len(text):
return len(text.encode("utf-16-le")) // 2
def check(info, allowed_privacy):
errs = []
if info.get("privacy_level") not in allowed_privacy:
errs.append("privacy_level not offered for this creator")
if utf16_len(info.get("title", "")) > 2200:
errs.append("title over 2200 UTF-16 units")
if not isinstance(info.get("is_aigc", False), bool):
errs.append("is_aigc must be a bool")
return errs
info = {"privacy_level": "SELF_ONLY", "title": "Demo \U0001F3AC",
"is_aigc": True, "disable_duet": True}
print(check(info, ["SELF_ONLY", "PUBLIC_TO_EVERYONE"]))
Where the video comes from
If the video is generated or edited with Sume, set is_aigc yourself: nothing in the trim, caption or filter endpoints writes TikTok metadata for you. To fit a length limit, video trim cuts a range for $0.02 per job. To add on-screen text, video captions burns styles such as tiktok-green for $0.20 per clip up to 60 seconds.
Limits
Allowed privacy_level values depend on the creator and come from the creator info query, so hard-coding the four names is wrong. In practice, query the creator first, cache the list for that session, and reject the post locally rather than discovering the mismatch after a multi-chunk upload has finished. This post does not describe audit status or how unaudited clients are treated; read the TikTok guidelines for that. For when AI labeling is expected, see Does TikTok allow AI-generated content.
Sources
Related posts
More in Developers
- Timeline 1.0 warnings after stitching shots: which need a fix
Timeline 1.0 returns soft warnings, not failures. A list of the codes you will see on a stitched AI film, what each means, and which ones are worth acting on.
- TTS boundary_lead_ms: why sentence slices end 70 ms after a word
Sume TTS sentence segments cut boundary_lead_ms after a sentence's last word: 70 ms by default, 0 to 500. The next segment absorbs the pause, and no gap opens.
- tts_duration_exceeded: split long scripts for Sume TTS
Sume TTS fails with tts_duration_exceeded when audio would pass 1,200 seconds, and takes at most 20,000 characters. Split rules and how to join the parts.
- TTS language omitted: Spanish text comes out with an English default
On Sume TTS, an omitted language defaults to English at the provider, with a ko or ja fallback only for Hangul or kana text. Set language for all others.
Written by Sume