YouTube Transcript Scraper
Pricing
from $1.20 / 1,000 transcripts
YouTube Transcript Scraper
Get transcripts from YouTube videos, Shorts, live streams, channels, playlists and search results as text, timestamped segments, SRT or WebVTT. No login or API key. You are charged only for rows that return a transcript.
Pricing
from $1.20 / 1,000 transcripts
Rating
5.0
(1)
Developer
Rastriq — Structured data from the world
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
YouTube Transcript Scraper extracts captions from YouTube videos, Shorts, live streams, channels, playlists and search results, and returns them as clean text, timestamped segments, SRT or WebVTT. No API key, no login, no browser. Export to JSON, CSV or Excel.
🚀 First test: keep the prefilled input (one video and the TED channel, 5 videos) and click Start. You only pay for rows that return a transcript.
🎯 Why use YouTube Transcript Scraper?
- 🤖 LLM and RAG pipelines: feed transcripts to an LLM or a vector store. The timestamped text format (
[00:01:23] ...) is made for prompts and lets you cite the exact moment. - 🔎 Content research: pull every talk from a channel, playlist or search query and analyze topics, quotes and keywords in bulk.
- 📈 SEO and content repurposing: turn videos into blog posts, summaries, chapters and subtitle files.
- ♿ Accessibility: export ready-to-use SRT and WebVTT files for subtitles.
- 📡 Channel monitoring: schedule runs with
publishedAfterset to7 daysto capture new uploads.
📋 What data does YouTube Transcript Scraper extract?
| Group | Fields |
|---|---|
| Video | videoId, url, title, durationSeconds, viewCount, isLive (live right now), isLiveContent (live stream or past stream) |
| Channel | channelName, channelId, channelUrl |
| Transcript | transcriptStatus, transcriptLanguage, originalLanguage, isAutoGenerated, segmentCount, wordCount |
| Languages | availableLanguages (code, name, isAutoGenerated for each track) |
| Transcript formats (you choose) | plain text, segments with start / duration / end, timestamped text [hh:mm:ss] ..., SRT, WebVTT |
| Metadata (on by default) | publishedAt, likeCount, description, keywords, thumbnailUrl |
⚙️ Input
| Parameter | Type | Default | Description |
|---|---|---|---|
urls | array | prefilled | Video, Shorts or live URLs, youtu.be links, bare video IDs, channel URLs (@handle, /channel/UC...; add /shorts or /streams to pick a tab) and playlist URLs. Mix them freely. |
searchQueries | array | none | Transcribe the top videos for each YouTube search query. |
maxVideosPerSource | integer | 20 | Limit per channel, playlist or search. Direct video URLs are not limited. |
maxVideos | integer | 0 | Hard cap for the whole run. 0 means no cap. |
channelTabs | array | videos | videos, shorts, streams. Used when a channel URL has no tab. |
publishedAfter / publishedBefore | string | none | YYYY-MM-DD or relative (30 days). Applies to channels, playlists and searches. Channels stop paging once older videos are reached. |
languages | array | en in the prefill | Language codes in order of preference. The first available one wins. |
fallbackToAnyLanguage | boolean | true | If no preferred language exists, return the default track instead of a LANGUAGE_NOT_AVAILABLE row. |
preferAutoGenerated | boolean | false | By default, creator-uploaded captions win over auto-generated ones. |
outputFormats | array | text, segments | Also available: timestamped, srt, vtt. |
includeMetadata | boolean | true | Adds publish date, likes, description, keywords and thumbnail. |
maxConcurrency | integer | 5 | Videos processed in parallel (1-20). |
proxyConfiguration | object | Apify residential | Required by YouTube. Its cost is included in the price. |
Single video, plain text:
{"urls": ["https://www.youtube.com/watch?v=jNQXAC9IVRw"],"outputFormats": ["text"]}
A channel, last 30 days, Spanish preferred, with SRT:
{"urls": ["https://www.youtube.com/@TED"],"publishedAfter": "30 days","languages": ["es", "en"],"outputFormats": ["text", "srt"],"maxVideosPerSource": 100}
📦 Output example
Real row from a run on the TED channel (description and text shortened):
{"videoId": "PpEUTpzWt2M","url": "https://www.youtube.com/watch?v=PpEUTpzWt2M","inputSource": "https://www.youtube.com/@TED","title": "How the Wealth Gap Is Reshaping Politics | Xochitl Gonzalez | TED","channelName": "TED","channelId": "UCAuUUnT6oDeKwE6v1NGQxug","channelUrl": "https://www.youtube.com/channel/UCAuUUnT6oDeKwE6v1NGQxug","durationSeconds": 636,"viewCount": 98795,"isLive": false,"publishedAt": "2026-10-13","likeCount": 652,"description": "Wealth inequality gets talked about as an economic problem. Writer Xochitl Gonzalez makes the case that it's a civic one, too ...","keywords": ["TEDTalk", "TEDTalks", "TED"],"thumbnailUrl": "https://i.ytimg.com/vi/PpEUTpzWt2M/sddefault.jpg","availableLanguages": [{ "code": "en", "name": "English (auto-generated)", "isAutoGenerated": true }],"transcriptStatus": "OK","transcriptLanguage": "en","originalLanguage": "en","isAutoGenerated": true,"segmentCount": 275,"wordCount": 1703,"text": "I'm here to tell you a story about getting a cup of coffee. Or I should say attempting to get a cup of coffee because when I went to pay for it, I couldn't. ..."}
🚦 Status per row
Every video the actor processes produces a row with a transcriptStatus; invalid URLs and channels that cannot be found get an INVALID_INPUT row. Videos skipped by your date filter or limits are not listed.
| Status | Meaning | Charged |
|---|---|---|
OK | Transcript returned | Yes |
NO_TRANSCRIPT | The video has no captions | No |
LANGUAGE_NOT_AVAILABLE | None of your preferred languages exist and fallback is off | No |
UNAVAILABLE | Private, removed, age-restricted or geo-blocked | No |
BLOCKED | YouTube blocked the request | No |
ERROR | Unexpected error | No |
INVALID_INPUT | The input is not a recognizable YouTube URL, ID or query | No |
💰 How much does YouTube Transcript Scraper cost?
YouTube Transcript Scraper uses pay per event pricing: you pay per transcript returned.
- $2.00 per 1,000 transcripts on the Free plan. Paid plans get a lower rate, so see the Pricing tab for your plan's rate.
- No charge for rows without a transcript (
NO_TRANSCRIPT,UNAVAILABLE, and the other non-OK statuses). - No start fee. The residential proxy cost is included.
Example: 500 transcripts = 500 x $2.00 / 1,000 = $1.00.
Speed: in a run measured on Apify (15 Oct 2026), 315 videos finished in about 3 minutes at 256 MB with concurrency 8, with 0 errors. About 94 % of the videos returned a transcript. The rest had no captions or were unavailable, and those rows were free.
🔌 API usage
Run YouTube Transcript Scraper from your code with the Apify API.
curl -X POST "https://api.apify.com/v2/acts/rastriq~youtube-transcript-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"urls": ["https://www.youtube.com/watch?v=jNQXAC9IVRw"], "outputFormats": ["text"]}'
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("rastriq/youtube-transcript-scraper").call(run_input={"urls": ["https://www.youtube.com/@TED"],"publishedAfter": "30 days","languages": ["en"],"outputFormats": ["timestamped"],})for row in client.dataset(run["defaultDatasetId"]).iterate_items():if row["transcriptStatus"] == "OK":print(row["title"], row["wordCount"])
You can also use schedules, webhooks, Make, Zapier, n8n and Google Sheets, or call the actor from AI agents through the Apify MCP server.
❓ FAQ
What if a video has no captions?
You get a NO_TRANSCRIPT row at no cost. The actor does not generate transcripts from audio (no speech-to-text), and it does not offer machine translation.
Auto-generated or creator-uploaded captions?
Creator-uploaded captions are preferred by default. Set preferAutoGenerated to true to reverse that. The isAutoGenerated field tells you which one you got.
How do languages work?
List codes in order, for example ["es", "en"]. The first available one wins. If none exists, the default track is returned (turn off fallbackToAnyLanguage to get a LANGUAGE_NOT_AVAILABLE row instead). availableLanguages lists every track of the video.
Does it work with Shorts and live streams?
Yes. Shorts and live URLs work as inputs, and you can add /shorts or /streams to a channel URL or use channelTabs.
Can it transcribe age-restricted videos?
No. They require a login, which this actor does not use, so they return UNAVAILABLE and are not charged.
How do I control volume and cost?
Set maxVideosPerSource for each channel, playlist or search, and maxVideos for the whole run. You can also set a maximum cost per run in the Apify run options, so a run stops when it reaches your budget.
Is it legal? The actor reads publicly available captions only. You are responsible for complying with YouTube's Terms of Service, copyright and data protection law when you use the output. This actor is not affiliated with or endorsed by YouTube or Google.
Where do I get support? Open a ticket in the Issues tab and include the run ID.
🔗 Related Rastriq actors
| Actor | What it does |
|---|---|
| TikTok Ad Library Scraper | Extract ads from the TikTok ad library |
| Google Ads Transparency Scraper | Extract ads from Google Ads Transparency Center |
| Facebook Ad Library Scraper | Extract ads from the Facebook Ad Library |