YouTube Transcript Scraper
Transcripts and subtitles of videos, playlists and channels, with timestamps and metadata. From $0.004 / video, pay per result, no browser, no login.
▶ Run it on Apify · Python example · All scrapers
Get the transcript (subtitles / captions) of any YouTube video as clean JSON, plain text, SRT or VTT. Paste video links, a playlist or a whole channel: this YouTube transcript scraper calls YouTube’s own data endpoints directly — no headless browser, no API key, no YouTube account — so runs start instantly and cost a fraction of a cent per video.
✅ Transcripts with timestamps (start + duration for every line) and the full text in one field
✅ SRT and VTT subtitle files ready to download or burn into a video
✅ Manual or auto-generated captions — you choose which one wins
✅ 100+ languages: pick your preferred languages in order, with automatic fallback
✅ Whole playlists and channels (/@handle, /channel/UC…) expanded to their videos automatically
✅ Video metadata: title, channel, duration, views, publish date, description, keywords, thumbnail
✅ Works with watch?v=, youtu.be/, Shorts, live replays, embeds and bare video IDs
✅ You never pay for videos without captions or for failed videos
🚀 Why this YouTube transcript API is different
| This Actor | Typical transcript scrapers | |
|---|---|---|
| Price per video | $0.004 (less on higher plans) | $0.005 – $0.01 |
| Playlists and channels in one run | Yes, with pagination | Often single videos only |
| Output formats | Segments, text, SRT, VTT | JSON only |
| Metadata included | Yes (title, channel, views, date…) | Separate Actor |
| Charged for videos without captions | Never | Often |
| Browser needed | No — 5 videos in parallel, seconds per video | Usually slow headless Chrome |
| Blocking handling | Session retries, new IPs, automatic residential fallback | Fails on cloud IPs |
💡 What can you do with YouTube transcripts?
- AI, RAG and LLM training: feed clean, timestamped transcripts into ChatGPT, Claude, LangChain, LlamaIndex or a vector database. Build “chat with this channel” apps.
- Summaries and notes: summarize lectures, podcasts, webinars and tutorials in seconds.
- Content repurposing: turn videos into blog posts, newsletters, X threads, LinkedIn posts and SEO articles.
- Subtitles: download SRT/VTT files and add them to your own videos or editing tools.
- SEO and keyword research: see exactly what top-ranking videos say about a topic.
- Market and competitor research: analyse what competitors, influencers and reviewers say about products and brands.
- Education and accessibility: searchable text for courses, quotes with exact timestamps, study material.
- Data science: sentiment, topic modelling and trend analysis across whole channels.
🛠️ How to get a YouTube transcript (3 steps)
- Paste video links (one per line) — or add a playlist or channel URL.
- Choose languages and formats — e.g.
en, thenes; segments + text, or SRT/VTT. - Click Start and download your dataset as JSON, CSV, Excel, XML or HTML, or fetch it through the API.
📥 Input example
{
"videos": ["https://www.youtube.com/watch?v=jNQXAC9IVRw", "https://youtu.be/dQw4w9WgXcQ"],
"playlistOrChannelUrls": ["https://www.youtube.com/@TED"],
"maxVideosPerSource": 20,
"languages": ["en", "es"],
"preferManual": true,
"outputFormats": ["segments", "text", "srt"],
"includeMetadata": true
}
📤 Output example
{
"videoId": "jNQXAC9IVRw",
"url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
"title": "Me at the zoo",
"channelName": "jawed",
"durationSeconds": 19,
"viewCount": 380000000,
"publishDate": "2005-04-23",
"language": "en",
"languageName": "English",
"isAutoGenerated": false,
"availableLanguages": [{ "code": "en", "name": "English", "isAutoGenerated": false }],
"segments": [
{ "start": 1.2, "duration": 2.16, "text": "All right, so here we are, in front of the elephants" }
],
"text": "All right, so here we are, in front of the elephants the cool thing about these guys is that…",
"srt": "1\n00:00:01,200 --> 00:00:03,360\nAll right, so here we are, in front of the elephants\n…",
"wordCount": 48,
"status": "ok"
}
Videos without captions are listed in the RUN_SUMMARY record of the run (key-value store), not in the dataset — and they are not charged.
⚙️ Input parameters
| Field | Type | Default | Description |
|---|---|---|---|
videos |
array | ["jNQXAC9IVRw"] |
YouTube video URLs or 11-character IDs; watch, short, live and embed links work. Maximum 1000. |
playlistOrChannelUrls |
array | — | Playlist and channel URLs to expand through InnerTube browse continuation. |
maxVideosPerSource |
integer | 50 |
Maximum videos read from each playlist or channel. |
languages |
array | ["en"] |
Language codes in preference order; any available track is a fallback. |
preferManual |
boolean | true |
Prefer human-written captions over auto-generated captions within the chosen language. |
outputFormats |
array | ["segments", "text"] |
Choose segments, plain text, SRT or VTT. |
includeMetadata |
boolean | true |
Include title, channel, duration, views, date, description, thumbnail and keywords. |
concurrency |
integer | 5 |
Maximum videos being processed in parallel. |
proxyConfiguration, maxRetries |
object, integer | Apify Proxy, auto | Proxy and retries; the defaults work for most runs. |
📋 Output fields
| Field | Type | Description |
|---|---|---|
videoId |
string | YouTube video ID |
url |
string | Watch URL |
title |
string | Video title |
channelName |
string | Channel name |
channelId |
string | Channel ID |
durationSeconds |
integer | Duration in seconds |
viewCount |
integer | View count |
publishDate |
string | Published date |
description |
string | Description, up to 5000 characters |
thumbnail |
string | Thumbnail URL |
keywords |
array | Video keywords |
language |
string | Output language code |
languageName |
string | Caption track name |
isAutoGenerated |
boolean | Selected caption track is automatic |
availableLanguages |
array | Available caption tracks |
segments |
array | Timed caption segments |
text |
string | Plain transcript |
srt |
string | SRT subtitle file content |
vtt |
string | WebVTT subtitle file content |
wordCount |
integer | Transcript word count |
status |
string | Always ok for dataset items |
Export as JSON, CSV, Excel, XML or HTML, or read it through the API.
💰 Pricing — pay only for transcripts
| What you run | Results | Cost (free plan) |
|---|---|---|
| 1 video | 1 | $0.004 |
| 100 videos | 100 | $0.40 |
| A 50-video playlist | 50 | $0.20 |
| 1,000 videos | 1,000 | $4.00 |
Higher Apify plans pay less: $0.0035 (Bronze), $0.003 (Silver), $0.0025 (Gold and above). Platform usage and proxies are included. Set a maximum cost per run and the Actor stops cleanly when it is reached. Videos without captions and failed videos are never charged.
🔌 Use the YouTube Transcript API from your code
Python
from apify_client import ApifyClient # pip install "apify-client>=3"
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("victorrodi/youtube-transcript-scraper-api").call(
run_input={"videos": ["https://www.youtube.com/watch?v=jNQXAC9IVRw"], "outputFormats": ["text"]}
)
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item["title"], "-", item["text"][:200])
JavaScript / Node.js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('victorrodi/youtube-transcript-scraper-api').call({
playlistOrChannelUrls: ['https://www.youtube.com/@TED'],
maxVideosPerSource: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((v) => console.log(v.title, v.wordCount));
cURL (run and get the results in one call)
curl -X POST "https://api.apify.com/v2/acts/victorrodi~youtube-transcript-scraper-api/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
-d '{"videos": ["dQw4w9WgXcQ"], "outputFormats": ["text"]}'
Also works with Make, Zapier, n8n, Google Sheets, Slack, LangChain, LlamaIndex and MCP / AI agents through Apify integrations.
🤖 Use it from AI agents (Claude, ChatGPT, Cursor…)
This Actor is available to AI assistants through the Apify MCP server. Add it with --actors victorrodi/youtube-transcript-scraper-api, then ask:
“Get the transcript of https://youtu.be/dQw4w9WgXcQ and summarize it in 5 bullet points.”
“Fetch the last 10 videos of @TED and list the main ideas of each one.”
🛡️ Reliability
- Requests are paced and retried on the same session first, then with a new IP and exponential backoff.
- If YouTube keeps blocking, the Actor switches to residential IPs automatically.
- One failing video never stops the run; every run writes a
RUN_SUMMARYrecord (results, videos without captions, failures, retries). - Playlists and channels are paged safely: a layout change can never make a run loop or overspend.
More examples and docs for all our Actors: trendpulse-scrapers.
📌 Tips
languagesis an ordered preference list:["pt", "en"]returns Portuguese when it exists, otherwise English, otherwise the first available track.- Turn preferManual off to always prefer auto-generated captions (useful for exact timing).
- Keep
concurrencyat 5 for large lists: faster is not cheaper when YouTube starts rate-limiting.
❓ FAQ
Do I need a YouTube API key? No. The official YouTube Data API does not return transcripts of other people’s videos; this Actor does, without any key or login.
Which videos work? Any public video, Short or live replay that has captions (manual or auto-generated). Private, deleted, age-restricted and members-only videos are skipped and not charged.
How many videos can I process? Up to 1,000 videos per run, plus playlists and channels (up to 1,000 videos per source).
Can I get subtitles in another language? Yes, when the video has a track in that language: list your preferred languages in order. availableLanguages shows every track of the video.
Is scraping YouTube transcripts legal? The Actor only reads publicly available captions and video information; it collects no personal data. Make sure your use respects YouTube’s terms, copyright and the laws that apply to you.
💬 Support
Missing a field, a format or found an issue? Open an issue in the Issues tab — it is answered fast. Feature requests are welcome.