YouTube Transcript & Subtitles Scraper avatar

YouTube Transcript & Subtitles Scraper

Pricing

$4.00 / 1,000 transcripts

Go to Apify Store
YouTube Transcript & Subtitles Scraper

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

Vanja V

Maintained by Community

Actor 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.

outcomestatuscharged
a transcript was returnedokyes, once per video
the video has no captions, not even automatic onesno_captionsno
you asked for a language the video has no track inlanguage_not_availableno
private, deleted, members-only, age-restricted or region-blockedunavailableno
YouTube kept answering with a bot check after several fresh connectionsblockedno

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
}
  • transcript is always filled on ok rows. segments, srt and vtt are filled when you pick them in outputFormats, and null otherwise, so every row has the same fields.
  • trackKind is manual for captions the uploader provided and auto for YouTube's automatic ones.
  • availableTracks lists every caption track the video has, on every row where YouTube returned the video, so you can see what else you could ask for.
  • publishDate and lengthSeconds come 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

fieldwhat it does
videoUrlsVideo links (watch, youtu.be, Shorts, live, embed) or bare 11-character IDs.
channelUrlsChannel links (@handle, /channel/UC…, /c/, /user/). Takes the newest uploads, Shorts and past live streams included.
playlistUrlsPlaylist links or IDs, in playlist order.
maxVideosPerChannelHow many videos to take from each channel or playlist (default 20).
languageoriginal (default) or a language code such as en, es, de, ja.
onlyNewSinceLastRunFor scheduled runs: skip channel and playlist videos an earlier run already returned.
outputFormatsAny 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 feenone
proxy and computeincluded
rows that are not okfree