YouTube Transcript Scraper - Captions & Subtitles
Pricing
from $3.00 / 1,000 transcripts
YouTube Transcript Scraper - Captions & Subtitles
YouTube transcript API and YouTube to text: videos, channels and playlists as timestamped caption lines, the full transcript, and SRT or WebVTT subtitles to download at no extra charge. 220 languages by name, or all a video has. Title, channel, views and length included. No captions, no charge.
Pricing
from $3.00 / 1,000 transcripts
Rating
0.0
(0)
Developer
Kaleidoscope Labs
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
7 hours ago
Last modified
Share
What can YouTube Transcript Scraper do?
Get the transcripts of YouTube videos, channels and playlists: every caption line with its start and duration, the whole text, in the languages you choose, as JSON, CSV, Excel, SRT or WebVTT.
- 📝 Transcripts: every line of a video's captions with when it starts and how long it shows, and the whole text in one field, ready for a summary, a search index or an AI pipeline.
- 📺 Channels and playlists: a channel's newest videos or a playlist in its order, up to a count you set, and only those published since a day or a span such as 30 days, each with its publish date and category.
- 🌍 Languages: the language spoken in each video by default; or the languages you choose from a list of 220; or every language a video has, one record each.
- 🎬 Subtitle files: each transcript as SRT or WebVTT text in its record, ready to save as a subtitle file.
- ✅ Videos without captions are free: a video that has no captions, or not in your language, is stored with the reason and the languages it has, and is not charged.
Run it from Apify Console, through the API, on a schedule, or from an AI agent. The prefilled input reads one NASA video and NASA's 10 newest videos (on 2026-10-28, 10 transcripts in 20 seconds: the video was among the newest), so you can see the output before a larger run.
| You want | Use | What it costs |
|---|---|---|
| A video's transcript as text | Its link or ID | $0.003 |
| A channel's or playlist's talks as a dataset | The channel's or playlist's link, a count, a date | $3.00 per 1,000 transcripts |
| Only the videos published since yesterday | Published since: 1 day, on a daily schedule | $0.003 per new video with captions |
| Subtitles in several languages | Languages, or Every language a video has, and Subtitle files | $0.003 per video and language |
| To know which languages a video has | Any input: every record lists them | Free when the video has none in your language |
What data do you get from a YouTube video?
| Field | What it holds |
|---|---|
videoId, url, title, description | The video's ID, page, title and description |
channelName, channelId, channelUrl | The channel that published it |
durationSeconds, viewCount, isLive | Its length, its views when read, and whether it is a stream live now |
publishedAt, category | Its publish date with its time zone, and YouTube's category: for videos read from a channel or a playlist |
language, languageName, trackKind | The transcript's language, its name as YouTube gives it, and whether the captions are uploaded (written by the channel) or automatic (YouTube's) |
requestedLanguage | The language you asked for this record, when you chose languages |
segments | The caption lines in order, each with start and duration in seconds and its text |
text | The whole transcript: the lines joined by spaces |
srt, vtt | The transcript as an SRT or WebVTT file, when you ask for one |
availableLanguages | Every caption track the video has: its code, name and kind |
availableLanguageNames | The same tracks' names as one text, joined by commas, for a spreadsheet |
unavailableReason | YouTube's own reason, for a video it does not play |
source, sourceType | The line of your input that led to the video, and whether it was a video, a channel or a playlist |
position | A listed video's place in its channel or playlist, from 1 (a channel's newest, a playlist's first). Records come as they are read: sort by it for the list's order |
missing | What the record lacks, and why |
Measured on 2026-10-27: of the 1,530 newest videos of nine institutions' channels (NASA, MIT OpenCourseWare, Ahrefs and others), 1,482 had captions and 48 had none; every listed video had its publish date.
How to use YouTube Transcript Scraper
- Create a free Apify account and open YouTube Transcript Scraper in Apify Console.
- In Videos, channels or playlists, enter what to read, one per line: a video's link or ID, a channel's link (such as https://www.youtube.com/@NASA) or a playlist's link.
- Choose Languages if you want others than each video's own, or turn on Every language a video has; add Subtitle files for SRT or WebVTT.
- For channels and playlists, set Videos per channel or playlist and, if you want, Published since.
- Click Start, then download the transcripts as JSON, CSV, Excel or HTML, or read them through the API. For CSV or Excel, choose the Transcripts view: it has the whole transcript in one cell, while all fields give each caption line columns of its own.
How much does it cost to get YouTube transcripts?
YouTube Transcript Scraper is priced per event, with no usage fees on top:
| Event | Price | When |
|---|---|---|
| Transcript | $3.00 per 1,000 | each record stored with its transcript: one per video and language |
A video without captions, without the language you asked for, private, removed or live now is stored with the reason and is not charged. The platform also charges $0.00005 when a run starts.
| Transcripts stored | Cost |
|---|---|
| 1 | $0.003 |
| 100 | $0.30 |
| 1,000 | $3.00 |
| 10,000 | $30.00 |
- A channel's last six months: 20 videos of Ahrefs' channel published since six months before 2026-10-28 gave 20 transcripts: $0.06.
- A video in four languages with SRT files: 4 transcripts, $0.012. Every language of the same NASA video: 20 transcripts, $0.06.
- A daily run for one channel's new videos: DW News' channel, published since 1 day: 8 videos on 2026-10-28, $0.024; a day without new videos costs only the run's start.
Apify's free plan credit of $5 a month covers about 1,600 transcripts. Set a maximum total charge in the run options to cap a run: the Actor stops before it.
Input recipes
Each recipe is a complete input: paste it into the JSON tab of the input form, or send it through the API. Fields left out take their defaults. The results are from runs on 2026-10-28.
A video's transcript (one NASA video: 1 transcript, in 6 seconds):
{"urls": ["https://www.youtube.com/watch?v=Zezt6EsG9WE"]}
A channel's last six months, for research (Ahrefs' channel: 20 transcripts, 7 uploaded and 13 automatic, each with its publish date, in 32 seconds):
{"urls": ["https://www.youtube.com/@AhrefsCom"],"maxVideos": 20,"dateFrom": "6 months"}
Only new videos, every day (DW News' channel; schedule it daily. On 2026-10-28, 1 day gave 8 videos, each with its publish date and automatic captions, in 89 seconds):
{"urls": ["https://www.youtube.com/@dwnews"],"maxVideos": 0,"dateFrom": "1 day"}
Lectures for a knowledge base (MIT OpenCourseWare's 18.06 Linear Algebra playlist, its first 5: a 7-minute interview with the lecturer, then lectures of 40 to 48 minutes, all with uploaded captions, in 9 seconds):
{"urls": ["https://www.youtube.com/playlist?list=PLE7DDD91010BC51F8"],"maxVideos": 5}
Subtitles in four languages (the NASA video in Spanish, French, German and Japanese, with SRT: 4 transcripts, in 4 seconds):
{"urls": ["https://www.youtube.com/watch?v=Zezt6EsG9WE"],"languages": ["es", "fr", "de", "ja"],"subtitleFormats": ["srt"]}
Every language a video has (the same video: 20 transcripts, 1 uploaded and 19 automatic, with WebVTT, in 5 seconds):
{"urls": ["https://www.youtube.com/watch?v=Zezt6EsG9WE"],"allLanguages": true,"subtitleFormats": ["vtt"]}
API and agent calls that leave maxVideos out get up to 50 videos per channel or playlist; 0 reads every video. A call that leaves urls out reads the prefilled NASA video and NASA's channel, and is charged as any run. Published since takes a date such as 2026-10-01 or a span back from today such as 30 days.
| You see | Why, and what to do |
|---|---|
A record with no text | The video has no captions, or none in the language you asked for: missing says which, and availableLanguages lists what it has. Not charged |
| Fewer records than videos in the channel | Videos per channel or playlist (50 by default) and Published since bound it; set 0 for every video |
trackKind is automatic | The channel uploaded no captions in that language: these are YouTube's automatic captions |
| No records, and the input's own message, such as "Enter at least one video, channel or playlist." | Nothing was read or charged: correct the input as it says and run it again (RUN_SUMMARY's inputError names the kind, for a program) |
Output example
A transcript from the prefilled input (shortened: the description and two of its lines, two of its 21 caption tracks). The video was given by its link, so its publish date is not read, and missing says so; a video read from a channel or a playlist also has publishedAt and category:
{"videoId": "Zezt6EsG9WE","url": "https://www.youtube.com/watch?v=Zezt6EsG9WE","title": "NASA Moon Base: Rovers and Lunar Terrain Vehicles (October 2026 Update)","channelName": "NASA","channelId": "UCLA_DiR1FfKNvjuUpBHmylQ","channelUrl": "https://www.youtube.com/channel/UCLA_DiR1FfKNvjuUpBHmylQ","durationSeconds": 557,"viewCount": 935631,"description": "There's a lot of ground to cover when you're building a Moon Base.","isLive": false,"language": "en","languageName": "English","trackKind": "uploaded","segments": [{"start": 2.135,"duration": 0.934,"text": "Think about"},{"start": 3.069,"duration": 3.337,"text": "hundreds of square miles where we have different assets."}],"text": "Think about hundreds of square miles where we have different assets. Multiple landers in different places of the Moon...","availableLanguages": [{"code": "en","name": "English","kind": "uploaded"},{"code": "de","name": "German (auto-generated)","kind": "automatic"}],"availableLanguageNames": "English, German (auto-generated)","source": "https://www.youtube.com/watch?v=Zezt6EsG9WE","sourceType": "video","missing": [{"group": "publishedAt","reason": "notRead"}]}
With Subtitle files, the record also holds srt or vtt. The start of the German SRT of the same video, from the "Subtitles in four languages" recipe:
100:00:02,139 --> 00:00:05,338Stellen Sie sich Hunderte von Quadratkilometern vor, auf denen wir
The run's default key-value store also holds RUN_SUMMARY: what the run stored, the records without a transcript and why, what could not be read, how the run ended (ended: finished, timedOut, aborted, maximumCost and the like), whether it did all it was asked (complete: false when it ended early or something could not be read; videos without captions or a date leave it true), and a Ref to quote if you report a problem. RUN_PROGRESS lists, by their IDs, the videos and channels or playlists the run could not read: written when the platform moves the run and at its end, so that a run moved or resurrected counts them once.
The dataset has two views: Transcripts (title, place in the list, channel, publish date, length, language, the kind of captions, the text, the link) and Videos (title, place in the list, channel, publish date, length, views, the languages by name, what is missing, the link).
YouTube subtitles: SRT and WebVTT
Turn on Subtitle files to get each transcript as an SRT or WebVTT file in its record, with one cue per caption line. YouTube's automatic captions show each line until two lines later; in the files, each cue ends when the next begins, so no two show at once. Save the srt or vtt field as a .srt or .vtt file to load it in a video player or an editor. The files cost nothing on top of the transcript.
YouTube to text: plain text for AI and search
Every record holds the whole transcript in text, the caption lines joined by spaces, next to the timed segments. Feed text to a summary, a search index or a retrieval pipeline, and keep segments to link an answer back to the moment in the video (start is in seconds: add &t= and the whole seconds to the video's url).
Integrations and API
- Make, Zapier, n8n: start a run with a video or a channel and get the transcripts when it finishes.
- Google Sheets, webhooks, the Apify API and clients for JavaScript and Python.
- AI agents: through Apify's MCP server, an agent can call the Actor as a tool.
Run a recipe and get its records in one call (with your Apify API key in the APIFY_TOKEN variable):
curl -X POST "https://api.apify.com/v2/acts/kaleidoscopelabs~youtube-transcript-scraper/run-sync-get-dataset-items" \-H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \-d '{"urls": ["https://www.youtube.com/watch?v=Zezt6EsG9WE"]}'
Building on this Actor
- Output stability: fields are added, never renamed or removed without a new major version; every change is in the changelog with its date, and a breaking one is announced here and in the changelog before the build.
- What a run's end means: every video read has a record, with
missingnaming what it lacks; a video or a channel or playlist that could not be read is counted in the run's last message and named by its ID in RUN_PROGRESS. A run that stores nothing because YouTube did not answer fails instead of succeeding empty. An input the Actor cannot read (no line it can read as a video, channel or playlist, a value it does not take) ends the run at once, with the reason as its last message, nothing read and nothing charged. - Cost per call: one event, $3.00 per 1,000 transcripts (one per video and language returned); a record without a transcript is never charged; the run stops before your maximum total charge.
- Notice: price changes follow Apify's 14-day notice; retiring the Actor is announced here first.
missing | Meaning |
|---|---|
transcript: noCaptions | the video has no captions |
transcript: languageNotAvailable | not in the language asked for; availableLanguages lists what it has |
transcript: notGiven | the captions could not be read |
transcript: live | a stream live now |
video and transcript: unavailable, private, ageRestricted, membersOnly, upcoming, unplayable | YouTube does not play the video; unavailableReason gives its reason |
publishedAt: notRead | a video given by its link or ID: no publish date is read |
publishedAt: notGiven | a listed video YouTube gave no date for; Published since was not applied to it |
srt or vtt: tooLarge | a subtitle file left out of a record too large to store |
For AI agents
Connect an MCP client (Claude, Cursor and others) to https://mcp.apify.com?tools=kaleidoscopelabs/youtube-transcript-scraper with your Apify API key, then ask, for example:
-
"Summarise the transcript of https://www.youtube.com/watch?v=Zezt6EsG9WE."
-
"Get the transcripts of the videos DW News published yesterday."
-
Minimal input:
{"urls": ["https://www.youtube.com/watch?v=Zezt6EsG9WE"]}: one record, in the language spoken in the video. -
Fields to read:
textfor the transcript,title,channelName,durationSecondsandpublishedAtfor context,segmentsfor timestamps,languageandtrackKindfor which captions they are. -
What to know:
- When you are not sure which language a video has, leave Languages empty: each video's own language is read, and
availableLanguageslists the others. - A record without
textsays why inmissing(no captions, or not in the language asked for) and is not charged; it is never an empty result that looks like a transcript. - Each language is a record of its own, with
requestedLanguageset when you chose languages. - An input the Actor cannot read (no line, no line it can read as a video, channel or playlist, a setting it does not take) ends the run SUCCEEDED with nothing read or charged and an empty dataset: the key-value record RUN_SUMMARY then has
inputError(noQuery, noReadableLine or invalidSetting) andmessage, with no Ref and no times, as nothing ran; otherwiseinputErroris null. Check it before reading an empty dataset as "no transcripts". - Every record carries the input line it came from in
source, so the records of a run with many lines split back by line. A video that two lines name is stored once, under the line that reached it first.
- When you are not sure which language a video has, leave Languages empty: each video's own language is read, and
Tips
- Try it cheap: the prefilled input reads about 10 videos in half a minute; raise the count once the output looks right.
- Each video's own language is the default: choose languages only when you need others; each language returned is one transcript.
- Uploaded captions come first: for each language the channel's own captions are taken before YouTube's automatic ones, and
trackKindsays which you got. - English means any English: en takes any English track (en, en-GB, en-US); a regional form such as pt-BR takes that form first, then the bare language.
- A daily schedule with Published since 1 day reads the videos published yesterday and today, so a video appears in two days' runs: keep one record per
videoIdwhen you join the runs.
FAQ
Is it legal to get YouTube transcripts?
The Actor reads captions that YouTube shows to every visitor of a public video, at a modest pace. YouTube's terms of service govern how its site is used, and how you use the transcripts is your responsibility: check the laws and terms that apply to you and the purpose you use them for.
Does it collect personal data?
The transcripts are what the channels and YouTube published, and they can contain names or other personal data said aloud in a video. The Actor reads no comments and no data about viewers. If you store or process transcripts that name people, you need a lawful basis for it under the GDPR or the laws that apply to you.
Why does a video have no transcript?
The video has no captions, or none in the language you asked for. Its record says which in missing, lists the languages it has in availableLanguages, and is not charged. A private, removed, age-restricted or members-only video, or one not started yet, says so too, with YouTube's reason; a stream live now has no transcript until it ends.
Are automatic captions a translation?
No. The Actor reads the caption tracks a video has: those the channel uploaded and YouTube's automatic ones, including the automatic captions of a video YouTube dubbed into other languages. trackKind says which a record holds. It does not translate captions itself.
Is there an official YouTube transcript API?
YouTube's Data API gives a video's captions only to someone with permission to edit that video; it does not give the captions of other channels' videos. This Actor reads what YouTube shows on a public video's page.
Can it read every video of a large channel?
Yes: set Videos per channel or playlist to 0. A channel's uploads are read newest first, a playlist in its order to its end (measured on 2026-10-27 with channels of up to 170 videos each). If a channel's first 20 videos have no transcript in the languages you asked for, the rest of it is not read, and the log says so.
Something went wrong: what should I check?
Check that each line is a video's link or ID, a channel's link or a playlist's link. The run's last message says how it ended and how many videos could not be read; RUN_SUMMARY says the same, with the Ref. If a run keeps failing, report it with the Ref from its last message.
Limits
- Captions only: the Actor reads captions; it does not transcribe a video's audio. A video without captions has no transcript.
- No translation: only the caption tracks a video has; a language it lacks is said, not translated.
- Channels: a channel's uploaded videos (its Videos tab), not its Shorts or live streams tabs; a Short or a past stream given by its link is read.
- Publish dates come with videos read from a channel or a playlist; a video given by its link or ID has none (
missingsays notRead), and Published since applies to channels and playlists only. A listed video whose date YouTube does not give is kept, its record saying so (missing: publishedAt notGiven): Published since could not be applied to it, and the run's last lines count such videos. - A playlist with Published since and a count: a playlist is not in date order, so its first videos up to the count are read and the older ones among them left out: a playlist can give fewer videos than the count while later ones are in the period. Set the count to 0 for every video in the period.
- Very long videos with subtitle files: a record over about 9 MB (a video of about 10 hours with both files) leaves out its subtitle files and says so; its transcript stays.
Support and feedback
Open an issue on the Actor's Issues tab: we answer within 24 hours. If the Actor helps you, a review and a bookmark help others find it.
YouTube Transcript Scraper is an independent tool, not affiliated with, endorsed by or sponsored by Google LLC. YouTube is a trademark of Google LLC.