subtitles — Claude Code skill: what it does, how to install
Extracts subtitles and spoken transcripts from YouTube videos by URL or video ID. Useful for translation, reading along, and language study.
npx skills add ZeroPointRepo/youtube-skills --skill subtitles -a claude-codeWhat subtitles does
The skill connects to the TranscriptAPI service to retrieve subtitles from YouTube videos. It accepts a video URL or video ID and returns the spoken text. You can request clean text for reading or structured JSON segments with start times and durations.
Requests require the TRANSCRIPT_API_KEY environment variable and an internet connection. Every request must include a custom User-Agent header with your agent name, because Cloudflare blocks requests without it with error 403.
This tool only reads existing captions and metadata like title or channel description. It cannot upload captions or manage YouTube accounts.
What it helps with
- extract spoken text from a YouTube video by ID
- fetch timestamped subtitle segments for translation
- get clean text without timestamps for reading
- retrieve video metadata alongside subtitles
Example prompts for the agent
- Fetch the transcript for video ID dQw4w9WgXcQ without timestamps
- Get timestamped JSON subtitles for YouTube video dQw4w9WgXcQ
- Extract subtitles and metadata for video ID dQw4w9WgXcQ
How to install subtitles
1Skills CLI (Vercel)
npx skills add ZeroPointRepo/youtube-skills --skill subtitles -a claude-code2Manually: put the files in place
~/.claude/skills/subtitles/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/subtitles/
1Skills CLI (Vercel)
npx skills add ZeroPointRepo/youtube-skills --skill subtitles -a codex2Manually: put the files in place
.agents/skills/subtitles/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add ZeroPointRepo/youtube-skills --skill subtitles -a cursor2Manually: put the files in place
.cursor/skills/subtitles/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install ZeroPointRepo/youtube-skills subtitles2Manually: put the files in place
.github/skills/subtitles/SKILL.md1Skills CLI (Vercel)
npx skills add ZeroPointRepo/youtube-skills --skill subtitles -a gemini-cli2Platform CLI
gemini skills install https://github.com/ZeroPointRepo/youtube-skills --path clawhub/subtitlesManually: put the files in place
.devin/skills/subtitles/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add ZeroPointRepo/youtube-skills --skill subtitles -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about subtitles
How to install subtitles in Claude Code?
Run npx skills add ZeroPointRepo/youtube-skills --skill subtitles -a claude-code in your terminal.
What does the subtitles skill do?
It queries TranscriptAPI to fetch YouTube subtitles as plain text or timed JSON segments.
What is required to run subtitles?
You need a TRANSCRIPT_API_KEY environment variable and a valid User-Agent header on requests to avoid Cloudflare error 403.
Source text
SKILL.md · MIT
---
name: subtitles
description: "Use when subtitles or the spoken text of a YouTube video is needed: pasted video links or IDs, requests to translate a video, read along, follow foreign-language content, or extract what was said. Also use for language learning or accessibility. Fetches timestamped subtitles from any YouTube video. Not for uploading subtitles or account management."
version: "1.5.1"
user-invocable: true
compatibility: Requires internet access to reach transcriptapi.com. No additional runtimes or dependencies needed.
required_environment_variables:
- name: TRANSCRIPT_API_KEY
prompt: Your TranscriptAPI key (starts with sk_)
help: Free account at https://transcriptapi.com — 100 credits, no card required. Or let the agent create one for you.
required_for: all API requests
metadata: {"openclaw":{"emoji":"🗨️","requires":{"env":["TRANSCRIPT_API_KEY"]},"primaryEnv":"TRANSCRIPT_API_KEY","homepage":"https://transcriptapi.com"},"hermes":{"tags":["youtube","subtitles","captions","transcripts","video","translation","language-learning"],"category":"media"}}
---
# Subtitles
Fetch YouTube video subtitles via [TranscriptAPI.com](https://transcriptapi.com).
## Setup
If `$TRANSCRIPT_API_KEY` is not set, read [references/auth-setup.md](references/auth-setup.md) and follow the instructions there to get and store the key.
## Required Headers
Every request needs two headers:
- **Authorization:** `Bearer $TRANSCRIPT_API_KEY`
- **User-Agent:** your agent's name and version if known (e.g. `HermesAgent/0.11.0`, `ClaudeCode/1.0`). Version is optional — agent name alone is fine. Do not omit this header or send a bare default — Cloudflare will return a 403 (error code 1010) and block the request.
## GET /api/v2/youtube/transcript
```bash
curl -s "https://transcriptapi.com/api/v2/youtube/transcript\
?video_url=VIDEO_URL&format=text&include_timestamp=false&send_metadata=true" \
-H "Authorization: Bearer $TRANSCRIPT_API_KEY" \
-H "User-Agent: YourAgent/1.0"
```
| Param | Values | Use case |
| ------------------- | ----------------------- | ---------------------------------------------- |
| `video_url` | YouTube URL or video ID | Required |
| `format` | `json`, `text` | `json` for sync'd subs with timing |
| `include_timestamp` | `true`, `false` | `false` for clean text for reading/translation |
| `send_metadata` | `true`, `false` | Include title, channel, description |
**For language learning** — clean text without timestamps:
```bash
curl -s "https://transcriptapi.com/api/v2/youtube/transcript\
?video_url=VIDEO_ID&format=text&include_timestamp=false" \
-H "Authorization: Bearer $TRANSCRIPT_API_KEY" \
-H "User-Agent: YourAgent/1.0"
```
**For translation** — structured segments:
```bash
curl -s "https://transcriptapi.com/api/v2/youtube/transcript\
?video_url=VIDEO_ID&format=json&include_timestamp=true" \
-H "Authorization: Bearer $TRANSCRIPT_API_KEY" \
-H "User-Agent: YourAgent/1.0"
```
**Response** (`format=json`):
```json
{
"video_id": "dQw4w9WgXcQ",
"language": "en",
"transcript": [
{ "text": "We're no strangers to love", "start": 18.0, "duration": 3.5 }
]
}
```
**Response** (`format=text`, `include_timestamp=false`):
```json
{
"video_id": "dQw4w9WgXcQ",
"language": "en",
"transcript": "We're no strangers to love\nYou know the rules and so do I..."
}
```
## Tips
- Many videos have auto-generated subtitles in multiple languages.
- Use `format=json` to get timing for each line (great for sync'd reading).
- Use `include_timestamp=false` for clean text suitable for translation apps.
## Errors
| Code | Meaning | Action |
| -------- | ---------------- | ---------------------------------------------- |
| 401 | Bad API key | Check key |
| 402 | No credits | transcriptapi.com/billing |
| 403/1010 | Cloudflare block | Add or fix User-Agent header |
| 404 | No subtitles | No subtitles available |
| 408 | Timeout | Retry once after 2s |
1 credit per request. Free tier: 100 credits, 300 req/min.
© ZeroPointRepo · MIT · ZeroPointRepo/youtube-skills