ActorsComparePricingFAQAboutBrowse actors on Apify
YouTube Transcript Scraper icon

Video

YouTube Transcript Scraper: Subtitles, SRT and VTT

YouTube Transcript Scraper is an Apify actor (API) by CheapAPI Labs. Transcripts and subtitles of any video as text, SRT or VTT, with translation. It costs $3.50 per 1,000 transcripts on every Apify plan, billed through your Apify account with no API key. The default standard queue takes minutes; fast mode adds $0.0015 per video ($1.50 per 1,000).

Compared with the most used YouTube transcript actor (about 25,200 users): 1,000 videos with captions costs $3.50 on Free and on Gold here and $10.00 and $7.00 there (Apify Store listing prices, checked September 2026). Apify platform usage is billed on top here.

Our prices updated 30 October 2026; competitor prices as checked in the comparison. 3 Apify users have run this actor (Apify Store count, 30 October 2026).

Free plan$3.50per 1,000 transcripts
Gold plan$3.50per 1,000 transcripts
API keyNot neededbilled by Apify

What does YouTube Transcript Scraper return?

Get the full transcript of any YouTube video (plain text, timestamped segments, SRT or WebVTT) from a link or video ID, in the caption language you prefer, with optional translation into 100+ languages.

One example row from a real run, shortened:

{
  "id": "91562ec09954574c",
  "input": "https://www.youtube.com/watch?v=Y8Wu4rSNJms",
  "videoId": "Y8Wu4rSNJms",
  "videoUrl": "https://www.youtube.com/watch?v=Y8Wu4rSNJms",
  "title": "How to set up BMW eDrive Modes in the New Generation of BMW Plug-In Hybrids",
  "transcriptAvailable": true,
  "language": "it",
  "originalLanguage": "en",
  "isTranslated": true,
  "translatedTo": "it",
  "isAutoGenerated": true,
  "segmentsCount": 30,
  "durationSeconds": 75.12,
  "wordCount": 185,
  "characterCount": 1234,
  "text": "Elettrifica la tua efficienza di guida. La tecnologia ibrida plug-in delle BMW con sistema operativo 8 ti offre il contr ...",
  "segments": [
    {
      "start": 1.12,
      "end": 6,
      "duration": 4.88,
      "text": "Elettrifica la tua efficienza di guida. La tecnologia"
    },
    {
      "start": 3.679,
      "end": 8.48,
      "duration": 4.801,
      "text": "ibrida plug-in delle BMW con"
    }
  ],
  "srt": "1\n00:00:01,120 --> 00:00:06,000\nElettrifica la tua efficienza di guida. La tecnologia\n\n2\n00:00:03,679 --> 00:00:08,480\nibrida plug-in delle BMW con\n...",
  "requestedLanguages": [
    "de",
    "en"
  ],
  "matchedLanguage": "en",
  "languageUnavailable": false,
  …
}

Which fields do you get?

One row per video. The fields marked "when selected" depend on Output formats.

Field Type Example
id string 91562ec09954574c (stable: same video + delivered language = same ID in every run)
input string https://www.youtube.com/watch?v=Y8Wu4rSNJms
videoId string Y8Wu4rSNJms
videoUrl string https://www.youtube.com/watch?v=Y8Wu4rSNJms
title string / null How to set up BMW eDrive Modes in the New Generation of BMW Plug-In Hybrids
transcriptAvailable boolean true
language string / null it (language of the delivered text)
originalLanguage string / null en (language of the captions on YouTube)
isTranslated boolean true
translatedTo string / null it
isAutoGenerated boolean / null true (automatic captions, detected from caption timing)
segmentsCount integer 30
durationSeconds number 75.12 (end of the last caption line)
wordCount / characterCount integer 185 / 1234
text string Elettrifica la tua efficienza di guida. La tecnologia ibrida plug-in ... (when selected)
segments array [{ "start": 1.12, "end": 6, "duration": 4.88, "text": "..." }] (when selected)
srt string 1\n00:00:01,120 --> 00:00:06,000\n... (when selected)
vtt string WEBVTT\n\n00:00:01.120 --> 00:00:06.000\n... (when selected)
requestedLanguages array / null ["de", "en"] (your language list, null when empty)
matchedLanguage string / null en (the language from your list that was delivered)
languageUnavailable boolean false (true = none of your languages existed, default captions delivered)
requestedTranslation string / null it
country string US
collectedAt / scrapedAt ISO date (collectedAt can be null) 2026-09-28T15:53:26.688Z (collectedAt = when the captions were collected, scrapedAt = when this run started)
reason string No captions found for this video (only on rows with transcriptAvailable: false)

Always filled when transcriptAvailable is true: id, input, videoId, videoUrl, transcriptAvailable, isTranslated, segmentsCount (at least 1), durationSeconds, wordCount, characterCount, languageUnavailable, country, scrapedAt, and every format you selected (text, segments, srt, vtt). Can be null: title, language and originalLanguage (when the caption language is not reported), translatedTo (no translation), isAutoGenerated (fewer than 4 caption lines), requestedLanguages, matchedLanguage and requestedTranslation (when you did not set them, or no language on your list was available), and collectedAt.

Rows for videos without a transcript (only when Include videos without a transcript is on) contain id, input, videoId, videoUrl, title, transcriptAvailable: false, a reason, requestedLanguages, requestedTranslation and scrapedAt.

How much does YouTube Transcript Scraper cost?

You pay per event, through your Apify account. Main price: $3.50 per 1,000 transcripts on every Apify plan. Every event and plan:

Price per event in USD by Apify plan. Platinum and Diamond pay the Gold price. Apify platform usage: billed separately by Apify.
EventFreeBronzeSilverGold
Video transcriptOne YouTube video whose transcript was delivered to the dataset (full text, timestamped segments and any SRT/VTT formats you choose).$0.0035$0.0035$0.0035$0.0035
Fast processing add onOptional. Charged only when you choose "Fast processing (about 1 minute)": once per video lookup (with the transcript, the video checked fee or each extra lookup). Standard processing (usually a few minutes) has no add on.$0.0015$0.0015$0.0015$0.0015
Video checked (no transcript)Charged once for a video that was looked up but has no transcript to deliver: no captions, none in your languages, or no data for the video (private, removed). Invalid links and lookups that fail on our side are free.$0.0033$0.0033$0.0033$0.0033
Extra language lookupCharged for each additional lookup made because a video lacks the first language on your Transcript languages list (the next language, or its default captions). With an empty list every video is a single lookup; with 1-3 languages a video needs 2-4 lookups at most.$0.0033$0.0033$0.0033$0.0033

How do I call YouTube Transcript Scraper API from code?

Every run is one HTTP request to the Apify API with your Apify token; the input below is the actor's own example. This actor usually runs for minutes, so start a run and fetch its dataset when it finishes (or use a webhook).

# start a run (this actor's standard queue takes minutes), then read its dataset
curl -X POST "https://api.apify.com/v2/acts/cheapapi~youtube-transcript-scraper/runs" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"videos":["https://www.youtube.com/watch?v=aircAruvnKk"],"outputFormats":["text","segments"],"processingSpeed":"standard"}'

With the JavaScript client:

import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('cheapapi/youtube-transcript-scraper').call({
  "videos": [
    "https://www.youtube.com/watch?v=aircAruvnKk"
  ],
  "outputFormats": [
    "text",
    "segments"
  ],
  "processingSpeed": "standard"
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

How does YouTube Transcript Scraper compare with alternatives?

Price for 1,000 videos with captions on the Apify Free plan and on Gold (Platinum and Diamond pay the Gold price for this Actor). The alternatives' prices are as listed and add no platform usage on top. This Actor does: Apify platform usage is billed separately by Apify on top of the prices shown ("+ usage"; see Pricing for typical amounts). Features as described in each Actor's public input and README.

Alternative Free plan Gold plan Channel / playlist input SRT + VTT Language priority list Translation Videos without captions free
Most used YouTube transcript Actor (~25,200 users, one video per run) $10.00 $7.00 ✗ ✗ ✗ one target language not stated
Second most used transcript Actor (~11,700 users) $5.00 $5.00 channel ✗ ✗ ✗ ✓
Third most used transcript Actor (~8,500 users; optional video metadata) $7.00 $5.00 ✗ ✗ (XML or text) ✗ (English preferred) ✗ not stated
Fourth most used transcript Actor (~8,200 users) $10.00 $10.00 ✗ ✗ ✗ ✗ not stated
Low cost Actor (~2,500 users) $1.00 + $0.00005 per run $0.70 + $0.00005 per run channel, playlist, search ✓ (one format per run) ✓ ✓ not stated
Cheapest per video Actor (~4,100 users, max 100 transcripts per run) about $0.02 about $0.02 channel ✓ ✓ ✓ ✓ (except a $0.00001 row fee)
This Actor $3.50 + usage $3.50 + usage ✗ (two step recipe below) ✓ (all formats in one run) ✓ (up to 3) ✓ (100+ languages) ✗ ($0.0033 per video checked)

Prices from public Apify Store listings, checked September 2026 (the four most used Actors charge the same on Platinum and Diamond as on Gold). With the optional Fast processing add on this Actor costs $5.00 per 1,000 plus usage, which is not cheaper than the second most used Actor ($5.00) or the third one on Gold ($5.00).

To be clear: several smaller Actors are much cheaper per video than this one (the two in the table cost $0.02 to $1.00 per 1,000, and others with 1,000 to 2,500 users charge about $0.70 to $1.00 per 1,000, some plus a start fee), and three Actors in the table (the second most used one and both low cost ones) accept a channel link directly, which this Actor does not. What this Actor offers is an event fee 30% or more below the four most used transcript Actors ($3.50 vs $5.00 to $10.00 per 1,000; platform usage is extra here, so the real difference depends on your run), all four output formats in the same row, a language priority list with matchedLanguage / languageUnavailable on each row, translation into 100+ languages, up to 10,000 videos per run, and a clean stop at your maximum cost per run. Unlike two of the Actors above, videos without captions are not free here ($0.0033 per video checked): every lookup is a real, paid request for us whether or not captions exist, so it is charged at cost covering price instead of being hidden in a higher per transcript price. If you mainly need the lowest price per video or channel input in one step, a cheaper Actor may suit you better.

What is it used for?

  • AI and LLM pipelines: summarize videos, build RAG knowledge bases, generate notes or quizzes from lectures.
  • Content repurposing: turn videos into blog posts, newsletters, show notes and social posts.
  • SEO and research: analyze what competitors say in their videos, mine keywords and topics at scale.
  • Subtitles and localization: export SRT/VTT files and translate captions into other languages.
  • Media monitoring: track mentions of brands, products or people across many videos.
  • Accessibility and archiving: keep searchable text copies of your own video library.

What is not included?

  • No AI transcription for videos without captions. The Actor reads the captions YouTube already has (uploaded or automatic). Videos with no captions return no transcript; the lookup costs $0.0033 (video-checked).
  • No video metadata beyond the title. Channel name, upload date, view, like and comment counts are not included. Get them with our YouTube Search Scraper.
  • No channel, playlist or keyword input. This Actor can't list a channel's uploads or a playlist's videos by itself. Use the two step recipe under Transcripts for a channel, playlist or keyword.
  • No comments. Use our YouTube Comments Scraper.
  • No list of available caption languages without fetching a transcript.

What are the limits?

  • isAutoGenerated is detected from caption timing, not read from YouTube, and may be wrong for unusual caption files.
  • Translations are machine translations provided by YouTube.
  • The language list accepts up to 3 languages.
  • Private, members only and removed videos can't be processed. Region restricted videos may need the right Country.
  • Standard processing usually takes a few minutes and can take up to ~45 minutes at peak times (transcripts are saved as they arrive). Choose Fast processing (paid add on) if you need results in about a minute.
  • Only new videos remembers up to 100,000 delivered videos per store and language setting; videos without a transcript are not remembered and are checked (and charged) again.

Questions about YouTube Transcript Scraper

Is there a limit on the Apify Free plan, and is platform usage included?

Free plan: up to $0.25 of this Actor's results per calendar month, enough to try it. Apify pays developers nothing for Free plan usage while our data costs are real, so this keeps the Actor sustainable. Runs that reach the allowance stop cleanly and keep everything collected so far; the allowance resets on the 1st of the month. Any paid Apify plan has no limit. Platform usage (compute) is not included on any plan: Apify bills it separately. At the default 256 MB a small run typically uses about $0.001 to $0.005; a standard run that waits longer uses roughly $0.005 to $0.01 per 5 minutes. Each run's usage is shown in Apify Console.

Is it legal to scrape YouTube transcripts?

The Actor collects captions that YouTube shows publicly to every visitor. You are responsible for how you use the text: respect copyright, YouTube's terms and privacy law (e.g. GDPR) in your use case. When in doubt, ask a lawyer.

How fresh is the data?

Every transcript is collected live when you run the Actor. collectedAt shows when.

How long does a run take?

Standard processing usually delivers results within a few minutes (up to ~45 minutes at peak times). You don't have to wait for the whole run: each transcript is saved to the dataset as soon as it is ready, and the log shows how many are ready with an estimate of the time left. With Fast processing most runs finish in about 1 minute. Each fallback language round adds roughly the same time again, but only for the videos that need it.

Why did I get fewer results than videos?

Some videos have no captions at all (captions disabled, music without lyrics, very new uploads), are private, age restricted or removed, or the maximum cost per run was reached. They are listed with a reason in RUN_SUMMARY (or as rows when Include videos without a transcript is on).

What happens when a video doesn't have my language?

The Actor tries the next language on your Transcript languages list. If the video has none of them, you get its default captions with languageUnavailable: true and matchedLanguage: null, so you can filter those rows. To always get text in your language, also set Translate to.

Why was I charged video-checked or extra-lookup? Do I pay for videos without a transcript?

Yes, a little. video-checked ($0.0033) is charged once for each video that was looked up but has no transcript to deliver (no captions, none in your languages, or no data for the video): checking a video costs us the same whether or not it has captions, and charging that lookup separately keeps the transcript price low instead of spreading the cost over every delivered transcript. Invalid links, videos skipped by Only new videos and videos not requested because of your maximum cost are free. extra-lookup ($0.0033) is charged for each additional lookup made because a video lacks the first language on your Transcript languages list. RUN_SUMMARY shows videosCheckedCharged, extraLookupsCharged and languageFallbackRequests. To avoid extra lookups, leave Transcript languages empty (default captions) or put the language most of your videos have first, and use Translate to for everything else.

How do I control my spending?

Set Maximum cost per run in the run options, or use Max videos to cap a long list. The run stops before the limit and RUN_SUMMARY shows stoppedByBudget: true.

Can I scrape a whole channel or playlist, or monitor one regularly?

Not directly: this Actor needs video links or IDs. Our YouTube Search Scraper can find a channel's recent videos by searching for its name, but that is not a guaranteed complete list (see Transcripts for a channel, playlist or keyword). To monitor, schedule a YouTube Search Scraper run and chain this Actor with a webhook or a Make/Zapier scenario, with Only new videos on: videos already delivered by an earlier run are skipped before any request and cost nothing. Use a separate Processed videos store name per channel or project. Each row's id also stays the same across runs for the same video and language, so you can deduplicate on id when you store results.

Which export formats are available?

JSON, JSONL, CSV, Excel, XML, HTML and RSS from the dataset. SRT and VTT files come as strings in each row; save them as .srt / .vtt.

Where do I get help?

Open an issue on the Actor's Issues tab in Apify Console. We read and answer every issue.

Run YouTube Transcript Scraper on Apify

The form opens with a working example. Free Apify accounts get a small monthly allowance.

Open on Apify