YouTube Transcript API: Subtitles, SRT, Text, Markdown
Pricing
from $0.68 / 1,000 video transcribeds
YouTube Transcript API: Subtitles, SRT, Text, Markdown
Get YouTube transcripts from video, Shorts, channel or playlist URLs: timestamped segments, plain text, Markdown, SRT, metadata. No API key, no login. MCP-ready for Claude, Cursor, ChatGPT and AI agents. YouTube Data API alternative. Pay per result, errors are free: $0.80 per 1,000 videos.
Pricing
from $0.68 / 1,000 video transcribeds
Rating
0.0
(0)
Developer
ABM
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
YouTube Transcript API: Subtitles, SRT, Text & Markdown
$0.80 per 1,000 videos transcribed ($0.0008 per video). Pay per result, no monthly rental. Errors, blocked requests and videos without captions are free.
Extract YouTube transcripts (captions / subtitles) in bulk from video, Shorts, channel or playlist URLs. No API key, no login, no YouTube quota: a simple YouTube Data API alternative for transcripts. For every video you get:
- the timestamped transcript: start, duration and end in seconds + text for every caption line,
- the plain text transcript and an LLM-ready Markdown version with
[mm:ss]timestamps, - optional RAG chunks with timestamped YouTube links for citations,
- a ready-to-use SRT subtitle file with its download link,
- video metadata: title, channel, channel ID, duration, views, publish date, category, description, keywords, thumbnail,
- the list of available caption languages, and whether the transcript is auto-generated or translated.
Public data only: no account, no cookies, no browser. Proxy handling is automatic and included in the price.
How much does it cost?
You pay one video event per transcript delivered to the dataset:
| Videos transcribed | Price |
|---|---|
| 100 | $0.08 |
| 1,000 | $0.80 |
| 10,000 | $8.00 |
Nothing is charged for videos without captions, private or removed videos, blocked requests, invalid URLs or videos skipped by onlyNew. Set a maximum cost per run in Apify: the actor stops cleanly when your budget is reached and never delivers anything it cannot bill.
How to use
- Paste one or more URLs into YouTube URLs (videos,
youtu.belinks, Shorts,@handlechannels,/channel/UC…, playlists, or bare video IDs). - Choose the transcript language (
en,fr,de,es,pt,ja…). - Run. Results appear in the dataset (one item per video), SRT files in the key-value store.
Input example
{"urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","https://youtu.be/jNQXAC9IVRw","https://www.youtube.com/@NASA","https://www.youtube.com/playlist?list=PLxxxxxxxxxxxxxxxx"],"language": "en","fallbackToAnyLanguage": true,"translateIfMissing": false,"preferManualCaptions": true,"maxVideosPerChannelOrPlaylist": 10,"includeTimestamps": true,"includeMarkdown": true,"ragChunkWords": 300,"onlyNew": false,"saveSrtFile": true}
| Field | Default | Description |
|---|---|---|
urls | – | Video, Shorts, channel or playlist URLs, or bare video IDs. |
language | en | Preferred language code. en also matches en-US, en-GB. |
fallbackToAnyLanguage | true | If your language is missing, return the original-language transcript. |
translateIfMissing | false | If your language is missing, return YouTube's machine translation into it. |
preferManualCaptions | true | Prefer creator-uploaded subtitles over auto-generated ones. |
maxVideosPerChannelOrPlaylist | 20 | Videos per channel (latest uploads) or playlist. |
includeTimestamps | true | Include the segments array. |
includeMarkdown | true | Include the LLM-ready markdown field. |
ragChunkWords | 0 | If > 0, include chunks of about this many words (for embeddings / RAG). |
onlyNew | false | Skip videos already delivered by your previous runs (scheduled runs). |
saveSrtFile | true | Save one .srt file per video and return its link. |
fetchPublishDate | true | Add publishDate, uploadDate, category. |
maxConcurrency | 5 | Videos processed in parallel. |
residentialFallback | true | Retry blocked videos through residential proxy (no extra charge). |
Output example
{"status": "success","videoId": "jNQXAC9IVRw","url": "https://www.youtube.com/watch?v=jNQXAC9IVRw","title": "Me at the zoo","channelName": "jawed","channelId": "UC4QobU6STFB0P71PMvOGN5A","channelUrl": "https://www.youtube.com/channel/UC4QobU6STFB0P71PMvOGN5A","durationSeconds": 19,"viewCount": 350000000,"publishDate": "2005-04-23","uploadDate": "2005-04-23","category": "Film & Animation","description": "The first video on YouTube...","keywords": [],"thumbnailUrl": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg","isLiveContent": false,"language": "en","languageName": "English","isAutoGenerated": false,"isTranslated": false,"availableLanguages": [{ "code": "en", "name": "English", "isAutoGenerated": false },{ "code": "de", "name": "German", "isAutoGenerated": false }],"segmentCount": 6,"wordCount": 48,"text": "All right, so here we are in front of the elephants...","segments": [{ "start": 1.2, "duration": 2.16, "end": 3.36, "text": "All right, so here we are in front of the elephants" }],"markdown": "# Me at the zoo\n\n- Channel: jawed\n- Published: 2005-04-23\n- Duration: 00:19\n- Language: en\n- URL: https://www.youtube.com/watch?v=jNQXAC9IVRw\n\n## Transcript\n\n**[00:01]** All right, so here we are in front of the elephants...\n","chunks": [{ "index": 0, "start": 1.2, "end": 17.5, "wordCount": 48, "url": "https://youtu.be/jNQXAC9IVRw?t=1", "text": "All right, so here we are..." }],"srtFileUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/jNQXAC9IVRw-en.srt","srtFileKey": "jNQXAC9IVRw-en.srt","sourceUrl": "https://youtu.be/jNQXAC9IVRw","scrapedAt": "2026-10-15T09:00:00+00:00"}
Videos that cannot be transcribed still get a free item so you know why:
{"status": "error","videoId": "abcdefghijk","url": "https://www.youtube.com/watch?v=abcdefghijk","sourceUrl": "https://www.youtube.com/@somechannel","error": "this video has no captions/subtitles"}
Filter on status = "success" to keep billed results only. The Overview view shows a table with thumbnail, title, channel, language, transcript and SRT link.
Use with AI agents (MCP)
This actor is MCP-ready: Claude, Cursor, ChatGPT and other AI agents can call it through the Apify MCP server (https://mcp.apify.com). The input is just a list of URLs plus a language code; the output is flat JSON with text, markdown (ready to drop into a prompt) and optional chunks with timestamped links for grounded answers. Typical agent prompts: "summarize the last 10 videos of @channel", "find where this video talks about pricing and give me the timestamp".
Integrations
- API: run it from any language with the Apify API or the
apify-clientfor Python / JavaScript and read the dataset as JSON, CSV, Excel or XML. - Make, Zapier, n8n: use the Apify app/node to start a run and get the transcripts in your workflow.
- Google Sheets: export the dataset or use the Apify integration to append one row per video.
- Schedules +
onlyNew: schedule a channel or playlist daily and receive only the new uploads, billed only once. - Webhooks: get notified when a run finishes.
Use cases
- AI & LLM pipelines: feed transcripts to summarizers, chatbots, RAG knowledge bases or AI agents.
- Content repurposing: turn videos into blog posts, newsletters, social threads or show notes.
- Subtitles: download SRT files for editing, translation or re-upload.
- Research & monitoring: track what a channel talks about, follow keywords and brand mentions over time.
- SEO: publish searchable text versions of your own videos.
- Education: build study notes and searchable lecture archives from playlists.
FAQ
Which videos work? Any public video that has captions (creator-made or YouTube auto-generated), including Shorts and finished live streams.
What am I charged for? Exactly one video event ($0.0008) per transcript delivered to the dataset. Errors, videos without captions, blocked requests and duplicates are free.
Do I need a YouTube API key, an account or a proxy? No. No key, no login, no quota. Proxy handling (datacenter first, residential fallback when YouTube blocks) is automatic and included in the price.
What if my language is not available? By default you get the original-language transcript (the language field tells you which). Enable translateIfMissing to get YouTube's machine translation, or disable fallbackToAnyLanguage to get an error instead.
Auto-generated or human captions? Human captions are preferred by default; isAutoGenerated tells you which one you got.
How do channels work? A channel URL returns its latest uploads (videos, Shorts and lives), up to maxVideosPerChannelOrPlaylist.
How does onlyNew work? Delivered video IDs are remembered per language in your key-value store named youtube-transcripts-state. Later runs skip them (for free). Delete that store to start over.
Does it transcribe videos without captions (speech-to-text)? No. It returns the captions YouTube already has; videos without any are reported as free errors.
Limitations
- Private, members-only and age-restricted videos require sign-in and are not supported (returned as free errors).
- Videos with no captions at all cannot be transcribed (no speech-to-text).
- Live streams in progress usually have no transcript until they end.
- Channel listing follows the uploads playlist order (newest first); large channels are limited by
maxVideosPerChannelOrPlaylist. - YouTube sometimes rate-limits cloud servers; the actor retries with new IPs and a residential fallback. Very long videos (3 h+) that end up on the residential fallback may fail (free).