YouTube Transcript Scraper — Captions & Subtitles for AI (Bulk) avatar

YouTube Transcript Scraper — Captions & Subtitles for AI (Bulk)

Pricing

$4.00 / 1,000 transcript extracteds

Go to Apify Store
YouTube Transcript Scraper — Captions & Subtitles for AI (Bulk)

YouTube Transcript Scraper — Captions & Subtitles for AI (Bulk)

Extract YouTube transcripts, captions and subtitles in bulk from video URLs or IDs. Manual or auto-generated tracks, any language, optional translation, plain text, timestamped segments, SRT or VTT. Ready for AI, RAG and LLM pipelines.

Pricing

$4.00 / 1,000 transcript extracteds

Rating

0.0

(0)

Developer

Eonix Pvt Ltd

Eonix Pvt Ltd

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Turn any list of YouTube videos into clean transcripts. Paste watch links, youtu.be links, Shorts, embeds, live URLs or plain video IDs, and get back one dataset item per video with the full transcript as plain text, plus optional timestamped segments, SRT and WebVTT. Manual subtitles are used when they exist, with auto-generated captions as a fallback. YouTube's built-in translation can return the transcript in another language.

You pay only for videos where a transcript was actually extracted. Videos with no captions, private or removed videos, and bad links are reported in the dataset for free.

What you can use it for

  • RAG and AI knowledge bases: index a channel's tutorials, lectures or podcasts into a vector store. segments keeps timestamps so answers can link back to the exact moment in the video.
  • LLM summarization and Q&A: feed transcriptText straight into a prompt to summarize videos, pull out key points or generate show notes.
  • Content repurposing: turn videos into blog posts, newsletters, social threads or chapter markers.
  • Research and monitoring: analyze what creators, competitors or politicians said, across hundreds of videos at once.
  • Subtitles: download ready-to-use .srt or .vtt bodies, optionally translated.
  • Dataset building: collect speech text with language and "auto-generated" labels for NLP work.

How it works

For each video the Actor asks YouTube's mobile app API for the caption track list, picks the best track and downloads it:

  1. A manual track in your preferred language (an exact code like en first, then a regional variant like en-GB)
  2. An auto-generated track in that language, if allowed
  3. Any other manual track
  4. Any other auto-generated track, if allowed
  5. If Translate to is set: a native track in that language wins. Otherwise the picked track is machine-translated by YouTube, when YouTube allows translation for it.

If the first method fails, the Actor tries a second one automatically. Failed requests are retried with backoff on a fresh proxy session. A problem with one video never stops the run.

Input

FieldDefaultDescription
videoUrls["https://www.youtube.com/watch?v=jNQXAC9IVRw"]Video URLs or 11-character IDs. Duplicates are fetched once.
preferredLanguageenCaption language to prefer (en, es, de, pt-BR, ...).
allowAutoGeneratedtrueUse automatic captions when no human-made subtitles exist.
translateTo(empty)Machine-translate the transcript into this language.
outputFormat["text", "segments"]Plain text is always included. Add segments, srt and/or vtt.
includeVideoDetailstrueAdd channel name, channel ID, duration and view count.
maxConcurrency5Videos processed in parallel.
proxyConfigurationApify ProxyUse the RESIDENTIAL group if YouTube shows bot checks.
{
"videoUrls": [
"https://www.youtube.com/watch?v=jNQXAC9IVRw",
"https://youtu.be/dQw4w9WgXcQ",
"https://www.youtube.com/shorts/abcdefghijk"
],
"preferredLanguage": "en",
"allowAutoGenerated": true,
"outputFormat": ["text", "segments", "srt"]
}

Output

One item per video. A successful item:

{
"status": "ok",
"videoId": "jNQXAC9IVRw",
"url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
"inputUrl": "https://youtu.be/jNQXAC9IVRw",
"title": "Me at the zoo",
"channelName": "jawed",
"channelId": "UC4QobU6STFB0P71PMvOGN5A",
"durationSeconds": 19,
"viewCount": 380412245,
"availableLanguages": [
{ "languageCode": "en", "languageName": "English", "isAutoGenerated": false, "isTranslatable": true },
{ "languageCode": "de", "languageName": "German", "isAutoGenerated": false, "isTranslatable": true }
],
"language": "en",
"languageName": "English",
"originalLanguage": "en",
"isAutoGenerated": false,
"isTranslated": false,
"transcriptText": "All right, so here we are, in front of the elephants the cool thing about these guys is that they have really, really, really long trunks and that's, that's cool and that's pretty much all there is to say",
"segments": [
{ "start": 1.2, "duration": 2.16, "text": "All right, so here we are, in front of the elephants" },
{ "start": 5.318, "duration": 7.031, "text": "the cool thing about these guys is that they have really, really, really long trunks" }
],
"srt": "1\n00:00:01,200 --> 00:00:03,360\nAll right, so here we are, in front of the elephants\n\n...",
"segmentCount": 4,
"wordCount": 39,
"sourceClient": "IOS",
"scrapedAt": "2026-10-16T05:00:12.150Z"
}

(The transcript in this example is shortened.) start and duration are in seconds. srt and vtt appear only when you select them.

A video without a usable transcript still gets an item, so you can see what happened to every input:

{
"status": "no_transcript",
"videoId": "NoCaps00001",
"url": "https://www.youtube.com/watch?v=NoCaps00001",
"title": "Silent timelapse of clouds",
"availableLanguages": [],
"reason": "This video has no captions or subtitles.",
"scrapedAt": "2026-10-16T05:00:12.160Z"
}
statusMeaningCharged
okTranscript extractedYes
no_transcriptThe video has no captions, or only auto-generated ones while those are turned offNo
unavailablePrivate, removed, age-restricted or region-blocked video (the reason says which)No
errorYouTube could not be reached after retries. Try again later or use a residential proxyNo
invalid_inputThe input line is not a YouTube video URL or IDNo

Run statistics (counts per status, how many videos were charged, and whether the run stopped early) are saved to the RUN_STATS record in the default key-value store.

Pricing

Pay per event: $0.004 per transcript extracted ($4 per 1,000 videos), plus a small amount of Apify platform usage. You are charged only for items with status: "ok". If you set a maximum cost per run, the Actor stops starting new videos once the limit is reached and keeps everything collected so far.

FAQ

Does it work for videos without captions? No. It reads the captions YouTube already has (uploaded or auto-generated). It does not transcribe audio itself. Such videos come back as no_transcript, free of charge.

Which languages are supported? Any language YouTube has captions for. Set preferredLanguage to a language code. If that language is missing, you get the best other track, and the item's language field says which one. Use translateTo to get a machine translation from YouTube.

How do I tell auto-generated captions from human ones? Check isAutoGenerated. Turn off Allow auto-generated captions to accept only human-made subtitles.

Can I scrape a whole channel or playlist? This Actor takes video URLs. Collect the video URLs with a channel or playlist scraper first, then pass them in.

Is the text ready for an LLM? Yes. Line breaks inside captions are joined, HTML entities are decoded and layout-only cues are removed. transcriptText is one clean string, and segments keeps the timing for chunking with timestamps.

What about Shorts and live streams? Shorts, /live/ and embed URLs are supported. Live streams usually get captions only after the stream ends.

Why do I see error items? YouTube sometimes rate-limits or bot-checks datacenter IPs. The Actor retries on new proxy sessions, but if it keeps happening, switch the proxy to the RESIDENTIAL group and rerun those videos.

Is this legal? The Actor reads publicly available caption data, the same data YouTube's own apps display. You are responsible for how you use the transcripts, including copyright and YouTube's Terms of Service.

Limitations

  • Private, members-only and some age-restricted videos cannot be read.
  • Transcript accuracy depends on YouTube's captions. Auto-generated captions have no punctuation in many languages.
  • YouTube changes its internal APIs from time to time. If transcripts stop coming through, please open an issue so it can be fixed quickly.