TikTok publishing API
Creasion publishes video to TikTok through the official Content Posting API. You send one HTTP request; we handle the OAuth handshake, the pre-flight the platform requires, chunked media transfer, rate-limit pacing, and status polling until the post lands.
How it works
- 1The account holder connects their TikTok account through TikTok Login. They see TikTok's own consent screen listing the scopes we request.
- 2We store the resulting tokens encrypted, and refresh them server-side so the connection does not silently expire.
- 3Before publishing we query creator_info to learn which privacy levels and interaction settings that specific account allows.
- 4You POST the caption, the video, and the creator's chosen options to /v1/posts.
- 5We transfer the video to TikTok with FILE_UPLOAD, then poll until TikTok confirms the post is live or reports why it failed.
- 6A signed webhook tells your system the outcome: published, partial, or failed, with no polling on your side.
Scopes we request
We request the minimum needed to publish on the creator's behalf, and nothing else. We do not read a creator's feed, follower list, or analytics.
user.info.basicShow the connected account's display name and avatar, so the creator can confirm which account a post is going to.
video.publishDirect Post of the creator's own video to the account they personally connected and authorized.
Pre-flight: creator_info
TikTok requires that a posting interface reflects the creator's own account settings rather than assuming defaults. Read this before you build your publish UI, because the values decide which options you may offer.
GET /v1/accounts/tiktok:7012345678901234567/creator-info
Authorization: Bearer sk_live_***
{
"creator_nickname": "yourbrand",
"privacy_level_options": [
"PUBLIC_TO_EVERYONE",
"MUTUAL_FOLLOW_FRIENDS",
"SELF_ONLY"
],
"comment_disabled": false,
"duet_disabled": false,
"stitch_disabled": true,
"max_video_post_duration_sec": 600
}If stitch_disabled comes back true, the stitch option must be shown as unavailable. Offering it anyway produces a rejected publish.
Publishing
POST /v1/posts
Authorization: Bearer sk_live_***
Content-Type: application/json
{
"accounts": ["tiktok:7012345678901234567"],
"content": "Behind the scenes of the new drop #fyp",
"media": [{ "url": "https://cdn.you.com/teaser.mp4" }],
"options": {
"privacy_level": "PUBLIC_TO_EVERYONE",
"disable_comment": false,
"disable_duet": false,
"disable_stitch": false
}
}The call returns immediately with a post id and queued status. Publishing runs asynchronously; poll GET /v1/posts/:id or wait for the webhook.
Media specs
- Format
- MP4, MOV, WebM
- Caption limit
- 2,200 characters
- Max duration
- Per creator_info (commonly 600s)
- Transfer method
- FILE_UPLOAD, bytes sent directly
- Aspect ratio
- Any; 9:16 recommended
- Rate pacing
- 6 requests/min per user
How we comply with TikTok's posting rules
Publishing on someone's behalf carries obligations. These are the behaviours Creasion guarantees for every TikTok post.
creator_info runs before every post
We query the Content Posting API for the creator's own settings first, and only offer the privacy levels and interaction options TikTok returns for that account. A request that skips this step gets rejected, so we never skip it.
The creator chooses the privacy level
Privacy is never hardcoded. The account holder picks from the options TikTok allows for their account. Interaction toggles that TikTok reports as unavailable are shown disabled, not silently ignored.
Nothing is posted without an explicit action
Publishing is always triggered by the account holder, through their own API call or an explicit Publish action. Creasion never posts on a schedule the creator did not set, and never reposts third-party content.
The video sent is the video published
We upload the exact file the creator supplied. No re-encoding that changes the content, no watermarking, no substitution.
Branded content and AI disclosure
Commercial-content and AI-generated-content flags are passed through to TikTok unchanged, so disclosure obligations reach the platform as the creator declared them.
Tokens stay encrypted and server-side
OAuth tokens are encrypted at rest with AES-256-GCM and refreshed server-side. They are never returned by our API, never logged, and never exposed to the browser.
Failures you should handle
A publish returns either a success or a typed failure. Partial success across several accounts is a normal outcome, not an exception: a post can be published on one account and rejected on another.
privacy_rejectedThe requested privacy level is not available for this creator. Read creator-info and choose from privacy_level_options.
rate_limitedTikTok's per-user pacing limit was hit. The publish is retried automatically with backoff, and the error is reported as retryable: true.
media_errorThe video could not be fetched or failed TikTok's processing checks. Verify format and duration against creator-info.
token_expiredThe creator's authorization lapsed or was revoked in TikTok's settings. The connected account is flagged for reconnect.
Availability
TikTok requires apps to pass a Content Posting API audit before they may publish publicly on a creator's behalf. Creasion is in that review process. Until it completes, connected accounts can publish through the full pipeline with private (SELF_ONLY) visibility. We will not describe public posting as available before the audit approves it.