Resources
6Install
npx skillscat add imoonkey/openweb/src-sites-youtube Install via the SkillsCat registry.
We need to write a 2-3 sentence plain-text summary, objective, factual, no marketing, no superlatives, no calls to action, natural prose, no bullet points, no headings, no markdown. At most 60 words. Provide only the summary text. We need to summarize the skill: YouTube skill with operations: searchVideos, getVideoDetail, getComments, getVideoPlayer, browseContent, getPlaylist, getTranscript, subscribeChannel, unsubscribeChannel, addComment, deleteComment. It solves problem of interacting with YouTube programmatically via InnerTube JSON API.
YouTube
Overview
Video content platform. InnerTube JSON API on www.youtube.com.
Workflows
Search and watch a video
searchVideos(query)→ video titles, thumbnails,videoIdsgetVideoDetail(videoId)→ title, description, recommendationsgetComments(videoId)→ comment threads with author, text, likes, repliesgetVideoPlayer(videoId)→ stream URLs, formats, captions
Browse a channel or playlist
browseContent(browseId: "FEwhat_to_watch")→ homepage video grid withvideoIdsbrowseContent(browseId: "UC...")→ channel page with tabs, videosgetPlaylist(playlistId)→ playlist title, owner, full video list
Get a video transcript
getVideoDetail(videoId)→ findengagementPanels[].engagementPanelSectionListRendererwithpanelIdentifier: "engagement-panel-searchable-transcript"→ extractparamstokengetTranscript(params)→ timestamped transcript lines
Subscribe / unsubscribe a channel
searchVideos(query)orbrowseContent(browseId)→ channel result →channelId(UC...)subscribeChannel(channelIds: [channelId ← searchVideos])→ confirmationunsubscribeChannel(channelIds: [channelId])→ reverses subscription
You cannot subscribe to your own channel. YouTube returns HTTP 400 ("you may not subscribe to yourself"). Pick a non-owned channel for verification (e.g. MKBHD
UCBJycsmduvYEL83R_U4JriQ).
Comment on a video
searchVideos(query)→videoIdaddComment(videoId, text)→commentIddeleteComment(videoId, commentId)→ removes the comment
Note:
getTranscriptrequires aparamstoken fromgetVideoDetail, not a direct videoId. The params token is session-bound; the endpoint may return FAILED_PRECONDITION without valid session context.
Operations
| Operation | Intent | Key Input | Key Output | Notes |
|---|---|---|---|---|
| searchVideos | search by keyword | query | videoId, title, channelName, viewCount, duration, thumbnail | entry point |
| browseContent | browse feeds/channels | browseId (FEwhat_to_watch, FEtrending, UC..., VL...) | video grids, channel tabs, metadata | see browseId patterns below |
| getVideoDetail | video metadata + recommendations | videoId ← searchVideos | title, description, viewCount, likes, publishDate, recommendations | |
| getComments | video comments | videoId ← searchVideos | commentId, author, text, likeCount, replyCount, publishedTime | adapter — two-step continuation |
| getPlaylist | playlist details + videos | playlistId ← searchVideos/browseContent | title, owner, videoCount, videos with videoId, duration | adapter — wraps /browse with VL prefix |
| getVideoPlayer | player + stream info | videoId ← searchVideos | streamingData, formats, captions, playabilityStatus | stream URLs restricted without auth |
| getGuide | sidebar navigation | — | subscriptions, explore categories, library links | |
| getTranscript | video transcript | params ← getVideoDetail engagement panel | timestamped transcript lines | not in openapi.yaml — see Known Issues |
| getNotificationCount | unseen notifications | — | unseenCount | requires sapisidhash auth |
| likeVideo | like a video | videoId ← searchVideos | confirmation | requires sapisidhash auth, SAFE (reversible) |
| unlikeVideo | remove like | videoId ← searchVideos | confirmation | requires sapisidhash auth |
| subscribeChannel | subscribe to channel | channelIds | confirmation | requires sapisidhash auth, SAFE (reversible) |
| unsubscribeChannel | unsubscribe from channel | channelIds | confirmation | requires sapisidhash auth, reverses subscribeChannel |
| addComment | post comment on video | videoId, text | commentId, text, author | adapter — requires sapisidhash auth, reversible via deleteComment |
| deleteComment | delete own comment | videoId, commentId ← addComment/getComments | confirmation (deleted: true) | adapter — requires sapisidhash auth, reverses addComment |
browseId Patterns
- Home feed:
FEwhat_to_watch - Trending:
FEtrending - Subscriptions:
FEsubscriptions - Channel:
UC...(e.g.UCsBjURrPoezykLs9EqgamOA) - Playlist:
VL+ playlist ID (e.g.VLPLWKjhJtqVAbkArDMaJhn2XB080UlFNRCt)
Quick Start
# Search videos
openweb youtube exec searchVideos '{"key": "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8", "context": {"client": {"clientName": "WEB", "clientVersion": "2.20260325.08.00"}}, "query": "machine learning tutorial"}'
# Get video detail (title, description, comments, recommendations)
openweb youtube exec getVideoDetail '{"key": "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8", "context": {"client": {"clientName": "WEB", "clientVersion": "2.20260325.08.00"}}, "videoId": "dQw4w9WgXcQ"}'
# Get video player info (stream URLs, formats, captions)
openweb youtube exec getVideoPlayer '{"key": "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8", "context": {"client": {"clientName": "WEB", "clientVersion": "2.20260325.08.00"}}, "videoId": "dQw4w9WgXcQ"}'
# Browse homepage
openweb youtube exec browseContent '{"key": "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8", "context": {"client": {"clientName": "WEB", "clientVersion": "2.20260325.08.00"}}, "browseId": "FEwhat_to_watch"}'
# Get comments on a video (adapter — only needs videoId)
openweb youtube exec getComments '{"videoId": "dQw4w9WgXcQ"}'
# Get playlist details and videos (adapter — only needs playlistId)
openweb youtube exec getPlaylist '{"playlistId": "PLWKjhJtqVAbkArDMaJhn2XB080UlFNRCt"}'
# Unsubscribe from a channel (requires auth)
openweb youtube exec unsubscribeChannel '{"key": "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8", "context": {"client": {"clientName": "WEB", "clientVersion": "2.20260325.08.00"}}, "channelIds": ["UCsBjURrPoezykLs9EqgamOA"]}'
# Add a comment to a video (adapter — requires auth)
openweb youtube exec addComment '{"videoId": "dQw4w9WgXcQ", "text": "Great video!"}'
# Delete own comment (adapter — requires auth)
openweb youtube exec deleteComment '{"videoId": "dQw4w9WgXcQ", "commentId": "UgzB1_kM5yz1Nv0nHdR4AaABAg"}'