Skip to main content

Quick reference

Before you start

TikTok has a strict review process before a TikTok App can publish on behalf of arbitrary creators. While in sandbox mode, every post is forced to privacy: "SELF_ONLY" regardless of what your request sends. The full set of privacy values unlocks after TikTok approves the app.If you’re seeing your scheduled posts appear “only to me” on TikTok, your Postbreeze server’s TikTok credentials are still in sandbox.
Before scheduling, the connected account must:
  • Have completed the OAuth connect flow at least once.
  • Have granted video.publish, video.upload, and user.info.basic scopes.
  • Be on a region/account type TikTok permits API publishing for — Personal, Creator, and Business accounts all work; advertiser-only sub-accounts do not.
TikTok rejects posts whose privacy doesn’t match the per-creator allow-list returned by the creator-info API. Postbreeze validates this when you connect the account — if your account can’t post PUBLIC_TO_EVERYONE, the field’s enum will be filtered down for you. See also: Platform settings — TikTok and Media uploads.

Quick start

Workspace is inferred from your API key — no workspaceId argument. Use the flat shape (content + platforms) for the common case; drop to the nested shape when you’d rather group every per-target field under targets[].
TikTok requires privacy on every post — there is no default. Pass one of PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, or SELF_ONLY on every TikTok target.

Content types

Video post

A single video. The publisher uploads the file to TikTok, polls publish/status/fetch until the platform reports PUBLISH_COMPLETE, then returns the TikTok video id on the PostTarget.externalPostId.
Up to 35 images stitched into a TikTok slideshow. The first item in mediaIds becomes the cover image — reorder via the media tray in compose, or by sending the array in the order you want.

Branded content disclosure

Branded content (paid partnerships) requires the brandContentToggle: true flag. TikTok enforces that branded posts must be privacy: "PUBLIC_TO_EVERYONE" — sending any other privacy value alongside brandContentToggle: true is rejected by Postbreeze’s validator before the request reaches TikTok.
Node.js

Media requirements

Images

Videos

You can’t mix photos and videos in the same post. Use either all-photos (carousel) or one video. See Media uploads for the presign + upload flow that produces mediaIds.

Platform-specific fields

TikTok settings go in platformOptions on each entry of platforms[]. The platform discriminator is required on every TikTok target — use "TIKTOK_PERSONAL" for Personal/Creator accounts and "TIKTOK_BUSINESS" for Business accounts. Both branches share the same field shape. firstComment is not accepted on TikTok targets — TikTok’s API has no comment-reply endpoint, so Postbreeze can’t auto-post a follow-up reply. The content field becomes the photo’s TikTok description. Limited to 2,200 characters and URLs are stripped if you include them — TikTok’s photo post API doesn’t honor inline URLs. Use the photoTitle field for the slideshow’s display title (90 chars max).

Media URL requirements

These do not work as media URLs:
  • Google Drive — returns an HTML download page, not the file
  • Dropbox — returns an HTML preview page
  • OneDrive / SharePoint — returns HTML
  • iCloud — returns HTML
Test your URL in an incognito browser window. If you see a webpage instead of the raw video or image, it will not work.
Media URLs must be:
  • Publicly accessible (no authentication required).
  • Returning actual media bytes with the correct Content-Type header.
  • Served from a domain TikTok permits — see TikTok’s verified-domain requirement below.
  • Hosted on a fast CDN.
Large videos are auto-rejected during upload (5–10 MB per chunk). Photos must resolve to 1080 × 1920.

Verified domain requirement

TikTok requires the host of video_url / image_url to be on your TikTok-developer-portal verified-domain list. Add your CDN origin (or Postbreeze’s R2_PUBLIC_URL) to that list before scheduling — uploads from unverified hosts return url_ownership_unverified and Temporal won’t retry.

Analytics

Available metrics via the Analytics API: Refresh cadence: every 12 hours. TikTok requires platform-side data older than 7 days to be re-fetched on demand, so historical analytics older than a week may show stale values until the next refresh tick.

Common errors

What you can’t do

These features are not exposed by TikTok’s Content Posting API today:
  • ❌ First comment (auto-post a follow-up reply)
  • ❌ Add hashtags as separate metadata
  • ❌ Add links (URLs in caption are stripped)
  • ❌ Edit a post after publish
  • ❌ Save as draft from API
  • ❌ Schedule via TikTok’s native scheduler (we use our own queue)
  • ❌ Post Stories or LIVE content
  • ❌ Apply effects, filters, or sounds programmatically

Full control (nested shape)

The flat shape above covers every TikTok use case. If you’d rather group every per-target field under targets[] — for example because you’re fanning the same post out to multiple platforms and want each target’s caption, media list, and options in one object — use the nested shape. Replace contentcaption, scheduledForscheduledAt, platformstargets, and accountIdsocialAccountId. Everything else is identical.
Node.js