YouTube Transcript Scraper avatar

YouTube Transcript Scraper

Pricing

Pay per event

Go to Apify Store
YouTube Transcript Scraper

YouTube Transcript Scraper

Extract YouTube transcripts & captions from videos, Shorts, channels and playlists. Plain text, timestamped segments, SRT or VTT, language choice, auto-translation and video metadata. Pay only for successful transcripts; failed videos are free.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Markus Essl

Markus Essl

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 days ago

Last modified

Share

Get the full transcript (captions/subtitles) of any public YouTube video, Short, channel or playlist as plain text, timestamped segments, SRT or WebVTT, together with the video's title, channel, publish date, duration and view count. You only pay for transcripts that were actually delivered. Videos with no captions are reported as free error records.

What data can you get

FieldExampleNotes
transcriptText"Good morning. How are you? ..."Full transcript as one string
segments[{"start": 27.1, "duration": 2.58, "text": "Good morning. How are you?"}]Timestamped lines, in seconds
srt / vtt1\n00:00:27,103 --> 00:00:29,678\n...Ready-to-use subtitle files (optional)
transcriptLanguageenLanguage of the returned transcript
isAutoGeneratedfalsetrue = YouTube speech recognition, false = captions provided by the uploader
isTranslated, translatedFromtrue, koSet when you ask for automatic translation
videoLanguagefr-FROriginal spoken language when YouTube exposes it
availableLanguages[{"languageCode": "de", "isAutoGenerated": false}, ...]Every caption track available on the video
title, description, keywords, category"Do schools kill creativity?"Video metadata
channelName, channelId, channelHandle, channelUrlTED, @TEDChannel info
publishedAt, durationSeconds, viewCount2007-01-07T05:00:34Z, 1203, 25027894Publish date in ISO 8601 (UTC)
wordCount, segmentCount3170, 427Quick size stats
status, errorCode, errorMessageerror, NO_TRANSCRIPTEvery video gets a record, including failures (free)

How to use

  1. Paste YouTube links into YouTube URLs or video IDs. You can mix videos (watch?v=, youtu.be/, /shorts/, /live/), bare 11-character video IDs, channels (@handle, /channel/UC…, plus /videos, /shorts or /streams for a specific tab) and playlists.
  2. Optionally pick preferred languages, an auto-translation target, and the output formats you want.
  3. Click Start, then download the results as JSON, CSV or Excel, or read them through the API.

Input example

{
"startUrls": [
"https://www.youtube.com/watch?v=iG9CE55wbtY",
"https://youtu.be/9bZkp7q19f0",
"https://www.youtube.com/@veritasium/videos",
"https://www.youtube.com/playlist?list=PLrAXtmErZgOeiKm4sgNOknGvNjby9efdf"
],
"languages": ["en"],
"translateTo": "",
"outputFormats": ["text", "segments", "srt"],
"maxVideosPerSource": 20,
"maxItems": 100
}

Output example

Real output from a test run (long fields shortened):

{
"status": "success",
"videoId": "iG9CE55wbtY",
"url": "https://www.youtube.com/watch?v=iG9CE55wbtY",
"title": "Do schools kill creativity? | Sir Ken Robinson | TED",
"channelName": "TED",
"channelId": "UCAuUUnT6oDeKwE6v1NGQxug",
"channelHandle": "@TED",
"channelUrl": "https://www.youtube.com/channel/UCAuUUnT6oDeKwE6v1NGQxug",
"publishedAt": "2007-01-07T05:00:34Z",
"durationSeconds": 1203,
"viewCount": 25027894,
"category": "Education",
"transcriptLanguage": "en",
"transcriptLanguageName": "English",
"isAutoGenerated": false,
"isTranslated": false,
"videoLanguage": "en",
"segmentCount": 427,
"wordCount": 3170,
"transcriptText": "Good morning. How are you? (Audience) Good. It's been great, hasn't it? I've been blown away by the whole thing. In fact, I'm leaving. (Laughter) ...",
"segments": [
{ "start": 27.103, "duration": 2.575, "text": "Good morning. How are you?" },
{ "start": 29.702, "duration": 1.403, "text": "(Audience) Good." },
{ "start": 31.129, "duration": 1.668, "text": "It's been great, hasn't it?" }
],
"srt": "1\n00:00:27,103 --> 00:00:29,678\nGood morning. How are you?\n\n2\n...",
"inputUrl": "https://www.youtube.com/watch?v=iG9CE55wbtY",
"scrapedAt": "2026-10-09T14:01:43Z"
}

A video without captions gets a free error record:

{
"status": "error",
"videoId": "l9McIeQxwqY",
"url": "https://www.youtube.com/watch?v=l9McIeQxwqY",
"errorCode": "NO_TRANSCRIPT",
"errorMessage": "This video has no captions/transcript (none uploaded and none auto-generated).",
"scrapedAt": "2026-10-09T14:01:50Z"
}

Pricing

$4.00 per 1,000 transcripts ($0.004 per video). You pay only for transcripts that were delivered. Error records cost nothing: videos with no captions, private, deleted, members-only or age-restricted videos, and languages that aren't available. Listing videos from channels and playlists is also free. Set a maximum charge per run in the run options if you want a hard spending cap.

Language and translation options

  • Preferred transcript languages: a priority list such as ["en", "es"]. en also matches en-US, en-GB and other regional variants.
  • Default (empty list): the transcript comes in the video's original spoken language. Auto-dubbed videos are handled correctly, so a French video with an English AI dub still returns the French transcript.
  • Fall back to original language: when none of your languages exists, you get the original-language transcript instead of an error. Turn this off to get a free LANGUAGE_NOT_AVAILABLE record instead.
  • Auto-translate to language: if the video has a native track in that language, the native track is used. Otherwise the transcript is machine-translated (Google Translate) and the timestamps are kept. isTranslated and translatedFrom are set on those records.
  • Prefer human-made captions: when the uploader provided captions, they are used before YouTube's auto-generated speech recognition.

Use cases

  • AI and LLM pipelines: feed transcripts to summarizers, RAG indexes, chatbots or AI agents. The Actor works with the Apify MCP server, so agents such as Claude or ChatGPT can call it as a tool.
  • Content repurposing: turn videos into blog posts, newsletters, show notes or social posts.
  • Research and monitoring: analyze what channels, competitors, politicians or news outlets say, and search across thousands of videos.
  • Subtitles and accessibility: download SRT or VTT files for editing, translation or re-upload.
  • SEO and marketing: extract keywords and topics from top-ranking videos in your niche.
  • Education: build study notes and searchable archives of lectures and talks.

FAQ

Is it legal to scrape YouTube transcripts? This Actor reads only publicly available data: the same captions anyone can see under a public video. It does not log in, use cookies or touch private data. You are responsible for how you use the content, for example copyright and YouTube's terms. When in doubt, consult a lawyer.

Why did a video return NO_TRANSCRIPT? The uploader didn't add captions, and YouTube didn't auto-generate any (common for music-only videos, live streams, very new uploads and some Shorts). The Actor checks three times from different connections before reporting this, so the record is reliable. It's free.

Which videos can't be processed? Private, deleted, members-only and age-restricted videos (those need a signed-in account), and premieres or live streams that haven't started yet. Each one gets a clear errorCode and costs nothing.

How many videos does a channel return? The newest maxVideosPerSource uploads (default 20). Add /videos, /shorts or /streams to the channel URL to limit the results to that tab. maxItems caps the whole run.

How accurate are auto-generated transcripts? They come from YouTube's own speech recognition. Quality is usually good for clear speech and weaker for music, heavy accents or crosstalk. The isAutoGenerated field tells you which kind each record contains.

Error codes: NO_TRANSCRIPT, LANGUAGE_NOT_AVAILABLE, TRANSLATION_FAILED, VIDEO_UNAVAILABLE, VIDEO_PRIVATE, AGE_RESTRICTED, MEMBERS_ONLY, LIVE_NOT_STARTED, VIDEO_UNPLAYABLE, CHANNEL_NOT_FOUND, PLAYLIST_NOT_FOUND, NO_VIDEOS_FOUND, INVALID_INPUT, BLOCKED (temporary; please retry).