YouTube Transcript Scraper: Channels, SRT & VTT
Pricing
from $8.00 / 1,000 transcripts
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
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.maxVideosPerSourcesets how many of the newest videos are taken from each;channelContentchooses 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.includeTimestampsputs a time at the start of every text line;wordTimestampsadds 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:
| Field | What it holds |
|---|---|
status | ok, no-captions, language-unavailable, unavailable, private, age-restricted, members-only, region-blocked, live, upcoming, blocked, invalid-input |
error | why there is no transcript, in plain words |
text | the transcript as one text (or one line per caption with includeTimestamps) |
segments | [{ "start": 7.47, "duration": 2.899, "text": "..." }], seconds |
srt, vtt | subtitle files as text, when asked for |
language, languageName, isAutoGenerated | which captions were returned |
isTranslated, translatedFrom, translationError | auto-translation, when asked for |
audioLanguage | the language spoken in the video, as YouTube's speech recognition sees it |
isFromDubbedAudio | the captions belong to one of YouTube's AI-dubbed audio tracks, not the original voice |
availableLanguages | every caption track the video has |
wordCount | words in the transcript (Chinese and Japanese characters count one each) |
charged | true 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_TOKENwith 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 ApifyClientclient = 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.
| Event | Price |
|---|---|
| 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
languagesif 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.