Quick reference
Before you start
Before scheduling, the connected account must:- Have completed the OAuth connect flow at least once.
- Have granted
video.publish,video.upload, anduser.info.basicscopes. - Be on a region/account type TikTok permits API publishing for — Personal, Creator, and Business accounts all work; advertiser-only sub-accounts do not.
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 — noworkspaceId 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[].
Content types
Video post
A single video. The publisher uploads the file to TikTok, pollspublish/status/fetch until the platform reports PUBLISH_COMPLETE, then returns the TikTok video id on the PostTarget.externalPostId.
Photo carousel
Up to 35 images stitched into a TikTok slideshow. The first item inmediaIds 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 thebrandContentToggle: 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 inplatformOptions 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.
Photo carousel caption behavior
Thecontent 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
Media URLs must be:- Publicly accessible (no authentication required).
- Returning actual media bytes with the correct
Content-Typeheader. - Served from a domain TikTok permits — see TikTok’s verified-domain requirement below.
- Hosted on a fast CDN.
Verified domain requirement
TikTok requires the host ofvideo_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 undertargets[] — 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 content → caption, scheduledFor → scheduledAt,
platforms → targets, and accountId → socialAccountId. Everything
else is identical.
Node.js