<!-- BusyBot node reference — https://busybot.net/tools/google-youtube/ -->

> Node: YouTube (`google_youtube`) · Action (binary) · v1
> Category: Marketing · Credentials: YouTube OAuth2 (`youtubeOAuth2`)
> Updated: 2026-08-16

# YouTube

> Manage YouTube channels, playlists, and videos

## Overview

The YouTube tool provides full access to the YouTube Data API v3. Supports five resources: (1) Channel -- get, getAll, update, uploadBanner. (2) Playlist -- create, delete, get, getAll, update. (3) Playlist Item -- add, delete, get, getAll. (4) Video -- delete, get, getAll (search), rate, update, upload. (5) Video Category -- getAll. Binary operations include video upload (resumable upload with chunked transfer) and channel banner upload. Requires Google OAuth2 credentials with YouTube Data API scope.

**Category:** Marketing  
**Tool Name:** `google_youtube`  
**Version:** 1

**Appearance:** Icon: `si-youtube` | Color: `#FF0000`

## Node Type

**Action (Binary)** — handles file/binary data operations

## Input / Output

| Direction | Port(s) |
|-----------|--------|
| Input | `Input` |
| Output | `Output`, `Error` |

## Credentials

This tool requires **YouTube OAuth2** credentials.
See the [Credentials Guide](https://busybot.net/credentials/youtube-oauth2/) for setup instructions.

### Resources

| Resource | Value |
|----------|-------|
| Channel | `channel` |
| Playlist | `playlist` |
| Playlist Item | `playlistItem` |
| Video | `video` |
| Video Category | `videoCategory` |

### Operations

Each resource has its own Operation list, and several resources reuse the same operation values (`get`, `getAll`, `delete`, `update`). Pick the resource first, then the operation.

| Resource | Operation | Value | Description |
|----------|-----------|-------|-------------|
| Channel | Get | `get` | Retrieve a channel |
| Channel | Get Many | `getAll` | Retrieve many channels |
| Channel | Update | `update` | Update a channel |
| Channel | Upload Banner | `uploadBanner` | Upload a channel banner image |
| Playlist | Create | `create` | Create a playlist |
| Playlist | Delete | `delete` | Delete a playlist |
| Playlist | Get | `get` | Get a playlist |
| Playlist | Get Many | `getAll` | Retrieve many playlists |
| Playlist | Update | `update` | Update a playlist |
| Playlist Item | Add | `add` | Add a video to a playlist |
| Playlist Item | Delete | `delete` | Remove an item from a playlist |
| Playlist Item | Get | `get` | Get a playlist item |
| Playlist Item | Get Many | `getAll` | Retrieve many playlist items |
| Video | Delete | `delete` | Delete a video |
| Video | Get | `get` | Get a video |
| Video | Get Many | `getAll` | Search for videos |
| Video | Rate | `rate` | Rate a video (like/dislike) |
| Video | Update | `update` | Update video metadata |
| Video | Upload | `upload` | Upload a video (resumable upload) |
| Video Category | Get Many | `getAll` | Retrieve video categories for a region |

### Parameters

Every parameter accepts expressions. Where an ID field is left empty, the node also falls back to a field of the same name on the input item — an item carrying `channelId`, `playlistId`, `playlistItemId`, `videoId` or `title` can drive the node directly.

The **Fields** parameter maps to the API's `part` argument and decides which blocks of the resource come back. `*` asks for all of them.

#### All Operations

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Authentication | `options` | No | `oAuth2` | Authentication method to use. |
| | | | | Options: `oAuth2` (OAuth2, recommended), `serviceAccount` |
| Google Account (`credentialId`) | `credential` | No | — | Connect or select your Google account. _(shown when Authentication is `oAuth2`)_ |
| Service Account Email | `string` | Yes | — | The email address of the Google service account. _(shown when Authentication is `serviceAccount`)_ |
| Private Key (`serviceAccountPrivateKey`) | `string` | Yes | — | The private key from the service account JSON key file. Paste the whole PEM block, BEGIN and END lines included. _(shown when Authentication is `serviceAccount`)_ |
| Max Concurrency | `number` | No | `5` | Maximum number of items to process concurrently. Keep low for upload operations (1–20). |

#### Channel: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Channel ID | `string` | Yes | — | The ID of the channel to retrieve. |
| Fields (`part`) | `multiOptions` | No | `['*']` | Comma-separated list of resource properties to include in the response. |
| | | | | Options: `*`, `brandingSettings`, `contentDetails`, `contentOwnerDetails`, `id`, `localizations`, `snippet`, `statistics`, `status`, `topicDetails` |

#### Channel: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Fields (`part`) | `multiOptions` | No | `['*']` | Comma-separated list of resource properties to include in the response. |
| | | | | Options: `*`, `brandingSettings`, `contentDetails`, `contentOwnerDetails`, `id`, `localizations`, `snippet`, `statistics`, `status`, `topicDetails` |
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `25` | Max number of results to return (1–50). _(shown when Return All is `false`)_ |
| Filters | `collection` | No | `{}` | Narrow the listing. With none of these set, the node returns your own channels. |
| — Category ID (`categoryId`) | `string` | No | — | YouTube guide category ID to filter by. |
| — For Username (`forUsername`) | `string` | No | — | YouTube username to retrieve the channel for. |
| — ID (`id`) | `string` | No | — | Comma-separated list of channel IDs. |
| — Managed By Me (`managedByMe`) | `boolean` | No | `false` | Whether to only return channels managed by the content owner. |
| Options | `collection` | No | `{}` | Extra request options. |
| — Language Code (`hl`) | `string` | No | — | Language code for localized resource metadata (e.g. "en", "de"). |
| — On Behalf Of Content Owner (`onBehalfOfContentOwner`) | `string` | No | — | Content owner ID for CMS users acting on behalf of the content owner. |

#### Channel: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Channel ID | `string` | Yes | — | The ID of the channel to update. |
| Update Fields | `collection` | No | `{}` | Branding settings to change. Only the fields you add are sent. |
| — Country (`country`) | `string` | No | — | The country with which the channel is associated. |
| — Description (`description`) | `string` | No | — | Channel description (max 1000 characters). |
| — Default Language (`defaultLanguage`) | `string` | No | — | Default language for the channel. |
| — Default Tab (`defaultTab`) | `string` | No | — | Content tab to display by default. |
| — Featured Channels Title (`featuredChannelsTitle`) | `string` | No | — | Title for the featured channels module (max 30 chars). |
| — Featured Channels URLs (`featuredChannelsUrls`) | `string` | No | — | Comma-separated list of featured channel IDs. |
| — Keywords (`keywords`) | `string` | No | — | Space-separated keywords for the channel. |
| — Moderate Comments (`moderateComments`) | `boolean` | No | `false` | Whether comments need approval before being visible. |
| — Profile Color (`profileColor`) | `string` | No | — | Prominent color for the channel. |
| — Show Related Channels (`showRelatedChannels`) | `boolean` | No | `false` | Whether to show related channels. |
| — Show Browse View (`showBrowseView`) | `boolean` | No | `false` | Whether to show browse view on the channel page. |
| — Tracking Analytics Account ID (`trackingAnalyticsAccountId`) | `string` | No | — | Google Analytics account ID for tracking. |
| — Unsubscribed Trailer (`unsubscribedTrailer`) | `string` | No | — | Video ID for the featured video for unsubscribed viewers. |
| — On Behalf Of Content Owner (`onBehalfOfContentOwner`) | `string` | No | — | Content owner ID for CMS users. |

#### Channel: Upload Banner

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Channel ID | `string` | Yes | — | The ID of the channel to update. |
| Binary Property (`binaryPropertyName`) | `string` | Yes | `data` | Name of the binary property containing the banner image to upload. Names are case-sensitive — see the upstream node's Binary Data panel for the exact names to use. |

#### Playlist: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Title | `string` | Yes | — | The title of the playlist. |
| Options | `collection` | No | `{}` | Optional playlist properties. |
| — Description (`description`) | `string` | No | — | The playlist description. |
| — Privacy Status (`privacyStatus`) | `options` | No | — | The playlist privacy status. |
| | | | | Options: `private`, `public`, `unlisted` |
| — Tags (`tags`) | `string` | No | — | Comma-separated keyword tags. |
| — Default Language (`defaultLanguage`) | `string` | No | — | Language code (e.g. "en"). |
| — On Behalf Of Content Owner (`onBehalfOfContentOwner`) | `string` | No | — | Content owner ID. |
| — On Behalf Of Content Owner Channel (`onBehalfOfContentOwnerChannel`) | `string` | No | — | Channel ID when acting on behalf of a content owner. |

#### Playlist: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Playlist ID | `string` | Yes | — | The ID of the playlist. |
| Options | `collection` | No | `{}` | Extra request options. |
| — On Behalf Of Content Owner (`onBehalfOfContentOwner`) | `string` | No | — | Content owner ID for CMS users. |

#### Playlist: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Playlist ID | `string` | Yes | — | The ID of the playlist. |
| Fields (`part`) | `multiOptions` | No | `['*']` | Resource properties to include. |
| | | | | Options: `*`, `contentDetails`, `id`, `localizations`, `player`, `snippet`, `status` |
| Options | `collection` | No | `{}` | Extra request options. |
| — On Behalf Of Content Owner (`onBehalfOfContentOwner`) | `string` | No | — | Content owner ID for CMS users. |
| — On Behalf Of Content Owner Channel (`onBehalfOfContentOwnerChannel`) | `string` | No | — | Channel ID when acting on behalf of a content owner. |

#### Playlist: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Fields (`part`) | `multiOptions` | No | `['*']` | Resource properties to include. |
| | | | | Options: `*`, `contentDetails`, `id`, `localizations`, `player`, `snippet`, `status` |
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `25` | Max number of results to return (1–50). _(shown when Return All is `false`)_ |
| Filters | `collection` | No | `{}` | Narrow the listing. With neither set, the node returns your own playlists. |
| — Channel ID (`channelId`) | `string` | No | — | Only return playlists from this channel. |
| — ID (`id`) | `string` | No | — | Comma-separated playlist IDs. |
| Options | `collection` | No | `{}` | Extra request options. |
| — On Behalf Of Content Owner (`onBehalfOfContentOwner`) | `string` | No | — | Content owner ID for CMS users. |
| — On Behalf Of Content Owner Channel (`onBehalfOfContentOwnerChannel`) | `string` | No | — | Channel ID when acting on behalf of a content owner. |

#### Playlist: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Playlist ID | `string` | Yes | — | The ID of the playlist. |
| Title | `string` | Yes | — | The title of the playlist. It is always sent, so set it even when changing something else. |
| Update Fields | `collection` | No | `{}` | Other playlist properties to change. |
| — Description (`description`) | `string` | No | — | The playlist description. |
| — Privacy Status (`privacyStatus`) | `options` | No | — | The playlist privacy status. |
| | | | | Options: `private`, `public`, `unlisted` |
| — Tags (`tags`) | `string` | No | — | Comma-separated keyword tags. |
| — Default Language (`defaultLanguage`) | `string` | No | — | Language code (e.g. "en"). |
| — On Behalf Of Content Owner (`onBehalfOfContentOwner`) | `string` | No | — | Content owner ID for CMS users. |

#### Playlist Item: Add

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Playlist ID | `string` | Yes | — | The ID of the playlist to add to. |
| Video ID | `string` | Yes | — | The ID of the video to add. |
| Options | `collection` | No | `{}` | Optional placement and playback settings. |
| — Position (`position`) | `number` | No | — | Zero-based position in the playlist. |
| — Note (`note`) | `string` | No | — | User-generated note (max 280 chars). |
| — Start At (`startAt`) | `string` | No | — | Start time in seconds. |
| — End At (`endAt`) | `string` | No | — | End time in seconds. |
| — On Behalf Of Content Owner (`onBehalfOfContentOwner`) | `string` | No | — | Content owner ID for CMS users. |

#### Playlist Item: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Playlist Item ID | `string` | Yes | — | The ID of the playlist item — not the video ID. |
| Options | `collection` | No | `{}` | Extra request options. |
| — On Behalf Of Content Owner (`onBehalfOfContentOwner`) | `string` | No | — | Content owner ID for CMS users. |

#### Playlist Item: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Playlist Item ID | `string` | Yes | — | The ID of the playlist item — not the video ID. |
| Fields (`part`) | `multiOptions` | No | `['*']` | Resource properties to include. |
| | | | | Options: `*`, `contentDetails`, `id`, `snippet`, `status` |
| Options | `collection` | No | `{}` | Extra request options. |
| — On Behalf Of Content Owner (`onBehalfOfContentOwner`) | `string` | No | — | Content owner ID for CMS users. |

#### Playlist Item: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Playlist ID | `string` | Yes | — | The playlist whose items you want. |
| Fields (`part`) | `multiOptions` | No | `['*']` | Resource properties to include. |
| | | | | Options: `*`, `contentDetails`, `id`, `snippet`, `status` |
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `25` | Max number of results to return (1–50). _(shown when Return All is `false`)_ |
| Options | `collection` | No | `{}` | Extra request options. |
| — On Behalf Of Content Owner (`onBehalfOfContentOwner`) | `string` | No | — | Content owner ID for CMS users. |

#### Video: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Video ID | `string` | Yes | — | The ID of the video. |
| Options | `collection` | No | `{}` | Extra request options. |
| — On Behalf Of Content Owner (`onBehalfOfContentOwner`) | `string` | No | — | Content owner ID for CMS users. |

#### Video: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Video ID | `string` | Yes | — | The ID of the video. |
| Fields (`part`) | `multiOptions` | No | `['*']` | Resource properties to include. |
| | | | | Options: `*`, `contentDetails`, `id`, `liveStreamingDetails`, `localizations`, `player`, `recordingDetails`, `snippet`, `statistics`, `status`, `topicDetails` |
| Options | `collection` | No | `{}` | Extra request options. |
| — On Behalf Of Content Owner (`onBehalfOfContentOwner`) | `string` | No | — | Content owner ID for CMS users. |

#### Video: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `25` | Max number of results to return (1–50). _(shown when Return All is `false`)_ |
| Filters | `collection` | No | `{}` | Search criteria. This operation is a search, so a Query or a Channel ID is usually what you want. |
| — Channel ID (`channelId`) | `string` | No | — | Only return videos from this channel. |
| — For Developer (`forDeveloper`) | `boolean` | No | `false` | Restrict to videos uploaded via your app. |
| — Published After (`publishedAfter`) | `string` | No | — | ISO 8601 datetime. Only return videos published after this time. |
| — Published Before (`publishedBefore`) | `string` | No | — | ISO 8601 datetime. Only return videos published before this time. |
| — Query (`q`) | `string` | No | — | Search query term. |
| — Region Code (`regionCode`) | `string` | No | — | ISO 3166-1 alpha-2 country code. |
| — Related To Video ID (`relatedToVideoId`) | `string` | No | — | Retrieve videos related to this video. |
| — Video Category ID (`videoCategoryId`) | `string` | No | — | Only return videos in this category. |
| — Video Syndicated (`videoSyndicated`) | `boolean` | No | `false` | Only videos playable outside youtube.com. |
| — Video Type (`videoType`) | `options` | No | — | Restrict results to one kind of video. |
| | | | | Options: `any`, `episode`, `movie` |
| Options | `collection` | No | `{}` | Result ordering and filtering. |
| — Order (`order`) | `options` | No | `relevance` | The order results come back in. |
| | | | | Options: `date`, `relevance` |
| — Safe Search (`safeSearch`) | `options` | No | — | Whether to filter restricted content. |
| | | | | Options: `moderate`, `none`, `strict` |

#### Video: Rate

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Video ID | `string` | Yes | — | The ID of the video. |
| Rating | `options` | No | `like` | The rating to apply as the authenticated account. |
| | | | | Options: `dislike`, `like`, `none` (remove any previous rating) |

#### Video: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Video ID | `string` | Yes | — | The ID of the video. |
| Title | `string` | Yes | — | The title of the video. It is always sent, so set it even when changing something else. |
| Region Code | `string` | No | — | ISO 3166-1 alpha-2 country code (e.g. "US", "GB", "DE"). Used to determine video category availability. |
| Category ID (`categoryId`) | `string` | Yes | — | Numeric video category ID. Use Video Category: Get Many to list available categories for your region. |
| Update Fields | `collection` | No | `{}` | Other video properties to change. |
| — Description (`description`) | `string` | No | — | The video description. |
| — Tags (`tags`) | `string` | No | — | Comma-separated tags. |
| — Default Language (`defaultLanguage`) | `string` | No | — | Language code (e.g. "en"). |
| — Privacy Status (`privacyStatus`) | `options` | No | — | Who can see the video. |
| | | | | Options: `private`, `public`, `unlisted` |
| — Embeddable (`embeddable`) | `boolean` | No | `false` | Whether the video can be embedded on other websites. |
| — Public Stats Viewable (`publicStatsViewable`) | `boolean` | No | `true` | Whether extended stats are publicly viewable. |
| — Publish At (`publishAt`) | `string` | No | — | Scheduled publish date (ISO 8601). Requires privacyStatus=private. |
| — Recording Date (`recordingDate`) | `string` | No | — | Date and time when the video was recorded (ISO 8601). |
| — Self Declared Made For Kids (`selfDeclaredMadeForKids`) | `boolean` | No | `false` | Whether the video is designated as child-directed. |
| — License (`license`) | `options` | No | — | The licence the video is published under. |
| | | | | Options: `creativeCommon`, `youtube` |

#### Video: Upload

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Title | `string` | Yes | — | The title of the video. |
| Region Code | `string` | No | — | ISO 3166-1 alpha-2 country code (e.g. "US", "GB", "DE"). Used to determine video category availability. |
| Category ID (`categoryId`) | `string` | Yes | — | Numeric video category ID. Use Video Category: Get Many to list available categories for your region. |
| Binary Property (`binaryPropertyName`) | `string` | Yes | `data` | Name of the binary property containing the video file to upload. Names are case-sensitive — see the upstream node's Binary Data panel for the exact names to use. |
| Options | `collection` | No | `{}` | Optional video properties. |
| — Description (`description`) | `string` | No | — | The video description. |
| — Tags (`tags`) | `string` | No | — | Comma-separated keyword tags. |
| — Default Language (`defaultLanguage`) | `string` | No | — | Language code (e.g. "en"). |
| — Privacy Status (`privacyStatus`) | `options` | No | — | Who can see the video. |
| | | | | Options: `private`, `public`, `unlisted` |
| — Embeddable (`embeddable`) | `boolean` | No | `false` | Whether the video can be embedded on other websites. |
| — Public Stats Viewable (`publicStatsViewable`) | `boolean` | No | `true` | Whether extended stats are publicly viewable. |
| — Publish At (`publishAt`) | `string` | No | — | Scheduled publish date (ISO 8601). Requires privacyStatus=private. |
| — Recording Date (`recordingDate`) | `string` | No | — | Date and time when the video was recorded (ISO 8601). |
| — Self Declared Made For Kids (`selfDeclaredMadeForKids`) | `boolean` | No | `false` | Whether the video is designated as child-directed. |
| — License (`license`) | `options` | No | — | The licence the video is published under. |
| | | | | Options: `creativeCommon`, `youtube` |
| — Notify Subscribers (`notifySubscribers`) | `boolean` | No | `false` | Whether to send notifications to channel subscribers. |

#### Video Category: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Region Code | `string` | Yes | — | ISO 3166-1 alpha-2 country code (e.g. "US", "GB"). |
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `25` | Max number of results to return (1–50). _(shown when Return All is `false`)_ |

## Output Data

Every operation **merges its result onto the input item's JSON** — the fields the item already carried survive, and a result field with the same name overwrites the item's value. **Binary data on the input item is forwarded** on every operation, including the two upload operations, which read the file but do not consume it.

| Operation | Output |
|-----------|--------|
| Channel Get, Channel Get Many, Playlist Get, Playlist Get Many, Playlist Item Get, Playlist Item Get Many, Video Get, Video Get Many, Video Category Get Many | **One output item per record returned.** Return All keeps paging until YouTube runs out of results. |
| Channel Update, Playlist Create, Playlist Update, Playlist Item Add, Video Update | One output item carrying the returned resource. |
| Video Upload | One output item carrying the created video resource plus `uploadId`, the new video's ID. |
| Channel Upload Banner | One output item carrying the API response plus `bannerUploaded: true`. |
| Playlist Delete, Playlist Item Delete, Video Delete | One output item carrying `success: true` and the ID that was removed — `deletedPlaylistId`, `deletedPlaylistItemId` or `deletedVideoId`. |
| Video Rate | One output item carrying `success: true`, `videoId` and `rating`. |

An empty result never drops the item. A listing that matched nothing emits the input item with `results: []` added; a Get that found nothing emits it with `success: false` and a `message` such as "Video not found". Check for the field you expect rather than assuming an item means a hit.

## Usage Examples

- Upload a video to YouTube
- Search for videos on a channel
- Create a new YouTube playlist
- Add a video to a playlist
- Update video metadata (title, description, tags)
- Upload a channel banner image
- Get video categories for a region
- Rate a video (like/dislike)

## Example Configuration

Upload a video file produced by an upstream node:

```json
{
  "type": "google_youtube",
  "parameters": {
    "resource": "video",
    "operation": "upload",
    "title": "{{ $json.title }}",
    "regionCode": "US",
    "categoryId": "22",
    "binaryPropertyName": "data",
    "options": {
      "description": "{{ $json.description }}",
      "tags": "tutorial,howto",
      "privacyStatus": "private",
      "notifySubscribers": false,
      "selfDeclaredMadeForKids": false
    }
  }
}
```

Search a channel's most recent videos:

```json
{
  "type": "google_youtube",
  "parameters": {
    "resource": "video",
    "operation": "getAll",
    "returnAll": false,
    "limit": 25,
    "filters": {
      "channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
      "q": "release notes",
      "videoType": "any"
    },
    "options": {
      "order": "date",
      "safeSearch": "moderate"
    }
  }
}
```

Create a public playlist:

```json
{
  "type": "google_youtube",
  "parameters": {
    "resource": "playlist",
    "operation": "create",
    "title": "Best of {{ $json.year }}",
    "options": {
      "description": "Our most watched uploads",
      "privacyStatus": "public",
      "tags": "highlights,annual"
    }
  }
}
```

Add a video to a playlist at the top:

```json
{
  "type": "google_youtube",
  "parameters": {
    "resource": "playlistItem",
    "operation": "add",
    "playlistId": "PLxxxxxxxxxxxxxxxx",
    "videoId": "{{ $json.uploadId }}",
    "options": {
      "position": 0,
      "note": "Added automatically"
    }
  }
}
```

Publish a video that was uploaded as private:

```json
{
  "type": "google_youtube",
  "parameters": {
    "resource": "video",
    "operation": "update",
    "videoId": "{{ $json.uploadId }}",
    "title": "{{ $json.title }}",
    "categoryId": "22",
    "updateFields": {
      "description": "Updated description",
      "tags": "tutorial,howto",
      "privacyStatus": "public",
      "license": "youtube"
    }
  }
}
```

Read a video's statistics only:

```json
{
  "type": "google_youtube",
  "parameters": {
    "resource": "video",
    "operation": "get",
    "videoId": "{{ $json.videoId }}",
    "part": ["snippet", "statistics"]
  }
}
```

List the video categories available in a region:

```json
{
  "type": "google_youtube",
  "parameters": {
    "resource": "videoCategory",
    "operation": "getAll",
    "regionCode": "US",
    "returnAll": true
  }
}
```

Replace a channel banner from a binary field:

```json
{
  "type": "google_youtube",
  "parameters": {
    "resource": "channel",
    "operation": "uploadBanner",
    "channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
    "binaryPropertyName": "data"
  }
}
```

Like a video:

```json
{
  "type": "google_youtube",
  "parameters": {
    "resource": "video",
    "operation": "rate",
    "videoId": "{{ $json.videoId }}",
    "rating": "like"
  }
}
```

### Error Handling

| Mode | Behavior |
|------|----------|
| **stop** | Halts workflow on first error |
| **continue** | Skips failed items, passes successful ones through |
| **errorPort** | Routes failed items to Error output port |

## Tips

Manage YouTube channels, playlists, videos (with resumable upload), and video categories via the YouTube Data API v3.

- **Uploads are resumable and chunked**, so a large file is sent in pieces rather than one request. Keep Max Concurrency low when a batch of items each carries a video — several simultaneous uploads is the quickest way to exhaust the API quota.
- **Category ID is numeric.** Run Video Category: Get Many for the region first if you do not already know the ID.
- **Scheduling requires privacy.** Publish At only takes effect on a video whose Privacy Status is `private`.
- **Playlist Item ID is not the Video ID.** Delete and Get on a playlist item want the item's own ID, which comes back from Playlist Item: Add or Get Many.
- **Listings default to your own account.** Channel and Playlist Get Many return the authenticated account's resources until you set a filter such as Channel ID or ID, at which point they return those instead.
- **Fields trims the response.** Asking for `snippet` alone instead of `*` makes big listings much smaller and cheaper to page through.