Publish to TikTok
Publish single videos, scheduled posts, and photo carousels to a connected TikTok account.
Single video publish
/api/v1/publish/tiktok| Parameter | Type | Required | Description |
|---|---|---|---|
mediaId | string | Yes | Video media ID to publish. |
tiktokAccountId | string (UUID) | Yes | Connected TikTok account ID from GET /tiktok/accounts. |
caption | string | No | Post caption. |
privacyLevel | string | No | PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, or SELF_ONLY. |
isAigc | boolean | No | Flag content as AI-generated. |
postMode | string | No | "direct" or "inbox". |
disableComment | boolean | No | Disable comments. |
disableDuet | boolean | No | Disable duet. |
disableStitch | boolean | No | Disable stitch. |
discloseCommercial | boolean | No | Disclose commercial content. |
brandOrganic | boolean | No | Mark as brand organic content. |
brandedContent | boolean | No | Mark as branded content. |
scheduledAt | string | No | ISO 8601 timestamp with timezone offset. Must be 5 minutes to 29 days in the future. |
The operation is asynchronous. The initial response returns an outputJobId and a status. Poll GET /jobs/publish/{outputJobId} until the status reaches succeeded or failed.
Scheduled publishing must be enabled for the account. If it is not enabled, requests with scheduledAt return 403.
{
"outputJobId": "019e1b76-74d7-8c7e-a927-6bd34bfaa114",
"status": "queued"
}When scheduledAt is provided, the response status is scheduled and includes scheduledFor.
{
"outputJobId": "019e1b76-74d7-8c7e-a927-6bd34bfaa114",
"status": "scheduled",
"scheduledFor": "2026-06-20T14:30:00+00:00"
}Example
{
"mediaId": "019e1b70-6f9e-80fd-8c49-690bcbdaf8db",
"tiktokAccountId": "550e8400-e29b-41d4-a716-446655440000",
"caption": "Made with AI #wonda",
"privacyLevel": "SELF_ONLY",
"isAigc": true,
"postMode": "direct"
}Schedule management
/api/v1/publish/scheduledLists scheduled Instagram and TikTok publish jobs for the account, soonest first.
/api/v1/publish/scheduled/{outputJobId}Cancels a scheduled publish before it fires. The endpoint returns 409 if the job has already started or reached a terminal state.
Both schedule-management endpoints return 403 when scheduled publishing is not enabled for the account.
TikTok photo carousel
/api/v1/publish/tiktok/carousel| Parameter | Type | Required | Description |
|---|---|---|---|
mediaIds | string[] | Yes | 2 to 35 media IDs. TikTok carousels only accept JPEG and WebP images. |
tiktokAccountId | string (UUID) | Yes | Connected TikTok account ID from GET /tiktok/accounts. |
caption | string | No | Optional caption, up to 90 characters. |
privacyLevel | string | No | Defaults to SELF_ONLY. |
postMode | string | No | direct or inbox. Defaults to direct. |
coverIndex | number | No | Index of the cover image to use. Defaults to 0. |
isAigc | boolean | No | Defaults to false. |
disableComment | boolean | No | Disable comments. |
disableDuet | boolean | No | Disable duet. |
disableStitch | boolean | No | Disable stitch. |
discloseCommercial | boolean | No | Defaults to false. |
brandOrganic | boolean | No | Defaults to false. |
brandedContent | boolean | No | Defaults to false. |
TikTok carousel publishing rejects S3-backed media. Use GCS-hosted JPEG or WebP images.
{
"mediaIds": [
"019e1b70-6f9e-80fd-8c49-690bcbdaf8db",
"019e1b72-0742-8bae-bb93-b569036d05af"
],
"tiktokAccountId": "550e8400-e29b-41d4-a716-446655440000",
"caption": "New carousel",
"privacyLevel": "SELF_ONLY",
"postMode": "direct",
"coverIndex": 0
}{
"tiktokPublishId": "c34a4b1f-b2ff-4f3f-a4fb-6cf2ca8f9e2c",
"publishId": "v0...",
"tiktokMediaId": "v0...",
"permalink": "https://www.tiktok.com/@example/video/...",
"imageCount": 2
}