YouTube Transcript Scraper – Bulk Captions, SRT/VTT, Playlists
Pricing
$3.00 / 1,000 transcripts
YouTube Transcript Scraper – Bulk Captions, SRT/VTT, Playlists
YouTube Transcript Scraper for videos, Shorts, playlists and whole channels. Plain text, timestamped segments, clean paragraphs, SRT and VTT in 100+ languages, with fallback to the video's own language. No API key, no quota. Pay only for transcripts delivered – videos without captions are free.
Pricing
$3.00 / 1,000 transcripts
Rating
0.0
(0)
Developer
Ani Björkström
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 days ago
Last modified
Share
The YouTube Transcript Scraper turns any YouTube video, Shorts, playlist or whole channel into text you can actually use: plain transcript, timestamped segments, clean paragraphs for LLMs, and ready-to-save SRT and VTT subtitle files, in 100+ languages.
- Pay only for delivered transcripts. A video with no captions returns a clear reason and costs nothing. No API key, no YouTube Data API quota, no monthly plan.
- Never comes back empty over a language mismatch. Ask for English on a Korean video and
fallbackToAnyLanguagehands you the Korean captions, flagged so you know what you got. - Bulk by design. Paste a playlist or channel URL and it expands into individual videos automatically, with human-written captions preferred over auto-generated ones.
What you get
One flat row per video, ready for CSV, Google Sheets, a vector database or an MCP tool call.
| Field | Description |
|---|---|
transcript | Full plain-text transcript (always included) |
segments | [{ start, duration, end, text }] in seconds – on by default |
transcriptWithTimestamps | One [mm:ss] text line per cue, the format people paste into ChatGPT or Claude |
paragraphs | Cues merged into ~700-character paragraphs, built for RAG chunking |
srt, vtt | Complete subtitle file contents (.srt / WebVTT) |
language, languageCodeRaw, requestedLanguage, languageMatchedRequest | What you asked for versus what the video had |
isAutoGenerated | true when the track is YouTube's ASR output |
availableLanguages, subtitleLanguages, autoCaptionLanguages | Every caption track the video offers |
wordCount, characterCount, segmentCount | Size of the transcript |
title, channelName, channelId, channelUrl, durationSeconds, viewCount, likeCount, uploadDate, description, tags, thumbnailUrl, isLive | Video details (includeVideoDetails, on by default) |
videoId, url, transcriptFound, error | Identity and status of the row |
Plain text is always there; every extra format is free and just a checkbox.
Input
Runs with no input at all (it transcribes a demo video), so a scheduled run is never empty. Typical inputs:
A whole playlist as SRT and paragraphs
{"startUrls": [{ "url": "https://www.youtube.com/playlist?list=PLFs4vir_WsTwEd-nJgVJCZPNL3HALHHpF" }],"language": "en","maxVideos": 100,"includeParagraphs": true,"includeSrt": true}
The latest 50 videos of a channel, strict Spanish only
{"startUrls": [{ "url": "https://www.youtube.com/@veritasium" }],"language": "es","fallbackToAnyLanguage": false,"maxVideos": 50}
Bare video IDs from your own database
{"videoIds": ["dQw4w9WgXcQ", "JsBZOcqZerk"],"includeSegments": false,"includeTimestampedText": true,"includeVideoDetails": false}
| Option | Default | What it does |
|---|---|---|
startUrls | demo video | Video, Shorts, playlist or channel URLs (@handle, /channel/UC…) |
videoIds | [] | Bare 11-character IDs, combined with the URLs |
maxVideos | 100 | Cap on videos processed (playlists and channels expand up to this) |
language | en | Preferred caption language code: en, es, de, fr, pt, hi, sv, ja… |
fallbackToAnyLanguage | true | Take the video's own language when the requested one is missing |
preferAutoGenerated | false | Prefer YouTube's ASR track even when human captions exist |
includeSegments / includeTimestampedText / includeParagraphs / includeSrt / includeVtt | on / off / off / off / off | Extra output formats, no extra cost |
includeVideoDetails | true | Title, channel, views, likes, description, tags, thumbnail |
concurrency | 5 | Videos fetched in parallel (1–20) |
proxyConfiguration | Apify Proxy (automatic) | Datacenter IPs first; a rate-limited video is retried on fresh datacenter IPs, then once on a residential IP |
Output example
{"videoId": "dQw4w9WgXcQ","url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)","channelName": "Rick Astley","durationSeconds": 213,"viewCount": 1816410960,"language": "en","requestedLanguage": "en","languageMatchedRequest": true,"isAutoGenerated": false,"availableLanguages": ["de-DE", "en"],"transcript": "We're no strangers to love, you know the rules and so do I...","wordCount": 487,"segmentCount": 61,"segments": [{ "start": 18.64, "duration": 3.24, "end": 21.88, "text": "♪ We're no strangers to love ♪" }],"transcriptFound": true,"error": null}
A video without captions still produces a row, so nothing silently disappears from a batch:
{"url": "https://www.youtube.com/watch?v=XXXXXXXXXXX","transcriptFound": false,"error": "This video has no captions or transcript available."}
Use cases
- AI, RAG and agents – developers feed
paragraphsinto LangChain, LlamaIndex, Pinecone or a custom pipeline; the flat rows also work as MCP tool output for Claude or ChatGPT agents. - Summarising and repurposing video – content teams turn hour-long podcasts, webinars and lectures into blog posts, newsletters and social threads.
- YouTube SEO and competitor research – SEO agencies mine what competitors actually say on camera, not just their titles and tags, across whole channels.
- Subtitles and localisation – editors export SRT/VTT to translate, correct or re-upload;
availableLanguagestells you which tracks already exist. - Market and academic research – researchers build searchable, timestamped corpora from playlists, courses and conference channels.
- Compliance and brand monitoring – legal and comms teams keep a written record of what was said in specific videos.
- Accessibility – produce readable text versions of video content at scale.
Pricing
$3 per 1,000 transcripts – charged once per video that actually returns a transcript. Videos with no captions, private or removed videos and rate-limit failures produce an explanatory row and are not charged. All output formats are included in the same price, and platform usage is included in the per-transcript fee.
Integrations
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("nourishing_courier/youtube-transcript-scraper").call(run_input={"startUrls": [{"url": "https://www.youtube.com/playlist?list=PLFs4vir_WsTwEd-nJgVJCZPNL3HALHHpF"}],"language": "en","includeParagraphs": True,})for row in client.dataset(run["defaultDatasetId"]).iterate_items():if row["transcriptFound"]:print(row["title"], row["wordCount"], "words")
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('nourishing_courier/youtube-transcript-scraper').call({videoIds: ['dQw4w9WgXcQ'],includeSrt: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0].srt);
curl
curl -X POST "https://api.apify.com/v2/acts/nourishing_courier~youtube-transcript-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls":[{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ"}],"includeParagraphs":true}'
n8n, Make, Zapier – add the Apify node, choose this actor, paste one of the inputs above and pass transcript or paragraphs to your LLM step. MCP – expose it through the Apify MCP server and your agent can call youtube-transcript-scraper as a tool. Results are also available as JSON, CSV, Excel, XML and RSS.
Limits and fair use
The scraper reads captions YouTube already publishes (human-written or auto-generated); it does not run speech-to-text on videos that have neither, and it cannot read private, members-only or age-restricted videos. YouTube throttles some datacenter IPs, so the default proxy setting retries a rate-limited video on fresh datacenter IPs and then on a residential IP; large runs go faster with a modest concurrency. Transcripts are the property of their creators – use them within YouTube's Terms of Service and applicable copyright law.
FAQ
Do I need a YouTube API key to get transcripts?
No. The YouTube Data API does not serve captions for videos you do not own anyway; this actor reads the public caption tracks directly, so there is no key and no quota.
Can I download transcripts for a whole playlist or channel?
Yes. Paste the playlist or channel URL into YouTube URLs and it expands into individual videos, up to maxVideos. Channel pages include their Videos, Shorts and Live tabs.
What happens if the video has no captions in my language?
With fallbackToAnyLanguage (the default) you receive the video's own language and languageMatchedRequest: false. Switch it off to accept only your exact language; the row then explains which languages were available.
Does it work with auto-generated captions?
Yes. Human-written subtitles win when both exist; set preferAutoGenerated if you specifically want the ASR track. isAutoGenerated tells you which one you got.
Can I get SRT or VTT files?
Yes – tick includeSrt and/or includeVtt and the full file content is in the srt / vtt fields, ready to save.
How much does it cost?
$3 per 1,000 delivered transcripts. Failed videos are free.
Does it work with n8n, Make or an MCP client?
Yes. The output is flat JSON, so it plugs into n8n and Make through the Apify integration and into agents through the Apify MCP server.
Why did a video come back rate-limited?
YouTube blocks some datacenter and heavily used IPs. With the default proxy setting the actor already retries a blocked video on two fresh datacenter IPs and then on a residential IP; if a row still says rate-limited, re-run those videos or lower concurrency.
Is this the YouTube Transcript API?
It is a hosted alternative to the popular youtube-transcript-api library and to the unofficial timedtext endpoint, with proxies, retries, playlist expansion and five output formats handled for you.