YouTube Transcript Scraper: Channels, SRT & VTT avatar

YouTube Transcript Scraper: Channels, SRT & VTT

Pricing

from $8.00 / 1,000 transcripts

Go to Apify Store
YouTube Transcript Scraper: Channels, SRT & VTT

YouTube Transcript Scraper: Channels, SRT & VTT

Get YouTube transcripts, subtitles and captions as text, timed segments, SRT or VTT, with video details, from videos, Shorts, live replays, playlists and whole channels. Manual and auto-generated captions in any language, optional auto-translation. Pay only for transcripts delivered.

Pricing

from $8.00 / 1,000 transcripts

Rating

0.0

(0)

Developer

Zaiq

Zaiq

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

Get the transcript, subtitles and captions of any public YouTube video as plain text, timed segments, SRT or WebVTT, together with the video's details: title, channel, duration, publish date, views. Paste video links, Shorts, live replays, whole playlists or channels. Manual and auto-generated captions in any language, with optional auto-translation. You pay only for transcripts delivered.

What it does

For each video it returns one row with:

  • The transcript as continuous text (optionally with a timestamp on every line), as timed segments (start and duration in seconds), and as SRT or WebVTT subtitle files if you ask for them.
  • Which captions it is: language, manual (uploaded by the channel) or auto-generated, and whether it was translated.
  • Every caption language the video has, manual and auto-generated, so you can see what else is available.
  • Video details: title, channel name, ID and link, duration, publish and upload dates, views, likes, category, description, tags, thumbnail, and whether it is a Short, a live stream or a live replay.
  • A clear status when there is no transcript: no captions, private, removed, age-restricted, live now, and so on. Those rows cost nothing.

Channels and playlists are listed newest first, up to the number of videos you choose per channel or playlist.

Who uses it

  • AI and RAG pipelines: feed lectures, talks, podcasts and tutorials to a language model, a search index or a vector database.
  • Content repurposing: turn videos into articles, newsletters, show notes, quotes and social posts.
  • Research and monitoring: study what channels say over time, across languages.
  • SEO and accessibility: subtitles as SRT or VTT, and the spoken words of videos you embed on your pages.

Example

A short NASA explainer, fetched on 4 October 2026 (row trimmed: the full text, all segments and the full SRT are in the real output):

{
"videoId": "MDMM9MZNcco",
"url": "https://www.youtube.com/watch?v=MDMM9MZNcco",
"status": "ok",
"title": "How Do We Communicate With Spacecraft? We Asked a NASA Expert",
"channelName": "NASA",
"channelId": "UCLA_DiR1FfKNvjuUpBHmylQ",
"durationSeconds": 119,
"publishDate": "2023-02-08T19:50:42Z",
"viewCount": 58556,
"language": "en",
"languageName": "English",
"isAutoGenerated": false,
"audioLanguage": "en",
"availableLanguages": [
{ "code": "en", "name": "English", "isAutoGenerated": false, "isTranslatable": true },
{ "code": "en", "name": "English", "isAutoGenerated": true, "isTranslatable": true }
],
"text": "How do we communicate with spacecraft? NASA. We Asked a NASA Technologist. We communicate with spacecraft in a lot of different ways. We have a network of antennas all over the world across all seven continents, along with satellites in space that help transmit these radio waves. ...",
"segments": [
{ "start": 2.402, "duration": 2.002, "text": "How do we communicate with spacecraft?" },
{ "start": 4.938, "duration": 2.502, "text": "NASA." },
{ "start": 7.44, "duration": 1.569, "text": "We Asked a NASA Technologist." }
],
"srt": "1\n00:00:02,402 --> 00:00:04,404\nHow do we communicate with spacecraft?\n\n2\n00:00:04,938 --> 00:00:07,440\nNASA.\n...",
"wordCount": 303,
"charged": true,
"fetchedAt": "2026-10-04T14:19:42Z"
}

In our tests on 4 October 2026, through residential connections, 356 of 356 recent videos with captions from 16 public channels (science, technology, universities, news) returned a transcript: 200 videos with 10 at a time and 160 with 30 at a time, about 1.6 seconds per video (median). The videos without captions came back as no-captions.

Input

{
"videos": [
"https://www.youtube.com/watch?v=MDMM9MZNcco",
"https://youtu.be/arj7oStGLkU",
"https://www.youtube.com/shorts/VV_JW4iCni0"
],
"channelsOrPlaylists": ["https://www.youtube.com/@NASA"],
"maxVideosPerSource": 20,
"languages": ["en"],
"outputFormats": ["text", "segments", "srt"]
}
  • videos: links or 11-character video IDs. Watch, youtu.be, Shorts, embed, live and mobile links all work.
  • channelsOrPlaylists: channel links (@handle, /channel/..., /c/..., /user/...) or playlist links. maxVideosPerSource sets how many of the newest videos are taken from each; channelContent chooses Videos (default), Shorts, Live stream replays or All uploads. A channel link ending in /shorts or /streams does the same.
  • languages: language codes in order of preference. Leave empty for the language spoken in the video. fallbackToAnyLanguage (on by default) returns the video's own language when none of yours is available.
  • captionType: manual first (default), auto-generated first, manual only or auto-generated only.
  • translateTo: a language code. If the video has captions in that language they are used; otherwise YouTube's own auto-translation is requested.
  • outputFormats: text, segments, srt, vtt. includeTimestamps puts a time at the start of every text line; wordTimestamps adds each word's start time to the segments of auto-generated captions.
  • includeMetadata: likes, category, full description, tags, thumbnail and channel link (title, channel, duration, publish date and views are always included).
  • proxyConfiguration: residential by default (see FAQ).

Output

One row per video. The fields you will use most:

FieldWhat it holds
statusok, no-captions, language-unavailable, unavailable, private, age-restricted, members-only, region-blocked, live, upcoming, blocked, invalid-input
errorwhy there is no transcript, in plain words
textthe transcript as one text (or one line per caption with includeTimestamps)
segments[{ "start": 7.47, "duration": 2.899, "text": "..." }], seconds
srt, vttsubtitle files as text, when asked for
language, languageName, isAutoGeneratedwhich captions were returned
isTranslated, translatedFrom, translationErrorauto-translation, when asked for
audioLanguagethe language spoken in the video, as YouTube's speech recognition sees it
isFromDubbedAudiothe captions belong to one of YouTube's AI-dubbed audio tracks, not the original voice
availableLanguagesevery caption track the video has
wordCountwords in the transcript (Chinese and Japanese characters count one each)
chargedtrue only for rows you paid for

Very long videos: if a row would pass Apify's 9 MB item limit, its SRT, VTT (and if needed segments and text) are stored in the run's key-value store and linked from the row as srtUrl, vttUrl, segmentsUrl or textUrl. In our tests a 10.5-hour video with all formats needed this; a 5-hour one did not. The key-value store record SUMMARY has the run's counts by status.

Use it from code, automations and AI agents

  • API: run it and get the results in one call: POST https://api.apify.com/v2/acts/zaiq~youtube-transcript-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN with the input as JSON. The API tab on this page has ready-made Python, JavaScript and cURL examples.
  • Python (pip install apify-client):
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("zaiq/youtube-transcript-scraper").call(run_input={'videos': ['https://www.youtube.com/watch?v=UF8uR6Z6KLc', 'https://youtu.be/arj7oStGLkU'], 'languages': ['en'], 'outputFormats': ['text', 'segments']})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)
  • No code: connect it to Google Sheets, Zapier, Make or n8n from the Integrations tab, schedule runs in Apify Console, and get a webhook when a run finishes.
  • AI agents (MCP): add it as a tool to Claude, Cursor or any MCP client through Apify's MCP server: https://mcp.apify.com?tools=zaiq/youtube-transcript-scraper.

Pricing

You pay only for transcripts delivered. Apify's platform usage is included.

EventPrice
Transcript delivered$0.01 ($10 per 1,000 videos)
Translated transcript delivered (YouTube auto-translation into your translateTo language)$0.02

Plus Apify's standard run start fee of $0.00005.

Free: videos without captions, captions not in your languages (with fallback off), private, removed, unavailable, age-restricted, members-only and region-blocked videos, live streams still in progress, videos YouTube blocked on every try, invalid links, and every retry. A row is charged only when its charged field is true. If an auto-translation fails, you get the original transcript at the normal price and translationError says why. Your spending limit for the run is respected: the run stops cleanly when it is reached.

Limits

  • Only captions that exist on YouTube are returned; the Actor does not transcribe audio itself. Most videos with speech have YouTube's auto-generated captions; music-only videos and some short clips have none.
  • Age-restricted, private and members-only videos need a signed-in account, which this Actor never uses. They come back with their status, free.
  • YouTube rate-limits auto-translation heavily (in our tests about one request in eight succeeded), so translations are retried from fresh connections and take 10 to 35 seconds each. Some can still fail; those rows keep the original transcript.
  • For "the video's own language", the language comes from YouTube's speech recognition. For music-only videos it is sometimes wrong; set languages if you know what you need.
  • YouTube shows visitors who are not signed in at most the latest 40 Shorts of a channel.
  • YouTube changes its systems often. The Actor tries several of YouTube's own app interfaces in turn, so one change rarely stops it, but a large change can need an update.
  • Use it for videos you are allowed to process, and follow YouTube's terms and the rights of the video owners.

FAQ

Do I need a YouTube account, API key or cookies? No. The Actor reads only what YouTube shows any visitor who is not signed in.

Why residential proxies? YouTube answers data-centre addresses with "Sign in to confirm you're not a bot" far more often. Every blocked try is retried from a new address and costs you nothing; if all tries are blocked, the row says blocked and is free.

Manual or auto-generated captions? By default manual captions (uploaded by the channel) are preferred, then YouTube's auto-generated ones. isAutoGenerated tells you which you got; captionType lets you insist on one kind.

Can I get every language a video has? availableLanguages lists them. Run the Actor again with other languages to fetch them.

How fast is it? In our tests a typical video took 1 to 3 seconds and 30 videos ran at once; 160 videos finished in under half a minute.