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

PropertyValue
Caption2,200 characters (truncated if longer)
MediaOne video, or 1–35 images
Upload chunk size5–64 MiB per chunk; files ≤64 MiB upload whole
First commentn/a (no comments API)

Configuration fields

Set under config.tiktok:

FieldTypeDefaultNotes
privacy_levelstringRequired for DIRECT_POSTMust be one of the live creator’s allowed values, e.g. PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, SELF_ONLY.
post_modestringDIRECT_POSTDIRECT_POST publishes to the feed; INBOX sends an editable draft to the creator’s TikTok inbox. Alias: postMode.
disable_commentbooleanfalseTurn comments off on the published video.
disable_duetbooleanfalseDisallow Duets.
disable_stitchbooleanfalseDisallow Stitches.
auto_add_musicbooleantruePhoto carousels only: overlay a TikTok soundtrack. Alias: autoAddMusic.
video_cover_timestamp_msnumberFrame (in ms) to use as the cover image.
video_duration_secnumberClip duration hint (seconds) used in the creator-info pre-flight check.
disclosebooleanfalseMaster switch: the post discloses commercial content. When true, set one of the two toggles below.
brand_content_togglebooleanfalsePaid partnership / branded content disclosure. Cannot be combined with SELF_ONLY privacy.
brand_organic_togglebooleanfalsePromoting your own brand. Alias: commercial.

Required scopes

Configure scopes on the BYOK network record. When none are set, PostFuze requests:

  • user.info.basic
  • user.info.profile — richer profile data
  • user.info.stats — account metrics
  • video.publish
  • video.upload
  • video.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 }
	]
}