YouTube Transcript Scraper — Fast, Reliable, Pay Per Result
Pricing
Pay per event
YouTube Transcript Scraper — Fast, Reliable, Pay Per Result
Extract YouTube transcripts (timestamped segments, plain text, SRT, VTT) from videos, channels, playlists, and search. Honest per-video statuses; you only pay for delivered transcripts.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Fetchworks
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 hours ago
Last modified
Categories
Share
YouTube Transcript Scraper
Extract YouTube transcripts — timestamped segments, plain text, SRT, and VTT — from videos, Shorts, channels, playlists, and search results. Built for RAG pipelines, LLM agents, content research, and SEO workflows.
1,000 transcripts = $5. You pay only for transcripts actually delivered. Videos without captions, blocked videos, or failures are reported honestly — and never billed as transcripts.
Why this scraper
- Honest per-video statuses. Every video yields one dataset item with an explicit
status:ok,no_captions,blocked,live_stream,age_restricted,unavailable,translation_unavailable,po_token_required, orerror. Never a "successful" run with silently empty transcripts. - Success-only billing. The
transcriptevent is charged only forstatus: "ok"items. A failed video costs you nothing (at most a fractional metadata event when full video metadata was still delivered and requested). - Built to survive YouTube changes. Layered client strategies with residential proxy fallback, refreshed player parameters, and continuous monitoring. When YouTube shifts, this actor is patched within hours — not weeks.
- Batch, channel, playlist, and search input in one run. No artificial 200-video caps.
- Languages done right. Priority list (
["en", "de"]), manual-vs-auto-generated preference, full list of available caption tracks on every item, and best-effort translation. - Metadata comes free. Title, channel, duration, views, likes, publish date, thumbnails, category — included by default at no extra charge.
Input
{"videoUrls": ["https://www.youtube.com/watch?v=jNQXAC9IVRw","https://youtu.be/aqz-KE-bpKQ","https://www.youtube.com/shorts/abcdefghijk"],"channelUrls": ["@3blue1brown"],"maxVideosPerChannel": 25,"playlistUrls": ["https://www.youtube.com/playlist?list=PLZHQObOWTQDMsr9K-rj53DwVRMYO3t5Yr"],"searchQueries": ["neural networks explained"],"maxSearchResults": 10,"languages": ["en"],"preferAutoGenerated": false,"outputFormats": ["segments", "text", "srt", "vtt"],"includeMetadata": true,"includeChapters": false}
Any combination of videoUrls, channelUrls, playlistUrls, and searchQueries works. Bare 11-character video IDs, @handles, and playlist IDs are accepted too.
Output
One dataset item per video:
{"videoId": "jNQXAC9IVRw","url": "https://www.youtube.com/watch?v=jNQXAC9IVRw","status": "ok","language": "en","isAutoGenerated": false,"availableLanguages": [{ "languageCode": "en", "kind": "manual", "name": "English", "isTranslatable": true },{ "languageCode": "en", "kind": "asr", "name": "English (auto-generated)" }],"segments": [{ "start": 1.3, "dur": 3.4, "text": "All right, so here we are" }],"text": "All right, so here we are in front of the elephants…","srt": "1\n00:00:01,300 --> 00:00:04,700\nAll right, so here we are\n","vtt": "WEBVTT\n\n00:00:01.300 --> 00:00:04.700\nAll right, so here we are\n","metadata": {"title": "Me at the zoo","author": "jawed","channelId": "UC4QobU6STFB0P71PMvOGN5A","lengthSeconds": 19,"viewCount": 353000000,"publishDate": "2005-04-23","category": "People & Blogs"}}
A video without captions comes back as an honest item, not a fake success:
{"videoId": "kJQP7kiw5Fk","url": "https://www.youtube.com/watch?v=kJQP7kiw5Fk","status": "no_captions","availableLanguages": [],"error": "video has no caption tracks","metadata": { "title": "…", "author": "…" }}
Pricing
| Event | Price | When |
|---|---|---|
transcript | $0.005 | A transcript was successfully extracted (status: "ok") |
video-metadata | $0.0005 | No transcript possible, but full video metadata was delivered (only if metadata was requested) |
That's $5 per 1,000 transcripts, success-only. No actor-start fee.
Using from n8n
Use the Apify node (or an HTTP Request node):
Run Actor→ this actor, with your input JSON (e.g.{"videoUrls": ["{{ $json.url }}"], "outputFormats": ["text"]}).Get Dataset Items→ maptextorsegmentsinto your workflow (summarization, embeddings, Notion, Sheets…).
Single-video calls return in seconds, so synchronous run-sync-get-dataset-items works well:
POST https://api.apify.com/v2/acts/fetchworks~youtube-transcript-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN{ "videoUrls": ["https://www.youtube.com/watch?v=VIDEO_ID"], "outputFormats": ["text"] }
Using from Make (Integromat)
Add the Apify app → Run an Actor module → pick this actor and paste your input JSON. Then a Get Dataset Items module reads the transcripts. The same pattern powers Airtable, Sheets, and Slack scenarios.
Using from AI agents (MCP)
This actor is exposed through Apify's MCP server. Point your agent at https://mcp.apify.com with your Apify token, and it can call fetchworks/youtube-transcript-scraper as a tool — ask for a video URL's transcript and read text from the dataset. Works with Claude, OpenAI-compatible agents, and any MCP client.
FAQ
Is scraping YouTube transcripts legal? This actor accesses only publicly available caption data — the same data any signed-out viewer sees. No login, no private data, no personal data collection. Whether your specific use complies with YouTube's ToS and your jurisdiction is your call; for many research and indexing uses, publicly accessible data scraping has repeatedly been upheld (e.g. hiQ v. LinkedIn). Not legal advice.
What about rate limits? Handled internally: requests ride rotating residential-class sessions and caption downloads are spread across egress paths. You don't need to throttle your runs. For very large batches (10,000+), split into a few runs for best throughput.
Which languages are supported?
Every language YouTube has a caption track for. Give a priority list (["de", "en"]) and the first available track wins; availableLanguages on each item shows everything the video offers. translateTo requests YouTube auto-translation (best-effort — YouTube throttles translated tracks globally; failures are reported as translation_unavailable and not billed).
Auto-generated vs manual captions?
Manual (creator-uploaded) captions are preferred by default; auto-generated (ASR) tracks are used when no manual track exists. Set preferAutoGenerated: true to flip that. Each item tells you which you got via isAutoGenerated.
How long can videos be? 4-hour-plus videos are fine — transcripts are fetched as compact caption payloads, not media, so memory stays flat.
Live streams?
Finished live VODs with captions work like normal videos. Offline/upcoming live streams return status: "live_stream".
Unlisted videos? Work, as long as you have the URL.
Changelog
0.1
- Initial release: video/channel/playlist/search input, segments/text/SRT/VTT output, honest per-video statuses, success-only pay-per-event pricing, metadata and chapters.