# YouTube Transcript Scraper | Captions API, Bulk, Shorts (`aurelix/youtube-transcript-scraper`) Actor

Extract YouTube transcripts in bulk at $0.90 per 1,000 videos ($0.60 on paid plans) plus a $0.0001 start fee and $0.0001 per hour beyond 3 h. Videos, Shorts, channels, playlists, search terms; YouTube captions as text, timestamps, AI chunks, chapters. No captions, no charge.

- **URL**: https://apify.com/aurelix/youtube-transcript-scraper.md
- **Developed by:** [Aurelix](https://apify.com/aurelix) (community)
- **Categories:** Videos, AI, Social media
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 1,000 transcript results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What is YouTube Transcript Scraper?

**Get the transcripts of YouTube videos, Shorts, channels, playlists or searches (text, timestamps, AI-ready chunks) for $0.90 per 1,000 videos ($0.60 on paid plans), no login. No captions, no charge.**

For AI builders, researchers and content teams. One video comes back in seconds; your preferred caption language with fallback, an auto-generated flag on every row, and a status row (never charged) for videos without a transcript. Your first run with the example input costs about $0.001 (1 video in our test run).

[![YouTube Transcript Scraper: example output from a real run](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/youtube-transcript-scraper-card-v3.png)](https://console.apify.com/actors/Hrdkg8JExchW3dqc6?addFromActorId=Hrdkg8JExchW3dqc6)

[![YouTube Transcript Scraper: 75-second demo video](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/youtube-transcript-scraper-demo-thumb-v1.png)](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/youtube-transcript-scraper-demo-v1.mp4)

**[▶ Watch the 75-second demo](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/youtube-transcript-scraper-demo-v1.mp4)**

| | |
|---|---|
| **Input** | Video URLs or IDs, channels, playlists, search terms |
| **Output** | Transcript text, timestamped segments, AI chunks, chapters, 26 fields incl. a status; JSON, CSV, Excel, API |
| **Languages** | Your preference order, creator captions before auto-generated, automatic fallback |
| **Automate** | Schedules, webhooks, Zapier, Make, n8n, Google Sheets, MCP for AI agents |
| **Price** | $0.90 per 1,000 videos ($0.60 per 1,000 videos on paid Apify plans) |
| **Login needed** | No |

### Daily monitor: only what's new, every morning

Set it once, get only the new videos every morning. With **Only new videos since last run** on, the first run returns everything that matches; each later run skips videos that earlier runs already returned, so you pay only for new ones.

```json
{
  "channels": [
    "https://www.youtube.com/@veritasium",
    "https://www.youtube.com/@mkbhd"
  ],
  "maxVideosPerSource": 10,
  "languages": [
    "en"
  ],
  "incremental": true,
  "stateKey": "two-channels-daily"
}
```

1. Paste this input into the **Input** tab (JSON view) and click **Save as a new task**; it appears under **Saved tasks**.
2. Open the task from **Saved tasks** and click **Schedule**.
3. Choose **Daily**, pick the hour, and save.

**Cost example:** 2 channels, about 1 new video a day ≈ $0.03/month on the free plan ($0.021 on paid plans): one run a day for 30 days, start fee included. The first run returns everything that matches, so it costs more.

Add a Slack incoming-webhook URL in `slackWebhookUrl` (or any URL in `webhookUrl`) to get a short digest of each run's new videos; nothing is sent when a run finds nothing.

### Why YouTube Transcript Scraper users pick this one

- **One video in seconds.** Plain HTTP, no browser start; built for AI agents.
- **Whole channels in one run.** Channels, playlists and search terms, not one video per run.
- **Citations built in.** Every chunk has start and end times and a timestamped link.
- **A tenth of a cent each.** $0.60 per 1,000 on paid plans, $0.0001 start fee.
- **A row for every input.** Missing captions or private videos say why, never charged.

### Get started in 3 steps

1. Paste video links, channel links or @handles, playlist links or search terms, and set how many videos to read per channel, playlist or search.
2. Optionally set your preferred caption languages (e.g. en, es), turn auto-generated captions off, or change the AI chunk size.
3. Click Start, then download JSON, CSV or Excel, or send the transcripts to your vector database, LangChain, LlamaIndex, Zapier, Make or n8n through the API.

**[▶ Try it with the example input](https://console.apify.com/actors/Hrdkg8JExchW3dqc6?addFromActorId=Hrdkg8JExchW3dqc6)**

The form opens with an example input already filled in: that run costs about $0.001 on the free plan.

### How much does it cost to scrape YouTube transcripts?

Pay per event: you pay only for what the run returns, plus a small start fee. Bronze, Silver, Gold and higher Apify plans pay less per result.

| Videos | Free plan | Paid plans (Bronze, Silver, Gold) |
|---|---|---|
| 100 | $0.0901 | $0.0601 |
| 1,000 | $0.90 | $0.60 |
| 10,000 | $9.00 | $6.00 |

Totals include the $0.0001 start fee per run, rounded to the cent (amounts under $0.10 to four decimals). Apify's free plan includes $5 of credit a month, enough for about 5,500 videos.

$0.90 per 1,000 videos ($0.60 on paid Apify plans) plus a $0.0001 start fee per run (at the default 256 MB; Apify charges it per GB of memory), so a single video costs $0.0007 to $0.001. Very long videos add $0.0001 for each full hour beyond the first 3 hours (long-video-hour). Videos skipped for missing captions or because they are private, removed, age-restricted, members-only or live are never charged. The $0.20 residential-retry fee applies only if you turn on 'residentialFallback': at most once per run, and only when a residential IP returned at least one transcript.

#### Billing events

| Event | Free plan | Paid plans (Bronze, Silver, Gold) |
|---|---|---|
| `transcript-result` | $0.90 per 1,000 videos | $0.60 per 1,000 videos |
| `residential-retry` | $0.20 per run (only with residentialFallback on, when a residential IP returned a transcript) | $0.20 per run (only with residentialFallback on, when a residential IP returned a transcript) |
| `long-video-hour` | $0.0001 per hour of video beyond the first 3 hours | $0.0001 per hour of video beyond the first 3 hours |
| `apify-actor-start` | $0.0001 per run | $0.0001 per run |

### Benchmarks: how we compare

| Test | Input | Result | Run time | Peak memory |
|---|---|---|---|---|
| Default input | 1 video | 1 transcript | 2 to 3 s | 48 to 67 MB |
| Single videos, cold start | 8 runs, 1 video each: watch, youtu.be, Shorts, live, embed and mobile links with timestamps | 8 of 8 transcripts | 2 to 5 s | 49 to 59 MB |
| Mixed batch | 20 inputs: every link format, a duplicate, a deleted, an age-restricted, a region-blocked live replay and two caption-less videos | 13 of 13 eligible videos; 6 status rows, not charged | 29 to 34 s | 67 to 69 MB |
| Channels, playlist and searches | 3 channels, 1 playlist, 2 searches, 15 each (90 videos, incl. 6- and 12-hour lectures) | 89 of 89 eligible; 1 without captions | 189 to 225 s | 136 to 153 MB |
| Long playlist | 3Blue1Brown uploads, 247 videos | 247 of 247 transcripts | 220 s | 93 MB |
| Very long videos | 4 streams and lectures of 12 to 26 hours | 4 of 4 transcripts | 55 s | 153 MB |
| Large search run | 3 searches, 40 each (120 videos), English then Spanish preferred | 117 of 117 eligible; 3 without captions | 201 s | 114 MB |
| Daily channel feed | a channel, 5 latest, only-new mode, run twice | 5 transcripts, then 0 new (nothing charged) | 6 s, then 2 s | 46 to 64 MB |
| All final cloud tests | 25 runs on the HTTP route | 476 of 476 eligible videos, every run SUCCEEDED |  |  |

Apify cloud runs at the default 256 MB, one run per row, plain HTTP over Apify datacenter proxy; run times include container start. YouTube refuses many datacenter IPs (70 to 90% at times); the run moves to fresh IPs, which is counted in these times.

### What data you get

**YouTube Transcript Scraper** turns YouTube videos into clean transcripts: give video links (any format, including Shorts, youtu.be and embed links), channels (latest videos), playlists or search terms, and get one row per video with the full transcript as plain text, timestamped caption segments, ready-made chunks for RAG and embeddings, chapters, the caption language and whether it is auto-generated, plus the title, channel, publish date, duration and views. Videos it cannot read get a status row saying why, and are not charged. A single video comes back in a few seconds, so AI agents can call it through Apify's MCP server.

- status (ok, or why there is no transcript: no_captions, unavailable, invalid_input, not_found, no_videos, failed, not_read) and error
- video_id, url, title, channel_name, channel_id, channel_url, channel_handle, published_at (ISO 8601 UTC), duration_seconds, view_count, category, is_live_content
- language, language_name, is_auto_generated, language_fallback, available_languages
- transcript_text and word_count
- segments: \[{start, end, text}] in seconds
- chapters: \[{title, start, end}]; chunks: \[{index, start, end, text, url}]
- source_url, scraped_at

| title | channel_name | published_at | language | is_auto_generated | word_count | transcript_text |
|---|---|---|---|---|---|---|
| Rick Astley - Never Gonna Give You Up (Official Video) (4... | Rick Astley | 2009-10-25T06:57:33Z | en | False | 487 | \[♪♪♪] ♪ We're no strangers to love ♪ ♪ You know the rules... |
| PSY - GANGNAM STYLE(강남스타일) M/V | officialpsy | 2012-07-15T07:46:32Z | ko | True | 194 | 오반 강남 스타일 강남 스타일 낮에는 따로온 인간적인 여자 커피 한 잔에 여유를 아는 품격 있는 여자 ... |
| Fiber Optics are so much cooler than I thought | Veritasium | 2026-10-12T17:11:45Z | en | False | 6412 | - In 1887, a young physics teacher attached a thin glass ... |
| The Fermi Paradox — Where Are All The Aliens? (1/2) | Kurzgesagt – In a Nutshell | 2015-05-06T12:55:55Z | en | True | 1060 | are we the only living things in the entire universe the ... |

One full video record, exactly as a real run returned it (long text and lists shortened here). From a real run:

```json
{
  "video_id": "jNQXAC9IVRw",
  "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
  "title": "Me at the zoo",
  "channel_name": "jawed",
  "channel_id": "UC4QobU6STFB0P71PMvOGN5A",
  "channel_url": "https://www.youtube.com/channel/UC4QobU6STFB0P71PMvOGN5A",
  "channel_handle": "@jawed",
  "published_at": "2005-04-24T03:31:52Z",
  "duration_seconds": 19,
  "view_count": 447765657,
  "category": "Film & Animation",
  "is_live_content": false,
  "language": "en",
  "language_name": "English",
  "is_auto_generated": false,
  "language_fallback": false,
  "available_languages": [
    {
      "language": "en",
      "is_auto_generated": false
    },
    {
      "language": "de",
      "is_auto_generated": false
    }
  ],
  "transcript_text": "All right, so here we are, in front of the elephants the cool thing about these guys is that they have really... really ... [97 more characters]",
  "word_count": 39,
  "segments": [
    {
      "start": 1.2,
      "end": 3.36,
      "text": "All right, so here we are, in front of the elephants"
    },
    {
      "start": 5.318,
      "end": 7.974,
      "text": "the cool thing about these guys is that they have really..."
    },
    {
      "start": 7.974,
      "end": 12.616,
      "text": "really really long trunks"
    },
    "... [3 more]"
  ],
  "chapters": [
    {
      "title": "Intro",
      "start": 0,
      "end": 5
    },
    {
      "title": "The cool thing",
      "start": 5,
      "end": 17
    },
    {
      "title": "End",
      "start": 17,
      "end": 19
    }
  ],
  "chunks": [
    {
      "index": 0,
      "start": 1.2,
      "end": 18.881,
      "text": "All right, so here we are, in front of the elephants the cool thing about these guys is that they have really... really ... [97 more characters]",
      "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw&t=1s"
    }
  ],
  "source_url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
  "scraped_at": "2026-11-04T19:33:36Z"
}
```

### Use cases

- AI developers loading a channel's videos into a vector database for RAG
- Researchers and analysts mining talks, lectures and interviews as text
- Marketers and SEO writers turning videos into articles, summaries and quotes
- AI agents that need a video's transcript through MCP

### Use-case recipes

#### Build a searchable knowledge base from a channel

For AI developers and educators. Put the channel in `channels` and set `maxVideosPerSource`. Embed each entry of `chunks`; each chunk's `url` opens the video at that moment, so an answer can link to the exact spot.

```json
{
  "channels": [
    "https://www.youtube.com/@veritasium"
  ],
  "maxVideosPerSource": 10,
  "languages": [
    "en"
  ],
  "chunkSize": 1000,
  "chunkOverlap": 100
}
```

#### Daily new-video digest in Slack

For marketers and analysts who follow a few channels. Turn on `incremental`, give it a `stateKey`, paste a Slack webhook URL, and schedule the task daily. Each run returns only videos not returned before, and Slack gets the count and the top 10 with links.

```json
{
  "channels": [
    "@mkbhd"
  ],
  "maxVideosPerSource": 5,
  "incremental": true,
  "stateKey": "mkbhd-feed",
  "slackWebhookUrl": "https://hooks.slack.com/services/T000/B000/XXXX"
}
```

#### Research what videos say about a topic

For content researchers. Add search terms and keep the limit small. Sort the rows by `view_count`, then summarise `transcript_text` per video; turn off `includeSegments` when you only need the text.

```json
{
  "searchTerms": [
    "python tutorial"
  ],
  "maxVideosPerSource": 5,
  "includeSegments": false,
  "chunkSize": 0
}
```

#### Turn a course playlist into study notes

For students and trainers. Give the playlist; videos come back in playlist order. Use `chapters` as section headings and `segments` to quote the exact time of each point.

```json
{
  "playlists": [
    "https://www.youtube.com/playlist?list=PLFs4vir_WsTwEd-nJgVJCZPNL3HALHHpF"
  ],
  "maxVideosPerSource": 5,
  "languages": [
    "en"
  ]
}
```

### Input

| Field | Type | What it does | Default |
|---|---|---|---|
| `videos` (Videos) | array | Video URLs or 11-character IDs in any form, e.g. \['https://www.youtube.com/watch?v=dQw4w9WgXcQ', 'https://youtu.be/jNQXAC9IVRw', 'dQw4w9WgXcQ']. | \["https://www.youtube.com/watch?v=dQw4w9WgXcQ"] |
| `residentialFallback` (Retry on a residential IP when blocked) | boolean | YouTube asks many cloud IPs to confirm they are not a bot. | false |
| `channels` (Channels (latest videos)) | array | Channel URLs, @handles or UC… channel IDs, e.g. \['https://www.youtube.com/@veritasium', '@mkbhd']. |  |
| `playlists` (Playlists) | array | Playlist URLs or IDs, e.g. \['https://www.youtube.com/playlist?list=PLFs4vir_WsTwEd-nJgVJCZPNL3HALHHpF'], read in playlist order. |  |
| `searchTerms` (Search terms) | array | YouTube searches, e.g. \['python tutorial']. |  |
| `maxVideosPerSource` (Max videos per channel, playlist or search) | integer | How many videos to read from each channel, playlist and search term, e.g. 20. | 10 |

All 15 fields, with examples: see the **Input** tab.

### Use with AI agents (Apify MCP server, Claude, ChatGPT, n8n AI agent)

YouTube Transcript Scraper is a ready-made tool for AI agents. Through the Apify MCP server an agent reads this Actor's input schema, fills in the input from your request, starts the run and reads the videos back. You pay the same per-result price as a run started by hand, from your own Apify account.

#### Example prompts

- "Get the transcripts of the latest 10 videos from https://www.youtube.com/@veritasium and summarise each one in three bullet points"
- "Search YouTube for python tutorial, take the top 5 videos with English captions and give me a table of title, channel, views and word count"
- "Pull the transcript of https://www.youtube.com/watch?v=dQw4w9WgXcQ split into chunks with timestamped links so I can cite the exact moment"

#### Claude (claude.ai and Claude Desktop)

Open **Settings > Connectors**, choose **Add custom connector**, paste `https://mcp.apify.com/?tools=aurelix/youtube-transcript-scraper` and sign in to Apify when asked. Then ask Claude one of the prompts above.

#### Claude Code, Cursor, VS Code and other MCP clients

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=aurelix/youtube-transcript-scraper"
```

Clients configured with JSON take the same URL:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?tools=aurelix/youtube-transcript-scraper"
    }
  }
}
```

A client without Apify sign-in sends the header `Authorization: Bearer <YOUR_APIFY_TOKEN>`; to run the server locally instead, use `npx -y @apify/actors-mcp-server --actors aurelix/youtube-transcript-scraper` with `APIFY_TOKEN` set.

#### ChatGPT

Where your ChatGPT plan offers custom connectors (developer mode), add `https://mcp.apify.com/?tools=aurelix/youtube-transcript-scraper` as a connector, sign in to Apify, and ask for the data in plain words.

#### n8n AI agent

Give an **AI Agent** node an **MCP Client Tool** with the endpoint `https://mcp.apify.com/?tools=aurelix/youtube-transcript-scraper` and a Bearer credential holding your Apify token. The agent can then call YouTube Transcript Scraper whenever a workflow step needs videos; for a fixed, non-agent workflow use Apify's n8n node with **Run Actor** instead.

### Use it from AI agents (MCP), the API or no-code

#### Copy this to your AI assistant

```text
Use the Apify Actor aurelix/youtube-transcript-scraper (YouTube Transcript Scraper) through Apify's MCP server or API. Main input: videos (Videos); residentialFallback (Retry on a residential IP when blocked). Example input: {"channels": ["https://www.youtube.com/@veritasium"], "maxVideosPerSource": 20, "languages": ["en"], "chunkSize": 1000}. Each result is one video with fields such as video_id, url, title, channel_name, channel_id, channel_url, channel_handle, published_at. It costs $0.90 per 1,000 videos on Apify's free plan plus a $0.0001 start fee per run, and needs no login.
```

MCP server URL for this Actor: `https://mcp.apify.com/?tools=aurelix/youtube-transcript-scraper` (setup for each client in the section above).

#### API

Start a run and read the dataset with Apify's REST API or the Python and JavaScript clients:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("aurelix/youtube-transcript-scraper").call(run_input={'channels': ['https://www.youtube.com/@veritasium'], 'maxVideosPerSource': 20, 'languages': ['en'], 'chunkSize': 1000})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

#### No-code: schedule it in 3 clicks

Send the results to Google Sheets, Zapier, Make, n8n, Slack or any webhook URL.

1. Fill in the input, then click **Save as a new task**.
2. In the task, click **Schedule** and pick daily or weekly (Apify Schedules).
3. Turn on **Only new videos since last run** so each run returns only what is new, and paste a Slack or webhook URL into **Slack webhook URL** / **Webhook URL** to get a digest of the new items (count plus the top 10) after every run.

Prefer n8n or Make? Ask in the **Issues** tab and we will share a ready-made workflow for it.

### FAQ

#### Can I scrape YouTube transcripts without login?

Yes, without login: no YouTube account, cookies or API key. The Actor reads the public data YouTube serves any logged-out visitor, and never solves CAPTCHAs.

#### Is there a YouTube transcripts API?

You can use this Actor as one. Start it with Apify's REST API or the Python and JavaScript clients and read the results as JSON (see the code above), or call it from an AI agent through MCP.

#### How much does it cost to scrape YouTube transcripts?

About $0.90 for 1,000 videos on Apify's free plan and $0.60 on paid plans, start fee included. The free $5 monthly credit covers about 5,500 videos.

#### Can I export YouTube transcripts to Excel or Google Sheets?

Yes. Download the results as Excel, CSV, JSON, XML or HTML from the run's **Storage** tab, or send them to Google Sheets with Apify's Google Sheets integration or the API.

#### Is it legal to scrape YouTube transcripts?

It reads only public data any logged-out visitor can see: YouTube videos' captions and basic video details. It reads one video per IP at a time, four at once, never logs in and never solves CAPTCHAs. It returns caption text and video details (title, channel, date, duration, views, chapters); no comments, commenter names or other viewer data are read. Data is returned as shown publicly on YouTube, incl. the channel's name and @handle. The content is returned as the creator published it; copyright in it stays with its owner. People can ask for removal of their data by opening an issue on this Actor's Issues tab; if YouTube formally asks us to stop, this Actor will stop. You are responsible for using the data lawfully, incl. anti-spam and privacy laws; this is not legal advice.

#### Can I get transcripts for a whole YouTube channel?

Yes. Paste the channel URL and it returns a transcript for each of its videos that has captions. Turn on the only-new-videos mode and schedule it for a daily channel feed.

#### Is there a cheaper YouTube transcript scraper on Apify?

On price, yes: $0.60 per 1,000 videos on paid plans against $2.00 to $2.50 for the most-used ones, with a $0.0001 start fee. This tool doesn't translate transcripts or export SRT/VTT.

#### Can an AI agent call it?

Yes, through Apify's MCP server or the API: a single video comes back in seconds, and the output has chunks with timestamped links ready for citations.

#### Which videos work?

Any public video with captions: creator-uploaded or YouTube's automatic captions, in any language, including Shorts and past live streams. Videos without captions, private, removed, age-restricted and members-only videos cannot be read without a login; they are skipped and not charged.

#### Does it translate transcripts?

No. It returns captions in the languages the video actually has. Your preferred languages are tried in order; if none exists the video's own track is returned and 'language_fallback' is true. 'available_languages' lists every track.

#### What are the chunks for?

For RAG and embeddings: each transcript is cut into chunks of about 'chunkSize' characters with 'chunkOverlap' characters of overlap, always at caption-line boundaries. Each chunk has its start and end in seconds and a link that opens the video at that moment, so an AI answer can cite the exact spot.

#### How do chapters work?

They are read from the description timestamps the way YouTube builds chapters: at least three timestamps, the first at 0:00, in ascending order. YouTube's automatically generated chapters are not included.

#### Why did a run return fewer videos than I asked for?

Videos without captions and unavailable videos get a status row instead of a transcript (the status message also counts them by reason). Channels and playlists can have fewer videos than the limit. If YouTube kept blocking every proxy IP, the run stops early, keeps the transcripts already done and says so.

#### What am I charged when no transcript comes back?

Only the start fee ($0.0001 per run at the default 256 MB). Videos without captions, private, removed, age-restricted, members-only, live and upcoming videos, empty caption tracks, inputs that are not YouTube links and videos already returned in incremental mode are never charged. The $0.20 residential fee is charged only when you turned on residentialFallback and a residential IP returned at least one transcript.

#### What does a BLOCKED status mean?

YouTube refused every cloud IP the run tried. Before the run's first video answer, it stops after 60 refused IPs (all four workers together) or 20 seconds, charges only the start fee, and gives each unread video a 'not_read' row. Try again later, or turn on residentialFallback: at that same point the run then moves to residential IPs (up to 20 videos, one $0.20 fee only if they return a transcript).

#### Is a video charged twice if it is in a channel and a playlist?

No. Videos from all sources are de-duplicated before reading, so each video is read and charged once per run. With Only new videos since last run on, videos returned by an earlier run with the same inputs (or the same stateKey) are skipped too; that memory is kept for a year.

#### How fast is it?

A single video usually comes back in 3 to 20 seconds in total, most of it the run starting. Videos are read four at a time; in our tests 19 videos took about 30 seconds and 90 videos from channels, a playlist and searches a few minutes.

#### How many videos can one run read?

Up to 5,000 per channel, playlist or search term, plus any videos you list directly. A run stops early when 5 videos in a row fail after retries, when it has read 20 videos over a residential IP, when your maximum charge is reached, or when the run timeout comes near; it keeps and charges only the transcripts already returned.

#### Are Shorts included?

Shorts you paste as links are read. A channel is read from its Videos tab, so its Shorts and live tabs are not included, and search results leave Shorts out.

#### What happens if chunkOverlap is bigger than chunkSize?

The run sets the overlap to a tenth of the chunk size instead of failing. Set chunkSize to 0 to get no chunks at all.

### Limits (stated honestly)

- Only videos that have captions can be returned; there is no speech-to-text for videos without them.
- Private, removed, age-restricted, members-only, live and upcoming videos are skipped (they need a login or have no final captions).
- No translation: captions come in the languages the video has.
- Channels are read from their Videos tab (newest first); Shorts and live tabs are not included unless you give those videos directly.
- Search returns YouTube's video results for the term in relevance order, without Shorts, channels or playlists.
- Chapters come from description timestamps only, not YouTube's auto-generated chapters.
- YouTube refuses many cloud IPs; the run moves to fresh datacenter IPs, and if the first 60 it tries (all workers together), or its first 20 seconds of video requests, are all refused it stops with a BLOCKED status (only the start fee is charged). With 'residentialFallback' on it moves to residential IPs at that point instead, for up to 20 videos.
- Very long videos: each full hour beyond the first 3 hours adds $0.0001 (a 12-hour stream is $0.0009 + 9 × $0.0001).

### Works great with

- **Before this: [Website to Markdown API](https://apify.com/aurelix/website-to-markdown)**: the site's pages as Markdown, so videos and pages land in one AI corpus

### Related Aurelix tools

Public Aurelix Actors, grouped by the data they collect. All are pay-per-result and need no login.

#### AI, content and SEO

- **[Google Trends by Region](https://apify.com/aurelix/google-trends-scraper)**: Google Trends interest over time, by region and rising queries for any number of keywords, plus trending searches.
- **[Google Autocomplete API](https://apify.com/aurelix/google-autocomplete-scraper)**: Expands seed keywords into hundreds of real Google and YouTube autocomplete phrases, tagged by search intent.
- **[PDF to Markdown OCR & Table Extraction](https://apify.com/aurelix/pdf-to-markdown)**: Turns linked PDF and Word files into Markdown per page, with tables as JSON rows, RAG chunks and OCR.
- **[Broken Link Crawler & SEO Audit](https://apify.com/aurelix/seo-audit-crawler)**: Audits a whole site: one row per page with SEO checks and broken links, plus a ranked issues summary.
- **[Website to Markdown API](https://apify.com/aurelix/website-to-markdown)**: Crawls a site and returns one row of clean main-content Markdown per page, with title, headings and links.

#### Jobs and hiring data

- **[Greenhouse Jobs Scraper](https://apify.com/aurelix/greenhouse-jobs-scraper)**: Live jobs from a company's Greenhouse, Lever, Ashby or SmartRecruiters board, with salary and Canadian province tags.
- **[LinkedIn Jobs Country Filter Scraper](https://apify.com/aurelix/linkedin-jobs)**: Public LinkedIn job postings by keyword and country: title, company, location, seniority, job type, salary text, description.
- **[Multiple Job Boards Scraper](https://apify.com/aurelix/multi-job-board-scraper)**: LinkedIn, about 50 company career sites, Remote OK and We Work Remotely jobs in one deduplicated list.

#### E-commerce and product data

- **[AliExpress Scraper API](https://apify.com/aurelix/aliexpress-product-search)**: AliExpress search results by keyword: price, discount, rating, units sold, ship-from country and sponsored flag.
- **[Amazon New Releases & Best Sellers](https://apify.com/aurelix/amazon-best-sellers)**: Amazon Best Sellers and New Releases top 100 on 10 marketplaces: rank, ASIN, price, rating, rank change.
- **[Shopify Product Export Scraper](https://apify.com/aurelix/shopify-products-scraper)**: Every public product of any Shopify store with variants, SKUs, prices, barcodes, stock counts and collections.

#### Leads and company data

- **[Newly Funded Companies Hiring](https://apify.com/aurelix/funded-companies-hiring)**: Companies that just raised money (SEC Form D), with their open roles and business contacts, as a new-only monitor.
- **[Google Maps Phone Scraper](https://apify.com/aurelix/google-maps-scraper)**: Local business lists from Google Maps: phones, websites, ratings, hours, coordinates; optional website emails and socials.
- **[Recently Funded Companies API](https://apify.com/aurelix/recently-funded-companies)**: US companies that just filed an SEC Form D: amount raised, industry, state, executives, confirmed website.
- **[Tech Stack API](https://apify.com/aurelix/tech-stack-detector)**: CMS, e-commerce platform, analytics, ad pixels, chat, CDN and email provider for each domain you enter.

#### Ad intelligence

- **[Competitor Watch](https://apify.com/aurelix/competitor-watch)**: One report per competitor with only what is new: Meta and TikTok ads, page changes, Shopify products and prices, jobs.
- **[Facebook Ad Library Search & API](https://apify.com/aurelix/facebook-ad-library-scraper)**: Facebook and Instagram business ads from the Meta Ad Library: copy, creatives, landing pages, dates, optional EU reach.

#### Canada and government data

- **[Canada Building Permits](https://apify.com/aurelix/canada-building-permits-scraper)**: Building permits and development applications from 7 Canadian cities: address, type, status, dates, value, applicant, contractor and Toronto planner contact.

#### More data tools

- **[Tennis Betting Odds Scraper](https://apify.com/aurelix/tennis-odds-scraper)**: Tennis results and upcoming matches with opening and closing odds per bookmaker and implied probabilities.

### Recent changes

- **0.1**: Very long videos add $0.0001 per hour beyond 3 hours; the status states the exact charge, start fee included; videos not read after an early stop get a 'not_read' row.

The full history is on the **Changelog** tab.

### Tested daily

An automated health check runs this Actor every day on a fixed input and checks that at least 1 videos come back with `video_id`, `title`, `transcript_text`, `segments`, `language` filled in; a failed check alerts the maintainer straight away.

### Your feedback

Missing a field, found a bug or need another filter? Open an issue on the **Issues** tab; we aim to answer within a day. If this Actor saved you time, a short review helps other people find it.

# Changelog

This Actor's version history is a separate document: https://apify.com/aurelix/youtube-transcript-scraper/changelog.md

# Actor input Schema

## `videos` (type: `array`):

Video URLs or 11-character IDs in any form, e.g. \['https://www.youtube.com/watch?v=dQw4w9WgXcQ', 'https://youtu.be/jNQXAC9IVRw', 'dQw4w9WgXcQ']. Shorts, live, embed and youtube-nocookie links work, as do links with timestamps or playlist parameters; several links pasted into one entry are split. A channel or playlist URL pasted here is treated as one.

## `channels` (type: `array`):

Channel URLs, @handles or UC… channel IDs, e.g. \['https://www.youtube.com/@veritasium', '@mkbhd']. The latest videos from the channel's Videos tab are read, newest first, up to 'Max videos per channel, playlist or search'.

## `playlists` (type: `array`):

Playlist URLs or IDs, e.g. \['https://www.youtube.com/playlist?list=PLFs4vir_WsTwEd-nJgVJCZPNL3HALHHpF'], read in playlist order.

## `searchTerms` (type: `array`):

YouTube searches, e.g. \['python tutorial']. The top video results (no Shorts, channels or playlists) are read in YouTube's relevance order.

## `maxVideosPerSource` (type: `integer`):

How many videos to read from each channel, playlist and search term, e.g. 20. Videos given directly are always read.

## `languages` (type: `array`):

Caption languages in order of preference, as codes, e.g. \['en', 'es']. 'en' also matches en-US and en-GB. Within a language a creator's own captions beat auto-generated ones. If none is available the video's own caption track is returned and 'language_fallback' is true. Empty = the video's own track.

## `includeAutoGenerated` (type: `boolean`):

Use YouTube's automatic (speech recognition) captions when the creator uploaded none. Off = only creator-made captions; videos with only automatic ones are skipped and not charged.

## `includeSegments` (type: `boolean`):

Add 'segments': every caption line with start and end in seconds, e.g. {start: 12.4, end: 15.1, text: '...'}. Off = plain text and chunks only, for smaller output.

## `chunkSize` (type: `integer`):

Split each transcript into 'chunks' of about this many characters for RAG and embeddings, e.g. 1000 (about 200 to 250 tokens). Chunks never cut a caption line and carry their start and end time and a timestamped link. 0 = no chunks.

## `chunkOverlap` (type: `integer`):

Characters repeated from the end of one chunk at the start of the next, e.g. 100, so context is not lost at a boundary. Must be smaller than the chunk size.

## `incremental` (type: `boolean`):

Return only videos not returned by a previous run with the same inputs, e.g. for a daily schedule on a channel. Videos skipped for missing captions are tried again next time (YouTube adds automatic captions a few hours after upload).

## `stateKey` (type: `string`):

Name for the 'new since last run' memory, e.g. 'my-channel-feed'. Leave empty to derive it from the inputs.

## `residentialFallback` (type: `boolean`):

YouTube asks many cloud IPs to confirm they are not a bot. Off (default): datacenter IPs only; if the first 60 tried (or the first 20 seconds) are all refused, the run stops early, says so, and charges nothing for the videos it could not read. On: at that point the run moves to residential IPs for up to 20 videos (one 'residential-retry' fee per run, charged only when they return at least one transcript). Turn on for scheduled or large runs that must finish.

## `slackWebhookUrl` (type: `string`):

After each run, post a short digest to Slack: how many results were saved (new ones only when 'Only new videos since last run' is on) and the top 10 with links, e.g. https://hooks.slack.com/services/T000/B000/XXXX. Nothing is posted when the run saved nothing. Leave empty to skip.

## `webhookUrl` (type: `string`):

After each run, POST the same digest as JSON (actor, newOnly, count, items = top 10 results, runUrl, text) to any URL, e.g. a Zapier, Make or n8n webhook. Nothing is sent when the run saved nothing. Leave empty to skip.

## Actor input object example

```json
{
  "videos": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "channels": [],
  "playlists": [],
  "searchTerms": [],
  "maxVideosPerSource": 10,
  "languages": [
    "en"
  ],
  "includeAutoGenerated": true,
  "includeSegments": true,
  "chunkSize": 1000,
  "chunkOverlap": 100,
  "incremental": false,
  "residentialFallback": false
}
```

# Actor output Schema

## `transcripts` (type: `string`):

One row per video: video details, transcript text, timestamped segments, chapters and AI-ready chunks (status ok), or a status row saying why a video has no transcript (not charged).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "videos": [
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
    ],
    "residentialFallback": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("aurelix/youtube-transcript-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "videos": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
    "residentialFallback": False,
}

# Run the Actor and wait for it to finish
run = client.actor("aurelix/youtube-transcript-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "videos": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "residentialFallback": false
}' |
apify call aurelix/youtube-transcript-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aurelix/youtube-transcript-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Hrdkg8JExchW3dqc6/builds/MXZV4PiwRbkgu3i2K/openapi.json
