YouTube Transcript Scraper - JSON, SRT, VTT, RAG avatar

YouTube Transcript Scraper - JSON, SRT, VTT, RAG

Pricing

$7.50 / 1,000 transcripts

Go to Apify Store
YouTube Transcript Scraper - JSON, SRT, VTT, RAG

YouTube Transcript Scraper - JSON, SRT, VTT, RAG

Extract transcripts from YouTube videos. Input: video URLs or IDs + language preferences. Output: plain text, timestamped segments, SRT/VTT subtitles, and RAG chunks with deep links. 100+ languages, no API key. $0.0075 per delivered transcript.

Pricing

$7.50 / 1,000 transcripts

Rating

0.0

(0)

Developer

Jaime Martinez

Jaime Martinez

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

YouTube Transcript Scraper & API for developers and AI pipelines

YouTube transcript scraper and transcript API for developers and AI pipelines — extract transcripts and subtitles as JSON, text, SRT, VTT, or RAG chunks with timestamps, in bulk, across 100+ languages, with no API key.

YouTube gates its caption endpoint behind PoToken bot-checks and datacenter-IP bans, so free libraries like youtube-transcript-api and yt-dlp often return empty transcripts in production. This actor mints a per-video proof-of-origin token, escalates to residential proxies when needed, and is actively maintained — and you only pay for transcripts actually delivered.

Built for developers and AI builders who need YouTube captions at scale: feed an LLM, build a RAG pipeline, summarize videos, translate, search, or repurpose content.


Run in 30 seconds

Paste this input (or just click Start — the form is pre-filled with a working video):

{ "videoUrls": ["https://www.youtube.com/watch?v=jNQXAC9IVRw"] }

Seconds later the dataset holds one item per video: title, channel, language, timestamped segments, and the full transcript text. Turn on includeSrt, includeVtt, or ragChunking to also get subtitle files and embedding-ready chunks in the same run.

Why this actor

  • Built for YouTube's PoToken era. YouTube now blocks naive transcript scrapers (empty responses behind its bot-check). This actor solves the current proof-of-origin requirement and is actively maintained with a daily canary watchdog — 100% success across our monitored canary runs since launch (2026-06-12).
  • Bulk & fast. Pass one URL or thousands; concurrent extraction with automatic retries.
  • 🎯 Every format you need. Plain text, timestamped segments, SRT, VTT, and RAG chunks with deep links — in a single run.
  • 🌍 100+ languages, manual and auto-generated captions, with language preference and fallback.
  • 💸 Pay per video. No monthly fee. You're only charged for transcripts we actually deliver.

Use cases

  • RAG / LLM ingestion — turn long videos into clean, chunked, timestamped context for vector databases (LangChain, LlamaIndex).
  • Summaries & notes — feed transcripts to Claude/GPT for summaries, chapters, show notes.
  • Subtitles — export ready-to-use .srt / .vtt files.
  • Search & analytics — index spoken content across a channel.
  • Translation & repurposing — transcribe once, translate anywhere.

Input

FieldTypeDescription
videoUrlsarrayRequired. YouTube video URLs (watch, youtu.be, shorts, embed, live) or raw 11-char video IDs.
languagesarrayPreferred language codes in order, e.g. ["en","es"]. Falls back to English, then first available. Default ["en"].
preferManualbooleanPrefer human-uploaded captions over auto-generated. Default true.
includeSegmentsbooleanInclude timestamped {start, duration, text} segments. Default true.
includePlainTextbooleanInclude the whole transcript as one clean string. Default true.
includeSrtbooleanInclude a SubRip .srt string. Default false.
includeVttbooleanInclude a WebVTT .vtt string. Default false.
ragChunkingbooleanEmit overlapping chunks with timestamps + deep links for embeddings. Default false.
chunkMaxChars / chunkOverlapCharsintegerChunk sizing for RAG. Defaults 1500 / 200.
concurrencyintegerVideos processed in parallel (1–10). Default 5.
proxyCountryCodestringOptional two-letter country code for proxies (affects region-locked captions).

Example input

{
"videoUrls": [
"https://www.youtube.com/watch?v=jNQXAC9IVRw",
"https://youtu.be/8S0FDjFBj8o"
],
"languages": ["en"],
"includeSrt": true,
"ragChunking": true
}

Output

One dataset item per video:

{
"ok": true,
"videoId": "jNQXAC9IVRw",
"url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
"title": "Me at the zoo",
"channelName": "jawed",
"durationSeconds": 19,
"viewCount": 358000000,
"language": "en",
"captionKind": "manual",
"availableLanguages": [{ "languageCode": "en", "kind": "manual", "name": "English" }],
"segmentCount": 6,
"text": "All right, so here we are, in front of the elephants...",
"segments": [{ "start": 1.2, "duration": 2.16, "text": "All right, so here we are, in front of the elephants" }],
"srt": "1\n00:00:01,200 --> 00:00:03,360\nAll right, so here we are...",
"chunks": [{ "index": 0, "text": "...", "startSeconds": 1.2, "endSeconds": 18.5, "deepLink": "https://www.youtube.com/watch?v=jNQXAC9IVRw&t=1s" }]
}

The dataset ships with three views: Transcripts (one row per video), RAG chunks (one row per chunk, with timestamps and deep links), and Subtitles (SRT/VTT).

Successful transcripts are written to the default dataset — that's the only thing you're billed for. Videos that couldn't be delivered (no captions, private/unavailable, bad URL) are listed with the reason in the run's key-value store under SKIPPED, and a per-run SUMMARY record counts successes, no-caption videos, and failures — never charged.

What you'll pay

$0.0075 per delivered transcript. No subscription, no minimums — skipped videos are never billed.

Transcripts deliveredYou pay
11 × $0.0075 = $0.0075
100100 × $0.0075 = $0.75
1,0001,000 × $0.0075 = $7.50

The Pricing tab always shows the current rate.

Use as an MCP tool / with AI agents

This actor is exposed as an MCP tool via Apify's MCP server (streamable HTTP):

https://mcp.apify.com/?tools=jamhimself/youtube-transcript-extractor

Example MCP client configuration:

{
"mcpServers": {
"youtube-transcripts": {
"url": "https://mcp.apify.com/?tools=jamhimself/youtube-transcript-extractor"
}
}
}

Any MCP client — Claude, Cursor, or agent frameworks — can call this actor directly with the same input and output described above (authenticate with your Apify API token).

Why scrapers return empty transcripts (and why this one doesn't)

YouTube's caption (timedtext) endpoint now requires a proof-of-origin token (PoToken) minted by its BotGuard bot-check and bound to the specific video — without it, the endpoint returns an empty 200 response. That, plus aggressive datacenter-IP blocking, is why many free libraries and stale scrapers suddenly return no transcript at all.

This actor:

  • solves the BotGuard challenge and mints a fresh PoToken bound to each video ID,
  • tries a cheap datacenter IP first, then automatically escalates to rotating residential proxies,
  • is actively maintained with a daily canary watchdog — 100% success across our monitored canary runs since launch (2026-06-12).

If a video still returns no transcript, it's almost always genuine: captions disabled, private/members-only, region-locked, or a live stream without a caption track. Those are skipped and never billed.

FAQ

Does it work for auto-generated captions? Yes — manual and ASR (auto) captions, in 100+ languages.

Playlists and channels? Pass individual video URLs for now. Playlist/channel expansion is coming.

Is this legal? It accesses publicly available caption data. You are responsible for complying with YouTube's Terms of Service and applicable copyright law in your use of the output.

Why do some videos return no transcript? The video genuinely has captions disabled, is private/age-restricted/region-locked, or is a live stream without a caption track.


If this actor saved you time, an honest review helps others find it.

Questions or a format you need? Open an issue on the actor — it's actively maintained.

YouTube is a trademark of Google LLC. This actor is not affiliated with or endorsed by them. Built and maintained by Jamhimself LLC.