YouTube Transcript & Subtitles Scraper - Captions, SRT, AI
Pricing
from $3.50 / 1,000 transcript delivereds
YouTube Transcript & Subtitles Scraper - Captions, SRT, AI
Scrape YouTube transcripts and subtitles from video, Shorts, channel, playlist or search links as text, timestamps, SRT or VTT. Any caption language or translated; AI audio transcription when a video has no captions. Only-new-videos mode for schedules. For AI agents, MCP and n8n. Pay per transcript.
Pricing
from $3.50 / 1,000 transcript delivereds
Rating
0.0
(0)
Developer
Scrapewise Data
Maintained by CommunityActor stats
0
Bookmarked
20
Total users
9
Monthly active users
2 days ago
Last modified
Categories
Features
Share
YouTube Transcript Scraper: captions, subtitles, SRT/VTT and AI transcription
Scrape the full transcript of any YouTube video as clean text, timestamped segments, SRT or VTT, with title, channel, views and length. No API key. US$ 5 per 1,000 transcripts, 3 to 8 seconds per video.
What does this YouTube transcript scraper do?
- Takes videos, Shorts, finished live streams, channels, playlists or search terms.
- Returns the transcript in the language you ask for, translated when the video does not have it.
- Transcribes the audio when a video has no captions, if you turn it on.
- Gives every video one row: a transcript, or a free row with an
errorCodethat says why not.
Who uses it
- AI and RAG builders: transcripts and timestamped chunks to summarize, quote or index.
- Automation (n8n, Make, Zapier): one call per video that never breaks on a video without captions.
- SEO and content teams: what competitors say in their videos, as text to search and repurpose.
- Subtitle editors and translators: SRT and VTT files in the language they need.
How much does it cost to scrape YouTube transcripts?
| Apify plan | Per transcript | Per 1,000 transcripts |
|---|---|---|
| Free | US$ 0.005 | US$ 5.00 |
| Bronze | US$ 0.0045 | US$ 4.50 |
| Silver | US$ 0.004 | US$ 4.00 |
| Gold and above | US$ 0.0035 | US$ 3.50 |
- One charge per video whose transcript is delivered, whatever its length, format or translation. 50 transcripts cost US$ 0.25 on the Free plan.
- Free: listing channels, playlists and searches, videos without captions, private, removed, age restricted, live or blocked videos, videos skipped by a date filter, duplicates.
- Audio transcription, from October 29, 2026, only when you turn it on and the video has no captions: the transcript price plus US$ 0.03 per started minute of audio (a 12 minute video costs US$ 0.365).
- Actor start, from October 29, 2026: US$ 0.00005 per run (US$ 0.05 per 1,000 runs).
- Proxy and compute are included. No YouTube API key needed.
Why use this YouTube transcript scraper
| Common problem | What this Actor does |
|---|---|
| A live stream that already ended returns nothing | Transcribed like any video (tested on a 3.6 hour stream, 37,561 words) |
| A stream that is still live or scheduled | Free row with LIVE_NOT_ENDED and YouTube's own message |
| "Could not retrieve the video ID" | Accepts watch, youtu.be, m., music., Shorts, live, embed, youtube-nocookie.com, attribution links, URLs without https:// or with quotes, and bare 11-character ids |
| Language parameter ignored | The language you ask for comes first; if the video does not have it, the transcript is translated and the row says so (translatedTo, translationSource) |
| Empty string returned as success | Every video gets text, or error plus a stable errorCode |
| "Failed with status 403" | Each video is retried several times before it is reported as BLOCKED (free) |
| Paying for runs that fail | Only delivered transcripts are charged: failed, blocked, private or captionless videos come back as free rows |
| More charges than requested | The same video in three URL formats is one row and one charge, and maxItems is a hard cap |
How to scrape YouTube transcripts
- Paste video, channel or playlist links in Video, channel, playlist or search URLs, or add Search terms.
- Set Preferred languages and, for channels, Max videos per channel, playlist or search.
- Click Start. Transcripts appear in the Output tab and export to JSON, CSV, Excel, SRT or VTT.
The same run as JSON input:
{ "videoUrls": ["https://www.youtube.com/watch?v=iG9CE55wbtY"] }
A video in French, whatever languages it has: { "videoUrls": ["https://youtu.be/iG9CE55wbtY"], "targetLanguage": "fr" }. The 50 newest videos of a channel since January:
{ "videoUrls": ["https://www.youtube.com/@veritasium"], "maxVideosPerSource": 50, "publishedAfter": "2026-01-01" }
Search terms: { "searchQueries": ["python asyncio explained"], "maxVideosPerSource": 6 }. An empty input transcribes one example video.
One real row from 2026-10-21, text and lists shortened:
{"videoId": "iG9CE55wbtY","url": "https://www.youtube.com/watch?v=iG9CE55wbtY","title": "Do schools kill creativity? | Sir Ken Robinson | TED","channel": "TED","channelId": "UCAuUUnT6oDeKwE6v1NGQxug","publishedAt": "2007-01-07T05:00:34+00:00","viewCount": 25055607,"lengthSeconds": 1203,"category": "Education","isLiveContent": false,"language": "en","languageName": "English","isAutoGenerated": false,"availableLanguages": ["en", "fr", "de", "es", "pt-BR"],"text": "Good morning. How are you? (Audience) Good. It's been great, hasn't it? ...","wordCount": 3170,"segments": [{ "text": "Good morning. How are you?", "start": 27.1, "duration": 2.58 }],"errorCode": null,"sourceUrl": "https://www.youtube.com/watch?v=iG9CE55wbtY","scrapedAt": "2026-10-21T20:18:26.310132+00:00"}
Switching from another YouTube transcript scraper? Your existing input works
Send the same JSON through the API and change only the Actor id.
| Field you already send | What happens here |
|---|---|
videoUrl, youtube_url, urls, startUrls, video_urls, videoIds | Merged into videoUrls |
targetLanguage, language | The language you want, translated when missing; auto for the spoken language |
translate_to / transcript_type | Same as translateTo / captionType (generated = auto) |
output_formats (srt, vtt, text) | Same as subtitleFormats; text is always included |
list_only | Returns each video's caption tracks (captionTracks) without downloading them; free |
channel, channel_url | Lists or transcribes the channel's videos ("channel_transcripts": true with channel) |
max_videos, start_date, end_date | Per-source limit and publish date range |
include_metadata, include_transcript_text, preserve_formatting | Accepted; metadata and text are always included |
{ "channel_url": "https://www.youtube.com/@veritasium", "max_videos": 5, "language": "en" }
YouTube transcript languages and translation
languages is an ordered list of caption codes (default en, pt, pt-BR, es); ["auto"] returns the language spoken in the video. targetLanguage puts one language first and translates into it when the video lacks it; add "autoTranslate": false to get only original captions. translateTo translates every transcript. YouTube's own translation is used when it exists, machine translation otherwise; timestamps stay the same and the row records the source. Translation is included in the price.
YouTube videos without captions
With transcribeAudioIfNoCaptions on, videos with no captions at all are transcribed from their audio inside the Actor (no API key, about 99 languages). Rows get transcriptSource: "audio" and audioMinutes; videos longer than maxAudioMinutes (default 30) come back as a free AUDIO_TOO_LONG row. Videos with captions always use the captions. Give the run 2 to 4 GB of memory: an 11.8 minute video took 9.8 min at 2 GB and 5.5 min at 4 GB, with a one-time setup per run.
Monitor YouTube channels: only new videos
Turn on onlyNewVideos, save the input as a Task and attach a Schedule. Delivered video ids are kept per channel, playlist or search in the key-value store youtube-transcript-only-new-videos in your account, so each run transcribes only new uploads and a day without uploads costs nothing. Videos that had no captions are tried again on the next run, free.
Video guides from Apify: how to schedule an Actor and how to connect it to other apps.
Use it from AI agents, n8n and Make
- AI agents (MCP): add this Actor to the Apify MCP server and
call it from Claude, ChatGPT, Cursor, VS Code or any MCP client. The agent sends a video, channel or search and gets
the transcript back as text, ready to summarize, quote or index. Example prompt: "get the transcripts of the 10
newest videos of this channel and list the main topics". Server URL:
https://mcp.apify.com/?actors=scrapewise/youtube-transcript. - RAG and summaries:
includeSegmentsgives timestamped chunks you can embed one by one and link back to the exact second of the video. - n8n, Make, Zapier: use the Apify node or module ("Run Actor and get dataset items") with the same JSON input as above, or read the dataset from the Apify API. See Apify integrations.
- Schedules: run it daily with
onlyNewVideoson a list of channels to get each new video's transcript once. - Exports: JSON, CSV, Excel or XML from the run page, and SRT or VTT files with
subtitleFormats.
Requests an agent can pass straight through:
- "Transcribe the 10 newest Veritasium videos and list the main topics" ->
{"videoUrls": ["https://www.youtube.com/@veritasium"], "maxVideosPerSource": 10} - "Find videos that explain the Model Context Protocol and give me their transcripts" ->
{"searchQueries": ["model context protocol explained"], "maxVideosPerSource": 5} - "Give me this video's transcript in Spanish" ->
{"videoUrls": ["https://youtu.be/iG9CE55wbtY"], "targetLanguage": "es"}
YouTube transcript output fields
| Field | Notes |
|---|---|
videoId, url, title, channel, channelId, channel_url | Always present when the video exists |
publishedAt, viewCount, lengthSeconds, category, description, thumbnailUrl | Video metadata at the moment of the run |
isLiveContent | True for past or current live streams |
language, languageName, isAutoGenerated | Language of the delivered text and whether it is an automatic caption or audio transcription |
availableLanguages | Every caption language the video has |
text, wordCount | The full transcript as one string and its word count |
segments | {text, start, duration} per caption line (includeSegments, on by default) |
durationSeconds | Where the last caption line ends |
srt, vtt | Full subtitle files, with subtitleFormats |
translatedTo, translationSource, translationError | Only on translated rows |
transcriptSource, audioMinutes | Only on rows transcribed from audio |
videoStatus, publishDate | With includeVideoStatus |
captionTracks | Only with list_only |
sourceUrl | The input the video came from |
error, errorCode, scrapedAt | See below |
The dataset has two views: Overview and All fields.
Error codes (rows not charged)
errorCode | Meaning |
|---|---|
NO_CAPTIONS | No captions at all (turn on audio transcription to get text) |
NO_CAPTIONS_IN_LANGUAGE | No captions of the requested captionType |
EMPTY_TRANSCRIPT | The caption track exists but has no text |
VIDEO_UNAVAILABLE, VIDEO_UNPLAYABLE | Private, removed or region locked |
AGE_RESTRICTED | Age restricted video |
LIVE_NOT_ENDED | Live stream still running, scheduled, or without a recording yet |
INVALID_VIDEO_ID, INVALID_INPUT | Not a valid video id or YouTube URL |
AUDIO_TOO_LONG, NO_SPEECH | Audio transcription only |
BLOCKED | YouTube refused every attempt; run it again |
The run itself fails only when nothing was delivered because YouTube blocked the requests, or when no channel, playlist or search could be listed.
YouTube transcript scraper FAQ
Why not the official YouTube API? The YouTube Data API downloads caption tracks only with OAuth for videos you own or manage, and every call uses your daily quota. This Actor reads the public captions of any public video without an API key, adds translation, SRT and VTT, and can transcribe videos that have no captions.
How fast is it?
One video takes 3 to 8 seconds; a channel of 10 videos about 11 seconds; 34 mixed videos in 9 languages took 50 seconds. Rows arrive in the order they finish, so sort by publishedAt for a timeline.
It said NO_CAPTIONS but the video has captions. Several ways of reading the captions are tried first. Open an issue with the URL and it will be looked at.
How many videos can I pull from one channel?
maxVideosPerSource goes up to 5,000 and maxItems up to 10,000; set both.
Can I call it from the API?
Yes, for example with curl. A video without captions is a row with errorCode, so a one-video-per-call workflow does not break.
curl -X POST "https://api.apify.com/v2/acts/scrapewise~youtube-transcript/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" -d '{"videoUrls": ["https://youtu.be/iG9CE55wbtY"], "subtitleFormats": ["srt"]}'
Is it legal? The Actor reads public caption tracks and audio of public videos without login. You are responsible for how you use and republish the text.
YouTube transcript scraper limitations
- Machine translation and audio transcription can contain mistakes; rows say when they were used.
- Age restricted and members-only videos cannot be transcribed.
publishedAtcan be empty in rare cases.- Keep the default proxy settings: they are included in the price and give the most complete results.
Related scrapers
- YouTube Channel Transcripts Scraper: every transcript of a channel in bulk, with SRT and VTT.
- Audio & Video Transcriber: any audio or video URL or podcast RSS feed to text.
- YouTube Comments Scraper: comments, replies and likes of YouTube videos.
- TikTok Transcript Scraper: TikTok captions with views and likes.
- Instagram Reels Transcript Scraper: Instagram reels and videos to text.
Try it now
Click Start with the example input: one TED talk, about 3,000 words, for US$ 0.005. Need a field, a format or a language option? Open an issue in the Issues tab of this page; user requests decide what the next version adds.
Changelog
- 19 Oct 2026: examples for AI agents (Apify MCP server).
- 16 Oct 2026: section on AI agents (MCP), n8n and Make in this page.
- 2026-10-08:
LIVE_NOT_ENDEDright away for running streams;targetLanguagewith automatic translation;["auto"]language; more URL formats; optional audio transcription; field names of other transcript actors accepted; empty caption tracks become freeEMPTY_TRANSCRIPTrows. - 2026-10-07: optional
videoStatusandpublishDate. - 2026-09-14: lower price with Store discounts by plan.