# YouTube Channel & Playlist Transcripts - Bulk, Free Tier (`om_kh/youtube-channel-transcripts`) Actor

Free tier on every run. Paste a YouTube channel or playlist and get clean timestamped transcripts for every video, with publication date and view count attached. Handles @handles, channel URLs, channel IDs and playlist URLs. Keyless, no cookies. Human subtitles preferred over auto.

- **URL**: https://apify.com/om\_kh/youtube-channel-transcripts.md
- **Developed by:** [omar khandji](https://apify.com/om_kh) (community)
- **Categories:** Videos, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## YouTube Channel & Playlist Transcripts — Bulk Subtitles

> Paste a channel or a playlist. Get every video's transcript, timestamped and clean. No API key, no cookies, no quota.

### Free tier — free transcripts on every run

**The first 5 transcripts of every run are free**, on every run you ever make.
Point it at a channel and read real transcripts before you are billed.

Beyond that you pay **$0.001 per transcript**, and only for transcripts actually
delivered to your dataset — a video with no captions is never billed.

One guard: the free allowance never covers more than half of a run, so a
10-video run gets 5 free. Bulk runs are where the free tier pays off.

### Why this one

Transcript scrapers make you supply the video URLs. If you want a whole channel, that is a scraping job before the scraping job.

This Actor takes **the channel or playlist itself** and does the rest:

1. Resolves it through YouTube's own feed — `@handle`, channel URL, channel ID or playlist URL all work.
2. Removes duplicates across every source you listed, so a video that sits in both a channel and one of its playlists is transcribed and billed **once**.
3. Pulls each transcript, preferring **human-written subtitles** over auto-generated ones.
4. Attaches the **publication date and view count** from the feed — the player alone does not know them, and they are what let you rank a back catalogue.

### What you pass

| Form | Example |
|---|---|
| Handle | `@3blue1brown` |
| Channel URL | `https://www.youtube.com/@veritasium` |
| Channel ID | `UCYO_jab_esuFRV4b17AJtAw` |
| Playlist URL | `https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi` |
| Playlist ID | `PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi` |

### Output

One row per video — the transcript fields, plus where it came from:

```json
{
  "video_id": "aircAruvnKk",
  "video_url": "https://www.youtube.com/watch?v=aircAruvnKk",
  "title": "But what is a neural network?",
  "channel": "3Blue1Brown",
  "published_at": "2017-10-05T15:11:00+00:00",
  "views": 19204471,
  "language": "en",
  "is_generated": false,
  "duration_seconds": 1105.64,
  "word_count": 3357,
  "text": "Full transcript as one clean string …",
  "segments": [{ "start": 12.4, "duration": 3.1, "text": "Let me start with a question." }]
}
````

Turn **Include timestamped segments** off if you only want `text` — useful when you are paying an LLM per token.

### Good to know

- **YouTube's feed publishes the 15 most recent videos of a channel.** That is YouTube's limit, not ours. To go deeper, list the channel's playlists — a channel's own "all videos" playlist works too.
- **Hard cost cap.** Set `maxTotalChargeUsd` and the run can never bill above it.
- **A video without captions is never billed.** It is reported in `source_errors` with code `NO_TRANSCRIPT` and costs you nothing.
- **Proxy included.** YouTube blocks datacenter IPs; the default Apify Proxy setting handles it.

### Typical uses

- Index an entire channel for RAG or search
- Turn a conference playlist into articles, notes or a newsletter
- Analyse what a competitor actually says across their catalogue
- Build a training or evaluation corpus from a curated playlist

### Related scrapers

Same data, other sources — all with the same free tier, the same clean schema and the same pay-only-for-what-you-get billing:

| Actor |
|---|
| [YouTube Transcript API — Subtitles & Captions in Any Language](https://apify.com/om_kh/youtube-transcript-api) |
| [YouTube Search Scraper - Videos, Views & Channels](https://apify.com/om_kh/vigia-youtube-search-monitor) |
| [YouTube Channel Videos Scraper - Views & Velocity](https://apify.com/om_kh/vigia-youtube-video-watch) |
| [Company Careers & ATS Jobs API - Workday, Greenhouse](https://apify.com/om_kh/vigia-clean-jobs-delta) |
| [Google Search Results Scraper - SERP Positions](https://apify.com/om_kh/vigia-serp-rank-delta) |
| [Google Maps Business Scraper - Places & Contacts](https://apify.com/om_kh/vigia-local-business-monitor) |

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

## `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,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxTotalChargeUsd": 1
}
```

# 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("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=om_kh/youtube-channel-transcripts",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Channel & Playlist Transcripts - Bulk, Free Tier",
        "description": "Free tier on every run. Paste a YouTube channel or playlist and get clean timestamped transcripts for every video, with publication date and view count attached. Handles @handles, channel URLs, channel IDs and playlist URLs. Keyless, no cookies. Human subtitles preferred over auto.",
        "version": "0.1",
        "x-build-id": "C8uoK1crbSgx8t0hy"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/om_kh~youtube-channel-transcripts/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-om_kh-youtube-channel-transcripts",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/om_kh~youtube-channel-transcripts/runs": {
            "post": {
                "operationId": "runs-sync-om_kh-youtube-channel-transcripts",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/om_kh~youtube-channel-transcripts/run-sync": {
            "post": {
                "operationId": "run-sync-om_kh-youtube-channel-transcripts",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "maxTotalChargeUsd"
                ],
                "properties": {
                    "sources": {
                        "title": "Channels and playlists",
                        "type": "array",
                        "description": "Channel handles (@3blue1brown), channel URLs, channel IDs (UC...), playlist URLs or playlist IDs. Mix as many as you like.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxVideos": {
                        "title": "Max videos per run",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Total ceiling across every source, applied after duplicates are removed.",
                        "default": 50
                    },
                    "language": {
                        "title": "Preferred language",
                        "type": "string",
                        "description": "Two-letter code (en, fr, es...). Human-written captions are preferred over auto-generated. Leave empty for English, then the video's default.",
                        "default": ""
                    },
                    "includeSegments": {
                        "title": "Include timestamped segments",
                        "type": "boolean",
                        "description": "Keep the per-line segments with start time and duration. Turn off for plain text only.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "YouTube blocks datacenter IPs, so this Actor routes through a proxy. Leave the default unless you have your own.",
                        "default": {
                            "useApifyProxy": true
                        }
                    },
                    "maxTotalChargeUsd": {
                        "title": "Maximum charge (USD)",
                        "minimum": 0,
                        "type": "number",
                        "description": "Hard maximum amount that this run may charge.",
                        "default": 1
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
