# YouTube Subtitles and Transcript Scraper

> YouTube transcript scraper: get public captions as full text and timed segments in JSON. Pick a language. $0.008 per transcript, no login needed.

URL: https://cliqtomedia.com/actors/youtube-transcript-scraper/

Category: Video, audio & streaming · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/youtube-transcript-scraper?fpr=cliqto

Paste a YouTube link. You get the words of the video as text, from its public subtitles.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `jNQXAC9IVRw` in YouTube video IDs or links. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

Get public YouTube subtitles and full transcripts as text and timed segments. Add a video ID or link, choose a language, and export one selected caption track as JSON.





## Price

Pay per event. Apify bills you, not us.

| What you pay for | Price | When |
|---|---|---|
| Complete transcript | $0.008 | One complete public caption transcript saved to the default Dataset. |
| Start fee | $0.053 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |

- One transcript: about $0.06.
- 1,000 transcripts: about $18.60 (200 runs of up to 5).
- Every day 100 transcripts, for 30 days: about $55.80 a month (20 runs a day).
- 5 transcripts once a week (4 runs a month): about $0.37 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Prices checked on 24 October 2026. Current price: https://apify.com/cliqtomedia/youtube-transcript-scraper?fpr=cliqto

## Questions

### Does it make text from the audio?

No. It copies the subtitles that the video already has on YouTube. If a video has no subtitles, use our [Audio & Podcast Transcriber](/actors/audio-video-transcriber/). It turns speech into text.

### Do I need a YouTube account?

No. The tool reads only public videos and their public subtitles.

### Can I get several languages for one video?

No. You get one subtitle language per video. You can list a few languages, and the tool takes the first one the video has.

### Do I pay for videos without subtitles?

There is no transcript fee for them: you pay the transcript fee only when the tool saves a full transcript. The small start fee of the run is paid once per run, whatever the videos have.

### Can I paste a channel or a playlist?

No. Paste links to single videos, up to 5 in one run.

### Is the text complete?

You get all the subtitles that YouTube has for the language you chose, with the time of each part. If the subtitles on YouTube miss some words, the text misses them too.

## Data fields

- `schemaVersion` (string)
- `workKey` (string)
- `status` (string)
- `complete` (boolean)
- `inputIndexes` (array)
- `normalizedInput` (string)
- `videoId` (string)
- `canonicalUrl` (string)
- `scrapedAt` (string)
- `source` (object)
- `catalogCompleteness` (string)
- `availableTracks` (array)
- `selection` (object)
- `track` (object)
- `segments` (array)
- `text` (string)
- `segmentCount` (integer)
- `textLength` (integer)
- `serializedBytes` (integer)
- `error` (object)
- `attempts` (integer)

## Input settings

- `videoUrls` (array, required): Add 1 to 5 video IDs or links to get available public subtitles and transcripts. Normal videos, youtu.be links, Shorts, and live links are accepted.
- `preferredLanguages` (array): Add language codes such as en, es, or de. The Actor tries them from top to bottom.
- `languageFallback` (string): Stop, try a close base language, or use the first allowed subtitle track.
- `captionPreference` (string): Choose manual subtitles, auto-generated subtitles, or the type to try first.
- `translateTo` (string): Optional language code for translated subtitles offered by YouTube. Leave this field empty for no translation. This is not AI translation.

## Step by step on Apify

1. Open the Actor's Input form in Apify Console.
2. A fresh form offers the public demo video `jNQXAC9IVRw` in YouTube video IDs or links (`videoUrls`). You can replace it with a direct video ID or link.
3. Keep the defaults: English (`preferredLanguages: ["en"]`), `FIRST_AVAILABLE`, and `MANUAL_FIRST`. You can change these settings.
4. Click Start. Open Subtitle and transcript results when the run ends.
5. Check `status`, `complete`, `text`, `segments`, and `track`. Open Run summary if any video has an error or did not finish.

## Use cases

| Task | Main input | Result to use |
|---|---|---|
| Search or index subtitle text | `videoUrls` | `text`, `videoId`, `track.effectiveLanguageCode` |
| Link text to moments in a video | `videoUrls` | `segments[].startSeconds`, `segments[].durationSeconds`, `segments[].text` |
| Choose manual or generated captions | `captionPreference` | `track.sourceIsGenerated`, `selection.reason` |
| Try other public languages | `preferredLanguages`, `languageFallback` | `track.effectiveLanguageCode`, `availableTracks` |
| Request an offered YouTube translation | `translateTo` | `track.isTranslated`, `track.translationTarget` |

## Tips

- List several languages in order; the first available one is used.
- Set the caption type to skip auto-generated captions.
- Use the start time of each part to link to a moment.

## Limits





## Sample result

The words of the video are at the end of the box, in `segments` → `text`. Scroll down inside the box to see them.

```json
{
  "schemaVersion": "1.0",
  "workKey": "video:jNQXAC9IVRw",
  "status": "SUCCEEDED",
  "complete": true,
  "inputIndexes": [
    0
  ],
  "normalizedInput": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
  "videoId": "jNQXAC9IVRw",
  "canonicalUrl": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
  "scrapedAt": "2026-10-10T00:52:57.102Z",
  "source": {
    "library": "youtube-transcript-api",
    "libraryVersion": "1.2.4",
    "transport": "UNOFFICIAL_PUBLIC_WEB",
    "proxyMode": "APIFY_RESIDENTIAL"
  },
  "catalogCompleteness": "NORMALIZED_UNIQUE_LANGUAGE_KIND",
  "availableTracks": [
    {
      "trackKey": "manual:de",
      "languageCode": "de",
      "languageName": "German",
      "kind": "MANUAL",
      "isTranslatable": false
    },
    {
      "trackKey": "manual:en",
      "languageCode": "en",
      "languageName": "English",
      "kind": "MANUAL",
      "isTranslatable": false
    }
  ],
  "selection": {
    "preferredLanguages": [
      "en"
    ],
    "languageFallback": "FIRST_AVAILABLE",
    "captionPreference": "MANUAL_FIRST",
    "matchedPreference": "en",
    "matchType": "EXACT",
    "fallbackUsed": false,
    "reason": "EXACT_LANGUAGE_MANUAL_PREFERRED"
  },
  "track": {
    "trackKey": "manual:en",
    "sourceLanguageCode": "en",
    "sourceLanguageName": "English",
    "effectiveLanguageCode": "en",
    "sourceIsGenerated": false,
    "isTranslated": false,
    "translationTarget": null,
    "isTranslatable": false,
    "availableTranslationLanguages": []
  },
  "segments": [
    {
      "sequence": 0
    }
  ]
}
```

## Use it from code

Actor ID: `cliqtomedia/youtube-transcript-scraper`

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/youtube-transcript-scraper").call(run_input={
    "videoUrls": [
        "jNQXAC9IVRw"
    ],
    "preferredLanguages": [
        "en"
    ]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```bash
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~youtube-transcript-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"videoUrls": ["jNQXAC9IVRw"], "preferredLanguages": ["en"]}'
```

```python
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/youtube-transcript-scraper")
result = tool.invoke({"run_input": {"videoUrls": ["jNQXAC9IVRw"], "preferredLanguages": ["en"]}})
print(result)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Use cases with this tool

- [One piece of content, ten new posts](https://cliqtomedia.com/actors/use-cases/content-repurposing/): Turn videos, podcasts, PDFs and articles into clean text. Make posts, notes and AI drafts from it.

## Similar tools

- [YouTube Comments Scraper](https://cliqtomedia.com/actors/youtube-comments-scraper/)
- [Apple Podcast Directory & RSS Contacts Scraper](https://cliqtomedia.com/actors/podcast-directory-rss-contacts-scraper/)
- [Audio & Podcast Transcriber (Speech to Text)](https://cliqtomedia.com/actors/audio-video-transcriber/)
- [Social Video Downloader: TikTok, Instagram, X - No Login](https://cliqtomedia.com/actors/social-video-downloader/)
- [YouTube Search Results Scraper — No Login](https://cliqtomedia.com/actors/youtube-search-scraper/)
- [Kick Live Streams & Viewer Count (Official API), No Login](https://cliqtomedia.com/actors/kick-channels/)
