Post to YouTube via MCP
Quick navigation: Which path should I use? · Multi-platform example · Recovery playbook · All 9 platforms at a glance
Prerequisites: VoxBurst MCP server configured. See MCP Server setup.
YouTube requires a video on every post. Images and text-only posts are not supported as standalone uploads. The YouTube Data API enforces a default limit of 6 video uploads per day, 3 per hour per channel.
The complete flow
Upload your video first
YouTube videos must be uploaded to VoxBurst before posting. Use the REST Media API to get a presigned URL and upload your file:
# Step 1: request presigned URL
curl -X POST https://api.voxburst.io/v1/media/upload \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx" \
-d '{ "filename": "demo.mp4", "contentType": "video/mp4", "sizeBytes": 52428800 }'
# Step 2: PUT bytes to the returned uploadUrl
# Step 3: poll GET /v1/media/:id until status = READYOnce you have a mediaId with status: READY, proceed.
Find the YouTube channel account ID
list_accounts()Look for "platform": "youtube". The id field is what goes in accountIds.
Create the post
See post type examples below.
Check the result
get_post(postId: "post_abc123"){
"id": "post_abc123",
"status": "published",
"platforms": [
{
"platform": "youtube",
"status": "published",
"platformPostUrl": "https://www.youtube.com/watch?v=ABC123",
"publishedAt": "2026-06-01T16:00:10Z",
"error": null
}
]
}What type of post do you want?
| I want to post… | contentType | Notes |
|---|---|---|
| Standard video | VIDEO | Any length up to 12 hours |
| YouTube Short | VIDEO | ≤60 seconds, 9:16 aspect ratio — automatically becomes a Short |
Videos ≤60 seconds shot in 9:16 portrait format automatically publish as YouTube Shorts. No separate contentType is needed — VoxBurst passes through the video and YouTube classifies it.
Media: Must use mediaIds (pre-uploaded VoxBurst media). YouTube does not accept raw URLs for video upload — the file must be uploaded to VoxBurst storage first.
Post type examples
Standard video
create_post(
content: "How we built our content calendar from scratch — full walkthrough",
accountIds: ["acc_youtube_abc123"],
contentType: "VIDEO",
mediaIds: ["media_video_abc123"]
)YouTube Short (portrait video ≤60 seconds)
create_post(
content: "One tip for scheduling content in under 60 seconds ⏱️",
accountIds: ["acc_youtube_abc123"],
contentType: "VIDEO",
mediaIds: ["media_short_abc123"]
)Scheduled video upload
create_post(
content: "Our founder explains the product vision in 3 minutes. Dropping Tuesday at 4 PM.",
accountIds: ["acc_youtube_abc123"],
contentType: "VIDEO",
mediaIds: ["media_founder_abc123"],
scheduledFor: "2026-06-03T16:00:00Z"
)With first comment
create_post(
content: "Complete setup guide for VoxBurst — everything you need to know",
accountIds: ["acc_youtube_abc123"],
contentType: "VIDEO",
mediaIds: ["media_guide_abc123"],
firstComment: "Timestamps:\n0:00 Intro\n1:30 Account setup\n3:00 Scheduling\n5:45 Analytics"
)Tell your AI agent this
Upload and post now:
Post a video to YouTube channel
[acc_id]. Title/caption:[text]. Use VoxBurst media ID[media_id]. Post now.
Scheduled:
Schedule a YouTube video on channel
[acc_id]. Caption:[text]. Media ID:[media_id]. Schedule for[ISO timestamp].
With chapter timestamps in first comment:
Post video
[media_id]to YouTube account[acc_id]. Caption:[text]. Add a first comment with these timestamps:[0:00 Intro, 1:30 Section 1, ...].
Failure cookbook
| Error | Cause | Fix |
|---|---|---|
QUOTA_EXCEEDED | Over 6 uploads/day or 3/hour per channel | Wait for quota to reset (midnight Pacific) or request a quota increase from Google Cloud Console |
VIDEO_REQUIRED | No mediaIds provided | YouTube requires a video — upload via Media API first, then pass the mediaId |
MEDIA_NOT_READY | Media record still processing | Poll GET /v1/media/:id until status: READY before posting |
DESCRIPTION_TOO_LONG | Over 5,000 characters | Shorten the video description |
INVALID_VIDEO_FORMAT | Unsupported codec or container | Re-encode to H.264 video with AAC audio, MP4 container |
OAUTH_TOKEN_EXPIRED | Google OAuth token expired | Re-connect the YouTube account in VoxBurst |
CHANNEL_SUSPENDED | Channel has policy violations | Check YouTube Studio for channel status and policy notices |
DUPLICATE_VIDEO | YouTube detected duplicate content | YouTube may hold or reject identical video uploads |
Post status failed | YouTube Data API error | Read platforms[].error; for quota errors, wait before retrying |
Account requirements
| Requirement | Detail |
|---|---|
| Account type | YouTube channel with upload permissions |
| Auth method | OAuth 2.0 via Google |
| Key precondition | Channel must have upload permissions enabled; quota defaults to 6 uploads/day |
| Re-connect trigger | Token expires; re-connect from VoxBurst Settings → Connected Accounts |
When YouTube is a poor fit
- Image posts — YouTube is video-only; standalone image posts are not supported
- Text-only announcements — no native text post format; use Community posts (not available via API)
- High-volume publishing — YouTube enforces a strict 6 uploads/day quota per channel; not suitable for bulk scheduling
- Short-notice publishing — YouTube video processing takes time; plan ahead for time-sensitive content
- Cross-platform campaigns where video is optional — if your campaign is image or text-based, skip YouTube or prepare a separate video asset
Cross-platform override example
YouTube takes a video while Instagram takes an image from the same campaign. Handle as two separate posts, or if both are in a multi-platform post, YouTube needs its own mediaIds:
# Post the image to Instagram, Twitter, LinkedIn
create_post(
content: "Watch the full breakdown on YouTube — link in bio.",
accountIds: ["acc_instagram_abc", "acc_twitter_def", "acc_linkedin_ghi"],
contentType: "IMAGE",
mediaUrls: ["https://cdn.example.com/thumbnail.jpg"],
platformOverrides: {
"TWITTER": { "content": "New video just dropped on YouTube 🎬 Link in profile. #tutorial" }
}
)
# Post the video to YouTube separately
create_post(
content: "Complete guide to cross-platform content scheduling — everything you need to know in 8 minutes.",
accountIds: ["acc_youtube_uvw"],
contentType: "VIDEO",
mediaIds: ["media_video_abc123"],
firstComment: "Chapters:
0:00 Intro
1:30 Setup
4:00 Scheduling
6:30 Analytics"
)See the same post across all platforms guide for a full 8-platform example.
Benchmark checklist
Last updated: 2026-05-31 — Added JSON tool-call examples and benchmark checklist.
| Supported content types | VIDEO only (≤60s 9:16 = YouTube Short automatically) |
| Unsupported content types | TEXT, IMAGE, CAROUSEL, REEL, STORY |
| Validation gotcha | 6 uploads/day, 3/hour per channel (YouTube Data API quota) |
| Media gotcha | Video must be uploaded to VoxBurst first — no raw mediaUrls; H.264 recommended |
| Account gotcha | YouTube channel must have upload permissions; quota resets midnight Pacific |
| Example prompt | ”Post video media_id to YouTube account acc_id. Caption: text.” |
| Example tool call | create_post(content: "...", accountIds: ["acc_youtube_abc"], contentType: "VIDEO", mediaIds: ["media_abc"]) |
| Example response | { "status": "published", "platforms": [{ "platform": "youtube", "platformPostUrl": "https://www.youtube.com/watch?v=..." }] } |
| Recovery path | Wait for quota reset for QUOTA_EXCEEDED; re-encode for INVALID_VIDEO_FORMAT |