Use when the user needs YouTube transcripts, video search, channel browsing, playlist extraction, or content monitoring. Trigger phrases: 'get the transcript for', 'search YouTube for', 'what are the latest videos on', 'list this playlist', 'monitor this channel', or any request involving a YouTube URL, video ID, or @handle. Do NOT use for downloading video or audio files, YouTube engagement data (likes, comments), or private/age-restricted videos.
Covers transcript extraction, video search, channel browsing, in-channel search, playlist extraction, and new-upload monitoring via TranscriptAPI.
Source: Ported from ZeroPointRepo/youtube-skills (MIT). Original skill authored by ZeroPointRepo contributors. Adapted for the claude-skills format.
BYOK / free-tier note: TranscriptAPI is a commercial service (BYOK — you bring your own key; 100 free credits included, no card required). For local/self-hosted extraction without an API key, use
youtube-transcript-api(Python) oryt-dlpas OSS fallbacks. See Anti-Patterns for guidance.
Every request to transcriptapi.com requires two headers:
Authorization: Bearer $TRANSCRIPT_API_KEYUser-Agent: ClaudeCode/1.0If TRANSCRIPT_API_KEY is not set, prompt the user to get a free key at https://transcriptapi.com (100 free credits, no card required) and store it as TRANSCRIPT_API_KEY.
GET https://transcriptapi.com/api/v2/youtube/transcript
?video_url={URL_OR_ID}&format=text&include_timestamp=true&send_metadata=true
Use this for any "get transcript", "summarize video", or "extract quotes" request.
GET https://transcriptapi.com/api/v2/youtube/search
?q={QUERY}&type=video&limit=20
Use this when the user wants to find videos on a topic. Follow with transcript calls on selected results.
GET https://transcriptapi.com/api/v2/youtube/channel/latest
?channel={@HANDLE_OR_ID}
Returns the 15 most recent uploads with view counts and publish timestamps. Use before fetching transcripts to check whether uploads are new.
GET https://transcriptapi.com/api/v2/youtube/channel/videos
?channel={@HANDLE_OR_ID}
Paginate with ?continuation=TOKEN on subsequent pages.
GET https://transcriptapi.com/api/v2/youtube/channel/search
?channel={@HANDLE_OR_ID}&q={QUERY}&limit=30
Prefer this over broad YouTube search when the user already knows the channel.
GET https://transcriptapi.com/api/v2/youtube/playlist/videos
?playlist={PLAYLIST_URL_OR_ID}
Paginate with ?continuation=TOKEN. Response includes playlist_info, results, has_more.
GET https://transcriptapi.com/api/v2/youtube/channel/resolve
?input={@HANDLE_OR_URL}
Returns {"channel_id": "UC...", "resolved_from": "@handle"}.
| Endpoint | Cost | |--------------------|----------| | transcript | 1 | | search | 1 | | channel/resolve | free | | channel/latest | free | | channel/videos | 1/page | | channel/search | 1 | | playlist/videos | 1/page |
Failed or rate-limited calls return a structured error and cost zero credits.
/search?q=...) — pick the most relevant results/transcript?video_url=...) for selected videoschannel/latest (free) — check for new uploadsplaylist/videos — get all video IDs in the playlistchannel/latest (free) firstchannel/search when the user knows which channel and wants to find a topic within itsearch (type=channel) to find a channel when the user doesn't know the handle| Code | Cause | Action | |----------|---------------------|-------------------------------------------| | 401 | Bad API key | Check TRANSCRIPT_API_KEY | | 402 | No credits | Inform user, direct to transcriptapi.com/billing | | 403/1010 | Missing User-Agent | Add User-Agent header | | 404 | No captions found | Inform user — zero credits charged | | 408 | Timeout | Retry once after 2 seconds | | 429 | Rate limited | Respect Retry-After header |
yt-dlp directly.channel/latest (free) to check for new content firstTRANSCRIPT_API_KEY environment variableyoutube-transcript-api (Python, no auth needed for public videos) or yt-dlp --write-subs are OSS alternatives with different trade-offs (no search, no channel API, but free and local)If the user cannot or will not use TranscriptAPI:
| Need | OSS Alternative | Trade-offs |
|------|----------------|------------|
| Single transcript | youtube-transcript-api (Python) | No search; no channel API; captions only |
| Download + subtitles | yt-dlp --write-subs | Requires local install; no REST; slower |
| Channel monitoring | Parse YouTube RSS feed (/feeds/videos.xml?channel_id=...) | Free, no auth; limited metadata |
marketing-skill/skills/video-content-strategist — for video strategy, scripting, and content planningmarketing-skill/skills/social-media-manager — for publishing and scheduling derived from transcriptsmarketing-skill/skills/content-production — for turning transcripts into blog posts, summaries, or articlesCopy a source-pinned command for your client. You run it yourself.
Destination: .claude/skills/youtube-full · pinned to the source commit
# Run from your project root
git clone https://github.com/alirezarezvani/claude-skills.git .skillboard-tmp
git -C .skillboard-tmp checkout 19392f7a08264ed00486a251f5b2098321771f94
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/.gemini/skills/youtube-full" ".claude/skills/"
rm -rf .skillboard-tmpReview the source before running. This copies files into your project; it is not a one-click install and does not verify runtime safety.
sudo apt update && sudo apt install -y gitnpm install -g @anthropic-ai/claude-code# Run from your project root
git clone https://github.com/alirezarezvani/claude-skills.git .skillboard-tmp
git -C .skillboard-tmp checkout 19392f7a08264ed00486a251f5b2098321771f94
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/.gemini/skills/youtube-full" ".claude/skills/"
rm -rf .skillboard-tmpDestination: .claude/skills/youtube-full
Scanner static-checks@0.1.0 · commit 19392f7a0826. Static checks cannot prove runtime safety – review the source and the exact diff before installing. How checks work.
References credentials, tokens or secret files that a skill should not need.
Evidence: [redacted]· fingerprint ccae6d912a41bfef