TikTok Content Posting API Privacy levels: SELF_ONLY | FOLLOWER_OF_CREATOR | MUTUAL_FOLLOW_FRIENDS | PUBLIC_TO_EVERYONE Set as_draft: true to send the video to the user's TikTok inbox as a draft (requires the video.upload scope, works unaudited/sandbox) instead of posting it directly (requires video.publish + app audit). Draft mode uses TikTok's separate inbox endpoint and ignores title, privacy_level, and interaction settings — the user sets everything in the TikTok app before posting.
TikTok Content Posting API
Privacy levels: SELF_ONLY | FOLLOWER_OF_CREATOR | MUTUAL_FOLLOW_FRIENDS | PUBLIC_TO_EVERYONE
Set as_draft: true to send the video to the user's TikTok inbox as a draft instead of posting it directly — the user finishes editing (including the caption) and posts it themselves in the TikTok app. This routes to TikTok's separate inbox endpoint and requires only the video.upload scope, which works in unaudited apps and sandbox mode. Direct posting requires the video.publish scope and a completed TikTok app audit.
POST https://eranol.com/api/v1/social/tiktok/publish
{
"title": "Check this out! #fyp",
"video_url": "https://your-r2-or-cdn-url/video.mp4",
"disable_duet": false,
"privacy_level": "PUBLIC_TO_EVERYONE",
"disable_stitch": false,
"disable_comment": false,
"scheduled_publish_time": null
}
{
"video_url": "https://your-r2-or-cdn-url/video.mp4",
"as_draft": true
}
When as_draft is true, TikTok's inbox endpoint is used instead of the direct-publish endpoint. title, privacy_level, disable_comment, disable_duet, disable_stitch, and the branded-content fields are all ignored — TikTok requires the user to set the caption and all posting options in-app before posting the draft.
| Field | Type | Required | Notes |
|---|---|---|---|
title | string | Required unless as_draft | Caption, max 2200 chars. Ignored when as_draft |
video_url | string | Yes | Must be an eranol.com URL |
as_draft | boolean | No | Default false. true sends to the TikTok inbox as a draft via TikTok's separate inbox endpoint (needs video.upload scope, works unaudited/sandbox) instead of posting directly (needs video.publish scope + app audit) |
privacy_level | string | Required unless as_draft | One of PUBLIC_TO_EVERYONE, FOLLOWER_OF_CREATOR, MUTUAL_FOLLOW_FRIENDS, SELF_ONLY. Ignored when as_draft |
disable_comment | boolean | No | Ignored when as_draft |
disable_duet | boolean | No | Ignored when as_draft |
disable_stitch | boolean | No | Ignored when as_draft |
scheduled_publish_time | number | null | No | TikTok's own native scheduling (unix seconds). Ignored when as_draft |
{
"publish_id": "sdfger345-34-dfhgrt-3453sdgfg-34234"
}
| Code | Meaning |
|---|---|
401 | Missing or invalid API key |
402 | Insufficient credits |
422 | Validation error — check your request body |
429 | Rate limit exceeded — slow down requests |
500 | Internal server error — try again or contact support |