YouTube Channel & Playlist Transcripts avatar

YouTube Channel & Playlist Transcripts

Pricing

from $2.10 / 1,000 transcripts

Go to Apify Store
YouTube Channel & Playlist 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

Gautham Krishna

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Categories

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:

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

TopicDetails
InputChannel links, @handles, channel IDs, playlist links or playlist IDs
OutputOne 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
TestedFinal 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
LimitsUp 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

FieldWhat it holds
statusok, 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, sourceTitleThe channel or playlist the video came from, as you typed it and as YouTube names it
positionPlace in the list, 1 being the newest upload on a channel or the first video of a playlist
videoId, url, titleThe video
publishedAtExact publish time in UTC, such as 2026-09-24T22:26:18Z. Empty in the rare case YouTube leaves it out
publishedTextPublish date as YouTube shows it in the list, such as 1 month ago or Streamed 2 years ago
viewCountExact view count at run time
channel, channelId, durationSecondsVideo details from the same request, at no extra cost
languageLanguage of the returned transcript
isAutoGeneratedtrue when the captions came from YouTube's speech recognition
requestedLanguageFoundfalse when the video has no captions in your language, so you got the original ones
transcriptThe full transcript as one string
wordCountWords in the transcript
segments[{ "start": 12.4, "duration": 3.1, "text": "..." }], when timestamps are on
messageWhy 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 and PL... 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:

FieldWhat it holds
likeCountExact likes at run time. Empty when YouTube leaves it out, as on 5 of 245 videos in the final test
commentCountExact comment count. Empty when comments are turned off, as on NASA's videos
categoryYouTube category, such as News & Politics
descriptionThe video description. Emails and phone numbers in it are replaced with [email removed] and [phone removed]
tagsThe uploader's tags
thumbnailUrlThe 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:

FieldWhat it holds
channelSubscriberCountSubscribers, 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
channelVideoCountPublic videos
channelViewCountTotal views
channelJoinedDateThe day the channel was created, such as 2006-06-17

outputFormats takes any of these:

ValueAddsWhat it holds
textplainTextThe captions as paragraphs, one per line, split at pauses of 2 seconds or more and after about 120 words
llmllmTextMarkdown 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
srtsrtThe SubRip subtitle file as text
vttvttThe WebVTT subtitle file as text
chunkschunksRAG 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.

OptionWhat it does
publishedAfterOnly videos published on or after a date: 2026-01-01, 2026-01-01T12:00:00Z (UTC), or a relative value such as 30 days
publishedBeforeOnly videos published before a date, in the same formats. Use both for a window
onlyNewSinceLastRunFor 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.

  1. Set your input with onlyNewSinceLastRun: true and click Save as a new task.
  2. On the task page, click Actions, then Schedule, and pick how often it runs. Apify's schedules guide covers cron times and time zones.
  3. On the task's Integrations tab, choose where each run's results go.
IntegrationWhat it does
SlackPosts a message to your channel when a run finishes
Google DriveSaves each run's results as a file in your Drive
WebhookSends the finished run, with its dataset ID, to your own URL
Make, Zapier, n8nAdds 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

  1. Human-made captions in your language come first.
  2. Then YouTube's auto-generated captions in your language.
  3. 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.

EventNo discountBronzeSilverGold
Transcript returned$3$2.70$2.40$2.10
Video without captions, private, members-only or failed fetchFreeFreeFreeFree
Channel or playlist that does not exist or has no public videosFreeFreeFreeFree
Video details, channel stats and output formatsFreeFreeFreeFree

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.

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 unavailable rows.
  • 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.