Scheduling to TikTok through SkedCast's API#
SkedCast's /v1 REST API schedules video and photo carousel to TikTok the same way it does every other platform: one POST https://api.skedcast.com/v1/posts call with a content caption and a targets block naming the connected accounts.
You need a TikTok account connected through TikTok's login, connected once through the console or through a connect link that POST /v1/clients/{id}/connect-invites creates.
The request is one contract for every connected platform. The fields that are specific to TikTok are listed below.
TikTok-specific fields#
| Field | Notes |
|---|---|
privacyLevel | Required. One of PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR or SELF_ONLY. A missing value returns a 422 naming the field. |
Example: schedule a post to TikTok#
{
"clientId": "00000000-0000-4000-8000-000000000001",
"content": "Day 12 of building a scheduler in public.",
"mediaIds": ["00000000-0000-4000-8000-000000000003"],
"targets": { "mode": "accounts", "accountIds": ["00000000-0000-4000-8000-000000000002"] },
"schedule": { "type": "at", "scheduledAt": "2030-01-15T15:00:00Z" },
"variants": [
{ "platform": "tiktok", "overrides": { "privacyLevel": "PUBLIC_TO_EVERYONE" } }
]
}TikTok facts#
| Fact | Value |
|---|---|
| Max caption length | 2,200 characters |
| Media per post | one video, or up to 35 photos as a carousel, per post (not mixed). |
| Native platform scheduling | No. SkedCast holds the timer and publishes at the scheduled time. |
| SkedCast's default pacing | 15 / day, with at least 1 hr between posts, per account. This is SkedCast's per-account pacing, not TikTok's own published limit. See the rate limits reference. |
Published-post URL (permalink) | Returned once TikTok confirms the post is public. A SELF_ONLY post may never get a public URL. Until then externalId is TikTok's publish id, not the video id. |
Reading status and results#
GET https://api.skedcast.com/v1/post-targets/{id} returns the TikTok target's status (for example scheduled, on_hold, published, failed or missed). Once the post is published, externalId and permalink point at the live post (see the table above).
on_hold:holdReasonsays why (pacing, a platform limit, media still processing, your plan, or a channel that needs reconnecting) andretryAtsays when the next try is.missed: the scheduled time passed while the post waited.outcomeReasonsays why; reschedule it.failed:failureReasonsays why. When the post may already be live,outcomeReasonisdelivery_unconfirmed: check the account, because a retry is refused.requiredActionsays what you must do (reconnect_channel,change_plan,contact_support,reschedule,retryorcheck_platform), or isnullwhen nothing is needed.- Instead of polling, subscribe to the
target.publishedandtarget.failedwebhooks (one per destination;post.publishedandpost.failedreport the whole post). See the webhooks reference below. - Or connect an MCP client and ask an agent to check. See the MCP hub below.