Skill v1.5.0
currentAutomated scan100/100name: captions description: "Use when captions, subtitles, or the spoken text of a YouTube video is needed — even if not explicitly requested: pasted video links or IDs, requests to read, quote, or translate a video, accessibility needs, deaf/HoH use cases, content review, or language learning. Fetches timestamped caption data from any YouTube video. Not for uploading subtitles or account management." version: "1.5.0" 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","captions","subtitles","transcripts","video","accessibility","translation"],"category":"media"}}
Captions
Extract closed captions from YouTube videos via TranscriptAPI.com.
Setup
If $TRANSCRIPT_API_KEY is not set, read 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
curl -s "https://transcriptapi.com/api/v2/youtube/transcript\?video_url=VIDEO_URL&format=json&include_timestamp=true&send_metadata=true" \-H "Authorization: Bearer $TRANSCRIPT_API_KEY" \-H "User-Agent: YourAgent/1.0"
| Param | Required | Default | Values | |
|---|---|---|---|---|
video_url | yes | — | YouTube URL or video ID | |
format | no | json | json (structured), text (plain) | |
include_timestamp | no | true | true, false | |
send_metadata | no | false | true, false |
Response (format=json — best for accessibility/timing):
{"video_id": "dQw4w9WgXcQ","language": "en","transcript": [{ "text": "We're no strangers to love", "start": 18.0, "duration": 3.5 },{ "text": "You know the rules and so do I", "start": 21.5, "duration": 2.8 }],"metadata": { "title": "...", "author_name": "...", "thumbnail_url": "..." }}
start: seconds from video startduration: how long caption is displayed
Response (format=text — readable):
{"video_id": "dQw4w9WgXcQ","language": "en","transcript": "[00:00:18] We're no strangers to love\n[00:00:21] You know the rules..."}
Tips
- Use
format=jsonfor sync'd captions (accessibility tools, timing analysis). - Use
format=textwithinclude_timestamp=falsefor clean reading. - Auto-generated captions are available for most videos; manual CC is higher quality.
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 captions | Video doesn't have CC enabled | |
| 408 | Timeout | Retry once after 2s |
1 credit per request. Free tier: 100 credits, 300 req/min.