YouTube Transcript Scraper — Fast, Reliable, Pay Per Result avatar

YouTube Transcript Scraper — Fast, Reliable, Pay Per Result

Pricing

Pay per event

Go to Apify Store
YouTube Transcript Scraper — Fast, Reliable, Pay Per Result

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

Fetchworks

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

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, or error. Never a "successful" run with silently empty transcripts.
  • Success-only billing. The transcript event is charged only for status: "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

EventPriceWhen
transcript$0.005A transcript was successfully extracted (status: "ok")
video-metadata$0.0005No 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):

  1. Run Actor → this actor, with your input JSON (e.g. {"videoUrls": ["{{ $json.url }}"], "outputFormats": ["text"]}).
  2. Get Dataset Items → map text or segments into 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 appRun 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.