YouTube Transcript Scraper - Captions & Subtitles avatar

YouTube Transcript Scraper - Captions & Subtitles

Pricing

from $3.00 / 1,000 transcripts

Go to Apify Store
YouTube Transcript Scraper - Captions & Subtitles

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

Kaleidoscope Labs

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

7 hours ago

Last modified

Categories

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 wantUseWhat it costs
A video's transcript as textIts link or ID$0.003
A channel's or playlist's talks as a datasetThe channel's or playlist's link, a count, a date$3.00 per 1,000 transcripts
Only the videos published since yesterdayPublished since: 1 day, on a daily schedule$0.003 per new video with captions
Subtitles in several languagesLanguages, or Every language a video has, and Subtitle files$0.003 per video and language
To know which languages a video hasAny input: every record lists themFree when the video has none in your language

What data do you get from a YouTube video?

FieldWhat it holds
videoId, url, title, descriptionThe video's ID, page, title and description
channelName, channelId, channelUrlThe channel that published it
durationSeconds, viewCount, isLiveIts length, its views when read, and whether it is a stream live now
publishedAt, categoryIts publish date with its time zone, and YouTube's category: for videos read from a channel or a playlist
language, languageName, trackKindThe transcript's language, its name as YouTube gives it, and whether the captions are uploaded (written by the channel) or automatic (YouTube's)
requestedLanguageThe language you asked for this record, when you chose languages
segmentsThe caption lines in order, each with start and duration in seconds and its text
textThe whole transcript: the lines joined by spaces
srt, vttThe transcript as an SRT or WebVTT file, when you ask for one
availableLanguagesEvery caption track the video has: its code, name and kind
availableLanguageNamesThe same tracks' names as one text, joined by commas, for a spreadsheet
unavailableReasonYouTube's own reason, for a video it does not play
source, sourceTypeThe line of your input that led to the video, and whether it was a video, a channel or a playlist
positionA 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
missingWhat 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

  1. Create a free Apify account and open YouTube Transcript Scraper in Apify Console.
  2. 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.
  3. 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.
  4. For channels and playlists, set Videos per channel or playlist and, if you want, Published since.
  5. 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:

EventPriceWhen
Transcript$3.00 per 1,000each 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 storedCost
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 seeWhy, and what to do
A record with no textThe 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 channelVideos per channel or playlist (50 by default) and Published since bound it; set 0 for every video
trackKind is automaticThe 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:

1
00:00:02,139 --> 00:00:05,338
Stellen 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.

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 missing naming 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.
missingMeaning
transcript: noCaptionsthe video has no captions
transcript: languageNotAvailablenot in the language asked for; availableLanguages lists what it has
transcript: notGiventhe captions could not be read
transcript: livea stream live now
video and transcript: unavailable, private, ageRestricted, membersOnly, upcoming, unplayableYouTube does not play the video; unavailableReason gives its reason
publishedAt: notReada video given by its link or ID: no publish date is read
publishedAt: notGivena listed video YouTube gave no date for; Published since was not applied to it
srt or vtt: tooLargea 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: text for the transcript, title, channelName, durationSeconds and publishedAt for context, segments for timestamps, language and trackKind for 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 availableLanguages lists the others.
    • A record without text says why in missing (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 requestedLanguage set 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) and message, with no Ref and no times, as nothing ran; otherwise inputError is 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.

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 trackKind says 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 videoId when you join the runs.

FAQ

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 (missing says 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.