# YouTube Full Channel Transcripts Extractor (`scraper-engine/youtube-full-channel-transcripts-extractor`) Actor

🎥 Extract full YouTube channel transcripts fast with youtube-full-channel-transcripts-extractor. 🧠 Transcribe videos into searchable text for SEO, research, and content repurposing. ⚡ Efficient, accurate, and easy to use.

- **URL**: https://apify.com/scraper-engine/youtube-full-channel-transcripts-extractor.md
- **Developed by:** [Scraper Engine](https://apify.com/scraper-engine) (community)
- **Categories:** AI, SEO tools, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Full Channel Transcripts Extractor

Extract **every** transcript from an entire YouTube channel — videos, shorts, streams/lives, podcasts, even playlists — with just a link. Get clean, structured captions alongside rich video & channel metadata, ready to download as JSON, CSV or Excel.

Give it `@handle`, a channel ID, a channel URL, or a playlist link and it crawls the whole thing, pulling transcripts in the **format you choose** — plain text, timestamped text, SRT, VTT, TTML, JSON3, srv1/2/3 or SBV.

### 🌟 Why Choose This Actor?

- ⚡ **Bulk by design** — drop in many channels/playlists at once and scrape them in one run.
- 🧾 **13 transcript formats** — from a simple text array to broadcast-ready SRT/VTT.
- 🧷 **Pick your fields** — toggle channel and video metadata on/off to keep results lean.
- 🛡️ **Self-healing proxies** — starts direct, then auto-falls-back to datacenter and sticky residential proxies if YouTube pushes back.
- 💾 **Live results** — every video is saved the moment it's ready, so a long run never loses progress.
- 📊 **Organized output** — four ready-made dataset views (Transcripts, Video Metadata, Channel Info, Full Records).

### ✨ Key Features

- Works with **videos**, **shorts**, **streams/lives**, **podcasts** and **playlists**.
- Dynamic, deployment-proof extraction (no hardcoded keys that rot when YouTube updates).
- Retries with backoff on blocks/timeouts.
- Comment counts, like counts, view counts, publish dates, thumbnails, keywords and full channel stats.

### 📥 Input

| Field | Type | Description |
|-------|------|-------------|
| `urls` | array | **Required.** Channel/playlist links, @handles or IDs — one per line. |
| `url` | string | Optional single source (for convenience). |
| `outputFormat` | string | Transcript format (`captions`, `srt`, `vtt`, `json3`, …). |
| `maxVideos` | integer | Max videos per source (`0` = all). |
| `*Boolean` | boolean | Toggle each channel/video metadata field. |
| `maxRetries` | integer | Retries per blocked request. |
| `maxScrollRetries` | integer | Retries while paginating the channel. |
| `proxyConfiguration` | object | Proxy settings (fallback ladder applies automatically). |

```json
{
  "urls": ["https://www.youtube.com/@Vexento/shorts"],
  "outputFormat": "captions",
  "maxVideos": 50,
  "channelNameBoolean": true,
  "viewCountBoolean": true,
  "likesBoolean": true,
  "commentsBoolean": true,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### 📤 Output

Each item is one video:

```json
{
  "videoId": "MdRB7mX9iWI",
  "title": "Do you guys think Cloudy approves?…",
  "channelName": "Vexento",
  "channelHandle": "@Vexento",
  "channelID": "UCYZ9rknEmE4R1J_HBJ2yBlQ",
  "subscriberCount": "513K subscribers",
  "datePublished": "2026-05-05T16:15:44.000Z",
  "viewCount": "5,012 views",
  "likes": "262",
  "comments": "55",
  "thumbnailUrl": "https://i.ytimg.com/vi/MdRB7mX9iWI/maxres2.jpg",
  "captions": ["[music]", ">> It's cute.", "Do you approve or not?"]
}
```

### 🚀 How to Use (Apify Console)

1. Log in at [console.apify.com](https://console.apify.com) → **Actors**.
2. Open **YouTube Full Channel Transcripts Extractor**.
3. Paste your channel / playlist links, pick a format and metadata fields.
4. Click **Start** and watch the live log fill up.
5. Open the **Output** tab — switch between the Transcripts, Video Metadata, Channel Info and Full Records views.
6. Export to JSON / CSV / XLSX.

### 🤖 Use via API

```bash
curl -X POST "https://api.apify.com/v2/acts/<ACTOR_ID>/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls":["https://www.youtube.com/@Vexento/shorts"],"outputFormat":"captions","maxVideos":25}'
```

### 💡 Best Use Cases

- Build searchable text databases from entire channels.
- Repurpose video content into blogs, articles and social snippets.
- Feed transcripts into NLP / LLM pipelines.
- Accessibility and study aids from educational content.

### 💳 Pricing

Billed per scraped video record (pay-per-event). Runs that hit your spend limit stop cleanly, keeping everything already collected.

### ❓ FAQ

**Can I scrape multiple channels at once?** Yes — add as many links to `urls` as you want.

**What if YouTube blocks me?** The actor automatically escalates from a direct connection to a datacenter proxy, then to a sticky residential proxy, retrying along the way.

**Which formats are supported?** captions, textWithTimestamps, xmlWithoutTimestamps, xmlWithTimestamps, singleStringText, srt, ttml, vtt, json3, srv3, srv2, srv1, sbv.

### 🛟 Support

Only publicly available data is collected. You are responsible for complying with YouTube's Terms of Service and applicable laws (GDPR/CCPA, etc.).

# Actor input Schema

## `urls` (type: `array`):

One entry per line. Accepts a channel @handle, channel ID (UC…), full channel URL (/videos, /shorts, /streams), or a playlist URL/ID. Bulk-friendly: add as many as you like.

## `outputFormat` (type: `string`):

Choose how transcripts are returned.

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

Cap how many videos to extract from each source. 0 means every video.

## `channelNameBoolean` (type: `boolean`):

Include the channel name in each record.

## `channelHandleBoolean` (type: `boolean`):

Include the channel @handle.

## `channelIDBoolean` (type: `boolean`):

Include the channel ID (UC…).

## `subscriberCountBoolean` (type: `boolean`):

Include the channel subscriber count.

## `channelCreationDateBoolean` (type: `boolean`):

Include the channel's creation date.

## `channelCountryBoolean` (type: `boolean`):

Include the channel's country.

## `channelViewCountBoolean` (type: `boolean`):

Include the channel's total view count.

## `channelVideoCountBoolean` (type: `boolean`):

Include the channel's total video count.

## `datePublishedBoolean` (type: `boolean`):

Include the full ISO publish date/time.

## `dateTextBoolean` (type: `boolean`):

Include the formatted publish date (e.g. Feb 7, 2025).

## `relativeDateTextBoolean` (type: `boolean`):

Include the relative date (e.g. 3 days ago).

## `viewCountBoolean` (type: `boolean`):

Include the video view count.

## `likesBoolean` (type: `boolean`):

Include the like count.

## `commentsBoolean` (type: `boolean`):

Include the comment count.

## `keywordsBoolean` (type: `boolean`):

Include the video keywords/tags.

## `thumbnailBoolean` (type: `boolean`):

Include the video thumbnail URL.

## `descriptionBoolean` (type: `boolean`):

Include the video description.

## `maxRetries` (type: `integer`):

How many times to retry a blocked/failed request before giving up. Higher = more resilient.

## `maxScrollRetries` (type: `integer`):

How many times to retry empty/failed pagination pages while collecting videos.

## `saveInBatches` (type: `boolean`):

If on, results are also written into separate batch datasets (in addition to the main output) so very large channels stay organised and memory-friendly.

## `videosPerBatch` (type: `integer`):

When batching is enabled, how many videos to put in each batch dataset.

## `concurrency` (type: `integer`):

How many videos to fetch at the same time. Higher = faster, but heavier load. Lower it if you hit blocks.

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

The run starts with a direct connection. If YouTube blocks it, the actor automatically falls back to a Datacenter proxy, then to a sticky Residential proxy.

## Actor input object example

```json
{
  "urls": [
    "https://www.youtube.com/@Vexento/shorts"
  ],
  "outputFormat": "captions",
  "maxVideos": 0,
  "channelNameBoolean": true,
  "channelHandleBoolean": false,
  "channelIDBoolean": false,
  "subscriberCountBoolean": false,
  "channelCreationDateBoolean": false,
  "channelCountryBoolean": false,
  "channelViewCountBoolean": false,
  "channelVideoCountBoolean": false,
  "datePublishedBoolean": false,
  "dateTextBoolean": false,
  "relativeDateTextBoolean": false,
  "viewCountBoolean": false,
  "likesBoolean": false,
  "commentsBoolean": false,
  "keywordsBoolean": false,
  "thumbnailBoolean": false,
  "descriptionBoolean": false,
  "maxRetries": 5,
  "maxScrollRetries": 3,
  "saveInBatches": false,
  "videosPerBatch": 100,
  "concurrency": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "urls": [
        "https://www.youtube.com/@Vexento/shorts"
    ],
    "maxVideos": 0,
    "maxRetries": 5,
    "maxScrollRetries": 3,
    "videosPerBatch": 100,
    "concurrency": 25,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraper-engine/youtube-full-channel-transcripts-extractor").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 = {
    "urls": ["https://www.youtube.com/@Vexento/shorts"],
    "maxVideos": 0,
    "maxRetries": 5,
    "maxScrollRetries": 3,
    "videosPerBatch": 100,
    "concurrency": 25,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scraper-engine/youtube-full-channel-transcripts-extractor").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 '{
  "urls": [
    "https://www.youtube.com/@Vexento/shorts"
  ],
  "maxVideos": 0,
  "maxRetries": 5,
  "maxScrollRetries": 3,
  "videosPerBatch": 100,
  "concurrency": 25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scraper-engine/youtube-full-channel-transcripts-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scraper-engine/youtube-full-channel-transcripts-extractor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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