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.

4 min readSume
All posts

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

TikTok direct post reference, read 2026-10-02
FieldTypeNotes
privacy_levelstring, requiredOne of the options from the creator info query; the list names PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY
titlestringMax 2200 in UTF-16 runes; hashtags and mentions supported
is_aigcboolTrue if the video is AI generated; it is labeled accordingly
disable_commentboolTrue blocks comments
disable_duetboolTrue blocks Duets
disable_stitchboolTrue blocks Stitches
brand_content_toggleboolPaid partnership content
brand_organic_toggleboolSelf-promotion content
video_cover_timestamp_msint32Cover 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

All Developers posts

Written by Sume