YouTube Channel & Playlist Transcripts
Pricing
from $2.10 / 1,000 transcripts
YouTube Channel & Playlist Transcripts
Transcripts for every video on a YouTube channel or playlist. Paste @handles, channel or playlist URLs and get transcript, timestamps, date and views per video. At no extra cost: likes, tags, chapters, channel stats, SRT, VTT, LLM text, chapter chunks. Only-new mode. $3 per 1,000, failures free.
Pricing
from $2.10 / 1,000 transcripts
Rating
0.0
(0)
Developer
Gautham Krishna
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 hours ago
Last modified
Share
Get the transcript of every video on a YouTube channel or playlist in one run, for people building an AI knowledge base, a content archive or a research dataset.
Use cases, each with a ready-to-run example:
- Transcribe every video in a playlist
- Get the latest podcast episodes as text
- Turn a course playlist into an LLM dataset
- Archive a channel with publish dates, views and likes
- Get transcripts only for videos from a date range
- Split a channel's transcripts into chunks for RAG
Paste a channel link, an @handle or a playlist link, set how many videos you want, and get one row per video with the full transcript, timestamps, publish date and view count. The output is ready for an LLM, a RAG index, a content audit or a spreadsheet. Turn on likes, comment counts, tags, chapters and channel stats, or SRT, VTT, plain-text, LLM-ready Markdown and RAG chunks split by YouTube chapters, at no extra cost.
You pay $3 per 1,000 transcripts ($0.003 each), and less on Apify Store discount tiers (Bronze, Silver, Gold), down to $2.10 per 1,000 on Gold. Videos without captions, private videos and sources that fail to load are never charged.
At a glance
| Topic | Details |
|---|---|
| Input | Channel links, @handles, channel IDs, playlist links or playlist IDs |
| Output | One JSON row per video: transcript, timestamps, title, view count, exact publish time in UTC, channel and position. Optional: likes, comment count, category, description, tags, thumbnail, chapters, channel stats, and SRT, VTT, plain-text, LLM-ready and RAG chunk formats |
| Price | $0.003 per transcript ($3 per 1,000), or $2.70 per 1,000 on Bronze, $2.40 on Silver and $2.10 on Gold. No start fee. Videos without captions, private videos and sources that fail are free |
| Tested | Final test run on 16 Oct 2026 with every option on: 10 channels and 4 playlists listed 250 videos, and all 245 that had captions returned a transcript with every format, in 188 seconds |
| Limits | Up to 20,000 videos per source, maxVideosPerSource: 0 takes them all. Channels go newest first, Shorts are off by default. No speech-to-text for videos without captions |
What you get per video
| Field | What it holds |
|---|---|
status | ok, no_transcript, unavailable, duplicate or error for videos, plus not_found, no_videos or invalid_input for a source that could not be listed, or that has nothing new or nothing in your date window |
sourceUrl, sourceType, sourceId, sourceTitle | The channel or playlist the video came from, as you typed it and as YouTube names it |
position | Place in the list, 1 being the newest upload on a channel or the first video of a playlist |
videoId, url, title | The video |
publishedAt | Exact publish time in UTC, such as 2026-09-24T22:26:18Z. Empty in the rare case YouTube leaves it out |
publishedText | Publish date as YouTube shows it in the list, such as 1 month ago or Streamed 2 years ago |
viewCount | Exact view count at run time |
channel, channelId, durationSeconds | Video details from the same request, at no extra cost |
language | Language of the returned transcript |
isAutoGenerated | true when the captions came from YouTube's speech recognition |
requestedLanguageFound | false when the video has no captions in your language, so you got the original ones |
transcript | The full transcript as one string |
wordCount | Words in the transcript |
segments | [{ "start": 12.4, "duration": 3.1, "text": "..." }], when timestamps are on |
message | Why a row failed, on rows that are not ok |
Input
{"sources": ["https://www.youtube.com/@NASA","https://www.youtube.com/channel/UCsXVk37bltHxD1rDPwtNM8Q","https://www.youtube.com/c/LinusTechTips","https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab"],"maxVideosPerSource": 50,"includeShorts": false,"language": "en","includeTimestamps": true}
Sources can be:
- channel links in any form, such as
@handle,/channel/UC...,/c/name,/user/name, or a channel tab like/@name/videos; - playlist links with
list=..., including a watch link that carries a playlist; - bare
@handles,UC...channel IDs andPL...playlist IDs.
maxVideosPerSource set to 0 takes every video, up to 20,000 per source.
Channels are read newest first.
With includeShorts off you get regular videos and past live streams.
Turn it on to get every upload, Shorts included.
A video that appears in two of your sources, or twice in one playlist, is fetched and charged once, for the first source in your list.
Each later copy is a free duplicate row whose duplicateOf names that first source.
Video details, channel stats and output formats
All off by default and free. They ride in the same row, so a transcript is still one charge.
includeVideoDetails: true adds:
| Field | What it holds |
|---|---|
likeCount | Exact likes at run time. Empty when YouTube leaves it out, as on 5 of 245 videos in the final test |
commentCount | Exact comment count. Empty when comments are turned off, as on NASA's videos |
category | YouTube category, such as News & Politics |
description | The video description. Emails and phone numbers in it are replaced with [email removed] and [phone removed] |
tags | The uploader's tags |
thumbnailUrl | The largest thumbnail YouTube returns |
chapters | [{ "title", "start", "end", "url" }] from the description's timestamps, by YouTube's rule: the list starts at 0:00 and has at least three rising entries. Each url opens the video at that chapter |
includeChannelStats: true adds the stats of the channel that posted the video, read once per channel:
| Field | What it holds |
|---|---|
channelSubscriberCount | Subscribers, rounded the way YouTube shows them, such as 4,170,000 for "4.17M". Empty when YouTube does not show it, as on 3 VEVO videos in the final test |
channelVideoCount | Public videos |
channelViewCount | Total views |
channelJoinedDate | The day the channel was created, such as 2006-06-17 |
outputFormats takes any of these:
| Value | Adds | What it holds |
|---|---|---|
text | plainText | The captions as paragraphs, one per line, split at pauses of 2 seconds or more and after about 120 words |
llm | llmText | Markdown for an LLM: title, channel, date, URL, duration and caption type on top, a heading per chapter, a [m:ss] stamp per paragraph, and sound cues such as [Music] removed |
srt | srt | The SubRip subtitle file as text |
vtt | vtt | The WebVTT subtitle file as text |
chunks | chunks | RAG chunks: one per YouTube chapter, with long chapters split evenly, or even pieces when the video has no chapters. Each has index, chapter, start, end, wordCount, text and a url that opens the video at that second |
chunkSizeWords sets the chunk size, 300 words by default.
Chunks are cut between caption lines, so one can run a little over.
In the final test the largest of 3,825 chunks held 313 words, and 94 of the 245 videos had chapters.
Date window and only new videos
Three optional inputs, all off by default.
| Option | What it does |
|---|---|
publishedAfter | Only videos published on or after a date: 2026-01-01, 2026-01-01T12:00:00Z (UTC), or a relative value such as 30 days |
publishedBefore | Only videos published before a date, in the same formats. Use both for a window |
onlyNewSinceLastRun | For scheduled runs. Returns only videos it has not returned a transcript for before, from the same source, and nothing older than the newest one it returned last time. Videos that had no captions yet are checked again on the next run |
Each video is judged by its exact publish time.
On channels the listing stops once videos are older than publishedAfter, and maxVideosPerSource then counts only videos inside the window, newest first.
Playlists keep their own order, so the whole playlist is listed and filtered.
A source with nothing in the window, or nothing new, comes back as a free no_videos row.
The only-new memory is a key-value store named youtube-channel-transcripts-monitor in your own Apify account, one record per source.
Delete that store to start over.
Run it on a schedule
A daily or weekly run with onlyNewSinceLastRun: true keeps a transcript archive of the channels you follow up to date.
We ran the same 16 channels and playlists on 15 Oct and again on 20 Oct.
The 20 Oct run returned 15 transcripts, none returned on 15 Oct, and 7 sources with nothing new came back as free no_videos rows.
- Set your input with
onlyNewSinceLastRun: trueand click Save as a new task. - On the task page, click Actions, then Schedule, and pick how often it runs. Apify's schedules guide covers cron times and time zones.
- On the task's Integrations tab, choose where each run's results go.
| Integration | What it does |
|---|---|
| Slack | Posts a message to your channel when a run finishes |
| Google Drive | Saves each run's results as a file in your Drive |
| Webhook | Sends the finished run, with its dataset ID, to your own URL |
| Make, Zapier, n8n | Adds each new row to a Google Sheet, a CRM or a database |
Each video has a stable videoId, so a sheet or database can skip rows it already holds.
How language works
- Human-made captions in your language come first.
- Then YouTube's auto-generated captions in your language.
- If neither exists, you get the captions in the language spoken in the video, and the row shows
requestedLanguageFound: false.
Output example
This is a real row from a test run on @NASA on 15 Oct 2026.
The segments array is cut to its first three entries here.
The real row has 18.
{"sourceUrl": "@NASA","sourceType": "channel","sourceId": "UCLA_DiR1FfKNvjuUpBHmylQ","sourceTitle": "NASA","position": 10,"videoId": "ErAqN6gXqZQ","url": "https://www.youtube.com/watch?v=ErAqN6gXqZQ","status": "ok","title": "NASA's SpaceX Crew-13 Mission (Official NASA Trailer)","publishedAt": "2026-09-30T18:48:20Z","publishedText": "2 weeks ago","viewCount": 102665,"channel": "NASA","channelId": "UCLA_DiR1FfKNvjuUpBHmylQ","durationSeconds": 62,"language": "en","requestedLanguageFound": true,"isAutoGenerated": false,"transcript": "[Luke Delaney] The first things you see a child do when they're crawling is try to understand their environment. Curiosity for everybody is there, and it's natural for us to want to go understand even more beyond Earth. Liftoff! Of the Falcon 9 and Crew Dragon! Go NASA! Go SpaceX! [Jessica Watkins] The International Space Station provides a super unique opportunity to remove gravity from the equation. And in doing so, we are able to explore new possibilities within science. We are able to manufacture in new ways. We're able to explore new technologies that we're not able to do here on Earth. [Delaney] When we find out how cells propagate and microgravity, I think we're going improve the lives of everybody. [Joshua Kutryk] Space is opportunity to solve our biggest problems that we have on Earth.","wordCount": 137,"segments": [{ "start": 1.301, "duration": 1.435, "text": "[Luke Delaney] The first things you see a child" },{ "start": 2.736, "duration": 0.934, "text": "do when they're crawling" },{ "start": 3.67, "duration": 2.069, "text": "is try to understand their environment." }]}
With every option on, a row looks like this one from the final test run on 16 Oct 2026, from @CNBC.
Long strings are cut and marked with ..., segments, plainText, llmText, srt and vtt are left out, and the arrays are cut.
The real row has 14 tags, 3 chapters and 4 chunks.
{"sourceUrl": "https://www.youtube.com/@CNBC","sourceType": "channel","sourceId": "UCvJJ_dzjViJCoLf5uKUTwoA","sourceTitle": "CNBC","position": 18,"videoId": "cq2ZF8nv-ik","url": "https://www.youtube.com/watch?v=cq2ZF8nv-ik","status": "ok","title": "Inside Bracket22, A Trading Firm Powered By Al Agents","publishedAt": "2026-09-13T14:00:31Z","publishedText": "1 month ago","viewCount": 642110,"channel": "CNBC","channelId": "UCvJJ_dzjViJCoLf5uKUTwoA","durationSeconds": 248,"language": "en","requestedLanguageFound": true,"isAutoGenerated": false,"transcript": "Speaker 1: Hey, Houston, show me the charts from the work that Desmond did this weekend. The strateg ...","wordCount": 765,"likeCount": 6570,"commentCount": 498,"category": "News & Politics","description": "Brian Kelly previously ran a cryptocurrency hedge fund, but closed tha ...","tags": ["AI Agents", "Cryptocurrency", "Anthropic"],"thumbnailUrl": "https://i.ytimg.com/vi/cq2ZF8nv-ik/sddefault.jpg","chapters": [{ "title": "Introduction", "start": 0, "end": 32, "url": "https://www.youtube.com/watch?v=cq2ZF8nv-ik&t=0s" },{ "title": "AI Agents", "start": 32, "end": 192, "url": "https://www.youtube.com/watch?v=cq2ZF8nv-ik&t=32s" }],"channelSubscriberCount": 4170000,"channelVideoCount": 16195,"channelViewCount": 2079646777,"channelJoinedDate": "2006-06-17","chunks": [{"index": 0,"chapter": "Introduction","start": 0,"end": 26.52,"wordCount": 93,"text": "Speaker 1: Hey, Houston, show me the charts from the work that Desmond did this weekend. T ...","url": "https://www.youtube.com/watch?v=cq2ZF8nv-ik&t=0s"}]}
A source that cannot be listed comes back as a single free row.
{"sourceUrl": "https://www.youtube.com/@thisHandleDoesNotExist_zq81x","status": "not_found","message": "YouTube says this channel or playlist does not exist"}
Measured results
In our final test, 10 channels and 4 playlists listed 250 videos.
All 245 videos that had captions came back with a transcript.
The other 5 were music videos with no captions at all, returned as free no_transcript rows.
With every option on, the run took 188 seconds, and every transcript row carried every format, a description and channel stats.
Use it from AI agents
The scraper works as a tool through the Apify MCP server in Claude, Cursor, VS Code and other MCP clients. An agent can pass a channel handle and get back plain text it can summarise, search or index. Each call charges only for the transcripts it returns.
You can also call it through the Apify API or the Python and JavaScript clients, and schedule it or connect it to Make, Zapier and n8n.
Pricing
Prices are per 1,000 transcripts.
| Event | No discount | Bronze | Silver | Gold |
|---|---|---|---|---|
| Transcript returned | $3 | $2.70 | $2.40 | $2.10 |
| Video without captions, private, members-only or failed fetch | Free | Free | Free | Free |
| Channel or playlist that does not exist or has no public videos | Free | Free | Free | Free |
| Video details, channel stats and output formats | Free | Free | Free | Free |
Bronze, Silver and Gold are Apify Store discount tiers, and Apify's Pricing tab shows them as Starter, Scale and Business. Apify decides which tier an account is on.
A channel with 500 captioned videos costs $1.50, or $1.05 on Gold. Set a maximum cost per run in the run options. The scraper stops once that limit is reached.
More from heyitsgautham
Other actors from the same account.
- YouTube Transcript & Subtitles Scraper for specific video URLs or IDs, or a YouTube search, when you do not need a whole channel.
- YouTube Video & Shorts Comments Scraper with Replies for the comments and replies on a video or Short, for sentiment analysis and audience research.
- YouTube Search Results & Rank Tracker Scraper for YouTube search results with rank, and channel discovery within a subscriber range.
- YouTube & TikTok Transcripts MCP Server for AI Agents for giving an AI agent YouTube and TikTok transcripts, YouTube search and comments as MCP tools, with nothing to host.
- TikTok Video Transcript & Subtitles Scraper for the spoken words of public TikTok videos, with an optional speech-to-text fallback for videos without captions.
FAQ
Why does a video show no_transcript?
The uploader turned captions off and YouTube made no auto-generated ones.
Music videos often have none.
That row isn't charged.
Where does the exact date come from?
Channel and playlist pages only show a relative date such as "3 weeks ago", which stays in publishedText.
For publishedAt the scraper asks YouTube's player for each video's publish time, a request of about 120 bytes that is included in the price.
Can I scrape a Mix or a radio playlist?
No.
Mixes (list=RD...) are built per viewer and have no fixed list of videos.
Does it use the official YouTube API? No. It reads the same public data the YouTube website and app show, without logging in. Only use transcripts in ways that respect the rights of the video owners.
What about videos with no captions at all?
They come back as free no_transcript rows.
Speech-to-text for those is not included.
Limitations
- Private, members-only, age-restricted and upcoming videos come back as free
unavailablerows. - With Shorts off, regular videos and past live streams are merged by their relative date, so videos posted in the same week may swap places.
- Playlists keep the playlist's own order. YouTube leaves hidden and deleted videos out of the list.
- The cap is 20,000 videos per source.