@lap v0.3
# Machine-readable API spec. Each @endpoint block is one API call.
@api YouTube Data API v3
@base https://youtube.googleapis.com/
@version v3
@auth OAuth2 | OAuth2
@endpoints 76
@hint download_for_search
@toc youtube(76)

@endpoint POST /youtube/v3/abuseReports
@required {part: [str]}
@optional {abuseTypes: [map{id: str}], description: str, relatedEntities: [map{entity: map}], subject: map{id: str, typeId: str, url: str}}
@returns(200) {abuseTypes: [map], description: str, relatedEntities: [map], subject: map{id: str, typeId: str, url: str}}

@endpoint GET /youtube/v3/activities
@required {part: [str]}
@optional {channelId: str, home: bool, maxResults: int, mine: bool, pageToken: str, publishedAfter: str, publishedBefore: str, regionCode: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, nextPageToken: str, pageInfo: map{resultsPerPage: int(int32), totalResults: int(int32)}, prevPageToken: str, tokenPagination: map, visitorId: str}

@endpoint DELETE /youtube/v3/captions
@required {id: str}
@optional {onBehalfOf: str, onBehalfOfContentOwner: str}
@returns(200)

@endpoint GET /youtube/v3/captions
@required {part: [str], videoId: str}
@optional {id: [str], onBehalfOf: str, onBehalfOfContentOwner: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, visitorId: str}

@endpoint POST /youtube/v3/captions
@required {part: [str]}
@optional {onBehalfOf: str, onBehalfOfContentOwner: str, sync: bool}
@returns(200) {etag: str, id: str, kind: str, snippet: map{audioTrackType: str, failureReason: str, isAutoSynced: bool, isCC: bool, isDraft: bool, isEasyReader: bool, isLarge: bool, language: str, lastUpdated: str(date-time), name: str, status: str, trackKind: str, videoId: str}}

@endpoint PUT /youtube/v3/captions
@required {part: [str]}
@optional {onBehalfOf: str, onBehalfOfContentOwner: str, sync: bool}
@returns(200) {etag: str, id: str, kind: str, snippet: map{audioTrackType: str, failureReason: str, isAutoSynced: bool, isCC: bool, isDraft: bool, isEasyReader: bool, isLarge: bool, language: str, lastUpdated: str(date-time), name: str, status: str, trackKind: str, videoId: str}}

@endpoint GET /youtube/v3/captions/{id}
@required {id: str}
@optional {onBehalfOf: str, onBehalfOfContentOwner: str, tfmt: str, tlang: str}
@returns(200)

@endpoint POST /youtube/v3/channelBanners/insert
@optional {channelId: str, onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str}
@returns(200) {etag: str, kind: str, url: str}

@endpoint DELETE /youtube/v3/channelSections
@required {id: str}
@optional {onBehalfOfContentOwner: str}
@returns(200)

@endpoint GET /youtube/v3/channelSections
@required {part: [str]}
@optional {channelId: str, hl: str, id: [str], mine: bool, onBehalfOfContentOwner: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, visitorId: str}

@endpoint POST /youtube/v3/channelSections
@required {part: [str]}
@optional {onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str, contentDetails: map{channels: [str], playlists: [str]}, etag: str, id: str, kind: str=youtube#channelSection, localizations: map, snippet: map{channelId: str, defaultLanguage: str, localized: map, position: int(uint32), style: str, title: str, type: str}, targeting: map{countries: [str], languages: [str], regions: [str]}}
@returns(200) {contentDetails: map{channels: [str], playlists: [str]}, etag: str, id: str, kind: str, localizations: map, snippet: map{channelId: str, defaultLanguage: str, localized: map{title: str}, position: int(uint32), style: str, title: str, type: str}, targeting: map{countries: [str], languages: [str], regions: [str]}}

@endpoint PUT /youtube/v3/channelSections
@required {part: [str]}
@optional {onBehalfOfContentOwner: str, contentDetails: map{channels: [str], playlists: [str]}, etag: str, id: str, kind: str=youtube#channelSection, localizations: map, snippet: map{channelId: str, defaultLanguage: str, localized: map, position: int(uint32), style: str, title: str, type: str}, targeting: map{countries: [str], languages: [str], regions: [str]}}
@returns(200) {contentDetails: map{channels: [str], playlists: [str]}, etag: str, id: str, kind: str, localizations: map, snippet: map{channelId: str, defaultLanguage: str, localized: map{title: str}, position: int(uint32), style: str, title: str, type: str}, targeting: map{countries: [str], languages: [str], regions: [str]}}

@endpoint GET /youtube/v3/channels
@required {part: [str]}
@optional {categoryId: str, forUsername: str, hl: str, id: [str], managedByMe: bool, maxResults: int, mine: bool, mySubscribers: bool, onBehalfOfContentOwner: str, pageToken: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, nextPageToken: str, pageInfo: map{resultsPerPage: int(int32), totalResults: int(int32)}, prevPageToken: str, tokenPagination: map, visitorId: str}

@endpoint PUT /youtube/v3/channels
@required {part: [str]}
@optional {onBehalfOfContentOwner: str, auditDetails: map{communityGuidelinesGoodStanding: bool, contentIdClaimsGoodStanding: bool, copyrightStrikesGoodStanding: bool}, brandingSettings: map{channel: map, hints: [map], image: map, watch: map}, contentDetails: map{relatedPlaylists: map}, contentOwnerDetails: map{contentOwner: str, timeLinked: str(date-time)}, conversionPings: map{pings: [map]}, etag: str, id: str, kind: str=youtube#channel, localizations: map, snippet: map{country: str, customUrl: str, defaultLanguage: str, description: str, localized: map, publishedAt: str(date-time), thumbnails: map, title: str}, statistics: map{commentCount: str(uint64), hiddenSubscriberCount: bool, subscriberCount: str(uint64), videoCount: str(uint64), viewCount: str(uint64)}, status: map{isLinked: bool, longUploadsStatus: str, madeForKids: bool, privacyStatus: str, selfDeclaredMadeForKids: bool}, topicDetails: map{topicCategories: [str], topicIds: [str]}}
@returns(200) {auditDetails: map{communityGuidelinesGoodStanding: bool, contentIdClaimsGoodStanding: bool, copyrightStrikesGoodStanding: bool}, brandingSettings: map{channel: map{country: str, defaultLanguage: str, defaultTab: str, description: str, featuredChannelsTitle: str, featuredChannelsUrls: [str], keywords: str, moderateComments: bool, profileColor: str, showBrowseView: bool, showRelatedChannels: bool, title: str, trackingAnalyticsAccountId: str, unsubscribedTrailer: str}, hints: [map], image: map{backgroundImageUrl: map{defaultLanguage: map, localized: [map]}, bannerExternalUrl: str, bannerImageUrl: str, bannerMobileExtraHdImageUrl: str, bannerMobileHdImageUrl: str, bannerMobileImageUrl: str, bannerMobileLowImageUrl: str, bannerMobileMediumHdImageUrl: str, bannerTabletExtraHdImageUrl: str, bannerTabletHdImageUrl: str, bannerTabletImageUrl: str, bannerTabletLowImageUrl: str, bannerTvHighImageUrl: str, bannerTvImageUrl: str, bannerTvLowImageUrl: str, bannerTvMediumImageUrl: str, largeBrandedBannerImageImapScript: map{defaultLanguage: map, localized: [map]}, largeBrandedBannerImageUrl: map{defaultLanguage: map, localized: [map]}, smallBrandedBannerImageImapScript: map{defaultLanguage: map, localized: [map]}, smallBrandedBannerImageUrl: map{defaultLanguage: map, localized: [map]}, trackingImageUrl: str, watchIconImageUrl: str}, watch: map{backgroundColor: str, featuredPlaylistId: str, textColor: str}}, contentDetails: map{relatedPlaylists: map{favorites: str, likes: str, uploads: str, watchHistory: str, watchLater: str}}, contentOwnerDetails: map{contentOwner: str, timeLinked: str(date-time)}, conversionPings: map{pings: [map]}, etag: str, id: str, kind: str, localizations: map, snippet: map{country: str, customUrl: str, defaultLanguage: str, description: str, localized: map{description: str, title: str}, publishedAt: str(date-time), thumbnails: map{high: map{height: int(uint32), url: str, width: int(uint32)}, maxres: map{height: int(uint32), url: str, width: int(uint32)}, medium: map{height: int(uint32), url: str, width: int(uint32)}, standard: map{height: int(uint32), url: str, width: int(uint32)}}, title: str}, statistics: map{commentCount: str(uint64), hiddenSubscriberCount: bool, subscriberCount: str(uint64), videoCount: str(uint64), viewCount: str(uint64)}, status: map{isLinked: bool, longUploadsStatus: str, madeForKids: bool, privacyStatus: str, selfDeclaredMadeForKids: bool}, topicDetails: map{topicCategories: [str], topicIds: [str]}}

@endpoint GET /youtube/v3/commentThreads
@required {part: [str]}
@optional {allThreadsRelatedToChannelId: str, channelId: str, id: [str], maxResults: int, moderationStatus: str(published/heldForReview/likelySpam/rejected), order: str(orderUnspecified/time/relevance), pageToken: str, searchTerms: str, textFormat: str(textFormatUnspecified/html/plainText), videoId: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, nextPageToken: str, pageInfo: map{resultsPerPage: int(int32), totalResults: int(int32)}, tokenPagination: map, visitorId: str}

@endpoint POST /youtube/v3/commentThreads
@required {part: [str]}
@optional {etag: str, id: str, kind: str=youtube#commentThread, replies: map{comments: [map]}, snippet: map{canReply: bool, channelId: str, isPublic: bool, topLevelComment: map, totalReplyCount: int(uint32), videoId: str}}
@returns(200) {etag: str, id: str, kind: str, replies: map{comments: [map]}, snippet: map{canReply: bool, channelId: str, isPublic: bool, topLevelComment: map{etag: str, id: str, kind: str, snippet: map{authorChannelId: map, authorChannelUrl: str, authorDisplayName: str, authorProfileImageUrl: str, canRate: bool, channelId: str, likeCount: int(uint32), moderationStatus: str, parentId: str, publishedAt: str(date-time), textDisplay: str, textOriginal: str, updatedAt: str(date-time), videoId: str, viewerRating: str}}, totalReplyCount: int(uint32), videoId: str}}

@endpoint PUT /youtube/v3/commentThreads
@optional {part: [str], etag: str, id: str, kind: str=youtube#commentThread, replies: map{comments: [map]}, snippet: map{canReply: bool, channelId: str, isPublic: bool, topLevelComment: map, totalReplyCount: int(uint32), videoId: str}}
@returns(200) {etag: str, id: str, kind: str, replies: map{comments: [map]}, snippet: map{canReply: bool, channelId: str, isPublic: bool, topLevelComment: map{etag: str, id: str, kind: str, snippet: map{authorChannelId: map, authorChannelUrl: str, authorDisplayName: str, authorProfileImageUrl: str, canRate: bool, channelId: str, likeCount: int(uint32), moderationStatus: str, parentId: str, publishedAt: str(date-time), textDisplay: str, textOriginal: str, updatedAt: str(date-time), videoId: str, viewerRating: str}}, totalReplyCount: int(uint32), videoId: str}}

@endpoint DELETE /youtube/v3/comments
@required {id: str}
@returns(200)

@endpoint GET /youtube/v3/comments
@required {part: [str]}
@optional {id: [str], maxResults: int, pageToken: str, parentId: str, textFormat: str(textFormatUnspecified/html/plainText)}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, nextPageToken: str, pageInfo: map{resultsPerPage: int(int32), totalResults: int(int32)}, tokenPagination: map, visitorId: str}

@endpoint POST /youtube/v3/comments
@required {part: [str]}
@optional {etag: str, id: str, kind: str=youtube#comment, snippet: map{authorChannelId: map, authorChannelUrl: str, authorDisplayName: str, authorProfileImageUrl: str, canRate: bool, channelId: str, likeCount: int(uint32), moderationStatus: str, parentId: str, publishedAt: str(date-time), textDisplay: str, textOriginal: str, updatedAt: str(date-time), videoId: str, viewerRating: str}}
@returns(200) {etag: str, id: str, kind: str, snippet: map{authorChannelId: map{value: str}, authorChannelUrl: str, authorDisplayName: str, authorProfileImageUrl: str, canRate: bool, channelId: str, likeCount: int(uint32), moderationStatus: str, parentId: str, publishedAt: str(date-time), textDisplay: str, textOriginal: str, updatedAt: str(date-time), videoId: str, viewerRating: str}}

@endpoint PUT /youtube/v3/comments
@required {part: [str]}
@optional {etag: str, id: str, kind: str=youtube#comment, snippet: map{authorChannelId: map, authorChannelUrl: str, authorDisplayName: str, authorProfileImageUrl: str, canRate: bool, channelId: str, likeCount: int(uint32), moderationStatus: str, parentId: str, publishedAt: str(date-time), textDisplay: str, textOriginal: str, updatedAt: str(date-time), videoId: str, viewerRating: str}}
@returns(200) {etag: str, id: str, kind: str, snippet: map{authorChannelId: map{value: str}, authorChannelUrl: str, authorDisplayName: str, authorProfileImageUrl: str, canRate: bool, channelId: str, likeCount: int(uint32), moderationStatus: str, parentId: str, publishedAt: str(date-time), textDisplay: str, textOriginal: str, updatedAt: str(date-time), videoId: str, viewerRating: str}}

@endpoint POST /youtube/v3/comments/markAsSpam
@required {id: [str]}
@returns(200)

@endpoint POST /youtube/v3/comments/setModerationStatus
@required {id: [str], moderationStatus: str(published/heldForReview/likelySpam/rejected)}
@optional {banAuthor: bool}
@returns(200)

@endpoint GET /youtube/v3/i18nLanguages
@required {part: [str]}
@optional {hl: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, visitorId: str}

@endpoint GET /youtube/v3/i18nRegions
@required {part: [str]}
@optional {hl: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, visitorId: str}

@endpoint DELETE /youtube/v3/liveBroadcasts
@required {id: str}
@optional {onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str}
@returns(200)

@endpoint GET /youtube/v3/liveBroadcasts
@required {part: [str]}
@optional {broadcastStatus: str(broadcastStatusFilterUnspecified/all/active/upcoming/completed), broadcastType: str(broadcastTypeFilterUnspecified/all/event/persistent), id: [str], maxResults: int, mine: bool, onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str, pageToken: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, nextPageToken: str, pageInfo: map{resultsPerPage: int(int32), totalResults: int(int32)}, prevPageToken: str, tokenPagination: map, visitorId: str}

@endpoint POST /youtube/v3/liveBroadcasts
@required {part: [str]}
@optional {onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str, contentDetails: map{boundStreamId: str, boundStreamLastUpdateTimeMs: str(date-time), closedCaptionsType: str, enableAutoStart: bool, enableAutoStop: bool, enableClosedCaptions: bool, enableContentEncryption: bool, enableDvr: bool, enableEmbed: bool, enableLowLatency: bool, latencyPreference: str, mesh: str(byte), monitorStream: map, projection: str, recordFromStart: bool, startWithSlate: bool, stereoLayout: str}, etag: str, id: str, kind: str=youtube#liveBroadcast, snippet: map{actualEndTime: str(date-time), actualStartTime: str(date-time), channelId: str, description: str, isDefaultBroadcast: bool, liveChatId: str, publishedAt: str(date-time), scheduledEndTime: str(date-time), scheduledStartTime: str(date-time), thumbnails: map, title: str}, statistics: map{concurrentViewers: str(uint64)}, status: map{lifeCycleStatus: str, liveBroadcastPriority: str, madeForKids: bool, privacyStatus: str, recordingStatus: str, selfDeclaredMadeForKids: bool}}
@returns(200) {contentDetails: map{boundStreamId: str, boundStreamLastUpdateTimeMs: str(date-time), closedCaptionsType: str, enableAutoStart: bool, enableAutoStop: bool, enableClosedCaptions: bool, enableContentEncryption: bool, enableDvr: bool, enableEmbed: bool, enableLowLatency: bool, latencyPreference: str, mesh: str(byte), monitorStream: map{broadcastStreamDelayMs: int(uint32), embedHtml: str, enableMonitorStream: bool}, projection: str, recordFromStart: bool, startWithSlate: bool, stereoLayout: str}, etag: str, id: str, kind: str, snippet: map{actualEndTime: str(date-time), actualStartTime: str(date-time), channelId: str, description: str, isDefaultBroadcast: bool, liveChatId: str, publishedAt: str(date-time), scheduledEndTime: str(date-time), scheduledStartTime: str(date-time), thumbnails: map{high: map{height: int(uint32), url: str, width: int(uint32)}, maxres: map{height: int(uint32), url: str, width: int(uint32)}, medium: map{height: int(uint32), url: str, width: int(uint32)}, standard: map{height: int(uint32), url: str, width: int(uint32)}}, title: str}, statistics: map{concurrentViewers: str(uint64)}, status: map{lifeCycleStatus: str, liveBroadcastPriority: str, madeForKids: bool, privacyStatus: str, recordingStatus: str, selfDeclaredMadeForKids: bool}}

@endpoint PUT /youtube/v3/liveBroadcasts
@required {part: [str]}
@optional {onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str, contentDetails: map{boundStreamId: str, boundStreamLastUpdateTimeMs: str(date-time), closedCaptionsType: str, enableAutoStart: bool, enableAutoStop: bool, enableClosedCaptions: bool, enableContentEncryption: bool, enableDvr: bool, enableEmbed: bool, enableLowLatency: bool, latencyPreference: str, mesh: str(byte), monitorStream: map, projection: str, recordFromStart: bool, startWithSlate: bool, stereoLayout: str}, etag: str, id: str, kind: str=youtube#liveBroadcast, snippet: map{actualEndTime: str(date-time), actualStartTime: str(date-time), channelId: str, description: str, isDefaultBroadcast: bool, liveChatId: str, publishedAt: str(date-time), scheduledEndTime: str(date-time), scheduledStartTime: str(date-time), thumbnails: map, title: str}, statistics: map{concurrentViewers: str(uint64)}, status: map{lifeCycleStatus: str, liveBroadcastPriority: str, madeForKids: bool, privacyStatus: str, recordingStatus: str, selfDeclaredMadeForKids: bool}}
@returns(200) {contentDetails: map{boundStreamId: str, boundStreamLastUpdateTimeMs: str(date-time), closedCaptionsType: str, enableAutoStart: bool, enableAutoStop: bool, enableClosedCaptions: bool, enableContentEncryption: bool, enableDvr: bool, enableEmbed: bool, enableLowLatency: bool, latencyPreference: str, mesh: str(byte), monitorStream: map{broadcastStreamDelayMs: int(uint32), embedHtml: str, enableMonitorStream: bool}, projection: str, recordFromStart: bool, startWithSlate: bool, stereoLayout: str}, etag: str, id: str, kind: str, snippet: map{actualEndTime: str(date-time), actualStartTime: str(date-time), channelId: str, description: str, isDefaultBroadcast: bool, liveChatId: str, publishedAt: str(date-time), scheduledEndTime: str(date-time), scheduledStartTime: str(date-time), thumbnails: map{high: map{height: int(uint32), url: str, width: int(uint32)}, maxres: map{height: int(uint32), url: str, width: int(uint32)}, medium: map{height: int(uint32), url: str, width: int(uint32)}, standard: map{height: int(uint32), url: str, width: int(uint32)}}, title: str}, statistics: map{concurrentViewers: str(uint64)}, status: map{lifeCycleStatus: str, liveBroadcastPriority: str, madeForKids: bool, privacyStatus: str, recordingStatus: str, selfDeclaredMadeForKids: bool}}

@endpoint POST /youtube/v3/liveBroadcasts/bind
@required {id: str, part: [str]}
@optional {onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str, streamId: str}
@returns(200) {contentDetails: map{boundStreamId: str, boundStreamLastUpdateTimeMs: str(date-time), closedCaptionsType: str, enableAutoStart: bool, enableAutoStop: bool, enableClosedCaptions: bool, enableContentEncryption: bool, enableDvr: bool, enableEmbed: bool, enableLowLatency: bool, latencyPreference: str, mesh: str(byte), monitorStream: map{broadcastStreamDelayMs: int(uint32), embedHtml: str, enableMonitorStream: bool}, projection: str, recordFromStart: bool, startWithSlate: bool, stereoLayout: str}, etag: str, id: str, kind: str, snippet: map{actualEndTime: str(date-time), actualStartTime: str(date-time), channelId: str, description: str, isDefaultBroadcast: bool, liveChatId: str, publishedAt: str(date-time), scheduledEndTime: str(date-time), scheduledStartTime: str(date-time), thumbnails: map{high: map{height: int(uint32), url: str, width: int(uint32)}, maxres: map{height: int(uint32), url: str, width: int(uint32)}, medium: map{height: int(uint32), url: str, width: int(uint32)}, standard: map{height: int(uint32), url: str, width: int(uint32)}}, title: str}, statistics: map{concurrentViewers: str(uint64)}, status: map{lifeCycleStatus: str, liveBroadcastPriority: str, madeForKids: bool, privacyStatus: str, recordingStatus: str, selfDeclaredMadeForKids: bool}}

@endpoint POST /youtube/v3/liveBroadcasts/cuepoint
@optional {id: str, onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str, part: [str], cueType: str(cueTypeUnspecified/cueTypeAd), durationSecs: int(uint32), etag: str, id: str, insertionOffsetTimeMs: str(int64), walltimeMs: str(uint64)}
@returns(200) {cueType: str, durationSecs: int(uint32), etag: str, id: str, insertionOffsetTimeMs: str(int64), walltimeMs: str(uint64)}

@endpoint POST /youtube/v3/liveBroadcasts/transition
@required {broadcastStatus: str(statusUnspecified/testing/live/complete), id: str, part: [str]}
@optional {onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str}
@returns(200) {contentDetails: map{boundStreamId: str, boundStreamLastUpdateTimeMs: str(date-time), closedCaptionsType: str, enableAutoStart: bool, enableAutoStop: bool, enableClosedCaptions: bool, enableContentEncryption: bool, enableDvr: bool, enableEmbed: bool, enableLowLatency: bool, latencyPreference: str, mesh: str(byte), monitorStream: map{broadcastStreamDelayMs: int(uint32), embedHtml: str, enableMonitorStream: bool}, projection: str, recordFromStart: bool, startWithSlate: bool, stereoLayout: str}, etag: str, id: str, kind: str, snippet: map{actualEndTime: str(date-time), actualStartTime: str(date-time), channelId: str, description: str, isDefaultBroadcast: bool, liveChatId: str, publishedAt: str(date-time), scheduledEndTime: str(date-time), scheduledStartTime: str(date-time), thumbnails: map{high: map{height: int(uint32), url: str, width: int(uint32)}, maxres: map{height: int(uint32), url: str, width: int(uint32)}, medium: map{height: int(uint32), url: str, width: int(uint32)}, standard: map{height: int(uint32), url: str, width: int(uint32)}}, title: str}, statistics: map{concurrentViewers: str(uint64)}, status: map{lifeCycleStatus: str, liveBroadcastPriority: str, madeForKids: bool, privacyStatus: str, recordingStatus: str, selfDeclaredMadeForKids: bool}}

@endpoint DELETE /youtube/v3/liveChat/bans
@required {id: str}
@returns(200)

@endpoint POST /youtube/v3/liveChat/bans
@required {part: [str]}
@optional {etag: str, id: str, kind: str=youtube#liveChatBan, snippet: map{banDurationSeconds: str(uint64), bannedUserDetails: map, liveChatId: str, type: str}}
@returns(200) {etag: str, id: str, kind: str, snippet: map{banDurationSeconds: str(uint64), bannedUserDetails: map{channelId: str, channelUrl: str, displayName: str, profileImageUrl: str}, liveChatId: str, type: str}}

@endpoint DELETE /youtube/v3/liveChat/messages
@required {id: str}
@returns(200)

@endpoint GET /youtube/v3/liveChat/messages
@required {liveChatId: str, part: [str]}
@optional {hl: str, maxResults: int, pageToken: str, profileImageSize: int}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, nextPageToken: str, offlineAt: str(date-time), pageInfo: map{resultsPerPage: int(int32), totalResults: int(int32)}, pollingIntervalMillis: int(uint32), tokenPagination: map, visitorId: str}

@endpoint POST /youtube/v3/liveChat/messages
@required {part: [str]}
@optional {authorDetails: map{channelId: str, channelUrl: str, displayName: str, isChatModerator: bool, isChatOwner: bool, isChatSponsor: bool, isVerified: bool, profileImageUrl: str}, etag: str, id: str, kind: str=youtube#liveChatMessage, snippet: map{authorChannelId: str, displayMessage: str, fanFundingEventDetails: map, giftMembershipReceivedDetails: map, hasDisplayContent: bool, liveChatId: str, memberMilestoneChatDetails: map, membershipGiftingDetails: map, messageDeletedDetails: map, messageRetractedDetails: map, newSponsorDetails: map, publishedAt: str(date-time), superChatDetails: map, superStickerDetails: map, textMessageDetails: map, type: str, userBannedDetails: map}}
@returns(200) {authorDetails: map{channelId: str, channelUrl: str, displayName: str, isChatModerator: bool, isChatOwner: bool, isChatSponsor: bool, isVerified: bool, profileImageUrl: str}, etag: str, id: str, kind: str, snippet: map{authorChannelId: str, displayMessage: str, fanFundingEventDetails: map{amountDisplayString: str, amountMicros: str(uint64), currency: str, userComment: str}, giftMembershipReceivedDetails: map{associatedMembershipGiftingMessageId: str, gifterChannelId: str, memberLevelName: str}, hasDisplayContent: bool, liveChatId: str, memberMilestoneChatDetails: map{memberLevelName: str, memberMonth: int(uint32), userComment: str}, membershipGiftingDetails: map{giftMembershipsCount: int(int32), giftMembershipsLevelName: str}, messageDeletedDetails: map{deletedMessageId: str}, messageRetractedDetails: map{retractedMessageId: str}, newSponsorDetails: map{isUpgrade: bool, memberLevelName: str}, publishedAt: str(date-time), superChatDetails: map{amountDisplayString: str, amountMicros: str(uint64), currency: str, tier: int(uint32), userComment: str}, superStickerDetails: map{amountDisplayString: str, amountMicros: str(uint64), currency: str, superStickerMetadata: map{altText: str, altTextLanguage: str, stickerId: str}, tier: int(uint32)}, textMessageDetails: map{messageText: str}, type: str, userBannedDetails: map{banDurationSeconds: str(uint64), banType: str, bannedUserDetails: map{channelId: str, channelUrl: str, displayName: str, profileImageUrl: str}}}}

@endpoint DELETE /youtube/v3/liveChat/moderators
@required {id: str}
@returns(200)

@endpoint GET /youtube/v3/liveChat/moderators
@required {liveChatId: str, part: [str]}
@optional {maxResults: int, pageToken: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, nextPageToken: str, pageInfo: map{resultsPerPage: int(int32), totalResults: int(int32)}, prevPageToken: str, tokenPagination: map, visitorId: str}

@endpoint POST /youtube/v3/liveChat/moderators
@required {part: [str]}
@optional {etag: str, id: str, kind: str=youtube#liveChatModerator, snippet: map{liveChatId: str, moderatorDetails: map}}
@returns(200) {etag: str, id: str, kind: str, snippet: map{liveChatId: str, moderatorDetails: map{channelId: str, channelUrl: str, displayName: str, profileImageUrl: str}}}

@endpoint DELETE /youtube/v3/liveStreams
@required {id: str}
@optional {onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str}
@returns(200)

@endpoint GET /youtube/v3/liveStreams
@required {part: [str]}
@optional {id: [str], maxResults: int, mine: bool, onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str, pageToken: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, nextPageToken: str, pageInfo: map{resultsPerPage: int(int32), totalResults: int(int32)}, prevPageToken: str, tokenPagination: map, visitorId: str}

@endpoint POST /youtube/v3/liveStreams
@required {part: [str]}
@optional {onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str, cdn: map{format: str, frameRate: str, ingestionInfo: map, ingestionType: str, resolution: str}, contentDetails: map{closedCaptionsIngestionUrl: str, isReusable: bool}, etag: str, id: str, kind: str=youtube#liveStream, snippet: map{channelId: str, description: str, isDefaultStream: bool, publishedAt: str(date-time), title: str}, status: map{healthStatus: map, streamStatus: str}}
@returns(200) {cdn: map{format: str, frameRate: str, ingestionInfo: map{backupIngestionAddress: str, ingestionAddress: str, rtmpsBackupIngestionAddress: str, rtmpsIngestionAddress: str, streamName: str}, ingestionType: str, resolution: str}, contentDetails: map{closedCaptionsIngestionUrl: str, isReusable: bool}, etag: str, id: str, kind: str, snippet: map{channelId: str, description: str, isDefaultStream: bool, publishedAt: str(date-time), title: str}, status: map{healthStatus: map{configurationIssues: [map], lastUpdateTimeSeconds: str(uint64), status: str}, streamStatus: str}}

@endpoint PUT /youtube/v3/liveStreams
@required {part: [str]}
@optional {onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str, cdn: map{format: str, frameRate: str, ingestionInfo: map, ingestionType: str, resolution: str}, contentDetails: map{closedCaptionsIngestionUrl: str, isReusable: bool}, etag: str, id: str, kind: str=youtube#liveStream, snippet: map{channelId: str, description: str, isDefaultStream: bool, publishedAt: str(date-time), title: str}, status: map{healthStatus: map, streamStatus: str}}
@returns(200) {cdn: map{format: str, frameRate: str, ingestionInfo: map{backupIngestionAddress: str, ingestionAddress: str, rtmpsBackupIngestionAddress: str, rtmpsIngestionAddress: str, streamName: str}, ingestionType: str, resolution: str}, contentDetails: map{closedCaptionsIngestionUrl: str, isReusable: bool}, etag: str, id: str, kind: str, snippet: map{channelId: str, description: str, isDefaultStream: bool, publishedAt: str(date-time), title: str}, status: map{healthStatus: map{configurationIssues: [map], lastUpdateTimeSeconds: str(uint64), status: str}, streamStatus: str}}

@endpoint GET /youtube/v3/members
@required {part: [str]}
@optional {filterByMemberChannelId: str, hasAccessToLevel: str, maxResults: int, mode: str(listMembersModeUnknown/updates/all_current), pageToken: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, nextPageToken: str, pageInfo: map{resultsPerPage: int(int32), totalResults: int(int32)}, tokenPagination: map, visitorId: str}

@endpoint GET /youtube/v3/membershipsLevels
@required {part: [str]}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, visitorId: str}

@endpoint DELETE /youtube/v3/playlistItems
@required {id: str}
@optional {onBehalfOfContentOwner: str}
@returns(200)

@endpoint GET /youtube/v3/playlistItems
@required {part: [str]}
@optional {id: [str], maxResults: int, onBehalfOfContentOwner: str, pageToken: str, playlistId: str, videoId: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, nextPageToken: str, pageInfo: map{resultsPerPage: int(int32), totalResults: int(int32)}, prevPageToken: str, tokenPagination: map, visitorId: str}

@endpoint POST /youtube/v3/playlistItems
@required {part: [str]}
@optional {onBehalfOfContentOwner: str, contentDetails: map{endAt: str, note: str, startAt: str, videoId: str, videoPublishedAt: str(date-time)}, etag: str, id: str, kind: str=youtube#playlistItem, snippet: map{channelId: str, channelTitle: str, description: str, playlistId: str, position: int(uint32), publishedAt: str(date-time), resourceId: map, thumbnails: map, title: str, videoOwnerChannelId: str, videoOwnerChannelTitle: str}, status: map{privacyStatus: str}}
@returns(200) {contentDetails: map{endAt: str, note: str, startAt: str, videoId: str, videoPublishedAt: str(date-time)}, etag: str, id: str, kind: str, snippet: map{channelId: str, channelTitle: str, description: str, playlistId: str, position: int(uint32), publishedAt: str(date-time), resourceId: map{channelId: str, kind: str, playlistId: str, videoId: str}, thumbnails: map{high: map{height: int(uint32), url: str, width: int(uint32)}, maxres: map{height: int(uint32), url: str, width: int(uint32)}, medium: map{height: int(uint32), url: str, width: int(uint32)}, standard: map{height: int(uint32), url: str, width: int(uint32)}}, title: str, videoOwnerChannelId: str, videoOwnerChannelTitle: str}, status: map{privacyStatus: str}}

@endpoint PUT /youtube/v3/playlistItems
@required {part: [str]}
@optional {onBehalfOfContentOwner: str, contentDetails: map{endAt: str, note: str, startAt: str, videoId: str, videoPublishedAt: str(date-time)}, etag: str, id: str, kind: str=youtube#playlistItem, snippet: map{channelId: str, channelTitle: str, description: str, playlistId: str, position: int(uint32), publishedAt: str(date-time), resourceId: map, thumbnails: map, title: str, videoOwnerChannelId: str, videoOwnerChannelTitle: str}, status: map{privacyStatus: str}}
@returns(200) {contentDetails: map{endAt: str, note: str, startAt: str, videoId: str, videoPublishedAt: str(date-time)}, etag: str, id: str, kind: str, snippet: map{channelId: str, channelTitle: str, description: str, playlistId: str, position: int(uint32), publishedAt: str(date-time), resourceId: map{channelId: str, kind: str, playlistId: str, videoId: str}, thumbnails: map{high: map{height: int(uint32), url: str, width: int(uint32)}, maxres: map{height: int(uint32), url: str, width: int(uint32)}, medium: map{height: int(uint32), url: str, width: int(uint32)}, standard: map{height: int(uint32), url: str, width: int(uint32)}}, title: str, videoOwnerChannelId: str, videoOwnerChannelTitle: str}, status: map{privacyStatus: str}}

@endpoint DELETE /youtube/v3/playlists
@required {id: str}
@optional {onBehalfOfContentOwner: str}
@returns(200)

@endpoint GET /youtube/v3/playlists
@required {part: [str]}
@optional {channelId: str, hl: str, id: [str], maxResults: int, mine: bool, onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str, pageToken: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, nextPageToken: str, pageInfo: map{resultsPerPage: int(int32), totalResults: int(int32)}, prevPageToken: str, tokenPagination: map, visitorId: str}

@endpoint POST /youtube/v3/playlists
@required {part: [str]}
@optional {onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str, contentDetails: map{itemCount: int(uint32)}, etag: str, id: str, kind: str=youtube#playlist, localizations: map, player: map{embedHtml: str}, snippet: map{channelId: str, channelTitle: str, defaultLanguage: str, description: str, localized: map, publishedAt: str(date-time), tags: [str], thumbnailVideoId: str, thumbnails: map, title: str}, status: map{privacyStatus: str}}
@returns(200) {contentDetails: map{itemCount: int(uint32)}, etag: str, id: str, kind: str, localizations: map, player: map{embedHtml: str}, snippet: map{channelId: str, channelTitle: str, defaultLanguage: str, description: str, localized: map{description: str, title: str}, publishedAt: str(date-time), tags: [str], thumbnailVideoId: str, thumbnails: map{high: map{height: int(uint32), url: str, width: int(uint32)}, maxres: map{height: int(uint32), url: str, width: int(uint32)}, medium: map{height: int(uint32), url: str, width: int(uint32)}, standard: map{height: int(uint32), url: str, width: int(uint32)}}, title: str}, status: map{privacyStatus: str}}

@endpoint PUT /youtube/v3/playlists
@required {part: [str]}
@optional {onBehalfOfContentOwner: str, contentDetails: map{itemCount: int(uint32)}, etag: str, id: str, kind: str=youtube#playlist, localizations: map, player: map{embedHtml: str}, snippet: map{channelId: str, channelTitle: str, defaultLanguage: str, description: str, localized: map, publishedAt: str(date-time), tags: [str], thumbnailVideoId: str, thumbnails: map, title: str}, status: map{privacyStatus: str}}
@returns(200) {contentDetails: map{itemCount: int(uint32)}, etag: str, id: str, kind: str, localizations: map, player: map{embedHtml: str}, snippet: map{channelId: str, channelTitle: str, defaultLanguage: str, description: str, localized: map{description: str, title: str}, publishedAt: str(date-time), tags: [str], thumbnailVideoId: str, thumbnails: map{high: map{height: int(uint32), url: str, width: int(uint32)}, maxres: map{height: int(uint32), url: str, width: int(uint32)}, medium: map{height: int(uint32), url: str, width: int(uint32)}, standard: map{height: int(uint32), url: str, width: int(uint32)}}, title: str}, status: map{privacyStatus: str}}

@endpoint GET /youtube/v3/search
@required {part: [str]}
@optional {channelId: str, channelType: str(channelTypeUnspecified/any/show), eventType: str(none/upcoming/live/completed), forContentOwner: bool, forDeveloper: bool, forMine: bool, location: str, locationRadius: str, maxResults: int, onBehalfOfContentOwner: str, order: str(searchSortUnspecified/date/rating/viewCount/relevance/title/videoCount), pageToken: str, publishedAfter: str, publishedBefore: str, q: str, regionCode: str, relatedToVideoId: str, relevanceLanguage: str, safeSearch: str(safeSearchSettingUnspecified/none/moderate/strict), topicId: str, type: [str], videoCaption: str(videoCaptionUnspecified/any/closedCaption/none), videoCategoryId: str, videoDefinition: str(any/standard/high), videoDimension: str(any/2d/3d), videoDuration: str(videoDurationUnspecified/any/short/medium/long), videoEmbeddable: str(videoEmbeddableUnspecified/any/true), videoLicense: str(any/youtube/creativeCommon), videoSyndicated: str(videoSyndicatedUnspecified/any/true), videoType: str(videoTypeUnspecified/any/movie/episode)}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, nextPageToken: str, pageInfo: map{resultsPerPage: int(int32), totalResults: int(int32)}, prevPageToken: str, regionCode: str, tokenPagination: map, visitorId: str}

@endpoint DELETE /youtube/v3/subscriptions
@required {id: str}
@returns(200)

@endpoint GET /youtube/v3/subscriptions
@required {part: [str]}
@optional {channelId: str, forChannelId: str, id: [str], maxResults: int, mine: bool, myRecentSubscribers: bool, mySubscribers: bool, onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str, order: str(subscriptionOrderUnspecified/relevance/unread/alphabetical), pageToken: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, nextPageToken: str, pageInfo: map{resultsPerPage: int(int32), totalResults: int(int32)}, prevPageToken: str, tokenPagination: map, visitorId: str}

@endpoint POST /youtube/v3/subscriptions
@required {part: [str]}
@optional {contentDetails: map{activityType: str, newItemCount: int(uint32), totalItemCount: int(uint32)}, etag: str, id: str, kind: str=youtube#subscription, snippet: map{channelId: str, channelTitle: str, description: str, publishedAt: str(date-time), resourceId: map, thumbnails: map, title: str}, subscriberSnippet: map{channelId: str, description: str, thumbnails: map, title: str}}
@returns(200) {contentDetails: map{activityType: str, newItemCount: int(uint32), totalItemCount: int(uint32)}, etag: str, id: str, kind: str, snippet: map{channelId: str, channelTitle: str, description: str, publishedAt: str(date-time), resourceId: map{channelId: str, kind: str, playlistId: str, videoId: str}, thumbnails: map{high: map{height: int(uint32), url: str, width: int(uint32)}, maxres: map{height: int(uint32), url: str, width: int(uint32)}, medium: map{height: int(uint32), url: str, width: int(uint32)}, standard: map{height: int(uint32), url: str, width: int(uint32)}}, title: str}, subscriberSnippet: map{channelId: str, description: str, thumbnails: map{high: map{height: int(uint32), url: str, width: int(uint32)}, maxres: map{height: int(uint32), url: str, width: int(uint32)}, medium: map{height: int(uint32), url: str, width: int(uint32)}, standard: map{height: int(uint32), url: str, width: int(uint32)}}, title: str}}

@endpoint GET /youtube/v3/superChatEvents
@required {part: [str]}
@optional {hl: str, maxResults: int, pageToken: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, nextPageToken: str, pageInfo: map{resultsPerPage: int(int32), totalResults: int(int32)}, tokenPagination: map, visitorId: str}

@endpoint POST /youtube/v3/tests
@required {part: [str]}
@optional {externalChannelId: str, featuredPart: bool, gaia: str(int64), id: str, snippet: map{}}
@returns(200) {featuredPart: bool, gaia: str(int64), id: str, snippet: map}

@endpoint DELETE /youtube/v3/thirdPartyLinks
@required {linkingToken: str, type: str(linkUnspecified/channelToStoreLink)}
@optional {externalChannelId: str, part: [str]}
@returns(200)

@endpoint GET /youtube/v3/thirdPartyLinks
@required {part: [str]}
@optional {externalChannelId: str, linkingToken: str, type: str(linkUnspecified/channelToStoreLink)}
@returns(200) {etag: str, items: [map], kind: str}

@endpoint POST /youtube/v3/thirdPartyLinks
@required {part: [str]}
@optional {externalChannelId: str, etag: str, kind: str=youtube#thirdPartyLink, linkingToken: str, snippet: map{channelToStoreLink: map, type: str}, status: map{linkStatus: str}}
@returns(200) {etag: str, kind: str, linkingToken: str, snippet: map{channelToStoreLink: map{merchantId: str(uint64), storeName: str, storeUrl: str}, type: str}, status: map{linkStatus: str}}

@endpoint PUT /youtube/v3/thirdPartyLinks
@required {part: [str]}
@optional {externalChannelId: str, etag: str, kind: str=youtube#thirdPartyLink, linkingToken: str, snippet: map{channelToStoreLink: map, type: str}, status: map{linkStatus: str}}
@returns(200) {etag: str, kind: str, linkingToken: str, snippet: map{channelToStoreLink: map{merchantId: str(uint64), storeName: str, storeUrl: str}, type: str}, status: map{linkStatus: str}}

@endpoint POST /youtube/v3/thumbnails/set
@required {videoId: str}
@optional {onBehalfOfContentOwner: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, visitorId: str}

@endpoint GET /youtube/v3/videoAbuseReportReasons
@required {part: [str]}
@optional {hl: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, visitorId: str}

@endpoint GET /youtube/v3/videoCategories
@required {part: [str]}
@optional {hl: str, id: [str], regionCode: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, nextPageToken: str, pageInfo: map{resultsPerPage: int(int32), totalResults: int(int32)}, prevPageToken: str, tokenPagination: map, visitorId: str}

@endpoint DELETE /youtube/v3/videos
@required {id: str}
@optional {onBehalfOfContentOwner: str}
@returns(200)

@endpoint GET /youtube/v3/videos
@required {part: [str]}
@optional {chart: str(chartUnspecified/mostPopular), hl: str, id: [str], locale: str, maxHeight: int, maxResults: int, maxWidth: int, myRating: str(none/like/dislike), onBehalfOfContentOwner: str, pageToken: str, regionCode: str, videoCategoryId: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, nextPageToken: str, pageInfo: map{resultsPerPage: int(int32), totalResults: int(int32)}, prevPageToken: str, tokenPagination: map, visitorId: str}

@endpoint POST /youtube/v3/videos
@required {part: [str]}
@optional {autoLevels: bool, notifySubscribers: bool, onBehalfOfContentOwner: str, onBehalfOfContentOwnerChannel: str, stabilize: bool}
@returns(200) {ageGating: map{alcoholContent: bool, restricted: bool, videoGameRating: str}, contentDetails: map{caption: str, contentRating: map{acbRating: str, agcomRating: str, anatelRating: str, bbfcRating: str, bfvcRating: str, bmukkRating: str, catvRating: str, catvfrRating: str, cbfcRating: str, cccRating: str, cceRating: str, chfilmRating: str, chvrsRating: str, cicfRating: str, cnaRating: str, cncRating: str, csaRating: str, cscfRating: str, czfilmRating: str, djctqRating: str, djctqRatingReasons: [str], ecbmctRating: str, eefilmRating: str, egfilmRating: str, eirinRating: str, fcbmRating: str, fcoRating: str, fmocRating: str, fpbRating: str, fpbRatingReasons: [str], fskRating: str, grfilmRating: str, icaaRating: str, ifcoRating: str, ilfilmRating: str, incaaRating: str, kfcbRating: str, kijkwijzerRating: str, kmrbRating: str, lsfRating: str, mccaaRating: str, mccypRating: str, mcstRating: str, mdaRating: str, medietilsynetRating: str, mekuRating: str, menaMpaaRating: str, mibacRating: str, mocRating: str, moctwRating: str, mpaaRating: str, mpaatRating: str, mtrcbRating: str, nbcRating: str, nbcplRating: str, nfrcRating: str, nfvcbRating: str, nkclvRating: str, nmcRating: str, oflcRating: str, pefilmRating: str, rcnofRating: str, resorteviolenciaRating: str, rtcRating: str, rteRating: str, russiaRating: str, skfilmRating: str, smaisRating: str, smsaRating: str, tvpgRating: str, ytRating: str}, countryRestriction: map{allowed: bool, exception: [str]}, definition: str, dimension: str, duration: str, hasCustomThumbnail: bool, licensedContent: bool, projection: str, regionRestriction: map{allowed: [str], blocked: [str]}}, etag: str, fileDetails: map{audioStreams: [map], bitrateBps: str(uint64), container: str, creationTime: str, durationMs: str(uint64), fileName: str, fileSize: str(uint64), fileType: str, videoStreams: [map]}, id: str, kind: str, liveStreamingDetails: map{activeLiveChatId: str, actualEndTime: str(date-time), actualStartTime: str(date-time), concurrentViewers: str(uint64), scheduledEndTime: str(date-time), scheduledStartTime: str(date-time)}, localizations: map, monetizationDetails: map{access: map{allowed: bool, exception: [str]}}, player: map{embedHeight: str(int64), embedHtml: str, embedWidth: str(int64)}, processingDetails: map{editorSuggestionsAvailability: str, fileDetailsAvailability: str, processingFailureReason: str, processingIssuesAvailability: str, processingProgress: map{partsProcessed: str(uint64), partsTotal: str(uint64), timeLeftMs: str(uint64)}, processingStatus: str, tagSuggestionsAvailability: str, thumbnailsAvailability: str}, projectDetails: map, recordingDetails: map{location: map{altitude: num(double), latitude: num(double), longitude: num(double)}, locationDescription: str, recordingDate: str(date-time)}, snippet: map{categoryId: str, channelId: str, channelTitle: str, defaultAudioLanguage: str, defaultLanguage: str, description: str, liveBroadcastContent: str, localized: map{description: str, title: str}, publishedAt: str(date-time), tags: [str], thumbnails: map{high: map{height: int(uint32), url: str, width: int(uint32)}, maxres: map{height: int(uint32), url: str, width: int(uint32)}, medium: map{height: int(uint32), url: str, width: int(uint32)}, standard: map{height: int(uint32), url: str, width: int(uint32)}}, title: str}, statistics: map{commentCount: str(uint64), dislikeCount: str(uint64), favoriteCount: str(uint64), likeCount: str(uint64), viewCount: str(uint64)}, status: map{embeddable: bool, failureReason: str, license: str, madeForKids: bool, privacyStatus: str, publicStatsViewable: bool, publishAt: str(date-time), rejectionReason: str, selfDeclaredMadeForKids: bool, uploadStatus: str}, suggestions: map{editorSuggestions: [str], processingErrors: [str], processingHints: [str], processingWarnings: [str], tagSuggestions: [map]}, topicDetails: map{relevantTopicIds: [str], topicCategories: [str], topicIds: [str]}}

@endpoint PUT /youtube/v3/videos
@required {part: [str]}
@optional {onBehalfOfContentOwner: str, ageGating: map{alcoholContent: bool, restricted: bool, videoGameRating: str}, contentDetails: map{caption: str, contentRating: map, countryRestriction: map, definition: str, dimension: str, duration: str, hasCustomThumbnail: bool, licensedContent: bool, projection: str, regionRestriction: map}, etag: str, fileDetails: map{audioStreams: [map], bitrateBps: str(uint64), container: str, creationTime: str, durationMs: str(uint64), fileName: str, fileSize: str(uint64), fileType: str, videoStreams: [map]}, id: str, kind: str=youtube#video, liveStreamingDetails: map{activeLiveChatId: str, actualEndTime: str(date-time), actualStartTime: str(date-time), concurrentViewers: str(uint64), scheduledEndTime: str(date-time), scheduledStartTime: str(date-time)}, localizations: map, monetizationDetails: map{access: map}, player: map{embedHeight: str(int64), embedHtml: str, embedWidth: str(int64)}, processingDetails: map{editorSuggestionsAvailability: str, fileDetailsAvailability: str, processingFailureReason: str, processingIssuesAvailability: str, processingProgress: map, processingStatus: str, tagSuggestionsAvailability: str, thumbnailsAvailability: str}, projectDetails: map{}, recordingDetails: map{location: map, locationDescription: str, recordingDate: str(date-time)}, snippet: map{categoryId: str, channelId: str, channelTitle: str, defaultAudioLanguage: str, defaultLanguage: str, description: str, liveBroadcastContent: str, localized: map, publishedAt: str(date-time), tags: [str], thumbnails: map, title: str}, statistics: map{commentCount: str(uint64), dislikeCount: str(uint64), favoriteCount: str(uint64), likeCount: str(uint64), viewCount: str(uint64)}, status: map{embeddable: bool, failureReason: str, license: str, madeForKids: bool, privacyStatus: str, publicStatsViewable: bool, publishAt: str(date-time), rejectionReason: str, selfDeclaredMadeForKids: bool, uploadStatus: str}, suggestions: map{editorSuggestions: [str], processingErrors: [str], processingHints: [str], processingWarnings: [str], tagSuggestions: [map]}, topicDetails: map{relevantTopicIds: [str], topicCategories: [str], topicIds: [str]}}
@returns(200) {ageGating: map{alcoholContent: bool, restricted: bool, videoGameRating: str}, contentDetails: map{caption: str, contentRating: map{acbRating: str, agcomRating: str, anatelRating: str, bbfcRating: str, bfvcRating: str, bmukkRating: str, catvRating: str, catvfrRating: str, cbfcRating: str, cccRating: str, cceRating: str, chfilmRating: str, chvrsRating: str, cicfRating: str, cnaRating: str, cncRating: str, csaRating: str, cscfRating: str, czfilmRating: str, djctqRating: str, djctqRatingReasons: [str], ecbmctRating: str, eefilmRating: str, egfilmRating: str, eirinRating: str, fcbmRating: str, fcoRating: str, fmocRating: str, fpbRating: str, fpbRatingReasons: [str], fskRating: str, grfilmRating: str, icaaRating: str, ifcoRating: str, ilfilmRating: str, incaaRating: str, kfcbRating: str, kijkwijzerRating: str, kmrbRating: str, lsfRating: str, mccaaRating: str, mccypRating: str, mcstRating: str, mdaRating: str, medietilsynetRating: str, mekuRating: str, menaMpaaRating: str, mibacRating: str, mocRating: str, moctwRating: str, mpaaRating: str, mpaatRating: str, mtrcbRating: str, nbcRating: str, nbcplRating: str, nfrcRating: str, nfvcbRating: str, nkclvRating: str, nmcRating: str, oflcRating: str, pefilmRating: str, rcnofRating: str, resorteviolenciaRating: str, rtcRating: str, rteRating: str, russiaRating: str, skfilmRating: str, smaisRating: str, smsaRating: str, tvpgRating: str, ytRating: str}, countryRestriction: map{allowed: bool, exception: [str]}, definition: str, dimension: str, duration: str, hasCustomThumbnail: bool, licensedContent: bool, projection: str, regionRestriction: map{allowed: [str], blocked: [str]}}, etag: str, fileDetails: map{audioStreams: [map], bitrateBps: str(uint64), container: str, creationTime: str, durationMs: str(uint64), fileName: str, fileSize: str(uint64), fileType: str, videoStreams: [map]}, id: str, kind: str, liveStreamingDetails: map{activeLiveChatId: str, actualEndTime: str(date-time), actualStartTime: str(date-time), concurrentViewers: str(uint64), scheduledEndTime: str(date-time), scheduledStartTime: str(date-time)}, localizations: map, monetizationDetails: map{access: map{allowed: bool, exception: [str]}}, player: map{embedHeight: str(int64), embedHtml: str, embedWidth: str(int64)}, processingDetails: map{editorSuggestionsAvailability: str, fileDetailsAvailability: str, processingFailureReason: str, processingIssuesAvailability: str, processingProgress: map{partsProcessed: str(uint64), partsTotal: str(uint64), timeLeftMs: str(uint64)}, processingStatus: str, tagSuggestionsAvailability: str, thumbnailsAvailability: str}, projectDetails: map, recordingDetails: map{location: map{altitude: num(double), latitude: num(double), longitude: num(double)}, locationDescription: str, recordingDate: str(date-time)}, snippet: map{categoryId: str, channelId: str, channelTitle: str, defaultAudioLanguage: str, defaultLanguage: str, description: str, liveBroadcastContent: str, localized: map{description: str, title: str}, publishedAt: str(date-time), tags: [str], thumbnails: map{high: map{height: int(uint32), url: str, width: int(uint32)}, maxres: map{height: int(uint32), url: str, width: int(uint32)}, medium: map{height: int(uint32), url: str, width: int(uint32)}, standard: map{height: int(uint32), url: str, width: int(uint32)}}, title: str}, statistics: map{commentCount: str(uint64), dislikeCount: str(uint64), favoriteCount: str(uint64), likeCount: str(uint64), viewCount: str(uint64)}, status: map{embeddable: bool, failureReason: str, license: str, madeForKids: bool, privacyStatus: str, publicStatsViewable: bool, publishAt: str(date-time), rejectionReason: str, selfDeclaredMadeForKids: bool, uploadStatus: str}, suggestions: map{editorSuggestions: [str], processingErrors: [str], processingHints: [str], processingWarnings: [str], tagSuggestions: [map]}, topicDetails: map{relevantTopicIds: [str], topicCategories: [str], topicIds: [str]}}

@endpoint GET /youtube/v3/videos/getRating
@required {id: [str]}
@optional {onBehalfOfContentOwner: str}
@returns(200) {etag: str, eventId: str, items: [map], kind: str, visitorId: str}

@endpoint POST /youtube/v3/videos/rate
@required {id: str, rating: str(none/like/dislike)}
@returns(200)

@endpoint POST /youtube/v3/videos/reportAbuse
@optional {onBehalfOfContentOwner: str, comments: str, language: str, reasonId: str, secondaryReasonId: str, videoId: str}
@returns(200)

@endpoint POST /youtube/v3/watermarks/set
@required {channelId: str}
@optional {onBehalfOfContentOwner: str}
@returns(200)

@endpoint POST /youtube/v3/watermarks/unset
@required {channelId: str}
@optional {onBehalfOfContentOwner: str}
@returns(200)

@end
