# 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. 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.

- Page: https://cheapapilabs.com/actors/youtube-transcript-scraper/
- Run on Apify: https://apify.com/cheapapi/youtube-transcript-scraper
- Publisher: CheapAPI Labs (Apify username cheapapi)
- Main price: $3.50 per 1,000 transcripts on Free, $3.50 on Gold
- Our prices updated: 2026-10-30

## Prices per event (USD)

| Event | Free | Bronze | Silver | Gold |
|---|---:|---:|---:|---:|
| Video transcript | $0.0035 | $0.0035 | $0.0035 | $0.0035 |
| Fast processing add on | $0.0015 | $0.0015 | $0.0015 | $0.0015 |
| Video checked (no transcript) | $0.0033 | $0.0033 | $0.0033 | $0.0033 |
| Extra language lookup | $0.0033 | $0.0033 | $0.0033 | $0.0033 |

Platinum and Diamond pay the Gold price. Apify platform usage: billed separately by Apify.

## Call it from code

```bash
# 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"}'
```

## Example output row

```json
{
  "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,
  …
}
```

## Fields

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`.

## Compared 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.

## 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](https://cheapapilabs.com/actors/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](https://cheapapilabs.com/actors/youtube-comments-scraper/).
- **No list of available caption languages** without fetching a transcript.

## 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.

## FAQ

**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](https://cheapapilabs.com/actors/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.
