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
- TikTok Direct Post UX rules: nickname, preview, no default privacy
TikTok's content sharing guidelines require apps to show the creator nickname, a preview and a processing notice, with no default privacy value. A checklist.
- TikTok Upload Video: 5 pending shares per 24 hours explained
TikTok's inbox Upload Video endpoint allows at most 5 pending shares in 24 hours. Plan AI video batches around that cap and the creator's manual finish.
- TikTok photo post error app_version_check_failed: needs app 31.8+
TikTok's photo post API returns app_version_check_failed in MEDIA_UPLOAD mode when the creator's TikTok app is older than 31.8. Here is what to do.
- TikTok post status: PUBLISH_COMPLETE vs a public post ID
TikTok's Get Post Status returns five statuses. PUBLISH_COMPLETE is not proof the video is public; the post ID appears only after moderation approves it.
Written by Sume