YouTube Transcript Scraper: Channels & Playlists
Pricing
from $2.80 / 1,000 transcripts
YouTube Transcript Scraper: Channels & Playlists
Get transcripts of YouTube videos, Shorts, playlists, whole channels and search results as plain text, timed segments, SRT or WebVTT, with title, channel, views and publish date. Pick languages, or translate transcripts into one language (beta). Videos without captions are never charged.
Pricing
from $2.80 / 1,000 transcripts
Rating
0.0
(0)
Developer
Cairnware
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
19 days ago
Last modified
Categories
Share
YouTube Transcript Scraper
Get the transcript (captions / subtitles) of any YouTube video, Short, playlist, whole channel or search results page as clean plain text, timestamped segments or SRT / WebVTT subtitle files, in the original language or translated into any language YouTube supports, together with the video's title, channel, duration, views, likes and publish date. One row per video, ready for JSON, CSV, Excel, Google Sheets, the Apify API or your LLM pipeline.
Built for runs you do not have to babysit:
- Whole playlists and channels. Paste a playlist link or a channel link (
@handle,/channel/UC...) and every video in it is transcribed (channels: newest uploads first, up to the limit you set). Listing the videos is free. - You only pay for transcripts delivered. Videos without captions, unavailable or private videos, invalid links and failures are returned as free rows with a clear reason. No start fee.
- Every input is accounted for. Each link you enter appears in the output with
statusok,no_transcriptorerror. The run ends with a summary such as "48 of 50 videos have a transcript; 2 have no captions in the requested languages (not charged)". - Smart retries. When YouTube blocks or rate-limits a request, it is retried with exponential backoff on a fresh residential IP, switching between YouTube's app clients.
- Translate transcripts (beta). Set Translate to (e.g.
en) and every transcript arrives in that language: videos that have real captions in it use them, the others get YouTube's own machine translation of their captions, at the same price.translatedFromtells you which language it came from. - Language control. Give your preferred languages in order; human-made captions are preferred over auto-generated ones, and you can fall back to the video's original language.
- Respects your budget. The Actor stops when your maximum cost per run is reached and lists the remaining videos as free, unscraped rows.
What data you get
| Field | What it contains |
|---|---|
text | The full transcript as one plain-text string (HTML entities decoded, line breaks joined). |
segments | Every caption line with start and duration in seconds (on by default). |
srt, vtt | The transcript as an SRT or WebVTT subtitle file (both off by default). |
chapters | With Split by chapters: the video's chapters (the uploader's, else YouTube's automatic ones) as title, start, end and their part of the transcript text. Off by default. |
language, languageName, isAutoGenerated | Which caption track you got, e.g. en, "English (auto-generated)", true. |
translatedFrom | With Translate to: the language YouTube translated from, e.g. ko; null when the video already had captions in your target language. |
availableLanguages | Every caption track the video has, so you can re-run in another language. |
source | For videos found in a playlist or channel: that playlist or channel link from your input. |
title, channelName, channelId, channelUrl, durationSeconds, viewCount, isLiveContent | Always included. |
publishDate, likeCount, category, description, keywords, thumbnailUrl | With Full video details (on by default). |
wordCount, segmentCount, warnings, errorMessage, scrapedAt | Run bookkeeping. |
Use cases
- AI and LLM workflows: feed transcripts into summarisation, RAG, Q&A or content repurposing pipelines; split by chapters for clean, topic-sized chunks.
- Content research and SEO: see what top videos in your niche actually say; turn videos into blog posts, show notes or quotes.
- Market and brand research: analyse product reviews, interviews and talks at scale.
- Subtitles and translation: download SRT or WebVTT files, or translated transcripts, to study foreign-language channels or localise content.
- Education and accessibility: create study notes and searchable text from lectures.
How to use
- Paste one or more YouTube video, Shorts, playlist, channel or search results links (or video IDs), one per line.
- Optionally set your preferred languages (default
en), or a language to translate to. - Click Start. Download the results as JSON, CSV, Excel or HTML, or read them through the Apify API.
All common link formats work: youtube.com/watch?v=..., youtu.be/..., /shorts/..., /embed/..., /live/..., m.youtube.com, music.youtube.com, and extra parameters like &t=30s or &list=... are ignored. Playlists: youtube.com/playlist?list=... or a bare playlist ID (PL...). Channels: youtube.com/@handle, /channel/UC..., /c/name, /user/name, a bare @handle or channel ID. A channel link gives all its public uploads (videos, Shorts and live replays), newest first; a tab link gives only that tab: /@handle/videos (regular videos), /@handle/shorts (Shorts) or /@handle/streams (live replays). A watch link that also has &list= is treated as that one video. Search: paste a search results link (youtube.com/results?search_query=...) to get the transcripts of the top video results for that search, in YouTube's order (videos only: Shorts and "People also watched" shelves are skipped).
Input example
{"videos": ["https://www.youtube.com/watch?v=jNQXAC9IVRw","https://youtu.be/dQw4w9WgXcQ","https://www.youtube.com/shorts/VIDEO_ID","https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab","https://www.youtube.com/@3blue1brown"],"maxVideosPerSource": 100,"languages": ["en", "es"],"fallbackToAnyLanguage": true,"includeAutoGenerated": true,"includeTimestamps": true,"translateTo": "","includeSrt": false,"includeVtt": false,"includeChapters": false,"includeMetadata": true,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
| Field | Notes |
|---|---|
videos | Required unless you give searchQueries. Videos, playlists and channels, up to 10,000 videos per run after playlists and channels are expanded. Duplicates are removed (a video listed directly and also found in a playlist appears once). |
searchQueries | Optional search terms, one per entry (e.g. "sourdough starter for beginners"): each one's top video results are transcribed, like a pasted search results link. |
maxVideosPerSource | At most this many videos from each playlist or channel (default 100; channels: the newest). |
languages | Language codes in order of preference (en, es, pt-BR, zh-Hans...). en matches every English variant; pt-BR prefers Brazilian Portuguese, then other Portuguese. Empty = each video's original language. |
fallbackToAnyLanguage | If none of your languages exists, return the original-language transcript (with a warning). Off = no_transcript row, not charged. |
includeAutoGenerated | Use YouTube's automatic captions when the uploader added none (most videos only have these). |
includeTimestamps | Add the segments array. |
translateTo | Optional language code (en, es, de, pt-BR...). Every transcript is delivered in this language: a video's own captions in it if it has them, else YouTube's machine translation of the track chosen by languages (or the original language). Videos YouTube can't translate come back as no_transcript (free). |
includeSrt | Add the srt field. |
includeVtt | Add the vtt field (WebVTT, for HTML5 players). |
includeChapters | Add the chapters field (one extra request per video; videos without chapters get []). |
includeMetadata | Add publish date, likes, category, description, tags and thumbnail. |
maxRetries | Retries per request before a video is marked error (default 6). |
maxConcurrency | Videos processed in parallel (default 5). |
Output example
Real output for "Me at the zoo", collected on 2026-10-03 (description and segments shortened):
{"input": "jNQXAC9IVRw","source": null,"videoId": "jNQXAC9IVRw","url": "https://www.youtube.com/watch?v=jNQXAC9IVRw","status": "ok","errorMessage": null,"title": "Me at the zoo","channelName": "jawed","channelId": "UC4QobU6STFB0P71PMvOGN5A","channelUrl": "https://www.youtube.com/channel/UC4QobU6STFB0P71PMvOGN5A","durationSeconds": 19,"viewCount": 439481354,"likeCount": 19982756,"publishDate": "2005-04-23T20:31:52-07:00","category": "Film & Animation","description": "...","keywords": ["me at the zoo", "jawed karim", "first youtube video"],"thumbnailUrl": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg","isLiveContent": false,"language": "en","languageName": "English","isAutoGenerated": false,"availableLanguages": [{ "languageCode": "en", "languageName": "English", "isAutoGenerated": false },{ "languageCode": "de", "languageName": "German", "isAutoGenerated": false }],"text": "All right, so here we are, in front of the elephants the cool thing about these guys is that they have really... really really long trunks and that's cool (baaaaaaaaaaahhh!!) and that's pretty much all there is to say","wordCount": 39,"segmentCount": 6,"segments": [{ "start": 1.2, "duration": 2.16, "text": "All right, so here we are, in front of the elephants" },{ "start": 5.318, "duration": 2.656, "text": "the cool thing about these guys is that they have really..." },{ "start": 7.974, "duration": 4.642, "text": "really really long trunks" }],"srt": null,"vtt": null,"translatedFrom": null,"chapters": null,"warnings": [],"scrapedAt": "2026-10-03T10:25:02Z"}
A video that has no captions in your languages (with fallback off) looks like this and is not charged:
{"videoId": "9bZkp7q19f0","status": "no_transcript","errorMessage": "No captions in en. Available: ko (auto). Turn on \"Fall back to the original language\" or add one of these languages.","title": "PSY - GANGNAM STYLE(강남스타일) M/V","availableLanguages": [{ "languageCode": "ko", "languageName": "Korean (auto-generated)", "isAutoGenerated": true }],"text": null}
The dataset has two views: Overview (one row per video) and Timestamped lines (one row per caption line, handy for spreadsheets).
Pricing
$4 per 1,000 transcripts ($0.004 per video). No start fee. You only pay for transcripts delivered.
- Charged once per row with
status: "ok". no_transcriptanderrorrows (no captions, unavailable, private, members-only, invalid link, failed after retries, skipped by your cost limit) are free.- Residential proxy traffic and the metadata lookup are included in the price.
- Set a maximum cost per run in the run options; the Actor never goes over it.
Example: 500 videos a month ≈ $2.
FAQ
Why do some videos return no_transcript?
The video has no caption track that matches your settings: the uploader added none and YouTube did not create automatic captions (common for music without speech, very short or very new videos), or captions exist only in other languages. availableLanguages lists what the video has. You are not charged.
What is the difference between auto-generated and human-made captions?
Human-made captions were uploaded by the creator and are usually accurate and punctuated. Auto-generated captions come from YouTube's speech recognition: they cover most videos but have no punctuation and some recognition errors. isAutoGenerated tells you which one you got.
Can I get a translation into another language?
Yes: set Translate to to a language code. If the video has captions in that language you get those (translatedFrom is null); otherwise you get YouTube's own machine translation of the caption track picked by your preferred languages, or of the original language (translatedFrom says which, e.g. ko). It is the same translation YouTube's player shows under Subtitles > Auto-translate: good for reading and search, not publication-grade. It is a beta: YouTube throttles translation requests per video, much more than normal captions. The Actor retries each one on fresh residential IPs, but in our tests (October 2026) only about half of the videos that needed a translation got one in a run; the others are free error rows that you can run again later. Videos with real captions in your target language are not affected. availableLanguages always lists the tracks that really exist.
In what order are the rows?
In the order videos finish, which can differ from your input order when videos run in parallel. Each row has the input you gave and the videoId, so you can sort or join on them.
Why is a residential proxy the default? YouTube blocks many datacenter IP ranges ("Sign in to confirm you're not a bot"). Residential IPs, with a new IP on every retry, keep the failure rate low. You can choose another proxy in Proxy configuration, but expect more retries and errors.
How do I get every transcript of a channel?
Paste the channel link (https://www.youtube.com/@handle) and set Max videos per playlist, channel or search to at least the channel's number of uploads. Use /@handle/videos to skip Shorts and live replays, or /@handle/shorts for Shorts only. Listing the videos is free; each delivered transcript is charged as usual, and your maximum cost per run stops the run cleanly. Every row from a channel has the channel link in source.
Can I schedule it or call it from code? Yes. Use Apify Schedules for recurring runs, and the API tab of this Actor for ready-made examples in Python, JavaScript and cURL. Integrations exist for Google Sheets, Make, n8n, Zapier and webhooks.
Limitations
- Search results are YouTube's own ranking for the request (videos only), which can differ slightly from what you see signed in. Private and "Mix" (RD...) playlists cannot be read.
- Age-restricted, private and members-only videos cannot be read without signing in, so they return
error(free). The Actor never signs in to YouTube. - Live streams return captions only after the stream has ended and YouTube has processed them.
- Translations (beta) are YouTube's machine translation, not human-quality, and YouTube throttles them: expect about half to need a rerun (see FAQ).
- The Actor uses the same public endpoints as YouTube's apps. If YouTube changes them, results may break until the Actor is updated. Please report it and we will fix it.
- It does not download video or audio and does not collect comments or personal data. Transcripts are the creators' content: you are responsible for using them in line with YouTube's terms, copyright and the laws that apply to you.
Support
Questions, bugs or feature requests: open an issue on the Issues tab or email hello@cairnware.com. Please include the run ID if something went wrong. Support replies may be AI-assisted.
Made by Cairnware, small tools that keep working.