YouTube Transcript Scraper - Bulk, No Browser avatar

YouTube Transcript Scraper - Bulk, No Browser

Pricing

from $5.00 / 1,000 transcript delivereds

Go to Apify Store
YouTube Transcript Scraper - Bulk, No Browser

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

Halil Erdogan

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a month ago

Last modified

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: false and a plain-English reason in error. 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

  1. 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).
  2. 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.
  3. 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.
  4. Choose an output format. Plain text is the default; Timestamped segments, SRT subtitles and All three are the other options.
  5. Set a limit for playlists and channels in Max videos per playlist or channel (default 50). Single video URLs are never limited.
  6. Click Start. Leave Parallel requests and Proxy on their defaults; they are the settings the benchmark below was measured on.
  7. 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 ConsoleJSON keyTypeDefaultWhat it does
YouTube URLsurlsarray(required)Videos, playlists, channels or bare video IDs, one per line
Preferred languageslanguagesarray["en"] prefilledTwo-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 captionsallowAutoGeneratedbooleantrueMost videos have nothing else. Turn off for human-written captions only
Translate if the language is missingallowTranslationbooleantrueAsk YouTube to translate an available track into your first language
Output formatoutputFormatstringtexttext, segments, srt or all
Include title, channel and durationincludeVideoMetadatabooleantrueCosts nothing extra
Max videos per playlist or channelmaxVideosPerSourceinteger501 to 1,000. Applies to playlist and channel URLs only
Parallel requestsconcurrencyinteger101 to 30. Lower it if YouTube starts refusing requests
ProxyproxyConfigurationobjectApify Proxy, residentialLeave 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"
}
]
FieldMeaning
videoId, urlThe video the row belongs to
title, channel, durationSecondsVideo metadata, when Include title, channel and duration is on
language, languageNameThe caption track that was delivered
isGeneratedtrue when the track is YouTube's automatic captions
segmentCount, wordCountSize of the transcript
ok, errorok: true means a transcript was delivered; otherwise error says why not
textThe transcript as plain text (formats text and all)
segmentsThe caption cues with their own timestamps (formats segments and all)
srtA 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:

EventPriceWhen it is charged
transcript$0.005 ($5.00 per 1,000)Once per video whose transcript is delivered
apify-actor-start$0.001When 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:

BatchTranscripts deliveredYou pay
100 videos in one run100$0.50 + $0.001 = $0.501
1,000 videos in one run1,000$5.00 + $0.001 = $5.001
1,000 videos, 50 have captions switched off950$4.75 + $0.001 = $4.751
10,000 videos split into 10 runs10,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 ApifyClient
client = 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-apify on 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-batch and 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.

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

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 transcript event 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.