YouTube Transcript & Subtitles Scraper
Pricing
$4.00 / 1,000 transcripts
YouTube Transcript & Subtitles Scraper
Get YouTube transcripts and subtitles from video, channel and playlist links: plain text, timestamped segments, SRT and VTT, in the video's own language or the one you pick. Every caption track listed. Charged per transcript; videos without captions are free.
Pricing
$4.00 / 1,000 transcripts
Rating
0.0
(0)
Developer
Vanja V
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Get the transcript of any YouTube video as plain text, timestamped segments, SRT or WebVTT subtitles. Paste video links, channel links, playlist links, or any mix, and get one result row per video with its title, channel, publish date and length.
You pay $0.004 per transcript delivered, and only for videos that returned one. There is no start fee, and proxy and compute costs are included. A video without captions, a private or deleted video, or a video without a track in the language you asked for comes back with the reason in its row and costs nothing.
You need no YouTube API key, no Google account and no cookies.
What you pay for
$0.004 per transcript ($4 per 1,000), whatever the video's length.
| outcome | status | charged |
|---|---|---|
| a transcript was returned | ok | yes, once per video |
| the video has no captions, not even automatic ones | no_captions | no |
| you asked for a language the video has no track in | language_not_available | no |
| private, deleted, members-only, age-restricted or region-blocked | unavailable | no |
| YouTube kept answering with a bot check after several fresh connections | blocked | no |
Every row that is not ok has an error field that says what happened in one plain sentence. The
other videos in the run carry on. If you set a maximum cost per run, the Actor stops when the next
transcript would go over it and says so in the run's status message.
What you get
One dataset row per video:
{"videoId": "Jf75I9LKhvg","url": "https://www.youtube.com/watch?v=Jf75I9LKhvg","title": "How To Cook The Perfect Rice | Gordon Ramsay","channelName": "Gordon Ramsay","channelId": "UCIEv3lZ_tNXHzL3ox-_uUGQ","publishDate": "2013-12-05T08:00:00-08:00","lengthSeconds": 140,"status": "ok","requestedLanguage": "original","language": "en","trackKind": "auto","availableTracks": [{ "language": "en", "name": "English (auto-generated)", "kind": "auto" }],"transcript": "basmati rice the king of all rice is light fluffy delicious …","segments": [{ "start": 0.08, "duration": 2.36, "text": "basmati rice the king of all rice is" }],"srt": "1\n00:00:00,080 --> 00:00:02,440\nbasmati rice the king of all rice is\n\n…","vtt": "WEBVTT\n\n00:00:00.080 --> 00:00:02.440\nbasmati rice the king of all rice is\n\n…","error": null}
transcriptis always filled onokrows.segments,srtandvttare filled when you pick them inoutputFormats, andnullotherwise, so every row has the same fields.trackKindismanualfor captions the uploader provided andautofor YouTube's automatic ones.availableTrackslists every caption track the video has, on every row where YouTube returned the video, so you can see what else you could ask for.publishDateandlengthSecondscome straight from YouTube.
The run opens on a Transcripts table (title, channel, publish date, status, language, track kind, transcript, link, error). The full JSON has everything.
Input
| field | what it does |
|---|---|
videoUrls | Video links (watch, youtu.be, Shorts, live, embed) or bare 11-character IDs. |
channelUrls | Channel links (@handle, /channel/UC…, /c/, /user/). Takes the newest uploads, Shorts and past live streams included. |
playlistUrls | Playlist links or IDs, in playlist order. |
maxVideosPerChannel | How many videos to take from each channel or playlist (default 20). |
language | original (default) or a language code such as en, es, de, ja. |
onlyNewSinceLastRun | For scheduled runs: skip channel and playlist videos an earlier run already returned. |
outputFormats | Any of segments (default), srt, vtt. Plain text is always included. |
Duplicates are removed, so a video that is both in a playlist and in your video links is fetched and charged once.
Languages
With language set to original, each video comes back in its own spoken language: captions the
uploader provided first, then YouTube's automatic ones. Dubbed videos come back in the language of
the original audio. In our test set of 41 captioned videos in 5 languages (English, Spanish, German,
Japanese, Hindi), all 41 came back in the right language.
With a language code, you get that track if the video has one, uploaded or automatic. If it has
none, the row is language_not_available with the tracks it does have in availableTracks, and it
is not charged. The Actor does not machine-translate.
Channels and scheduled runs
Give a channel link and a schedule, turn on onlyNewSinceLastRun, and each run returns only the
videos published since the last one. A run with nothing new returns no rows and costs nothing. The
list of videos already returned is kept in a key-value store named
youtube-transcript-scraper-seen in your own Apify account; delete it to start over.
Speed and reliability
Measured on the platform: 63 videos from links, a channel and a playlist in 80 seconds,
58 of them on the first try and the other 5 on the second. Requests go through residential proxies, which are included in the price. When
YouTube shows a bot check, the Actor retries that video on fresh connections before it gives up
with blocked.
Use it from Make and n8n
The Actor works with the Apify modules in Make and the Apify node in n8n: run it, then read the
dataset. Every field has a fixed type (lengthSeconds is a number, segments an array of
{start, duration, text}), so you can map them directly.
What this cannot do
- Videos without any captions come back as
no_captions. The Actor reads YouTube's caption tracks and does not transcribe audio. - No translation: you get the tracks a video has.
- Private, members-only and age-restricted videos need a signed-in account, so they come back as
unavailable. - No comments, likes or view counts.
Pricing
per transcript (ok row) | $0.004 |
| per 1,000 transcripts | $4.00 |
| start fee | none |
| proxy and compute | included |
rows that are not ok | free |