YouTube Transcript Scraper — Subtitles, SRT/VTT & RAG Chunks avatar

YouTube Transcript Scraper — Subtitles, SRT/VTT & RAG Chunks

Pricing

from $3.00 / 1,000 results

Go to Apify Store
YouTube Transcript Scraper — Subtitles, SRT/VTT & RAG Chunks

YouTube Transcript Scraper — Subtitles, SRT/VTT & RAG Chunks

Scrape YouTube transcripts and subtitles from any video, playlist or channel. Export text, SRT, VTT or timestamped chunks for RAG and LLM datasets.

Pricing

from $3.00 / 1,000 results

Rating

5.0

(1)

Developer

Spool

Spool

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

Share

A hosted YouTube transcript API. Turn any video, playlist, or entire channel into clean, chunked, timestamped text your AI can actually use.

Free transcript libraries work fine until YouTube starts blocking you — then the caption URL quietly returns an empty body with no error, and you are debugging silence. This pulls captions through YouTube's own player endpoint on rotating proxies, so it keeps working at volume.

It also returns embedding-ready chunks with the timestamps still attached — so when your chatbot cites a source, it can link to the exact second in the video.


What you get

  • Feed it a whole channel. Paste a channel or playlist URL and it expands into every video automatically. No collecting video IDs by hand — which is what you actually want when building a knowledge base.
  • RAG-ready chunks out of the box. Configurable size and overlap, so sentences are never cut in half at a chunk boundary. Drop straight into Pinecone, Qdrant, Chroma, Weaviate or any vector store.
  • Timestamps that survive chunking. Every chunk carries startTime and endTime. Your retrieved passage links back to youtube.com/watch?v=...&t=142s.
  • Metadata for citations. Title, channel, duration, view count, description and keywords come with every transcript, so your sources look credible.
  • SRT and VTT subtitle files. Ready to drop into a video editor, a player, or an HTML5 <track> tag — no conversion step.
  • Translate into any supported language. Uses YouTube's own caption translation, so timings stay exact — only the words change.

Works on regular videos, Shorts, and past live streams, in any of the 100+ languages YouTube supports — including auto-generated captions.


Example output

{
"videoId": "aircAruvnKk",
"url": "https://www.youtube.com/watch?v=aircAruvnKk",
"title": "But what is a neural network? | Deep learning chapter 1",
"channel": "3Blue1Brown",
"durationSeconds": 1120,
"viewCount": 24038646,
"language": "en",
"isAutoGenerated": false,
"wordCount": 3357,
"characterCount": 18430,
"chunkCount": 29,
"transcript": "This is a 3. It's sloppily written and rendered at an extremely low resolution of 28x28 pixels, but your brain has no trouble recognizing it as a 3...",
"chunks": [
{
"index": 0,
"text": "This is a 3. It's sloppily written and rendered at an extremely low resolution...",
"charCount": 726,
"startTime": 4.22,
"endTime": 48.34
},
{
"index": 1,
"text": "But something in that crazy-smart visual cortex of yours resolves these as...",
"charCount": 796,
"startTime": 37.52,
"endTime": 84.46
}
],
"availableLanguages": [
{ "languageCode": "en", "name": "English", "isAutoGenerated": false },
{ "languageCode": "es", "name": "Spanish", "isAutoGenerated": false }
]
}

Note how chunk 1 starts at 37.52s while chunk 0 runs to 48.34s — that is the overlap doing its job. No sentence gets orphaned.


Common uses

You want toHow
Build a chatbot over a YouTube channelPaste the channel URL, chunk at 1000 / overlap 150, embed chunks[].text
Ingest a course or lecture seriesPaste the playlist URL
Summarise long talksoutputFormat: "text", feed transcript to an LLM
Make searchable video archivesKeep chunks + startTime for deep links
Generate subtitles or captionssubtitleFormat: "srt" or "vtt" — files come back ready to use
Translate a video's captionstranslateTo: "fr" — timings are preserved exactly
Localise a channeltranslateTo plus a channel URL
Analyse competitors' videosBatch URLs, read transcript and keywords

Input

The only required field is videoUrls. Everything else has sensible defaults.

{
"videoUrls": [
"https://www.youtube.com/@3blue1brown",
"https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi",
"https://www.youtube.com/watch?v=aircAruvnKk"
],
"languages": ["en"],
"maxVideosPerSource": 50,
"chunkTranscript": true,
"chunkSize": 1000,
"chunkOverlap": 150
}

Mix and match freely — the input accepts:

TypeExamples
Channelyoutube.com/@handle · /channel/UC... · /c/name
Playlistyoutube.com/playlist?list=PL... · any URL with ?list=
Videowatch URLs, youtu.be, Shorts, embed, live, or a bare 11-char ID

Channels and playlists expand into their videos automatically. Duplicates are removed across all sources, so overlapping inputs never cost you twice.

Options

OptionDefaultWhat it does
videoUrlsRequired. Videos to transcribe
languages["en"]Language priority order. Human-written captions beat auto-generated ones in the same language. If the video has none of your languages, you get whatever it does have rather than nothing — the row is flagged languageIsFallback: true and the log says so, so a French request answered in English is never silent
includeAutoGeneratedtrueAllow YouTube's speech recognition when no human captions exist
translateTo""Language code to translate into, e.g. fr, ar, es. Empty keeps the original. YouTube's translation endpoint refuses a good share of requests, so this retries before giving up. If it still won't translate, you get the original transcript rather than an empty result, with translationFailed: true on the row and a warning in the log — never a silent swap
subtitleFormatnonesrt, vtt, both, or none
maxVideosPerSource50Cap per channel/playlist. Individual video URLs are never capped
chunkTranscripttrueProduce RAG chunks
chunkSize1000Target characters per chunk (~250 tokens)
chunkOverlap150Characters repeated across boundaries
outputFormatbothboth, text, or chunks
includeSegmentsfalseAdd raw per-cue timings. Makes output much larger
maxConcurrency3Videos fetched in parallel. Raise it if your runs stay clean
maxRetries4Retries for transient failures. Blocked retries switch to residential proxy automatically
proxyConfigurationApify ProxyYouTube blocks bare datacenter IPs

Subtitle output

Set subtitleFormat and each record gains an srt and/or vtt string:

1
00:00:01,200 --> 00:00:03,360
Bueno, aqui estamos, frente a los elefantes.
2
00:00:05,318 --> 00:00:07,974
Lo genial de estos tipos es que tienen trompas muy...

Cue timings are clamped so a cue never overlaps the next one — auto-generated tracks frequently do, and most players handle that badly.

Choosing chunk size

Chunk sizeGood for
500Precise retrieval, short answers
1000General RAG — recommended starting point
2000+Long-context models, summarisation

Keep overlap at roughly 10–20% of chunk size.


When a video fails

Failures are returned as rows rather than silently dropped, each with a typed error so you can filter and act on them:

errorMeaning
no_captionsThe video genuinely has no captions in any language
language_not_availableThe video has no usable caption track at all. A video that simply lacks your language is not an error — see languages above
video_unavailableDeleted, region-blocked, or a bad ID
video_privatePrivate video
age_restrictedSign-in required
live_streamCurrently live — try again once it ends
bot_detectedYouTube flagged the exit IP. Retried automatically on residential
blocked_empty_responseYouTube throttled the request. Retried automatically on residential
rate_limitedToo many requests from one IP. Backed off and retried on residential; lower maxConcurrency if persistent

A run summary with the full error breakdown is written to the key-value store as RUN_SUMMARY, so you can monitor success rate over time.

Success rates below 100% are usually normal — plenty of YouTube videos simply have no captions. Check the failures view in the dataset to see which and why.


Notes

  • Only public videos with captions are supported. This tool does not transcribe audio — it retrieves captions that already exist on YouTube.
  • Private, members-only, and deleted videos cannot be accessed.
  • Runs entirely over HTTP with no headless browser, which keeps it fast and cheap.

FAQ

How do I get a transcript from a YouTube video? Paste the video URL into videoUrls and press Start. You get the full text, timestamped segments, and optional SRT/VTT files. No API key, no login, nothing to install.

Why does the youtube-transcript-api Python library stop working? Because YouTube soft-blocks it. The caption URL keeps returning HTTP 200 with an empty body, so nothing raises an error — you simply get nothing back. This Actor reads captions through YouTube's own player endpoint on rotating proxies, which is why it keeps working at volume.

Can I get transcripts for an entire channel or playlist? Yes. Paste a channel or playlist URL and it expands into the videos itself. maxVideosPerSource caps how many.

Which languages are supported? Any caption language the video actually has, plus YouTube's own translation via translateTo. If the video has none of your languages you get what it does have, flagged languageIsFallback: true — never a silent swap.

What if the video has no captions at all? You get a row carrying a typed error rather than a missing entry, so a large batch never leaves you guessing which videos worked.

Can it produce SRT or VTT subtitle files? Yes — set subtitleFormat to srt, vtt or both. The files are saved to the key-value store, ready for a video editor or an HTML5 <track> tag.

How much does it cost to run? Pay per event, so you are charged for what you actually extract rather than for time spent. A single video costs a fraction of a cent.

Is this legal? It reads publicly available captions from public videos. No login, no private data, no personal information. You are responsible for how you use the output.


Support

Found a bug or need a feature? Open an issue on the Actor's Issues tab and you will get a reply — usually the same day.