Overview
Schedule and automate YouTube video uploads with visibility settings, comments, likes, and analytics.
Upload and schedule videos to YouTube channels, then moderate comments, like videos, and read analytics through the same connection. There is no text or image post type on YouTube, so publishing always means uploading one video.
Quick Reference
| Property | Value |
|---|---|
| Title limit | 100 characters |
| Description limit | 5,000 characters |
| Videos per post | 1 |
| Video formats | MP4, MOV, AVI, WMV, FLV, 3GP, WebM |
| Onepostly upload cap | 256 MB |
| YouTube native max size | 256 GB |
| Shorts | Vertical 9:16, 3 minutes or shorter, auto-detected |
| Post types | Video, Shorts |
| Scheduling | Yes, with IANA timezone |
| Editing published videos | No. Delete and re-upload instead |
| Comments | Yes (list, create, delete) |
| Likes | Yes |
| Analytics | Yes (views, likes, comments, shares) |
| Daily upload quota | ~6 uploads per day on default Google quota |
Before You Start
YouTube is video-only. Every post requires exactly one video file. Publishing anything else fails with UNSUPPORTED_MEDIA_KIND.
Additional requirements:
- Onepostly caps publish uploads at 256 MB. YouTube itself allows up to 256 GB, so very large videos must be trimmed or compressed first
- Google's default quota allows roughly 6 uploads per day. Bursting past it fails until the next day
- Shorts are auto-detected from duration and aspect ratio. There is no separate post type or flag
- A suspended channel fails every upload with a 403 error. Check the channel status on YouTube before scheduling batches
- Unverified channels are limited to 15-minute videos. Verify the channel with a phone number to unlock longer uploads
Connect
Open Dashboard → Connections and connect YouTube.
Complete the Google consent screen with the account that owns the channel. The Google account must already have a YouTube channel.
Grab the account id from the connections list:
const { connections: list } = await connections.listConnections();
const yt = list.find((c) => c.platform === "youtube");
// yt.id is your accountIdIf an action fails with PERMISSION_DENIED, the connection is missing the scope. Reconnect YouTube once to grant it.
OAuth Scopes
| Scope | What it enables |
|---|---|
youtube.upload | Upload and manage your videos |
youtube.force-ssl | Read and manage comments, likes, and video details |
yt-analytics.readonly | Read YouTube Analytics metrics for your videos |
Token Lifetime
| Token | Lifetime | Behavior |
|---|---|---|
| Access token | ~1 hour | Refreshed automatically by Onepostly |
| Refresh token | Long-lived | After revocation in Google account settings, reconnect the account |
Capabilities
| Action | Supported | Notes |
|---|---|---|
| Video upload | Yes | Exactly one URL per destination |
| Shorts | Yes | Vertical 9:16, 3 minutes or shorter, auto-detected |
| Visibility | Yes | public / unlisted / private per destination |
| Schedule | Yes | Cancel any time before it publishes |
| Remote delete | Yes | Removes the video from the channel |
| Comments | Yes | List, create, delete |
| Like / unlike | Yes | On any video, as the connected account |
| Metadata | Yes | title, description, tags, categoryId (default "22"), madeForKids (default false), containsSyntheticMedia |
| Analytics | Yes | Views, likes, comments, shares |
| Text / image / stories / threads / quotes | No | Not YouTube concepts |
What You Can't Do
These features are not available through Onepostly's YouTube integration:
- Text-only, image, or multi-image posts
- Threads, quotes, or reply chains
- Custom thumbnails (YouTube exposes three auto-generated options only through Studio)
- Playlists or end screens
- Community posts, Premieres, or live streams
- Captions or subtitles
- Editing a published video's title or description. Delete and re-upload instead