YouTube API

YouTube video upload API without the OAuth headache

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.

Upload a YouTube video in under 15 minutes

One call for videos and Shorts. Aether handles the resumable upload protocol, quota tracking, and scheduled publishing automatically.

Node.js / TypeScript
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 key

The same call in Python and cURL

Python
import 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
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"
      }
    }
  }'

The actual API response

YouTube uploads begin processing immediately — status is publishing while YouTube processes the video. Once processing completes, publishResults includes the YouTube video ID.

JSON
{
  "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"
  }
}

YouTube OAuth — without the Google Cloud setup

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.

TypeScript
// 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"

Everything the YouTube API gives you

Resumable video upload

Aether uses YouTube's resumable upload session for video posts — initiate the session, then PUT the video bytes with the correct content type.

Scheduled publishing

Pass scheduledFor and Aether holds the post until the time fires, then uploads with your chosen privacyStatus. No cron job on your side.

YouTube Shorts

Upload a vertical video (9:16, under 3 minutes). YouTube classifies qualifying videos as Shorts automatically. No special flag needed.

Playlist attach

Pass overrides.youtube.playlistId to add the uploaded video to a channel playlist. List playlists for a connected profile via the profiles API.

First comment

Set firstComment (or overrides.youtube.firstComment) to post a top-level comment right after the video uploads — useful for hashtags and CTAs.

Publish overrides

Title, privacy, category, tags, made-for-kids, synthetic-media disclosure, and custom thumbnail URL — typed on the YouTube override object.

MCP / AI agents

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.

Why not build directly on the YouTube Data API v3?

YouTube's API is well-documented but has meaningful infrastructure overhead. Here's what you take on directly versus using Aether.

FeatureAetherYouTube API directly
Quota managementAether tracks and optimizes your quota10,000 units/day, manually tracked
Video uploadResumable upload handled for youImplement resumable upload protocol yourself
AuthenticationOne API keyOAuth 2.0 + Google Cloud project setup
Scheduled publishingNative scheduledFor fieldSet privacyStatus to private then update
API maintenanceWe absorb all breaking changesYour team's responsibility
Platform complianceOfficial API, fully compliantOfficial API, fully compliant

YouTube API rate limits and quota

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.

OperationCost / limitError codeNote
Daily quota10,000 units / dayquotaExceededShared unit pool for non-upload API calls
Video upload100 uploads / dayuploadLimitExceededDedicated bucket; 1 unit per videos.insert
Playlist attach~50 quota unitsquotaExceededplaylistItems.insert (shared pool)
Title100 characters400Required field
Description5,000 characters400UTF-8
Tags≤500 chars combined400Each tag ≤100 chars

YouTube API error codes reference

CodeMeaningHow Aether handles it
quotaExceededShared daily API quota exhaustedRetry after midnight Pacific; reduce non-upload API volume or request a quota increase in Google Cloud
forbiddenInsufficient permissions for this operationRe-connect via Connect Link to re-request YouTube scopes
unauthorizedInvalid or expired credentialsAether auto-refreshes Google OAuth tokens automatically
uploadLimitExceededChannel daily upload-count limit reachedWait for the upload limit to reset or reduce upload frequency
badRequestInvalid parameter or missing required fieldAether validates requests; check title, mediaUrls, and override fields
videoNotFoundRequested video does not existVerify video ID from publishResults after upload completes

AI-Native

Let your AI agent upload to YouTube

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.

Claude Desktop config
# 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"

Frequently asked questions

What does YouTube's API quota mean for my integration?+

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.

Can I schedule YouTube videos to publish at a specific time?+

Yes. Set scheduledFor in the post request. Aether holds the post and uploads when the schedule fires, using privacyStatus from overrides (default public).

What video formats does YouTube accept through Aether?+

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.

Can I post YouTube Shorts?+

Yes. Upload a vertical video (9:16 aspect ratio, under 3 minutes). YouTube automatically classifies qualifying videos as Shorts. No special flag needed.

Does Aether handle YouTube resumable uploads?+

Yes. Aether uses YouTube's resumable upload session for video posts (initiate session, then PUT the video bytes).

Ready to ship your YouTube integration?

Free tier · 3 accounts · full API access · MCP server · no credit card.

Get your free API key →