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.

Ready to get started?

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