Platform integration

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

  1. 1The account holder connects their TikTok account through TikTok Login. They see TikTok's own consent screen listing the scopes we request.
  2. 2We store the resulting tokens encrypted, and refresh them server-side so the connection does not silently expire.
  3. 3Before publishing we query creator_info to learn which privacy levels and interaction settings that specific account allows.
  4. 4You POST the caption, the video, and the creator's chosen options to /v1/posts.
  5. 5We transfer the video to TikTok with FILE_UPLOAD, then poll until TikTok confirms the post is live or reports why it failed.
  6. 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.basic

Show the connected account's display name and avatar, so the creator can confirm which account a post is going to.

video.publish

Direct 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_rejected

The requested privacy level is not available for this creator. Read creator-info and choose from privacy_level_options.

rate_limited

TikTok's per-user pacing limit was hit. The publish is retried automatically with backoff, and the error is reported as retryable: true.

media_error

The video could not be fetched or failed TikTok's processing checks. Verify format and duration against creator-info.

token_expired

The 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.