Aether

YouTube

YouTube OAuth connect, video and Shorts publishing, and scheduling on Aether.

YouTube is supported in V1 for OAuth connect, video publishing, and scheduling. Videos are required — Shorts are auto-classified by YouTube for qualifying vertical uploads. Analytics, inbox/comment sync, and community posts are not available yet.

Connect an account

  1. Generate a Connect Link with "platform": "youtube"
  2. Send the url to your user — they authorize via Google OAuth
  3. After OAuth completes, the profile appears via GET /v1/profiles

Self-hosted deployments

Set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET on your API server. Register redirect URI {NEXT_PUBLIC_API_URL}/v1/oauth/callback/youtube on your Google Cloud OAuth client (prod and local tunnel URLs as needed).

Scopes requested: youtube.upload, youtube.readonly, and youtube.force-ssl (first comment and playlist attach). After widening scopes, reconnect existing YouTube profiles so users re-consent.

Uploads from unverified API projects created after July 28, 2020 are restricted to private visibility, regardless of the requested privacyStatus. Complete YouTube API project verification before expecting public or unlisted uploads.

Content types

Video upload

A publicly reachable video URL is required in mediaUrls.

{
  "text": "A deep dive into our architecture...\n\n#API #buildinpublic",
  "profileIds": ["prof_yt123"],
  "mediaUrls": ["https://cdn.example.com/episode-12.mp4"],
  "overrides": {
    "youtube": {
      "title": "How We Built a Unified Social Media API",
      "privacyStatus": "public",
      "categoryId": "28",
      "tags": ["api", "youtube"]
    }
  }
}

Shorts

Upload a vertical video (typically 9:16, under ~3 minutes). YouTube classifies qualifying videos as Shorts automatically — no special flag or content type is required.

{
  "text": "Quick explainer on API rate limits. #Shorts #API",
  "profileIds": ["prof_yt123"],
  "mediaUrls": ["https://cdn.example.com/short-clip.mp4"],
  "overrides": {
    "youtube": {
      "title": "60 seconds to understand rate limiting"
    }
  }
}

Platform overrides

FieldDescription
titleVideo title (max 100 chars). Defaults to the first 100 characters of post text
textDescription override (otherwise uses base text)
privacyStatuspublic (default), private, or unlisted. Unverified API projects created after July 28, 2020 can only upload as private until verification completes
categoryIdYouTube category ID (default 22 People & Blogs). Common: 10 Music, 20 Gaming, 24 Entertainment, 27 Education, 28 Science & Tech
tagsArray of tags (each ≤100 chars; combined ≤500 after dedupe)
madeForKidsCOPPA self-declared made-for-kids flag (selfDeclaredMadeForKids)
containsSyntheticMediaDisclose realistic AI / synthetic (altered) media
playlistIdAdd the video to this playlist after upload
thumbnailUrlCustom thumbnail image URL (regular videos; channel must allow custom thumbnails)
firstCommentTop-level comment posted after upload (also supported at post level)

Playlists

List playlists for a connected YouTube profile:

GET /v1/profiles/:profileId/youtube-playlists

Use a returned playlist id as overrides.youtube.playlistId when creating a post. Aether does not auto-apply a default playlist — attach is explicit per publish. Creating or deleting playlists is not supported.

First comment

Pass firstComment at the post level or in overrides.youtube to publish a top-level comment immediately after the video uploads (uses YouTube commentThreads.insert).

Scheduling

Pass scheduledFor with an optional timezone — same as other platforms. Aether holds the post and uploads when the schedule fires, using the privacyStatus you set (default public). Native YouTube publishAt (upload as private then platform-side publish) is not used in this phase.

Quota

Video uploads (videos.insert) use a dedicated default allocation of 100 upload calls per day. Other YouTube Data API endpoints draw from the shared 10,000-unit daily quota.

OperationApprox. cost
Video upload (videos.insert)Dedicated bucket: 100 uploads/day (1 unit each)
Playlist attach (playlistItems.insert)~50 units (shared pool)

Exceeding limits returns a platform error (e.g. quotaExceeded or uploadLimitExceeded).

Not available for YouTube yet

FeatureStatus
Post and account analyticsConnector does not implement metrics fetch yet
Inbox / comment sync & moderationNot supported
Community postsNot supported via YouTube Data API in Aether
Post-publish metadata update APIPlanned (title/tags/thumb/playlist on existing videos)
Native YouTube publishAtNot implemented — use Aether scheduledFor

Verification checklist

After configuring your Google OAuth client and API env vars:

  1. Dashboard → Profiles → Connect → YouTube
  2. Complete OAuth → profile appears with platform: "youtube"
  3. Publish a short vertical clip (Shorts) and a longer video
  4. Optional: set thumbnailUrl, playlistId, and firstComment
  5. Optional: schedule a post ~10 minutes ahead and confirm it publishes on time
SymptomFix
YouTube grayed out in connect dialogRebuild @aether/shared after adding youtube to V1_PLATFORMS
Redirect errorGoogle redirect URI must match {NEXT_PUBLIC_API_URL}/v1/oauth/callback/youtube exactly
First comment or playlist attach fails with permission errorReconnect the profile to grant youtube.force-ssl
Thumbnail ignored / failsChannel must be verified for custom thumbnails; failures are non-fatal after a successful upload

See MCP Server and Node.js SDK for connect and publish examples.

On this page