# YouTube Channel Transcripts Scraper - Every Video to Text (`om_kh/youtube-channel-transcripts`) Actor

Bulk YouTube channel and playlist transcripts for RAG and LLM datasets: one timestamped transcript per video from an @handle, channel URL or playlist, with optional SRT/VTT and RAG chunks. Pay per transcript; videos without captions never billed. API and MCP ready. $5 per 1,000 transcripts.

- **URL**: https://apify.com/om_kh/youtube-channel-transcripts.md
- **Developed by:** [Khandji Omar](https://apify.com/om_kh) (community)
- **Categories:** Videos, Developer tools, AI
- **Features:** Limited permissions
- **Stats:** 8 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 transcripts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## YouTube Channel & Playlist Transcripts — Bulk Transcript Scraper

Download the **transcripts of every video in a YouTube channel or playlist** in one run. Paste a channel handle (`@name`), a channel URL or a playlist URL and get one clean, timestamped transcript per video — ready for research, search indexes, LLM fine-tuning or RAG.

> **Main YouTube transcript tool:** [YouTube Transcript Scraper](https://apify.com/om_kh/youtube-transcript-api) runs the same engine, with **$1 per 1,000 transcripts from 12 November 2026**. This Actor stays available with its own input and price.

### In short: what you give, what you get, what it costs

| | |
|---|---|
| **You give** | A channel (`@name` or link) or a playlist link |
| **We do** | List the channel's or playlist's videos, newest first, and read YouTube's own captions for each |
| **You get** | One row per video: the full transcript as clean text, with timestamped lines if you want them |
| **It costs** | $5 per 1,000 transcripts: a 100-video channel = **$0.50**, + $0.001 per run from Nov 20, 2026 (no start fee before). Videos without captions are never charged; the first result of every run is free. `maxVideos` (default 50) decides how far back it goes |
| **It does not** | Make a transcript when the video has no captions (that video is reported and costs $0), sign in, or use an API key |

A real result row is shown further down this page.

### Free tier — 1 result free on every run

**The first 1 result of every run is free**, on every run you ever make — not a one-off trial. One guard: the free allowance never covers more than half of a run, so the offer stays sustainable.

### What does this YouTube channel transcript scraper do?

Give it channels or playlists. It lists their videos (newest first, up to `maxVideos`) and for every video returns:

- the **full transcript as one clean string**, ready for an LLM, a search index or a spreadsheet;
- **timestamped segments** (`start`, `duration`, `text`) for subtitles, players or chunked RAG;
- the **language**, whether captions are **human-written or auto-generated**, and every other caption language available;
- the video **title**, **channel**, **duration**, **word count** and segment count.

Watch links, `youtu.be` short links, Shorts, embeds and bare 11-character IDs all work, mixed in one list.

### Compared with karamelo/youtube-full-channel-transcripts-extractor

Read on the Store on 2026-10-23 (YouTube Full Channel Transcripts Extractor). Where it does better, this section says so.

- **Built on the site's own data**, not a resold scraper: no second Actor between you and the source.
- **Free results on every run** and a hard cost cap (`maxTotalChargeUsd`).
- **Price:** $5 per 1,000 here, $7 there.

### Why use it

- **Whole channels, not one video at a time** — the Actor lists the videos for you.
- **Reads YouTube's own captions** — no speech-to-text guesswork, no API key, no login.
- **Human captions first** — auto-generated captions only when no human track exists.
- **You only pay for delivered transcripts** — videos without captions are free.

### How to get YouTube transcripts in 3 steps

1. Click **Try for free** and paste channel handles or playlist URLs in **Channels and playlists**.
2. Optional: set a **Preferred language** (`en`, `fr`, `es`, `de`, …). Leave it empty for English, then the video's default.
3. Click **Start**. Download the results as **JSON, CSV, Excel, HTML or XML**, or read them from the API.

### Input

| Field | Type | What it does |
|---|---|---|
| `sources` | array | Channel handles (`@name`), channel URLs or playlist URLs |
| `maxVideos` | integer | Maximum videos per run across all sources (default 50) |
| `language` | string | Preferred two-letter caption language |
| `includeSegments` | boolean | Timestamped segments on (default) or plain text only |
| `translateTo` | string | *Experimental* YouTube machine translation (`fr`, `es`…); often refused by YouTube, original language returned then |
| `outputFormats` | array | `srt`, `vtt`, `chunks` (RAG-ready ~250-word pieces with start/end seconds) |
| `proxyConfiguration` | object | Apify Proxy by default; YouTube blocks datacenter IPs |
| `maxTotalChargeUsd` | number | Hard spending cap for the run |

```json
{
  "sources": [
    "@3blue1brown",
    "https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi"
  ],
  "maxVideos": 50,
  "language": "en"
}
```

### Output

One dataset item per video:

A real row from this Actor's latest run on Apify (2026-10-24; long texts are cut and people's names hidden here, your dataset has them in full):

```json
{
  "video_id": "LKrwhjOI8Nc",
  "video_url": "https://www.youtube.com/watch?v=LKrwhjOI8Nc",
  "title": "There's never been a better time to go into math",
  "channel": "3Blue1Brown",
  "language": "en",
  "is_generated": false,
  "available_languages": [
    "ar",
    "bn"
  ],
  "duration_seconds": 2417.378,
  "segment_count": 1276,
  "word_count": 8859,
  "text": "Well, let's talk about it. It feels like the whole math world is on fire talking about AI in math. I have been thinking about this for a...",
  "segments": [
    {
      "start": 0,
      "duration": 1.432,
      "text": "Well, let's talk about it."
    },
    {
      "start": 1.432,
      "duration": 2.441,
      "text": "It feels like the whole math world is on fire"
    }
  ],
  "source": "youtube",
  "channel_id": "UCYO_jab_esuFRV4b17AJtAw",
  "channel_url": "https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw",
  "description": "Sharing a few thoughts on the future of math\nThese videos are funded directly by viewers: https://3b1b.co/support\nAn equally valuable for...",
  "keywords": [
    "Mathematics",
    "three blue one brown"
  ],
  "view_count": 2466827,
  "video_length_seconds": 2444,
  "thumbnail_url": "https://i.ytimg.com/vi/LKrwhjOI8Nc/sddefault.jpg",
  "is_live": false,
  "duration_human": "40:44",
  "hashtags": [
    "manim"
  ],
  "is_private": false,
  "allow_ratings": true,
  "playable_in_embed": true,
  "caption_track_count": 18,
  "is_translatable": true,
  "translation_languages": [
    "ar",
    "zh-Hant"
  ],
  "fetched_at": "2026-10-24T19:01:01Z",
  "published_at": "2026-10-16T16:15:20+00:00",
  "views": 2466379
}
```

| Field | Description |
|---|---|
| `video_id`, `video_url` | The video, normalised to a watch URL |
| `title`, `channel` | Video title and channel name |
| `language`, `is_generated` | Caption language and whether YouTube auto-generated it |
| `available_languages` | Every caption language the video offers |
| `text` | The full transcript as one string |
| `segments` | `[{text, start, duration}]`, in seconds |
| `duration_seconds`, `segment_count`, `word_count` | Size of the transcript |

A run also writes `RUN_SUMMARY.json` to its key-value store: videos requested, delivered, charged, and one line per failed video with the reason.

### How much does it cost?

**$0.005 per transcript** — you pay only for videos that actually come back with a transcript.

| Videos | Cost |
|---:|---:|
| 100 | $0.50 |
| 1,000 | $5.00 |
| 10,000 | $50.00 |

- **Failed videos are never charged**: captions disabled, private, deleted or invalid links cost $0.
- **You set the ceiling**: `maxTotalChargeUsd` (default $1) stops the run before it spends more.
- Apify's free plan includes monthly platform credit, enough for hundreds of transcripts.
- **One transcript in every run of 2+ videos is free**, so you can check the output on your own videos.

For comparison, the most-used transcript Actors on the Store charge $0.005–$0.01 per video.

### Use cases

- **Build a knowledge base** from an expert's whole channel and chat with it through RAG.
- **Content research** — search everything a competitor or creator has said.
- **Training and evaluation data** for language models.
- **Repurpose content** — turn a back catalogue into blog posts, newsletters or clips.
- **Education** — full-text search across a course playlist.

### Use it from code (API)

Every Apify Actor is an API. Start a run and read the results with one call.

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("om_kh/youtube-channel-transcripts").call(run_input={"sources": ["@3blue1brown", "https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi"], "maxVideos": 50, "language": "en"})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('om_kh/youtube-channel-transcripts').call({
    "sources": [
        "@3blue1brown",
        "https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi"
    ],
    "maxVideos": 50,
    "language": "en"
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**One HTTP call (cURL)** — runs the Actor and returns the dataset in the same response:

```bash
curl -X POST "https://api.apify.com/v2/acts/om_kh~youtube-channel-transcripts/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"sources": ["@3blue1brown", "https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi"], "maxVideos": 50, "language": "en"}'
```

### Integrations: n8n, Make, Zapier, Google Sheets

- **n8n** — the official *Apify* node, operation *Run Actor and get dataset*, Actor `om_kh/youtube-channel-transcripts`.
- **Make** — *Apify › Run an Actor*, then *Apify › Get Dataset Items*.
- **Zapier** — *Apify › Run Actor*; map the dataset items into your next step.
- **Google Sheets, webhooks, Slack** — add an integration from the *Integrations* tab of this Actor.
- **Schedules** — run it every hour or day from *Schedules* in Apify Console.

### Use it from an AI agent (MCP and x402)

Connect Claude Desktop, Cursor, VS Code or any MCP client to Apify's MCP server
at `https://mcp.apify.com` and add this Actor, `om_kh/youtube-channel-transcripts`, as a tool — the
agent passes the same JSON as the run input and gets the dataset back.

AI agents that pay with **x402** can run it too, without an Apify account: the
Actor charges only per result delivered, so an agent pays exactly for what it gets.

### Tips and limits

- **No captions, no transcript.** This Actor reads YouTube's own captions. A video with captions turned off returns a `NO_TRANSCRIPT` error for that video, is not charged, and the rest of the run continues.
- **Pick the language you want.** If your language is missing, check `available_languages` in the output and run again with one of them.
- **Big channels:** raise `maxVideos`; for a hand-picked list of single videos use [YouTube Transcript Scraper - Full Text, Timestamps, Language](https://apify.com/om_kh/youtube-transcript-api).
- **Speed:** videos are fetched 8 at a time; a typical video takes 1–3 seconds.

### FAQ

**Can I get SRT or VTT subtitle files?**
Yes. Set `outputFormats` to `["srt"]`, `["vtt"]` or both: each result then carries a ready-to-save `srt` / `vtt` string built from the timestamped captions. No extra charge.

**Is the output ready for RAG and LLMs?**
Yes. `outputFormats: ["chunks"]` adds `chunks`: consecutive captions merged into ~250-word pieces, each with `start` and `end` seconds, so you can embed them and cite the exact moment in the video.

**Can I translate a transcript?**
There is an experimental `translateTo` option that asks YouTube for its own machine translation. YouTube often refuses automated translation requests; when it does you still get the original transcript and a `translation_note` (and pay only the normal price). For reliable translation, send the `text` or `chunks` to your own translation model.

**Is it legal to scrape YouTube transcripts?**
This Actor only reads captions that YouTube shows publicly to any visitor. It does not log in and collects no personal data beyond the public channel name. You are responsible for how you use the text; check YouTube's terms and your local law, and consult a lawyer if unsure.

**Does it need a YouTube API key or cookies?**
No. There is no key, no login and nothing that expires.

**Can it transcribe videos that have no captions?**
No — it returns YouTube's existing captions (human or auto-generated), it does not run speech-to-text. Almost all spoken-word videos have auto-generated captions.

**Which languages are supported?**
Every language YouTube offers captions in. Set `language`, or leave it empty for English first.

**Can I get timestamps?**
Yes, `includeSegments` (on by default) returns every caption line with `start` and `duration` in seconds.

**Am I charged for videos that fail?**
Never. Only transcripts that are actually delivered are charged.

**Can I export to CSV or Excel?**
Yes, from the *Storage* tab of any run, or with `?format=csv` on the dataset API.

**Can my AI agent call it?**
Yes, via MCP (see above) or the plain HTTP API.

### Related Actors

- [YouTube Transcript Scraper - Full Text, Timestamps, Language](https://apify.com/om_kh/youtube-transcript-api)
- [YouTube Video Transcript API - Text, Timestamps, JSON](https://apify.com/om_kh/video-transcript-api)
- [YouTube Channel Videos Scraper - Exact Views, $0.50/1K](https://apify.com/om_kh/youtube-channel-videos-scraper)
- [YouTube Comments Scraper - Likes, Replies, Date, $0.40/1K](https://apify.com/om_kh/youtube-comments-scraper)
- [Google News Scraper - Headlines, Source, Date, API](https://apify.com/om_kh/google-news-scraper)

### Support

Found a bug or need a feature? Open an issue in the **Issues** tab of this Actor — every report gets an answer, usually within a day.

### Your feedback

Did this Actor save you time? A short review on the **Reviews** tab helps other people find it, and every review is read. Something missing or broken? Open an issue on the **Issues** tab: it is answered and fixed fast.

# Actor input Schema

## `sources` (type: `array`):

Channel handles (@3blue1brown), channel URLs, channel IDs (UC...), playlist URLs or playlist IDs. Mix as many as you like.

## `maxVideos` (type: `integer`):

Total ceiling across every source, applied after duplicates are removed.

## `language` (type: `string`):

Two-letter code (en, fr, es...). Human-written captions are preferred over auto-generated. Leave empty for English, then the video's default.

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

Keep the per-line segments with start time and duration. Turn off for plain text only.

## `translateTo` (type: `string`):

Experimental: asks YouTube for its own machine translation into this language code (fr, es, pt-BR...). YouTube often refuses automated translation requests; the original transcript is then returned with a translation_note, never a failed video.

## `outputFormats` (type: `array`):

Add ready-to-use formats to every transcript: 'srt' and 'vtt' subtitle files as text, and 'chunks' (about 250-word passages with start and end times, ready to embed for RAG).

## `proxyConfiguration` (type: `object`):

YouTube blocks datacenter IPs, so this Actor routes through a proxy. Leave the default unless you have your own.

## `maxTotalChargeUsd` (type: `number`):

Hard maximum amount that this run may charge.

## Actor input object example

```json
{
  "sources": [
    "@3blue1brown",
    "https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi"
  ],
  "maxVideos": 50,
  "language": "",
  "includeSegments": true,
  "outputFormats": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `report` (type: `string`):

A visual summary of delivery, charges, changes, and source issues.

## `results` (type: `string`):

Business-ready results in a sortable table. No JSON knowledge required.

## `csv` (type: `string`):

Results ready for spreadsheets, CRMs, and analytics tools.

## `excel` (type: `string`):

Results as an Excel workbook for non-technical teams.

## `runSummary` (type: `string`):

Machine-readable delivery, billing, and source diagnostics.

# 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 = {
    "sources": [
        "@3blue1brown",
        "https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("om_kh/youtube-channel-transcripts").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 = {
    "sources": [
        "@3blue1brown",
        "https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("om_kh/youtube-channel-transcripts").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 '{
  "sources": [
    "@3blue1brown",
    "https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call om_kh/youtube-channel-transcripts --silent --output-dataset

```

## MCP server setup

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

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/Vsd9cQqK1Jt8cC6Dx/builds/StiRcnVykqLhkaZAo/openapi.json
