youtube
YouTube Data API v3 via curl. Use this skill to search videos, get video/channel info, list playlists, and fetch comments.
$ Installer
git clone https://github.com/vm0-ai/vm0-skills /tmp/vm0-skills && cp -r /tmp/vm0-skills/youtube ~/.claude/skills/vm0-skills// tip: Run this command in your terminal to install the skill
name: youtube description: YouTube Data API v3 via curl. Use this skill to search videos, get video/channel info, list playlists, and fetch comments. vm0_secrets:
- YOUTUBE_API_KEY
YouTube Data API
Use the YouTube Data API v3 via direct curl calls to search videos, retrieve video details, get channel information, list playlist items, and fetch comments.
Official docs:
https://developers.google.com/youtube/v3
When to Use
Use this skill when you need to:
- Search videos by keywords or filters
- Get video details (title, description, statistics, duration)
- Get channel info (subscriber count, video count, description)
- List playlist items (videos in a playlist)
- Fetch comments on videos
- Get trending videos by region
Prerequisites
1. Create Google Cloud Project
- Go to Google Cloud Console
- Create a new project or select existing one
- Go to "APIs & Services" > "Library"
- Search for "YouTube Data API v3" and enable it
2. Get API Key
- Go to "APIs & Services" > "Credentials"
- Click "Create Credentials" > "API Key"
- Copy the API key
export YOUTUBE_API_KEY="AIzaSy..."
3. (Optional) Restrict API Key
For production use, restrict the key:
- Application restrictions: HTTP referrers, IP addresses
- API restrictions: YouTube Data API v3 only
Important: When using
$VARin a command that pipes to another command, wrap the command containing$VARinbash -c '...'. Due to a Claude Code bug, environment variables are silently cleared when pipes are used directly.bash -c 'curl -s "https://api.example.com" -H "Authorization: Bearer $API_KEY" | jq .'
How to Use
Base URL: https://www.googleapis.com/youtube/v3
1. Search Videos
bash -c 'curl -s "https://www.googleapis.com/youtube/v3/search?part=snippet&q=kubernetes+tutorial&type=video&maxResults=5&key=${YOUTUBE_API_KEY}"' | jq '.items[] | {videoId: .id.videoId, title: .snippet.title, channel: .snippet.channelTitle}'
2. Search with Filters
Search for videos uploaded this year, ordered by view count:
bash -c 'curl -s "https://www.googleapis.com/youtube/v3/search?part=snippet&q=react+hooks&type=video&order=viewCount&publishedAfter=2024-01-01T00:00:00Z&maxResults=10&key=${YOUTUBE_API_KEY}"' | jq '.items[] | {videoId: .id.videoId, title: .snippet.title}'
3. Get Video Details
Replace <your-video-id> with an actual video ID:
bash -c 'curl -s "https://www.googleapis.com/youtube/v3/videos?part=snippet,statistics,contentDetails&id=<your-video-id>&key=${YOUTUBE_API_KEY}"' | jq '.items[0] | {title: .snippet.title, views: .statistics.viewCount, likes: .statistics.likeCount, duration: .contentDetails.duration}'
4. Get Multiple Videos
Replace <your-video-id-1>, <your-video-id-2>, <your-video-id-3> with actual video IDs:
bash -c 'curl -s "https://www.googleapis.com/youtube/v3/videos?part=snippet,statistics&id=<your-video-id-1>,<your-video-id-2>,<your-video-id-3>&key=${YOUTUBE_API_KEY}"' | jq '.items[] | {id: .id, title: .snippet.title, views: .statistics.viewCount}'
5. Get Trending Videos
bash -c 'curl -s "https://www.googleapis.com/youtube/v3/videos?part=snippet,statistics&chart=mostPopular®ionCode=US&maxResults=10&key=${YOUTUBE_API_KEY}"' | jq '.items[] | {title: .snippet.title, channel: .snippet.channelTitle, views: .statistics.viewCount}'
6. Get Channel by ID
Replace <your-channel-id> with an actual channel ID:
bash -c 'curl -s "https://www.googleapis.com/youtube/v3/channels?part=snippet,statistics&id=<your-channel-id>&key=${YOUTUBE_API_KEY}"' | jq '.items[0] | {title: .snippet.title, subscribers: .statistics.subscriberCount, videos: .statistics.videoCount}'
7. Get Channel by Handle
bash -c 'curl -s "https://www.googleapis.com/youtube/v3/channels?part=snippet,statistics&forHandle=@GoogleDevelopers&key=${YOUTUBE_API_KEY}"' | jq '.items[0] | {id: .id, title: .snippet.title, subscribers: .statistics.subscriberCount}'
8. Get Channel by Username
bash -c 'curl -s "https://www.googleapis.com/youtube/v3/channels?part=snippet,statistics&forUsername=GoogleDevelopers&key=${YOUTUBE_API_KEY}"' | jq '.items[0] | {id: .id, title: .snippet.title, description: .snippet.description}'
9. List Playlist Items
Replace <your-playlist-id> with an actual playlist ID:
bash -c 'curl -s "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=<your-playlist-id>&maxResults=20&key=${YOUTUBE_API_KEY}"' | jq '.items[] | {position: .snippet.position, title: .snippet.title, videoId: .snippet.resourceId.videoId}'
10. Get Channel Uploads Playlist
First get the channel's uploads playlist ID, then list videos. Replace <your-channel-id> with an actual channel ID:
bash -c 'curl -s "https://www.googleapis.com/youtube/v3/channels?part=contentDetails&id=<your-channel-id>&key=${YOUTUBE_API_KEY}"' | jq -r '.items[0].contentDetails.relatedPlaylists.uploads'
11. Get Video Comments
Replace <your-video-id> with an actual video ID:
bash -c 'curl -s "https://www.googleapis.com/youtube/v3/commentThreads?part=snippet&videoId=<your-video-id>&maxResults=20&order=relevance&key=${YOUTUBE_API_KEY}"' | jq '.items[] | {author: .snippet.topLevelComment.snippet.authorDisplayName, text: .snippet.topLevelComment.snippet.textDisplay, likes: .snippet.topLevelComment.snippet.likeCount}'
12. Search Comments
Replace <your-video-id> with an actual video ID:
bash -c 'curl -s "https://www.googleapis.com/youtube/v3/commentThreads?part=snippet&videoId=<your-video-id>&searchTerms=great+video&maxResults=10&key=${YOUTUBE_API_KEY}"' | jq '.items[] | {author: .snippet.topLevelComment.snippet.authorDisplayName, text: .snippet.topLevelComment.snippet.textDisplay}'
13. Get Video Categories
bash -c 'curl -s "https://www.googleapis.com/youtube/v3/videoCategories?part=snippet®ionCode=US&key=${YOUTUBE_API_KEY}"' | jq '.items[] | {id: .id, title: .snippet.title}'
14. Search Videos by Category
bash -c 'curl -s "https://www.googleapis.com/youtube/v3/search?part=snippet&type=video&videoCategoryId=28&maxResults=10&key=${YOUTUBE_API_KEY}"' | jq '.items[] | {videoId: .id.videoId, title: .snippet.title}'
Note: Category 28 = Science & Technology
15. Get Playlists from Channel
Replace <your-channel-id> with an actual channel ID:
bash -c 'curl -s "https://www.googleapis.com/youtube/v3/playlists?part=snippet&channelId=<your-channel-id>&maxResults=20&key=${YOUTUBE_API_KEY}"' | jq '.items[] | {id: .id, title: .snippet.title, description: .snippet.description}'
Common Video Categories
| ID | Category |
|---|---|
| 1 | Film & Animation |
| 10 | Music |
| 17 | Sports |
| 20 | Gaming |
| 22 | People & Blogs |
| 24 | Entertainment |
| 25 | News & Politics |
| 26 | Howto & Style |
| 27 | Education |
| 28 | Science & Technology |
Part Parameter Options
Videos
snippet- Title, description, thumbnails, channelstatistics- Views, likes, comments countcontentDetails- Duration, definition, captionstatus- Upload status, privacy, licenseplayer- Embeddable player
Channels
snippet- Title, description, thumbnailsstatistics- Subscribers, videos, viewscontentDetails- Related playlists (uploads, likes)brandingSettings- Channel customization
Pagination
Use nextPageToken from response to get more results. Replace <your-next-page-token> with the actual token from the previous response:
bash -c 'curl -s "https://www.googleapis.com/youtube/v3/search?part=snippet&q=python&type=video&maxResults=50&pageToken=<your-next-page-token>&key=${YOUTUBE_API_KEY}"' | jq '.items[] | {title: .snippet.title}'
Guidelines
- Quota limits: API has 10,000 units/day quota. Search costs 100 units, most others cost 1 unit
- Rate limits: Implement exponential backoff on 403/429 errors
- API key security: Never expose API keys in client-side code
- Caching: Cache responses to reduce quota usage
- Video IDs: Extract from URLs like
youtube.com/watch?v=VIDEO_IDoryoutu.be/VIDEO_ID
