# YouTube Channel Transcripts: Every Video of a Channel (`fguiraud/youtube-channel-transcripts`) Actor

Download the transcripts of every video of a YouTube channel or playlist (@handle or link) as text, SRT, VTT, Markdown or RAG chunks, newest first, with title, duration and views. Only new videos on a schedule; videos without captions are not charged.

- **URL**: https://apify.com/fguiraud/youtube-channel-transcripts.md
- **Developed by:** [Fernando Guiraud](https://apify.com/fguiraud) (community)
- **Categories:** Videos, AI, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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

### What does YouTube Channel Transcripts do?

**YouTube Channel Transcripts** downloads the **transcripts of every video of a YouTube channel or playlist** in one run: give a `@handle`, a channel link or a playlist link and get **one row per video, newest first**, as **plain text, timestamped segments, SRT or VTT subtitles, Markdown or RAG-ready chunks**, with title, duration, views, keywords and description. **No YouTube API key.**

Schedule it with **Only new videos** and every run returns (and charges) only what the channel uploaded since the last run: a ready-made feed of new videos as text for newsletters, research or an LLM.

It runs on the Apify platform, so you also get an API, **scheduling**, integrations (Google Sheets, Make, Zapier, n8n, Slack) and access for **AI agents through the [Apify MCP server](https://mcp.apify.com)**.

> **Independent tool**, not affiliated with or endorsed by YouTube or Google LLC. It only reads publicly available captions.

### Why use it?

- 📚 **Research a creator or competitor**: every video of the channel as searchable text.
- 🤖 **Build a dataset or a RAG index** from a whole channel, already chunked with timestamps.
- 📰 **Watch a channel**: a weekly run with **Only new videos** gives you each new upload as text.
- ✍️ **Repurpose your own channel** into blog posts, show notes and social posts.

### How to download all transcripts of a YouTube channel

1. Click **Try for free**.
2. In **YouTube channels or playlists**, enter `@handle`, `youtube.com/@handle`, `youtube.com/channel/UC...` or a playlist link.
3. Set **Max videos per channel** (up to 2,000; listing the channel is free).
4. Optionally turn on **Only new videos** and choose the output formats.
5. Click **Start** and download the results as JSON, CSV or Excel.

### Input

```json
{
  "channels": ["@TED"],
  "maxVideosPerChannel": 50,
  "onlyNewVideos": true,
  "outputs": ["text", "srt"]
}
```

Single videos (`videos`) and YouTube searches (`searchQueries`) also work in the same run.

### Output

Real result from a run on 2026-10-13 (text shortened):

```json
{
  "videoId": "CKAyfGItpgg",
  "title": "How to Start Any Conversation the Right Way | Chris Fenning | TED",
  "channel": "TED",
  "foundIn": "TED",
  "language": "en",
  "isAutoGenerated": false,
  "durationSeconds": 667,
  "viewCount": 108964,
  "text": "I want to be long-winded and unclear. It's not a common opening line. Most people won't tell us when they're going to be long-winded, but we know...",
  "wordCount": 1759,
  "transcriptSource": "captions"
}
```

| Field | Description |
|---|---|
| `text`, `segments`, `srt`, `vtt`, `markdown`, `chunks` | The transcript in the formats you choose |
| `foundIn` | The channel or playlist the video was listed from |
| `language`, `isAutoGenerated` | Caption language and whether it was generated automatically |
| `title`, `durationSeconds`, `viewCount`, `keywords`, `description` | Video details |
| `status` | `ok` (billed), `no-captions`, `unavailable` or `error` (not billed) |

### How much does it cost to download a channel's transcripts?

| Event | Price |
|---|---|
| Run start (per GB of memory, default 256 MB) | $0.001 |
| Transcript (one video, all formats, with video details) | **$0.003** |
| AI transcription minute (only with `aiFallback`, videos without captions) | $0.010 |

**100 transcripts cost $0.30**, residential proxies included. Listing the channel is free: you pay only for transcripts returned. Videos without captions, private or removed videos and failures are never billed. Set **Max cost per run** and the Actor stops cleanly at that limit.

### Use it with AI agents (MCP)

Add `https://mcp.apify.com?tools=fguiraud/youtube-channel-transcripts` to Claude, Cursor or any MCP client and ask *"Get the last 20 videos of @TED as text and summarize the main ideas."* Common field names (`channel`, `handle`, `url`...) are accepted.

### FAQ and limitations

- **Order**: videos come newest first, Shorts and past live streams included.
- **Videos without captions**: they come back with `status: "no-captions"` and are not billed, unless you turn on `aiFallback` to transcribe them with AI (open-source Whisper, $0.010 per minute).
- **Age-restricted, private and members-only videos** cannot be read without signing in; they come back as `unavailable` and are not billed.
- **Is it legal?** The Actor reads the captions YouTube shows publicly on each video. Respect the rights of the video creators when you reuse their content.
- Found a problem or need a feature? Open an issue on the **Issues** tab.
- **Did it save you time?** A short review on the **Reviews** tab helps other people find this Actor.

### Related tools

- Single videos or many links: [YouTube Transcript Scraper](https://apify.com/fguiraud/youtube-transcript-scraper).
- Videos about a topic: [YouTube Search Transcripts](https://apify.com/fguiraud/youtube-search-transcripts).

# Actor input Schema

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

Get the newest videos of whole channels or playlists: @handle, youtube.com/@handle, youtube.com/channel/UC..., or a playlist link. Combine with Only new videos and a schedule to get every new upload as text.

## `maxVideosPerChannel` (type: `integer`):

How many of the newest videos to take from each channel or playlist. Listing is free; you pay only for transcripts returned.

## `onlyNewVideos` (type: `boolean`):

Skip videos of these channels, playlists and searches that earlier runs already processed. Ideal on a schedule: each run returns (and charges) only new videos.

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

Video links (youtube.com/watch?v=..., youtu.be/..., Shorts, live, embed) or 11-character video IDs. One per line. Channel and playlist links pasted here also work.

## `searchQueries` (type: `array`):

Get transcripts of the videos YouTube shows for a search, e.g. "python tutorial" or "AI agents". Results keep YouTube's order (searchRank). Combine with Only new videos and a schedule to get new videos about a topic as text.

## `maxVideosPerSearch` (type: `integer`):

How many results to take from each search (20 per page). Searching is free; you pay only for transcripts returned.

## `sortBy` (type: `string`):

Order of the search results.

## `uploadDate` (type: `string`):

Only videos uploaded in this period.

## `videoDuration` (type: `string`):

Only videos of this length.

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

Language codes in order of preference (en, es, pt, de, fr...). 'es' also matches regional tracks such as 'es-419'. Empty = the video's own captions.

## `fallbackToOtherLanguage` (type: `boolean`):

If none of the preferred languages exists, return the video's captions in its own language (billed). Turn off to skip those videos instead (not billed).

## `preferManualCaptions` (type: `boolean`):

Use captions written by the creator when they exist, and auto-generated ones otherwise. Turn off to prefer auto-generated captions.

## `aiFallback` (type: `boolean`):

When a video has no captions at all, download its audio and transcribe it with open-source Whisper (99 languages, auto-detected). Billed $0.010 per minute of audio instead of the transcript price; each video is rounded up to the next minute. Off by default. The run uses 2 GB of memory when this is on.

## `maxAiMinutesPerVideo` (type: `integer`):

Videos without captions that are longer than this are not transcribed with AI (and not billed). Protects your budget from very long videos.

## `outputs` (type: `array`):

text (paragraphs), segments (start/end/text), srt, vtt, markdown (with \[HH:MM:SS] timestamps) and chunks (for RAG).

## `includeMetadata` (type: `boolean`):

Channel ID, duration, views, keywords and description (free).

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

Target size of each chunk when 'chunks' is selected.

## `maxConcurrency` (type: `integer`):

How many videos are processed at the same time.

## `failOnError` (type: `boolean`):

Mark the run as FAILED when a video fails after all retries or no transcript is returned. Videos without captions do not count. Useful for monitoring pipelines.

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

YouTube blocks data-center IPs, so residential proxies are used by default (included in the price).

## Actor input object example

```json
{
  "channels": [
    "@TED",
    "https://www.youtube.com/@NASA"
  ],
  "maxVideosPerChannel": 5,
  "onlyNewVideos": false,
  "searchQueries": [
    "python tutorial"
  ],
  "maxVideosPerSearch": 10,
  "sortBy": "relevance",
  "uploadDate": "any",
  "videoDuration": "any",
  "languages": [
    "en"
  ],
  "fallbackToOtherLanguage": true,
  "preferManualCaptions": true,
  "aiFallback": false,
  "maxAiMinutesPerVideo": 60,
  "outputs": [
    "text",
    "segments"
  ],
  "includeMetadata": true,
  "chunkSize": 1000,
  "maxConcurrency": 5,
  "failOnError": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "channels": [
        "@TED"
    ],
    "maxVideosPerChannel": 5,
    "languages": [
        "en"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fguiraud/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 = {
    "channels": ["@TED"],
    "maxVideosPerChannel": 5,
    "languages": ["en"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("fguiraud/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 '{
  "channels": [
    "@TED"
  ],
  "maxVideosPerChannel": 5,
  "languages": [
    "en"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call fguiraud/youtube-channel-transcripts --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fguiraud/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/RU7tJAPu7Dr0GSgAI/builds/5MtIK8TtWI73ByWwd/openapi.json
