How to Schedule TikTok Posts via API

TikTok's Content Posting API has no native scheduling. Here's how to schedule TikTok posts with Postproxy — exact-time and queue-based, with the real request shapes.

Why TikTok scheduling is harder than it looks

TikTok’s Content Posting API has two flows: direct post publish, and an inbox/draft upload that lands inside the TikTok app for the user to publish manually. Neither takes a future timestamp.

Compare with Meta’s Instagram Graph API (no scheduled_publish_time for Reels either) or YouTube (only supports private uploads with a future publishAt). TikTok is the strictest: there is no server-side scheduling at all. If you want a post live at 9:00 AM Tuesday, something on your side has to be awake at 9:00 AM Tuesday and call the publish endpoint.

That something — a worker, a delayed task queue, retry logic, timezone handling, OAuth token refresh — is the whole problem.

Schedule a TikTok post for an exact time

Terminal window
curl -X POST "https://api.postproxy.dev/api/posts" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"post": {
"body": "New product drop. Link in bio.",
"scheduled_at": "2026-05-12T09:00:00Z"
},
"profiles": ["tiktok"],
"media": ["https://yourcdn.com/launch-9x16.mp4"],
"platforms": {
"tiktok": {
"privacy_status": "PUBLIC_TO_EVERYONE"
}
}
}'

privacy_status is required by TikTok on every post. Allowed values: PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY.

The post enters a scheduled state. At 09:00 UTC on May 12 Postproxy uploads the video to TikTok and publishes. Until then you can PATCH /api/posts/:id to change the caption (post.body), the time, or the media.

TikTok media specs

These are validated upfront so you find out about a wrong file before TikTok rejects it 30 seconds in.

  • Video: MP4, MOV, AV, or WebM, max 4GB, 3 seconds to 10 minutes
  • Minimum dimensions: 720×1280 (TikTok rejects below this)
  • Aspect ratio: 9:16 strongly preferred (TikTok will letterbox 16:9)
  • Codec: H.264 video, AAC audio
  • Caption (post.body): max 2,200 characters

For multi-image posts (carousels), TikTok also supports format: "image" with up to 35 images:

Terminal window
curl -X POST "https://api.postproxy.dev/api/posts" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"post": { "body": "Behind the scenes — swipe →" },
"profiles": ["tiktok"],
"media": [
"https://yourcdn.com/bts-1.jpg",
"https://yourcdn.com/bts-2.jpg",
"https://yourcdn.com/bts-3.jpg"
],
"platforms": {
"tiktok": {
"format": "image",
"privacy_status": "PUBLIC_TO_EVERYONE",
"photo_cover_index": 0
}
}
}'

Queue-based scheduling

When you want a steady cadence rather than exact timestamps, queues are simpler. First create a queue (a profile group is required):

Terminal window
curl -X POST "https://api.postproxy.dev/api/post_queues" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"profile_group_id": "pg123",
"post_queue": {
"name": "TikTok evergreen",
"timezone": "America/Los_Angeles",
"jitter": 10,
"queue_timeslots_attributes": [
{ "day": 1, "time": "09:00" },
{ "day": 3, "time": "13:00" },
{ "day": 5, "time": "18:00" }
]
}
}'

day is 0 (Sunday) to 6 (Saturday). jitter shifts each post by ±10 minutes so the cadence doesn’t look mechanical.

Then add a post — pass queue_id, no scheduled_at:

Terminal window
curl -X POST "https://api.postproxy.dev/api/posts" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"post": { "body": "How we shoot this stuff." },
"profiles": ["tiktok"],
"media": ["https://yourcdn.com/bts.mp4"],
"queue_id": "q1abc",
"queue_priority": "medium",
"platforms": {
"tiktok": { "privacy_status": "PUBLIC_TO_EVERYONE" }
}
}'

The response includes the assigned scheduled_at. Higher-priority posts (queue_priority: "high") re-shuffle to earlier slots when added.

Status

Terminal window
curl -X GET "https://api.postproxy.dev/api/posts/p_xyz" \
-H "Authorization: Bearer YOUR_API_KEY"

Post-level statuses: processing, processed, scheduled, media_processing_failed. Per-platform statuses: processing, published, failed. Once published, the platform record carries a permalink to the live TikTok URL.

Going further

For deeper TikTok-specific topics — sandbox vs. production access, audited app review, the inbox-vs-direct-post tradeoff — see our TikTok API integration guide and the post on scaling TikTok posting.

For the same scheduling treatment on adjacent platforms, see the sibling guides: auto-post YouTube Shorts via API, schedule Instagram Reels via API, and schedule and auto-post to Threads via API.

Ready to get started?

Start with our free plan and scale as your needs grow. No credit card required.