YouTube API
Connect a channel once, then upload videos and Shorts with title, privacy, tags, thumbnails, and playlist attach — schedule with Aether. No Google Cloud project setup for your users.
One call for videos and Shorts. Aether handles the resumable upload protocol, quota tracking, and scheduled publishing automatically.
import Aether from "aether";
const aether = new Aether({ apiKey: process.env.AETHER_API_KEY });
// Upload and schedule a YouTube video
const post = await aether.posts.create({
profileIds: ["yt_channel123"],
text: "A deep dive into our architecture...\n\n#API #buildinpublic",
mediaUrls: ["https://your-cdn.com/episode-12.mp4"],
overrides: {
youtube: {
title: "How We Built a Unified Social Media API",
privacyStatus: "public",
categoryId: "28",
tags: ["api", "youtube"],
playlistId: "PLxxxxxxxx",
},
},
scheduledFor: "2026-06-15T15:00:00Z",
});
// Post a YouTube Short
const short = await aether.posts.create({
profileIds: ["yt_channel123"],
text: "Quick explainer on API rate limits. #Shorts #API",
mediaUrls: ["https://your-cdn.com/short-clip.mp4"],
overrides: {
youtube: {
title: "60 seconds to understand rate limiting",
privacyStatus: "public",
},
},
});Free tier · 3 accounts · no credit card
Get your free API keyimport os
import aether
client = aether.Aether(api_key=os.environ["AETHER_API_KEY"])
# Upload and schedule a YouTube video
post = client.posts.create(
profile_ids=["yt_channel123"],
text="A deep dive into our architecture...",
media_urls=["https://your-cdn.com/episode-12.mp4"],
overrides={
"youtube": {
"title": "How We Built a Unified Social Media API",
"privacyStatus": "public",
"categoryId": "28",
}
},
scheduled_for="2026-06-15T15:00:00Z",
)curl -X POST https://api.aetherhq.dev/v1/posts \
-H "Authorization: Bearer $AETHER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"profileIds": ["yt_channel123"],
"text": "A deep dive into our architecture...",
"mediaUrls": ["https://your-cdn.com/episode-12.mp4"],
"scheduledFor": "2026-06-15T15:00:00Z",
"overrides": {
"youtube": {
"title": "How We Built a Unified Social Media API",
"privacyStatus": "public",
"categoryId": "28"
}
}
}'YouTube uploads begin processing immediately — status is publishing while YouTube processes the video. Once processing completes, publishResults includes the YouTube video ID.
{
"success": true,
"data": {
"id": "post_6q8st3b",
"status": "publishing",
"text": null,
"profileIds": ["yt_channel123"],
"mediaUrls": ["https://cdn.aetherhq.dev/org_9p2qrs/episode-12.mp4"],
"mediaKeys": ["org_9p2qrs/episode-12.mp4"],
"scheduledFor": "2026-06-15T15:00:00.000Z",
"publishResults": [],
"publishedAt": null,
"failedAt": null,
"createdAt": "2026-06-08T14:23:11.000Z"
}
}Getting direct YouTube API access means: creating a Google Cloud project, enabling the YouTube Data API v3, setting up OAuth 2.0 credentials, building a consent screen, and requesting quota increases once your app scales.
Aether's Connect Link removes all of that. Call one endpoint, get a URL, send it to your user. They authorize their YouTube channel, and it appears in your dashboard automatically.
// Generate a Connect Link for your user to authenticate YouTube
const link = await aether.connectLinks.create({
platform: "youtube",
redirectUrl: "https://yourapp.com/settings/social",
});
// Send link.url to your user — they click, authorize their YouTube channel,
// and it appears in your dashboard automatically.
// No Google Cloud project or OAuth credential setup needed.
console.log(link.url); // "https://connect.aetherhq.dev/link/cl_yt3s6t..."
console.log(link.expiresAt); // "2026-06-15T14:23:11.000Z"Aether uses YouTube's resumable upload session for video posts — initiate the session, then PUT the video bytes with the correct content type.
Pass scheduledFor and Aether holds the post until the time fires, then uploads with your chosen privacyStatus. No cron job on your side.
Upload a vertical video (9:16, under 3 minutes). YouTube classifies qualifying videos as Shorts automatically. No special flag needed.
Pass overrides.youtube.playlistId to add the uploaded video to a channel playlist. List playlists for a connected profile via the profiles API.
Set firstComment (or overrides.youtube.firstComment) to post a top-level comment right after the video uploads — useful for hashtags and CTAs.
Title, privacy, category, tags, made-for-kids, synthetic-media disclosure, and custom thumbnail URL — typed on the YouTube override object.
Aether MCP tools can upload and schedule YouTube posts with the same overrides your API uses — Connect Link OAuth, no Google Cloud setup for your users.
YouTube's API is well-documented but has meaningful infrastructure overhead. Here's what you take on directly versus using Aether.
| Feature | Aether | YouTube API directly |
|---|---|---|
| Quota management | ✓Aether tracks and optimizes your quota | ✗10,000 units/day, manually tracked |
| Video upload | ✓Resumable upload handled for you | ✗Implement resumable upload protocol yourself |
| Authentication | ✓One API key | ✗OAuth 2.0 + Google Cloud project setup |
| Scheduled publishing | ✓Native scheduledFor field | ✗Set privacyStatus to private then update |
| API maintenance | ✓We absorb all breaking changes | ✗Your team's responsibility |
| Platform compliance | Official API, fully compliant | Official API, fully compliant |
YouTube uses a quota system rather than request-rate limits. Each operation costs quota units. Aether tracks usage and queues uploads across days to stay within your allocation.
| Operation | Cost / limit | Error code | Note |
|---|---|---|---|
| Daily quota | 10,000 units / day | quotaExceeded | Shared unit pool for non-upload API calls |
| Video upload | 100 uploads / day | uploadLimitExceeded | Dedicated bucket; 1 unit per videos.insert |
| Playlist attach | ~50 quota units | quotaExceeded | playlistItems.insert (shared pool) |
| Title | 100 characters | 400 | Required field |
| Description | 5,000 characters | 400 | UTF-8 |
| Tags | ≤500 chars combined | 400 | Each tag ≤100 chars |
| Code | Meaning | How Aether handles it |
|---|---|---|
| quotaExceeded | Shared daily API quota exhausted | Retry after midnight Pacific; reduce non-upload API volume or request a quota increase in Google Cloud |
| forbidden | Insufficient permissions for this operation | Re-connect via Connect Link to re-request YouTube scopes |
| unauthorized | Invalid or expired credentials | Aether auto-refreshes Google OAuth tokens automatically |
| uploadLimitExceeded | Channel daily upload-count limit reached | Wait for the upload limit to reset or reduce upload frequency |
| badRequest | Invalid parameter or missing required field | Aether validates requests; check title, mediaUrls, and override fields |
| videoNotFound | Requested video does not exist | Verify video ID from publishResults after upload completes |
AI-Native
Aether ships an MCP server that exposes every YouTube endpoint as a callable tool. Claude Desktop, Cursor, and any MCP-compatible agent can upload videos, create Shorts, schedule publishing, and pull analytics — with no additional integration code.
# Add to ~/.claude/claude_desktop_config.json
{
"mcpServers": {
"aether": {
"command": "npx",
"args": ["-y", "aether-mcp"],
"env": { "AETHER_API_KEY": "sk_live_..." }
}
}
}
# Claude can now upload to YouTube:
# "Upload our latest podcast episode to YouTube, schedule for Thursday 3pm"
# "Post this as a YouTube Short"
# "Add this video to our Tutorials playlist"Video uploads use a dedicated default allocation of 100 uploads per day at 1 quota unit each (videos.insert). Other YouTube Data API calls draw from the shared 10,000-unit daily pool. Plan upload volume around the dedicated upload bucket.
Yes. Set scheduledFor in the post request. Aether holds the post and uploads when the schedule fires, using privacyStatus from overrides (default public).
Common formats YouTube accepts (MP4 H.264, MOV, WebM, and others). Pass a publicly reachable media URL; Aether streams it into YouTube's resumable upload API.
Yes. Upload a vertical video (9:16 aspect ratio, under 3 minutes). YouTube automatically classifies qualifying videos as Shorts. No special flag needed.
Yes. Aether uses YouTube's resumable upload session for video posts (initiate session, then PUT the video bytes).
Free tier · 3 accounts · full API access · MCP server · no credit card.
Get your free API key →