YouTube Transcript Scraper
Pricing
from $2.00 / 1,000 transcripts
YouTube Transcript Scraper
Get transcripts from YouTube videos, whole channels or playlists in one run. JSON with timestamps, SRT, VTT or plain text. 2 USD per 1,000 transcripts, and videos without captions are free.
Pricing
from $2.00 / 1,000 transcripts
Rating
0.0
(0)
Developer
Brahim Sliti
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
11 days ago
Last modified
Share
Paste YouTube links, get the transcripts back. Videos, channels and playlists can be mixed in the same input list, and you get one dataset with one row per video.
You get the text with timestamps, plus the video title and channel. Pick JSON, SRT, VTT or plain text depending on whether it's going into an LLM, a subtitle editor or a spreadsheet.
What people use it for
- Feeding videos to an LLM or a RAG pipeline. Every row has a
textfield with the full transcript as one string, ready to chunk and embed, and atranscriptfield with timed segments if you need to cite the exact moment. - Turning a channel into written content. Point it at a creator's channel and get their last 50 videos as text for blog posts, newsletters or show notes.
- Research across many videos. Pull every talk from a conference playlist and search them like documents.
- Subtitles. Ask for
srtorvttand drop the file into your editor.
How to use it
- Paste your links in YouTube URLs, one per line. Mix them freely:
- videos:
https://www.youtube.com/watch?v=dQw4w9WgXcQ,youtu.be/...,/shorts/..., or just the 11-character id - channels:
@mkbhdor any channel URL - playlists: any URL with
list=
- videos:
- For channels and playlists, set Max videos per channel or playlist (default 10).
- Pick a format and, if you want a specific language, a Target language (
fr,es,en-US...). - Click Start. Export as JSON, CSV or Excel, or pull the results through the API.
{"urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ", "@mkbhd"],"maxVideos": 20,"format": "json"}
What you get
{"videoId": "dQw4w9WgXcQ","url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","title": "Rick Astley - Never Gonna Give You Up","channelName": "Rick Astley","language": "en","originalLanguage": "en","isAutoGenerated": false,"format": "json","transcript": [{ "start": 0.0, "dur": 1.6, "text": "We're no strangers to love" }],"text": "We're no strangers to love...","wordCount": 231}
transcript: timed segments in JSON, or one SRT / VTT / TXT string if you picked another format.text: the whole transcript as plain text, always there whatever the format.languageandisAutoGenerated: which caption track you got. Without a target language you get the video's original language, never an auto-translated track.- Turn on List available languages to also get every caption track the video offers.
Pricing
2 USD per 1,000 transcripts. You pay only when a transcript comes back. A video with no captions, a private video or a bad link returns an error row, and error rows are free. No monthly fee, no charge for the Apify platform usage on top.
Example: the last 100 videos of 10 channels (1,000 videos) costs 2 USD at most, less if some of them have no captions.
Good to know
- It reads the captions YouTube already has, manual or auto-generated. It does not run speech-to-text, so a video without any captions comes back as
NO_TRANSCRIPT. - It does not translate. If the language you asked for isn't on the video you get
LANGUAGE_NOT_AVAILABLE; turn on List available languages to see what exists. - Age-restricted and private videos can't be read without a signed-in account, so they come back as errors.
- You don't need a proxy or a YouTube account. Blocking is our problem, not yours.
Use it from n8n, Make or an API
- Small inputs: call
run-sync-get-dataset-itemsand read the items back directly. Set Time budget (seconds) (default 240) to how long you are willing to wait: the actor stops starting new channel/playlist pages and transcript batches before that point and returns what it already has, so you never hit Apify's 300 second run-sync limit and lose the whole run. Anything left unfinished comes back as aTIME_BUDGET_EXCEEDEDrow instead of being silently dropped. - Big inputs: start the run with
POST /v2/acts/vakitek~youtube-transcript/runs, pollGET /v2/actor-runs/<runId>(or addwaitForFinish=60) until the status isSUCCEEDED, then readGET /v2/datasets/<datasetId>/items. Set Time budget (seconds) to0(no limit) for this pattern.
Errors
A bad link never crashes the run. It becomes a row with an error code, and you are not charged for it.
error | What happened | Retry? |
|---|---|---|
NO_CAPTIONS | The video has no captions at all | No |
LANGUAGE_NOT_AVAILABLE | No caption track in the language you asked for | No |
NOT_FOUND | The video, channel or playlist was removed or never existed | No |
AGE_RESTRICTED | Needs a signed-in account | No |
PRIVATE | The video is private | No |
MEMBERS_ONLY | Members-only video, nobody can fetch it without a membership, not charged | No |
NO_RESULTS | The channel or playlist has no videos | No |
INVALID_URL | The line isn't a YouTube video, channel or playlist | No |
INVALID_INPUT | An option value is invalid | No |
PARSE_ERROR | YouTube changed its page and we could not read it; we fix these fast, open an issue | No |
BLOCKED | YouTube refused us for now, even after trying every proxy tier | Yes |
UPSTREAM_ERROR | Something went wrong on YouTube's side or ours | Yes |
UPSTREAM_UNAVAILABLE | Our API was unreachable | Yes |
TIME_BUDGET_EXCEEDED | The time budget ran out before this video, channel or playlist finished | Yes |
Some rows also carry a legacyError field with the old, pre-unification code name (for example NO_TRANSCRIPT, VIDEO_UNAVAILABLE, CHANNEL_NOT_FOUND, PLAYLIST_NOT_FOUND or LOGIN_REQUIRED) so a pipeline still matching on it keeps working while it migrates to error.
Reliability
Success rate, last 30 days: 97.3 % of 72 results across 36 runs (updated 2026-10-10). Failures counted: blocks, errors on our side, and runs that failed or timed out. Not counted: videos with no captions, private or deleted videos, bad links.
FAQ
Can I get every transcript from a channel? Yes. Put the channel in YouTube URLs and set Max videos per channel or playlist to how far back you want to go.
I already use another transcript actor. Do I have to change my code?
Probably not much. We accept videoUrl and targetLanguage as input names too, and the segment format is {start, dur, text}.
Can I call it from my code or from an AI agent? Yes, like any Apify actor: REST API, the Python and JavaScript clients, or the Apify MCP server. The examples are in the API tab.
Can I use the transcripts to train a model? The captions belong to the creators, and YouTube's terms limit automated access. Check your use case against them and the copyright rules where you operate.
Something broke or a field is missing? Open an issue on this page. We read every one and usually answer within a day.