YouTube Transcript Scraper - Bulk, No Browser
Pricing
from $5.00 / 1,000 transcript delivereds
YouTube Transcript Scraper - Bulk, No Browser
Transcripts from YouTube videos, playlists and channels, charged only when a transcript is actually delivered. No browser, so a run finishes in seconds. Benchmarked 45/45 videos with zero failures. Every video that cannot be fetched says exactly why instead of disappearing from the output.
Pricing
from $5.00 / 1,000 transcript delivereds
Rating
0.0
(0)
Developer
Halil Erdogan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
Share
YouTube Transcript Scraper pulls transcripts from YouTube videos, playlists and channels in bulk. Paste a list of watch links, youtu.be links, Shorts, playlist URLs, @channel handles or bare video IDs, press Start, and get each video back as clean text, timestamped segments or an SRT subtitle file.
The price is $5.00 per 1,000 transcripts delivered. A video that has no usable captions still gets its own row that says why, and that row is free.
What does YouTube Transcript Scraper do?
It reads the caption tracks YouTube already publishes for a video and turns them into data you can use. There is no browser inside: the Actor asks YouTube's caption endpoints over plain HTTP, so there is no Chrome instance to start and a small batch usually finishes in seconds.
- Bulk input. One line per video, playlist or channel. A playlist or channel URL is expanded into its videos automatically.
- Three output formats. Plain text for an LLM or a RAG pipeline, timestamped segments for search and alignment, or an SRT file for subtitle work. Or all three in the same row.
- Language control. List the languages you want in order (
en,es,tr...). The first one the video actually has wins. If none of them exists, the Actor can ask YouTube to translate a track it does have. - Auto-generated captions included. Most videos only have machine captions, so they are accepted by default. Switch this off if you need human-written captions only.
- Title, channel and duration at no extra cost. They come from the same response as the caption list, so there is no second request per video.
- No silent gaps. Captions switched off, an age gate, a private or deleted video: each one comes back as a row with
ok: falseand a plain-English reason inerror. You never have to compare your input list with your output to find out what went missing.
Because it runs on the Apify platform, you also get the usual tools around it: the API, scheduled runs, saved tasks, webhooks, and exports to JSON, CSV or Excel from the Output tab.
Who is it for?
- AI and data teams who feed video content into LLMs, embeddings or RAG pipelines and need clean text in volume.
- Researchers and analysts who study what a channel, a topic or a whole playlist says over time.
- Content and SEO teams who turn talks, interviews and tutorials into articles, show notes or quotes.
- Subtitle and accessibility work, where an SRT file with the original cue timings is the starting point.
- Caption audits, where the question is which videos in a list have captions at all, in which language, and whether they are auto-generated.
How to scrape YouTube transcripts
- Open the Actor in Apify Console. Sign in, or create a free Apify account; the free plan's monthly credit covers a first batch (see the pricing section).
- Paste your links into YouTube URLs on the Input tab, one per line. Videos, playlists, channels and bare IDs can be mixed in one list.
- Pick your languages in Preferred languages, in order of preference. Leave the field empty to get each video in the language it is spoken in.
- Choose an output format. Plain text is the default; Timestamped segments, SRT subtitles and All three are the other options.
- Set a limit for playlists and channels in Max videos per playlist or channel (default 50). Single video URLs are never limited.
- Click Start. Leave Parallel requests and Proxy on their defaults; they are the settings the benchmark below was measured on.
- Open the Output tab when the run finishes. Each video is one row. Click Export to download JSON, CSV or Excel, or read the dataset through the API.
Tip: save the input as a task if you run the same list every week, then attach a schedule to it.
Input
| Field in Console | JSON key | Type | Default | What it does |
|---|---|---|---|---|
| YouTube URLs | urls | array | (required) | Videos, playlists, channels or bare video IDs, one per line |
| Preferred languages | languages | array | ["en"] prefilled | Two-letter codes in order of preference. Empty = the language the video is spoken in, with English as the fallback when YouTube states no language |
| Accept auto-generated captions | allowAutoGenerated | boolean | true | Most videos have nothing else. Turn off for human-written captions only |
| Translate if the language is missing | allowTranslation | boolean | true | Ask YouTube to translate an available track into your first language |
| Output format | outputFormat | string | text | text, segments, srt or all |
| Include title, channel and duration | includeVideoMetadata | boolean | true | Costs nothing extra |
| Max videos per playlist or channel | maxVideosPerSource | integer | 50 | 1 to 1,000. Applies to playlist and channel URLs only |
| Parallel requests | concurrency | integer | 10 | 1 to 30. Lower it if YouTube starts refusing requests |
| Proxy | proxyConfiguration | object | Apify Proxy, residential | Leave as it is |
Example input:
{"urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","https://www.youtube.com/@TED"],"languages": ["en"],"allowAutoGenerated": true,"allowTranslation": true,"outputFormat": "text","includeVideoMetadata": true,"maxVideosPerSource": 50}
Output
Each video becomes one row in the run's dataset. The field names below are exactly the ones the Actor writes; the values in the example are shortened and only illustrate the shape of a row.
[{"videoId": "dQw4w9WgXcQ","url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)","channel": "Rick Astley","language": "en","languageName": "English","isGenerated": false,"segmentCount": 61,"wordCount": 480,"durationSeconds": 213,"ok": true,"error": null,"text": "<the whole transcript as one plain-text string>"},{"videoId": "xxxxxxxxxxx","url": "https://www.youtube.com/watch?v=xxxxxxxxxxx","ok": false,"error": "the uploader disabled captions on this video"}]
| Field | Meaning |
|---|---|
videoId, url | The video the row belongs to |
title, channel, durationSeconds | Video metadata, when Include title, channel and duration is on |
language, languageName | The caption track that was delivered |
isGenerated | true when the track is YouTube's automatic captions |
segmentCount, wordCount | Size of the transcript |
ok, error | ok: true means a transcript was delivered; otherwise error says why not |
text | The transcript as plain text (formats text and all) |
segments | The caption cues with their own timestamps (formats segments and all) |
srt | A ready SRT subtitle file as text (formats srt and all) |
A failed row keeps its place in the dataset; fields that could not be read may be empty. The run also writes a RUN_STATS record to its key-value store with the number of videos, transcripts delivered and failures.
How much does it cost to get YouTube transcripts?
This Actor uses Apify's pay-per-event pricing. You pay a fixed price for two events, and the platform usage of the run is not billed on top:
| Event | Price | When it is charged |
|---|---|---|
transcript | $0.005 ($5.00 per 1,000) | Once per video whose transcript is delivered |
apify-actor-start | $0.001 | When a run starts; one event per GB of memory, minimum one. At the default 512 MB that is one event |
Videos that fail are free: no transcript, no charge.
Some examples at the default settings:
| Batch | Transcripts delivered | You pay |
|---|---|---|
| 100 videos in one run | 100 | $0.50 + $0.001 = $0.501 |
| 1,000 videos in one run | 1,000 | $5.00 + $0.001 = $5.001 |
| 1,000 videos, 50 have captions switched off | 950 | $4.75 + $0.001 = $4.751 |
| 10,000 videos split into 10 runs | 10,000 | $50.00 + $0.01 = $50.01 |
Is it free to try?
Apify's free plan comes with $5 of platform credit every month, and pay-per-event charges are paid from that credit. At $0.005 per transcript, $5 covers up to 999 transcripts in a single run.
Can I cap what a run costs?
Yes. Set Maximum cost per run under Run options in Console, or pass maxTotalChargeUsd when you start the run through the API. Apify's documentation states that the Actor stops gracefully at that limit and that you are never charged for events beyond it.
Limits you should know about
Most of these come from YouTube, not from the Actor.
- Captions switched off. Some uploaders disable captions. There is nothing to fetch; the row says so.
- Age-restricted videos need a signed-in session. The Actor does not sign in, so these come back as failed rows.
- Private, deleted and region-blocked videos are reported as such.
- No track in your languages. If translation is off and none of your languages exists, the video is reported rather than returned in another language.
- Very large batches can be throttled. If a long run starts returning block errors partway through, split the list into smaller runs. The error rows show the moment it happens, and they are not charged.
- Auto-captions have no punctuation and can misread names. That is how YouTube produces them.
- Timestamps belong to the caption cue, not to the individual word.
- Up to 1,000 videos per playlist or channel URL (
maxVideosPerSource). Add more lines for more sources. - Run length. A run's default timeout is one hour (3,600 seconds) with 512 MB of memory. For very large lists, raise the timeout in Run options or split the list.
Measured results
Benchmark on 5 September 2026 (build 0.2.5), default settings: three channels (TED, Veritasium, BBC News), 45 videos, 45 transcripts, 0 failures, 24 seconds. The median transcript was 2,403 words; 22 tracks were auto-generated and 23 human-written; 44 were in English and one in Arabic.
Forty-five videos is a benchmark, not a guarantee. Disabled captions, age gates and region blocks will still fail on your own lists, and each failure will tell you which one it was. Keep the default proxy and concurrency settings: they are what this number was measured on, and lowering them to save cost lowers the success rate with it.
Use the YouTube transcript API
Every run can be started from your own code. The quickest way is one HTTP call that starts the Actor, waits for it and returns the dataset:
curl -X POST \"https://api.apify.com/v2/actors/hllerdgn80~youtube-transcript-batch/run-sync-get-dataset-items" \-H "Authorization: Bearer <YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"], "languages": ["en"]}'
This synchronous endpoint returns HTTP 408 if the run takes longer than 300 seconds. For long lists, start the run asynchronously and read the dataset when it finishes. The Python client does both in two lines:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("hllerdgn80/youtube-transcript-batch").call(run_input={"urls": ["https://www.youtube.com/@TED"], "maxVideosPerSource": 100})for row in client.dataset(run.default_dataset_id).iterate_items():print(row["videoId"], row["ok"], row.get("wordCount"))
The API tab on this page has ready-made JavaScript, Python and CLI examples and the OpenAPI definition. Your API token is in Console under Settings > API & Integrations; send it in the Authorization header rather than in the URL.
Integrations: Make, Zapier, n8n and MCP
- Make: add the Apify Run an Actor module, then Get Dataset Items, then for example Google Sheets Create Spreadsheet Rows. The Watch Actor Runs trigger works for scheduled runs.
- Zapier: use the Finished Actor run trigger, or the Run Actor action followed by Fetch dataset items.
- n8n: install the Apify node (
@apify/n8n-nodes-apifyon self-hosted n8n, or from the node registry on n8n Cloud) and pick the Actor in the node. - AI agents through MCP: point your MCP client at
https://mcp.apify.com?tools=hllerdgn80/youtube-transcript-batchand the agent gets this Actor as a tool. - Webhooks and schedules: run the same list every day and have Apify call your endpoint when the run succeeds or fails.
FAQ
Does it need a YouTube API key or a Google login?
No. There is no field for a key or a login, and the Actor does not ask for one. That is also why age-restricted videos, which need a signed-in session, come back as failed rows.
Does it work with auto-generated captions?
Yes, and by default it accepts them, because most videos have no other track. isGenerated tells you which kind each row contains.
Which languages can I get?
Any language the video has a caption track in, requested by its two-letter code. If your language is missing and Translate if the language is missing is on, the Actor asks YouTube for a translated track in your first language.
Am I charged for videos that fail?
No. Only rows with a delivered transcript trigger the transcript event. Failed rows are in the dataset so you can see them, and they cost nothing.
How many videos can I process in one run?
Single video URLs have no limit in the input. Playlist and channel URLs are capped by Max videos per playlist or channel, up to 1,000 each. For very large jobs, several smaller runs are more reliable than one huge run, because YouTube may start refusing requests partway through.
Why is a transcript missing punctuation or getting names wrong?
It is almost certainly an auto-generated track. YouTube's automatic captions come without punctuation and can mishear proper names. Turn off Accept auto-generated captions if you only want human-written tracks, and expect fewer results.
Can I get the transcript with timestamps?
Yes. Choose Timestamped segments for the caption cues with their timings, SRT subtitles for a subtitle file, or All three.
Is it legal to scrape YouTube transcripts?
The Actor only reads captions that YouTube makes publicly available for a video. What you do with the text is your responsibility: transcripts belong to the people who made the videos, and YouTube's terms and copyright law still apply. If you plan commercial reuse, check with a lawyer.
Other Actors from the same developer
- YouTube Channel Contact Finder: business e-mail addresses that creators publish on their YouTube channels, charged per e-mail delivered.
- Podcast Contact Finder: owner e-mail addresses from podcast RSS feeds, found by topic or from Apple Podcasts links.
- App Developer Contact Finder: developer contact e-mails from Google Play listings.
Support and feedback
Found a video that should have worked, or a message in error that doesn't make sense? Open a thread in the Issues tab of this page and include the video URL, the input you used and the text of the error field. Issues are public, so the answer helps the next person with the same problem too. Requests for new fields or formats are welcome there as well.
Changelog
- 28 September 2026: the
transcriptevent is priced at $0.005 ($5.00 per 1,000 transcripts) from 11:01 UTC. - September 2026: README rewritten with a step-by-step guide, output example, pricing examples, API and integration notes, and FAQ.
- 7 September 2026: build 0.2.16; pay-per-event pricing switched on.
- 5 September 2026: Actor created; benchmark of 45 videos on build 0.2.5.