Transcriptapi

Use when YouTube is or could be relevant — even if not mentioned: pasted video/channel/playlist links, video IDs, @handles, creator lookups, video summaries, quotes, translations, topic research, tutorials, talks, lectures, expert discussions, product reviews, how-to guides, new product announcements, or anything where video content is fresher or richer than text search.

How to use it

Claude Code
  1. Run the line below. It pulls the whole folder into ~/.claude/skills/transcriptapi.
  2. Describe your job in plain words. Claude Code follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit ZeroPointRepo/youtube-skills/skills/transcriptapi#main ~/.claude/skills/transcriptapi

For one project only, change the path to .claude/skills/transcriptapi.

Claude (web or desktop app)
  1. On this page open ⋯ → Download .md.
  2. Save it as SKILL.md in a folder, zip the folder, then Customize → Skills → + → Create skill → Upload a skill.
  3. Pick the file and Save. Claude shows the name and description and runs a security scan.
  4. Check the skill is switched on.
  5. Start a new chat and describe your job in plain words. The AI follows the skill from there.
ChatGPT or another app
  1. ChatGPT: make a Project and paste it into Instructions.
  2. Neither? Paste it at the top of a new chat — it works for that chat.
Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Source of Transcriptapi

Show the full text311 lines
namedescriptionversionuser-invocablecompatibilityrequired_environment_variablesmetadata
transcriptapiUse when YouTube is or could be relevant — even if not mentioned: pasted video/channel/playlist links, video IDs, @handles, creator lookups, video summaries, quotes, translations, topic research, tutorials, talks, lectures, expert discussions, product reviews, how-to guides, new product announcements, or anything where video content is fresher or richer than text search. Covers transcripts, video/channel search, channel browsing, playlists, and within-channel search. Not for uploads, account management, or written-source-only research.1.5.4trueRequires internet access to reach transcriptapi.com. No additional runtimes or dependencies needed. - 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{"openclaw":{"emoji":"▶️","requires":{"env":["TRANSCRIPT_API_KEY"]},"primaryEnv":"TRANSCRIPT_API_KEY","homepage":"https://transcriptapi.com"},"hermes":{"tags":["youtube","transcripts","video","search","channels","playlists","captions"],"category":"media"}}

TranscriptAPI

Full YouTube data toolkit via TranscriptAPI.com. Transcripts, search, channels, playlists — one API key.

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.

API Reference

Full OpenAPI spec: transcriptapi.com/openapi.json — consult this for the latest parameters and schemas.

Auth

All requests: -H "Authorization: Bearer $TRANSCRIPT_API_KEY"

Endpoints

Channel endpoints accept channel — an @handle, channel URL, or UC... ID. No need to resolve first. Playlist endpoints accept playlist — a playlist URL or ID.

GET /api/v2/youtube/transcript — 1 credit
GET https://transcriptapi.com/api/v2/youtube/transcript?video_url=VIDEO_URL&format=text&include_timestamp=true&send_metadata=true
Authorization: Bearer $TRANSCRIPT_API_KEY
User-Agent: YourAgent/1.0
Param Required Default Validation
video_url yes — YouTube URL or 11-char video ID
format no json json or text
include_timestamp no true true or false
send_metadata no false true or false

Accepts: https://youtube.com/watch?v=ID, https://youtu.be/ID, youtube.com/shorts/ID, or bare ID.

Response (format=json):

{
  "video_id": "dQw4w9WgXcQ",
  "language": "en",
  "transcript": [
    { "text": "We're no strangers...", "start": 18.0, "duration": 3.5 }
  ],
  "metadata": { "title": "...", "author_name": "...", "author_url": "..." }
}
GET /api/v2/youtube/search — 1 credit
GET https://transcriptapi.com/api/v2/youtube/search?q=QUERY&type=video&limit=20
Authorization: Bearer $TRANSCRIPT_API_KEY
User-Agent: YourAgent/1.0
Param Required Default Validation
q yes — 1-200 chars (trimmed)
type no video video or channel
limit no 20 1-50

Response (type=video):

{
  "results": [
    {
      "type": "video",
      "videoId": "dQw4w9WgXcQ",
      "title": "Rick Astley - Never Gonna Give You Up",
      "channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
      "channelTitle": "Rick Astley",
      "channelHandle": "@RickAstley",
      "channelVerified": true,
      "lengthText": "3:33",
      "viewCountText": "1.5B views",
      "publishedTimeText": "14 years ago",
      "hasCaptions": true,
      "thumbnails": [{ "url": "...", "width": 120, "height": 90 }]
    }
  ],
  "result_count": 20
}

Response (type=channel):

{
  "results": [
    {
      "type": "channel",
      "channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
      "title": "Rick Astley",
      "handle": "@RickAstley",
      "subscriberCount": "4.2M subscribers",
      "verified": true,
      "rssUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=UC..."
    }
  ],
  "result_count": 5
}
GET /api/v2/youtube/channel/resolve — FREE (0 credits)
GET https://transcriptapi.com/api/v2/youtube/channel/resolve?input=@TED
Authorization: Bearer $TRANSCRIPT_API_KEY
User-Agent: YourAgent/1.0
Param Required Validation
input yes 1-200 chars — @handle, URL, or UC... ID

Response:

{ "channel_id": "UCsT0YIqwnpJCM-mx7-gSA4Q", "resolved_from": "@TED" }

If input is already a valid UC[a-zA-Z0-9_-]{22} ID, returns immediately without lookup.

GET /api/v2/youtube/channel/videos — 1 credit/page
# First page (100 videos)
GET https://transcriptapi.com/api/v2/youtube/channel/videos?channel=@NASA
Authorization: Bearer $TRANSCRIPT_API_KEY
User-Agent: YourAgent/1.0

# Most-viewed first (channel Videos tab, ~30 videos)
GET https://transcriptapi.com/api/v2/youtube/channel/videos?channel=@NASA&sort=popular
Authorization: Bearer $TRANSCRIPT_API_KEY
User-Agent: YourAgent/1.0

# Next pages (repeat the same sort)
GET https://transcriptapi.com/api/v2/youtube/channel/videos?continuation=TOKEN&sort=popular
Authorization: Bearer $TRANSCRIPT_API_KEY
User-Agent: YourAgent/1.0
Param Required Validation
channel conditional @handle, channel URL, or UC... ID
tab no videos (default), shorts, or streams
sort no latest, popular, or oldest (omit for the uploads feed)
continuation conditional non-empty string (next pages)

Provide exactly one of channel or continuation.

Sorting. Add sort=latest, popular, or oldest to channel/videos to get a channel's videos in the order you want, for example its most-popular uploads first. A sorted page returns about 30 videos (an unsorted page returns about 100), and every page costs the same 1 credit.

When paging, send the same sort on each request.

Every item carries members_only, true only when YouTube badges it "Members only", and those items have no viewCountText. Items from tab=streams carry lengthText and publishedTimeText (for example Streamed 2 years ago); tab=shorts returns null for both, because YouTube's Shorts grid publishes neither. On the channel-tab feeds (tab=videos with sort, tab=shorts, tab=streams) channelId, channelTitle, channelHandle and index are null.

Response:

{
  "results": [{
    "videoId": "abc123xyz00",
    "title": "Latest Video",
    "channelId": "UCsT0YIqwnpJCM-mx7-gSA4Q",
    "channelTitle": "TED",
    "channelHandle": "@TED",
    "lengthText": "15:22",
    "viewCountText": "3.2M views",
    "publishedTimeText": "2 years ago",
    "thumbnails": [...],
    "index": "0",
    "members_only": false
  }],
  "playlist_info": {"title": "Uploads from TED", "numVideos": "5000"},
  "continuation_token": "4qmFsgKlARIYVVV1...",
  "has_more": true
}
GET /api/v2/youtube/channel/latest — FREE (0 credits)
GET https://transcriptapi.com/api/v2/youtube/channel/latest?channel=@TED
Authorization: Bearer $TRANSCRIPT_API_KEY
User-Agent: YourAgent/1.0
Param Required Validation
channel yes @handle, channel URL, or UC... ID

Returns last 15 videos via RSS with exact view counts and ISO timestamps.

Response:

{
  "channel": {
    "channelId": "...",
    "title": "TED",
    "author": "TED",
    "url": "..."
  },
  "results": [
    {
      "videoId": "abc123xyz00",
      "title": "Latest Video",
      "published": "2026-01-30T16:00:00Z",
      "viewCount": "2287630",
      "description": "Full description...",
      "thumbnail": { "url": "...", "width": "480", "height": "360" }
    }
  ],
  "result_count": 15
}
GET /api/v2/youtube/channel/search — 1 credit
GET https://transcriptapi.com/api/v2/youtube/channel/search?channel=@TED&q=climate+change&limit=30
Authorization: Bearer $TRANSCRIPT_API_KEY
User-Agent: YourAgent/1.0
Param Required Validation
channel yes @handle, channel URL, or UC... ID
q yes 1-200 chars
limit no 1-50 (default 30)
GET /api/v2/youtube/playlist/videos — 1 credit/page
# First page
GET https://transcriptapi.com/api/v2/youtube/playlist/videos?playlist=PL_PLAYLIST_ID
Authorization: Bearer $TRANSCRIPT_API_KEY
User-Agent: YourAgent/1.0

# Next pages
GET https://transcriptapi.com/api/v2/youtube/playlist/videos?continuation=TOKEN
Authorization: Bearer $TRANSCRIPT_API_KEY
User-Agent: YourAgent/1.0
Param Required Validation
playlist conditional Playlist URL or ID (PL/UU/LL/FL/OL prefix)
continuation conditional non-empty string

Credit Costs

Endpoint Cost
transcript 1
search 1
channel/resolve free
channel/search 1
channel/videos 1/page
channel/latest free
playlist/videos 1/page

Errors

Code Meaning Action
401 Bad API key Check key, re-run setup
402 No credits Top up at transcriptapi.com/billing
403/1010 Cloudflare block Add or fix User-Agent header
404 Not found Video/channel/playlist doesn't exist or no captions
408 Timeout/retryable Retry once after 2s
422 Validation error Check param format
429 Rate limited Wait, respect Retry-After

Tips

  • When user shares YouTube URL with no instruction, fetch transcript and summarize key points.
  • Use channel/latest (free) to check for new uploads before fetching transcripts — pass @handle directly.
  • For research: search → pick videos → fetch transcripts.
  • Free tier: 100 credits, 300 req/min. Starter ($5/mo): 1,000 credits, 300 req/min.

Copy-paste examples

Every request in this file as a ready-to-run one-liner: references/curl-examples.md

1---
2name: transcriptapi
3description: "Use when YouTube is or could be relevant — even if not mentioned: pasted video/channel/playlist links, video IDs, @handles, creator lookups, video summaries, quotes, translations, topic research, tutorials, talks, lectures, expert discussions, product reviews, how-to guides, new product announcements, or anything where video content is fresher or richer than text search. Covers transcripts, video/channel search, channel browsing, playlists, and within-channel search. Not for uploads, account management, or written-source-only research."
4version: "1.5.4"
5user-invocable: true
6compatibility: Requires internet access to reach transcriptapi.com. No additional runtimes or dependencies needed.
7required_environment_variables:
8 - name: TRANSCRIPT_API_KEY
9 prompt: Your TranscriptAPI key (starts with sk_)
10 help: Free account at https://transcriptapi.com — 100 credits, no card required. Or let the agent create one for you.
11 required_for: all API requests
12metadata: {"openclaw":{"emoji":"▶️","requires":{"env":["TRANSCRIPT_API_KEY"]},"primaryEnv":"TRANSCRIPT_API_KEY","homepage":"https://transcriptapi.com"},"hermes":{"tags":["youtube","transcripts","video","search","channels","playlists","captions"],"category":"media"}}
13---
14 
15# TranscriptAPI
16 
17Full YouTube data toolkit via [TranscriptAPI.com](https://transcriptapi.com). Transcripts, search, channels, playlists — one API key.
18 
19## Setup
20 
21If `$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.
22 
23## Required Headers
24 
25Every request needs two headers:
26 
27- **Authorization:** `Bearer $TRANSCRIPT_API_KEY`
28- **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.
29 
30## API Reference
31 
32Full OpenAPI spec: [transcriptapi.com/openapi.json](https://transcriptapi.com/openapi.json) — consult this for the latest parameters and schemas.
33 
34## Auth
35 
36All requests: `-H "Authorization: Bearer $TRANSCRIPT_API_KEY"`
37 
38## Endpoints
39 
40Channel endpoints accept `channel` — an `@handle`, channel URL, or `UC...` ID. No need to resolve first. Playlist endpoints accept `playlist` — a playlist URL or ID.
41 
42### GET /api/v2/youtube/transcript — 1 credit
43 
44```http
45GET https://transcriptapi.com/api/v2/youtube/transcript?video_url=VIDEO_URL&format=text&include_timestamp=true&send_metadata=true
46Authorization: Bearer $TRANSCRIPT_API_KEY
47User-Agent: YourAgent/1.0
48```
49 
50| Param | Required | Default | Validation |
51| ------------------- | -------- | ------- | ------------------------------- |
52| `video_url` | yes | — | YouTube URL or 11-char video ID |
53| `format` | no | `json` | `json` or `text` |
54| `include_timestamp` | no | `true` | `true` or `false` |
55| `send_metadata` | no | `false` | `true` or `false` |
56 
57Accepts: `https://youtube.com/watch?v=ID`, `https://youtu.be/ID`, `youtube.com/shorts/ID`, or bare `ID`.
58 
59**Response** (`format=json`):
60 
61```json
62{
63 "video_id": "dQw4w9WgXcQ",
64 "language": "en",
65 "transcript": [
66 { "text": "We're no strangers...", "start": 18.0, "duration": 3.5 }
67 ],
68 "metadata": { "title": "...", "author_name": "...", "author_url": "..." }
69}
70```
71 
72### GET /api/v2/youtube/search — 1 credit
73 
74```http
75GET https://transcriptapi.com/api/v2/youtube/search?q=QUERY&type=video&limit=20
76Authorization: Bearer $TRANSCRIPT_API_KEY
77User-Agent: YourAgent/1.0
78```
79 
80| Param | Required | Default | Validation |
81| ------- | -------- | ------- | --------------------- |
82| `q` | yes | — | 1-200 chars (trimmed) |
83| `type` | no | `video` | `video` or `channel` |
84| `limit` | no | `20` | 1-50 |
85 
86**Response** (`type=video`):
87 
88```json
89{
90 "results": [
91 {
92 "type": "video",
93 "videoId": "dQw4w9WgXcQ",
94 "title": "Rick Astley - Never Gonna Give You Up",
95 "channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
96 "channelTitle": "Rick Astley",
97 "channelHandle": "@RickAstley",
98 "channelVerified": true,
99 "lengthText": "3:33",
100 "viewCountText": "1.5B views",
101 "publishedTimeText": "14 years ago",
102 "hasCaptions": true,
103 "thumbnails": [{ "url": "...", "width": 120, "height": 90 }]
104 }
105 ],
106 "result_count": 20
107}
108```
109 
110**Response** (`type=channel`):
111 
112```json
113{
114 "results": [
115 {
116 "type": "channel",
117 "channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
118 "title": "Rick Astley",
119 "handle": "@RickAstley",
120 "subscriberCount": "4.2M subscribers",
121 "verified": true,
122 "rssUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=UC..."
123 }
124 ],
125 "result_count": 5
126}
127```
128 
129### GET /api/v2/youtube/channel/resolve — FREE (0 credits)
130 
131```http
132GET https://transcriptapi.com/api/v2/youtube/channel/resolve?input=@TED
133Authorization: Bearer $TRANSCRIPT_API_KEY
134User-Agent: YourAgent/1.0
135```
136 
137| Param | Required | Validation |
138| ------- | -------- | --------------------------------------- |
139| `input` | yes | 1-200 chars — @handle, URL, or UC... ID |
140 
141**Response:**
142 
143```json
144{ "channel_id": "UCsT0YIqwnpJCM-mx7-gSA4Q", "resolved_from": "@TED" }
145```
146 
147If input is already a valid `UC[a-zA-Z0-9_-]{22}` ID, returns immediately without lookup.
148 
149### GET /api/v2/youtube/channel/videos — 1 credit/page
150 
151```http
152# First page (100 videos)
153GET https://transcriptapi.com/api/v2/youtube/channel/videos?channel=@NASA
154Authorization: Bearer $TRANSCRIPT_API_KEY
155User-Agent: YourAgent/1.0
156 
157# Most-viewed first (channel Videos tab, ~30 videos)
158GET https://transcriptapi.com/api/v2/youtube/channel/videos?channel=@NASA&sort=popular
159Authorization: Bearer $TRANSCRIPT_API_KEY
160User-Agent: YourAgent/1.0
161 
162# Next pages (repeat the same sort)
163GET https://transcriptapi.com/api/v2/youtube/channel/videos?continuation=TOKEN&sort=popular
164Authorization: Bearer $TRANSCRIPT_API_KEY
165User-Agent: YourAgent/1.0
166```
167 
168| Param | Required | Validation |
169| -------------- | ----------- | --------------------------------------------- |
170| `channel` | conditional | `@handle`, channel URL, or `UC...` ID |
171| `tab` | no | `videos` (default), `shorts`, or `streams` |
172| `sort` | no | `latest`, `popular`, or `oldest` (omit for the uploads feed) |
173| `continuation` | conditional | non-empty string (next pages) |
174 
175Provide exactly one of `channel` or `continuation`.
176 
177**Sorting.** Add sort=latest, popular, or oldest to channel/videos to get a channel's videos in the order you want, for example its most-popular uploads first. A sorted page returns about 30 videos (an unsorted page returns about 100), and every page costs the same 1 credit.
178 
179When paging, send the same sort on each request.
180 
181Every item carries `members_only`, `true` only when YouTube badges it "Members only", and those items have no `viewCountText`. Items from `tab=streams` carry `lengthText` and `publishedTimeText` (for example `Streamed 2 years ago`); `tab=shorts` returns `null` for both, because YouTube's Shorts grid publishes neither. On the channel-tab feeds (`tab=videos` with `sort`, `tab=shorts`, `tab=streams`) `channelId`, `channelTitle`, `channelHandle` and `index` are `null`.
182 
183**Response:**
184 
185```json
186{
187 "results": [{
188 "videoId": "abc123xyz00",
189 "title": "Latest Video",
190 "channelId": "UCsT0YIqwnpJCM-mx7-gSA4Q",
191 "channelTitle": "TED",
192 "channelHandle": "@TED",
193 "lengthText": "15:22",
194 "viewCountText": "3.2M views",
195 "publishedTimeText": "2 years ago",
196 "thumbnails": [...],
197 "index": "0",
198 "members_only": false
199 }],
200 "playlist_info": {"title": "Uploads from TED", "numVideos": "5000"},
201 "continuation_token": "4qmFsgKlARIYVVV1...",
202 "has_more": true
203}
204```
205 
206### GET /api/v2/youtube/channel/latest — FREE (0 credits)
207 
208```http
209GET https://transcriptapi.com/api/v2/youtube/channel/latest?channel=@TED
210Authorization: Bearer $TRANSCRIPT_API_KEY
211User-Agent: YourAgent/1.0
212```
213 
214| Param | Required | Validation |
215| --------- | -------- | ----------------------------------------- |
216| `channel` | yes | `@handle`, channel URL, or `UC...` ID |
217 
218Returns last 15 videos via RSS with exact view counts and ISO timestamps.
219 
220**Response:**
221 
222```json
223{
224 "channel": {
225 "channelId": "...",
226 "title": "TED",
227 "author": "TED",
228 "url": "..."
229 },
230 "results": [
231 {
232 "videoId": "abc123xyz00",
233 "title": "Latest Video",
234 "published": "2026-01-30T16:00:00Z",
235 "viewCount": "2287630",
236 "description": "Full description...",
237 "thumbnail": { "url": "...", "width": "480", "height": "360" }
238 }
239 ],
240 "result_count": 15
241}
242```
243 
244### GET /api/v2/youtube/channel/search — 1 credit
245 
246```http
247GET https://transcriptapi.com/api/v2/youtube/channel/search?channel=@TED&q=climate+change&limit=30
248Authorization: Bearer $TRANSCRIPT_API_KEY
249User-Agent: YourAgent/1.0
250```
251 
252| Param | Required | Validation |
253| --------- | -------- | ----------------------------------------- |
254| `channel` | yes | `@handle`, channel URL, or `UC...` ID |
255| `q` | yes | 1-200 chars |
256| `limit` | no | 1-50 (default 30) |
257 
258### GET /api/v2/youtube/playlist/videos — 1 credit/page
259 
260```http
261# First page
262GET https://transcriptapi.com/api/v2/youtube/playlist/videos?playlist=PL_PLAYLIST_ID
263Authorization: Bearer $TRANSCRIPT_API_KEY
264User-Agent: YourAgent/1.0
265 
266# Next pages
267GET https://transcriptapi.com/api/v2/youtube/playlist/videos?continuation=TOKEN
268Authorization: Bearer $TRANSCRIPT_API_KEY
269User-Agent: YourAgent/1.0
270```
271 
272| Param | Required | Validation |
273| -------------- | ----------- | ---------------------------------------------------- |
274| `playlist` | conditional | Playlist URL or ID (`PL`/`UU`/`LL`/`FL`/`OL` prefix) |
275| `continuation` | conditional | non-empty string |
276 
277## Credit Costs
278 
279| Endpoint | Cost |
280| --------------- | -------- |
281| transcript | 1 |
282| search | 1 |
283| channel/resolve | **free** |
284| channel/search | 1 |
285| channel/videos | 1/page |
286| channel/latest | **free** |
287| playlist/videos | 1/page |
288 
289## Errors
290 
291| Code | Meaning | Action |
292| -------- | ----------------- | --------------------------------------------------- |
293| 401 | Bad API key | Check key, re-run setup |
294| 402 | No credits | Top up at transcriptapi.com/billing |
295| 403/1010 | Cloudflare block | Add or fix User-Agent header |
296| 404 | Not found | Video/channel/playlist doesn't exist or no captions |
297| 408 | Timeout/retryable | Retry once after 2s |
298| 422 | Validation error | Check param format |
299| 429 | Rate limited | Wait, respect Retry-After |
300 
301## Tips
302 
303- When user shares YouTube URL with no instruction, fetch transcript and summarize key points.
304- Use `channel/latest` (free) to check for new uploads before fetching transcripts — pass @handle directly.
305- For research: search → pick videos → fetch transcripts.
306- Free tier: 100 credits, 300 req/min. Starter ($5/mo): 1,000 credits, 300 req/min.
307 
308## Copy-paste examples
309 
310Every request in this file as a ready-to-run one-liner: [references/curl-examples.md](references/curl-examples.md)
311 

Discussion