Skip to content

API

YouTube scheduling API and video upload

SkedCast's REST API schedules Shorts and long-form videos to YouTube with one authenticated POST call. The request has the same shape as for every other connected platform, plus any fields specific to YouTube.

All platforms

Scheduling to YouTube through SkedCast's API#

SkedCast's /v1 REST API schedules Shorts and long-form videos to YouTube 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 YouTube channel connected through its Google account, 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 YouTube are listed below.

YouTube-specific fields#

FieldNotes
titleOptional. YouTube needs a title, so when you omit it SkedCast uses the caption's first line (up to 100 characters). Send one to choose it yourself.
madeForKidsOptional boolean; false ("not made for kids") unless you set it. It is a COPPA declaration, so it is never read from the channel.
privacyStatusOptional: public (the default), unlisted or private. A natively scheduled video is uploaded private until its time.
captionsOptional subtitle tracks (up to 10, SRT or WebVTT with timing), uploaded once the video is live. Needs the youtube.force-ssl permission. The outcome is captionIssue on the post target.
chaptersOptional [{ start, title }] in whole seconds: the first at 0, at least 3, each at least 10 seconds long. Added to the description for YouTube to build chapters from.
playlistIdOptional: adds the video to one of the channel's playlists once it is live (playlistIssue reports a failure).

Send these in the overrides object of the "youtube" entry in variants. Every other field on the post (caption, media, schedule) is the same as on every other platform.

Example: schedule a post to YouTube#

json
{
  "clientId": "00000000-0000-4000-8000-000000000001",
  "content": "Building a scheduler in public: Day 12 — the API layer.\n\nToday: idempotency keys and why they matter.",
  "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": "youtube", "overrides": { "madeForKids": false } }
  ]
}
POST https://api.skedcast.com/v1/posts — send Authorization: Bearer sked_live_… and an Idempotency-Key header. Replace the example ids with your own.

YouTube facts#

FactValue
Max caption length5,000 characters
Media per postone video per upload.
Native platform schedulingAvailable. Send scheduleMode: "native" to hand the timer to YouTube's own scheduler; by default SkedCast holds the timer.
SkedCast's default pacing5 / day, with at least 30 min between posts, per account. This is SkedCast's per-account pacing, not YouTube's own published limit. See the rate limits reference.
Published-post URL (permalink)https://youtu.be/{id}, always returned once the video is published.

Reading status and results#

GET https://api.skedcast.com/v1/post-targets/{id} returns the YouTube 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: holdReason says why (pacing, a platform limit, media still processing, your plan, or a channel that needs reconnecting) and retryAt says when the next try is.
  • missed: the scheduled time passed while the post waited. outcomeReason says why; reschedule it.
  • failed: failureReason says why. When the post may already be live, outcomeReason is delivery_unconfirmed: check the account, because a retry is refused.
  • requiredAction says what you must do (reconnect_channel, change_plan, contact_support, reschedule, retry or check_platform), or is null when nothing is needed.
  • Instead of polling, subscribe to the target.published and target.failed webhooks (one per destination; post.published and post.failed report the whole post). See the webhooks reference below.
  • Or connect an MCP client and ask an agent to check. See the MCP hub below.
YouTubeapischedulingrest

FAQ

Is YouTube's own scheduler used, or SkedCast's?
SkedCast's, by default: SkedCast publishes the video at the scheduled time. Send `scheduleMode: "native"` with a future time to use YouTube's own scheduler instead: the video is uploaded as private and YouTube makes it public at the time, so an unlisted video cannot be scheduled natively.
Can I edit a YouTube video after it is published?
Yes. POST /v1/posts/{id}/targets/{targetId}/edit-published (MCP tool edit_published_post) changes the title, description, tags, category, privacy, thumbnail, translations and subtitle tracks of a video that is live or natively scheduled, without republishing it. When YouTube publishing is temporarily at capacity, the call returns 429 youtube_units_exhausted with a Retry-After header. Wait that many seconds, then retry.

Ready to broadcast everywhere?

Sign up free — no credit card. You land on the Free plan, and you can start a one-time 7-day Studio trial from your workspace whenever you are ready. Connect your first accounts, import a batch, and watch one post fan out across every platform.