YouTube Transcript Scraper — Videos, Channels & Playlists avatar

YouTube Transcript Scraper — Videos, Channels & Playlists

Pricing

Pay per event

Go to Apify Store
YouTube Transcript Scraper — Videos, Channels & Playlists

YouTube Transcript Scraper — Videos, Channels & Playlists

YouTube transcript scraper and API: captions with timestamps, plain text or SRT, title, channel, views and duration for videos, whole channels and playlists. No login.

Pricing

Pay per event

Rating

5.0

(1)

Developer

Tristan Leroux

Tristan Leroux

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

20 hours ago

Last modified

Categories

Share

Download YouTube transcripts (captions and subtitles) with timestamps from single videos, whole channels and playlists. Get plain text, timestamped segments or SRT, plus title, channel, duration, views and publish date for every video. No login and no API key needed; export results as JSON, CSV or Excel, or pull them through the Apify API.

What does YouTube Transcript Scraper do?

YouTube Transcript Scraper works as an unofficial YouTube transcript API. Give it any mix of:

  • Video links or IDs — watch, youtu.be, Shorts, embed and live links.
  • Channel links — youtube.com/@handle, /channel/UC…, /c/… or /user/…. The scraper takes the channel's newest videos, Shorts or past live streams.
  • Playlist links — any link with list= in it, or a bare playlist ID.

For every video it returns the transcript in each language you ask for, both as one block of text and as timestamped segments (or as SRT subtitles), together with video metadata. Manual and auto-generated captions are both supported. Each result also tells you which video, channel or playlist link it came from, so you can group results by source.

The scraper reads the captions YouTube already has. It does not transcribe audio itself: videos without captions are listed in the run summary and are not charged.

Use cases

  • AI and RAG builders — load every transcript of a channel or course playlist into a vector database, chatbot or LLM prompt.
  • Content marketers — turn videos into blog posts, newsletters, show notes and social posts without retyping.
  • Market and brand researchers — find what creators and competitors say about a product, topic or brand across hundreds of videos.
  • Educators and students — make lecture playlists searchable and quote them with timestamps.
  • Media monitoring teams — check a channel's new uploads for mentions on a schedule.
  • Subtitle and localization teams — export existing captions as SRT files.

How much does it cost?

You pay only for transcripts you get (pay-per-event). Platform usage is included.

EventWhat you pay forFree planPaid plans (from)
transcriptOne transcript saved: one video in one language$2.00 per 1,000$1.00 per 1,000 (Gold+)

A small fixed actor-start fee charged by Apify ($0.00005) applies per run. Videos without captions, failed videos and duplicates are not charged.

Worked examples:

  • One channel, 50 newest videos, English → up to 50 transcripts → $0.10 on the Free plan, $0.05 on Gold+.
  • 20 playlists × 50 videos, English and Spanish → up to 2,000 transcripts → $4.00 on the Free plan, $2.00 on Gold+.

The Apify Free plan includes $5 monthly credit, enough for about 2,500 transcripts each month.

How to use YouTube Transcript Scraper

  1. Open the actor in Apify Console and click Try for free.
  2. Paste video links into Video URLs, channel links into Channel URLs and/or playlist links into Playlist URLs (the form is prefilled with a working example).
  3. Set Languages (e.g. en, es, de-DE) and the transcript format you want.
  4. For channels and playlists, set Max videos per channel / Max videos per playlist and, for channels, the tab to read (Videos, Shorts or Live streams).
  5. Click Start. When the run finishes, open the Output tab and export to JSON, CSV or Excel.

Using the API instead:

  1. Get your API token from Settings → Integrations in Apify Console.
  2. Call run-sync-get-dataset-items with your input (see Integrations and API).
  3. Read the returned JSON items directly, or fetch the run's dataset later.

Input

Provide at least one of videoUrls, channelUrls, playlistUrls or videoIds. They can be combined in one run.

FieldTypeDescription
videoUrlslist of stringsVideo links: watch, youtu.be, Shorts, embed or live URLs.
channelUrlslist of stringsChannel links (/@handle, /channel/UC…, /c/…, /user/…), bare @handles or UC… channel IDs. A link ending in /videos, /shorts or /streams reads that tab.
playlistUrlslist of stringsPlaylist links (any link with list=) or bare playlist IDs such as PL….
videoIdslist of stringsBare 11-character video IDs, e.g. dQw4w9WgXcQ.
languageslist of stringsLanguage codes in priority order, e.g. en, de-DE, pt-BR, es-419. One result per video and language found. Default ["en"].
formatselectjson (plain text + segments), text (plain text) or srt (SRT subtitles in transcriptText). Default json.
includeSegmentsbooleanAdd timestamped segments (start, duration, text). Default on.
includeMetadatabooleanAdd title, channel, duration, views and publish date. Default on.
channelVideoTypeselectChannel tab for links that don't name one: videos, shorts or streams. Default videos.
maxVideosPerChannelintegerNewest videos taken from each channel. Default 50.
maxVideosPerPlaylistintegerVideos taken from each playlist, from the top. Default 50.
maxItemsintegerHard cap on results for the whole run. Default 1,000.
proxyConfigurationobjectProxy settings. Default: Apify Proxy, group RESIDENTIAL (YouTube blocks datacenter IPs).
debugbooleanExtra diagnostics in the log.
{
"videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
"channelUrls": ["https://www.youtube.com/@mkbhd"],
"playlistUrls": ["https://www.youtube.com/playlist?list=PLBsP89CPrMeNIuvr9j3_EQaMwaNJ6rhuQ"],
"languages": ["en"],
"format": "json",
"maxVideosPerChannel": 20,
"maxVideosPerPlaylist": 50
}

Output

One item per video and language. This item is from a real run on 2026-11-02 (segments and text shortened here; a real item contains every caption line):

{
"videoId": "dQw4w9WgXcQ",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"sourceType": "video",
"sourceUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"channelName": "Rick Astley",
"channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
"durationSec": 213,
"viewCount": 1833016036,
"publishedAt": "2009-10-24T23:57:33-07:00",
"language": "en",
"isAutoGenerated": false,
"segments": [
{ "start": 1.36, "duration": 1.68, "text": "[♪♪♪]" },
{ "start": 18.64, "duration": 3.24, "text": "♪ We're no strangers to love ♪" }
],
"transcriptText": "[♪♪♪] ♪ We're no strangers to love ♪ ♪ You know the rules and so do I ♪ …",
"wordCount": 487,
"format": "json",
"fetchedAt": "2026-11-02T13:56:20Z"
}

Field notes:

  • sourceType — video, channel or playlist: how this video got into the run.
  • sourceUrl — the link you entered that produced this item (for channels and playlists, the channel or playlist link). A video reached through several of your links appears once, credited to the first one.
  • language — the YouTube language code of the transcript returned.
  • isAutoGenerated — true for YouTube's automatic captions, false for uploaded captions.
  • segments — timestamped caption lines in seconds; omitted when includeSegments is off.
  • transcriptText — plain text, or numbered SRT blocks (HH:MM:SS,mmm --> HH:MM:SS,mmm) when format is srt.
  • Metadata fields are null if YouTube does not return them; the transcript is still saved.

Integrations and API

Run the actor and get the transcripts back in one call:

curl -X POST "https://api.apify.com/v2/acts/innolabs~youtube-transcript-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"channelUrls": ["https://www.youtube.com/@mkbhd"], "maxVideosPerChannel": 10, "languages": ["en"]}'

Python with apify-client:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("innolabs/youtube-transcript-scraper").call(
run_input={
"playlistUrls": ["https://www.youtube.com/playlist?list=PLBsP89CPrMeNIuvr9j3_EQaMwaNJ6rhuQ"],
"languages": ["en"],
"format": "text",
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["wordCount"], item["transcriptText"][:80])
  • Make, Zapier, n8n — use the Apify app/node to start the actor and send transcripts to Google Sheets, Notion, Airtable, Slack or your database.
  • Scheduling — create a schedule in Apify Console (e.g. daily) to collect a channel's new uploads automatically.
  • Webhooks — trigger your pipeline when a run finishes.
  • AI agents (MCP) — connect Claude, Cursor or other MCP clients through the Apify MCP server at https://mcp.apify.com and let your agent fetch YouTube transcripts on demand.

FAQ

The scraper only reads public videos and the captions YouTube shows to every visitor without logging in. It does not access private, members-only or age-restricted content. Check that your use of the transcripts respects YouTube's terms, copyright and the laws that apply to you.

Do I need proxies?

Yes, and it is set up for you. YouTube blocks Apify's datacenter IPs for transcripts ("Sign in to confirm you're not a bot"), so the default proxy is Apify Proxy, group RESIDENTIAL. Residential traffic is included in the price: the scraper downloads only the caption data and a few fields of video details (about 20 KB per video), never the full video page. When a request is blocked anyway, it switches to a fresh IP and retries. You can also use your own residential proxy URLs. If you switch to datacenter proxies and YouTube blocks every video, the run fails with a clear message instead of returning an empty dataset. Blocked videos are never charged.

How many videos can I get?

Each channel or playlist gives up to Max videos per channel / playlist videos (50 by default, raise it as needed). maxItems caps the total number of results for the run; the run stops cleanly there and you are never charged above it.

Can I get only new videos?

The scraper does not remember earlier runs. Schedule it with a small Max videos per channel (e.g. 10, newest first) and skip videoId values you already have in your sheet or database. Within one run, duplicates are removed and not charged.

What happens if a video, channel or playlist fails?

Nothing else stops. Videos without captions in your languages, unavailable videos and blocked requests are listed in the run's SUMMARY record with the video ID, language and reason (e.g. transcripts_disabled, no_transcript_in_language, video_unavailable). A channel or playlist that cannot be read (not found, private, or a missing Shorts/Live tab) is listed with its link and reason, and the other links are still processed. Links that are not YouTube links at all stop the run immediately with a clear message. If YouTube blocks the proxy for every video and nothing is saved, the run ends as Failed with a message telling you to switch to a residential proxy, so an empty run never looks successful.

Does it work for videos without captions?

No. The scraper returns captions that exist on YouTube (uploaded or auto-generated). It does not run speech-to-text on the audio. Such videos are reported and not charged.

Can I get a transcript translated into another language?

The scraper returns languages that exist on the video. Ask for several codes in Languages and you get one result per language found.

Limits

  • Captions only: no speech-to-text for videos without captions. Some Shorts have none.
  • Channels: Videos, Shorts and Live (past streams) tabs, newest first. Podcasts, Releases and Courses tabs are not read; use their playlist links instead.
  • Playlists are read in playlist order. Auto-generated Mix playlists (list=RD…), private and "Watch later" playlists are not supported.
  • Private, members-only and age-restricted videos are skipped.
  • Language codes must match YouTube's (de-DE, not de, when that is what the video lists).
  • YouTube blocks Apify datacenter IPs for transcripts, so the default proxy is Apify RESIDENTIAL. Blocked videos are reported, not charged, and can be retried in a new run.