TikTok
Publish video or photo carousel posts to a TikTok profile via the Content Posting API v2 direct-post flow. The platform id is tiktok. Videos are chunk-uploaded (one byte range per step); photos are URL-ingested by TikTok. PostFuze then polls until TikTok reports the post complete. TikTok has no comments API, so any first-comment or thread containers are ignored.
Privacy and media requirements
Each TikTok post requires either exactly one video or one-to-35 images in the main container. Direct posts require an explicit
privacy_levelallowed by the creator account. The interaction toggles and disclosure flags below map directly onto TikTok’s publishing requirements, so set them accurately.Supported content
- Video — a single video, uploaded as a direct post to the connected profile.
- Photo carousel — one to 35 images, submitted by URL for TikTok to fetch.
Photo URL domain verification
TikTok photo posts use
PULL_FROM_URL. The media-serving domain or URL prefix must be verified in the TikTok developer portal for your app, or TikTok rejects the post with url_ownership_unverified. Verify the production CDN/storage host that appears in PostFuze media URLs before enabling photo posts.Limits
| Property | Value |
|---|---|
| Caption | 2,200 characters (truncated if longer) |
| Media | One video, or 1–35 images |
| Upload chunk size | 5–64 MiB per chunk; files ≤64 MiB upload whole |
| First comment | n/a (no comments API) |
Configuration fields
Set under config.tiktok:
| Field | Type | Default | Notes |
|---|---|---|---|
privacy_level | string | Required for DIRECT_POST | Must be one of the live creator’s allowed values, e.g. PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, SELF_ONLY. |
post_mode | string | DIRECT_POST | DIRECT_POST publishes to the feed; INBOX sends an editable draft to the creator’s TikTok inbox. Alias: postMode. |
disable_comment | boolean | false | Turn comments off on the published video. |
disable_duet | boolean | false | Disallow Duets. |
disable_stitch | boolean | false | Disallow Stitches. |
auto_add_music | boolean | true | Photo carousels only: overlay a TikTok soundtrack. Alias: autoAddMusic. |
video_cover_timestamp_ms | number | — | Frame (in ms) to use as the cover image. |
video_duration_sec | number | — | Clip duration hint (seconds) used in the creator-info pre-flight check. |
disclose | boolean | false | Master switch: the post discloses commercial content. When true, set one of the two toggles below. |
brand_content_toggle | boolean | false | Paid partnership / branded content disclosure. Cannot be combined with SELF_ONLY privacy. |
brand_organic_toggle | boolean | false | Promoting your own brand. Alias: commercial. |
Required scopes
Configure scopes on the BYOK network record. When none are set, PostFuze requests:
user.info.basicuser.info.profile— richer profile datauser.info.stats— account metricsvideo.publishvideo.uploadvideo.list— enumerate published videos (for metrics & imports)
Create a post
A public video with Duet disabled and a branded-content disclosure:
curl
curl https://api.postfuze.com/api/v1/posts \
-H "Authorization: Bearer sk_live_…" \
-H "Content-Type: application/json" \
-d '{
"accounts": ["acct_tt_01"],
"containers": [
{
"content": "60 seconds of build-in-public chaos 😅 #devtools",
"media": [{ "id": "media_clip_mp4" }]
}
],
"config": {
"tiktok": {
"privacy_level": "PUBLIC_TO_EVERYONE",
"disable_duet": true,
"disable_stitch": false,
"brand_content_toggle": true
}
}
}'201 Created
{
"id": "post_d72e",
"status": "queued",
"default_config": {
"tiktok": { "privacy_level": "PUBLIC_TO_EVERYONE", "disable_duet": true, "disable_stitch": false, "brand_content_toggle": true }
},
"containers": [
{ "id": "ctr_t1", "position": 0, "role": "main", "content": "60 seconds of build-in-public chaos 😅 #devtools" }
],
"targets": [
{ "id": "tgt_tt1", "social_account_id": "acct_tt_01", "platform": "tiktok", "status": "queued", "platform_post_id": null }
]
}