# YouTube Channel Transcripts (`scrapewise/youtube-channel-transcripts`) Actor

Get the transcripts of every video on a YouTube channel as text, timestamps, SRT or VTT, with publish date, views and length. Limit videos per channel, filter by date and schedule it with only-new-videos mode. Videos without captions are free. Pay per transcript.

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

## Pricing

from $3.50 / 1,000 transcript delivereds

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?

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 Channel Transcripts

Get the transcripts of every video on a YouTube channel in one run: clean text, timestamped segments, SRT or VTT, with each video's title, publish date, views and length. Paste a channel, choose how many videos, and schedule it to receive only the new ones.

### What you get

- **A whole channel from one URL or handle.** `https://www.youtube.com/@veritasium`, `@veritasium`, `/channel/UC...`, `/c/name` or `/user/name`. Videos come newest first.
- **Only new videos since the last run.** Turn on `onlyNewVideos`, schedule the Actor daily or weekly, and each run delivers only the videos you did not get yet.
- **Date filter.** `publishedAfter` keeps only videos published after a date; older ones cost nothing.
- **Regular videos and past live streams by default**, Shorts optional.
- **Videos without captions never fail the run.** They come back with an `errorCode` and are **not charged**.
- **Video details included:** `title`, `publishedAt`, `viewCount`, `lengthSeconds`, `description`, `thumbnailUrl`, `channelId`, at no extra cost.

### Use cases

- Build a knowledge base or RAG index from a creator's channel, a podcast or a company's tutorial library.
- Monitor competitors or news channels: a daily schedule with `onlyNewVideos` sends each new video's transcript to Slack, Google Sheets or your AI summary workflow.
- Research a niche: pull the last 50 videos of 10 channels and search what they talk about.

### Input

```json
{
  "channelUrls": ["https://www.youtube.com/@veritasium", "@lexfridman"],
  "maxVideosPerSource": 20,
  "publishedAfter": "2026-01-01",
  "onlyNewVideos": true,
  "includeShorts": false,
  "languages": ["en"],
  "maxItems": 50
}
```

| Field | What it does |
|---|---|
| `channelUrls` | Channel URLs or handles. A handle without `@` also works. |
| `maxVideosPerSource` | Videos per channel, newest first (default 10). |
| `publishedAfter` | Skip videos published before this date. |
| `onlyNewVideos` | Skip videos already delivered in earlier runs of your account. |
| `includeShorts` | Add Shorts to the listing. |
| `languages`, `captionType`, `includeSegments`, `subtitleFormats` | Advanced: caption language, manual or auto captions, timestamps, SRT/VTT. |
| `maxItems` | Hard limit for the whole run (default 50). |

### Output

One item per video:

```json
{
  "videoId": "dQw4w9WgXcQ",
  "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
  "channel": "Rick Astley",
  "channelId": "UCuAXFkgsw1L7xaCfnd5JJOw",
  "publishedAt": "2009-10-25T06:57:33+00:00",
  "viewCount": 1815077270,
  "lengthSeconds": 213,
  "language": "en",
  "isAutoGenerated": false,
  "text": "[♪♪♪] ♪ We're no strangers to love ♪ ...",
  "wordCount": 487,
  "segments": [{ "text": "[♪♪♪]", "start": 1.36, "duration": 1.68 }],
  "errorCode": null,
  "sourceUrl": "https://www.youtube.com/@RickAstleyYT",
  "scrapedAt": "2026-09-13T01:30:00+00:00"
}
```

`sourceUrl` is the channel the video came from. Items that could not be transcribed have `error` and `errorCode` filled in and are not charged:

| errorCode | Meaning |
|---|---|
| `NO_CAPTIONS` | The video has no captions |
| `NO_CAPTIONS_IN_LANGUAGE` | No captions of the requested caption type |
| `VIDEO_UNAVAILABLE` / `VIDEO_UNPLAYABLE` | Private, removed or region-locked video |
| `AGE_RESTRICTED` | Age restricted video |
| `LIVE_NOT_ENDED` | Live stream still running or upcoming |
| `BLOCKED` | YouTube blocked every attempt; try again |

### Pricing

**From US$ 3.50 per 1,000 transcripts delivered, no monthly fee.** US$ 5.00 on the Free plan, lower on paid Apify plans:

| Apify plan | Per 1,000 transcripts |
|---|---|
| Free | US$ 5.00 |
| Starter (Bronze) | US$ 4.50 |
| Scale (Silver) | US$ 4.00 |
| Business (Gold) and above | US$ 3.50 |

Listing the channel is free, and so are videos without captions, unavailable or blocked. With `onlyNewVideos` on, a daily run over a channel that posted nothing new costs nothing.

### How to use

- **Console:** paste the channels, click Start, download JSON, CSV or Excel.
- **API:** `POST https://api.apify.com/v2/acts/scrapewise~youtube-channel-transcripts/run-sync-get-dataset-items?token=YOUR_TOKEN` with the input as the body.
- **Schedule:** Apify Schedules, daily or weekly, with `onlyNewVideos` on.
- **Integrations:** n8n, Make, Zapier, Google Sheets and MCP clients (Claude, Cursor) through the Apify integrations.

### FAQ

**How many videos can I get from one channel?**
Set `maxVideosPerSource` up to 5,000 and `maxItems` at least as high. Large channels take longer; videos are transcribed 5 at a time.

**Does it transcribe audio?**
No. It reads the captions YouTube already has, manual or auto-generated. Most videos in major languages have auto-generated captions.

**How does "only new videos" behave on the first runs?**
Each run takes up to `maxVideosPerSource` videos per channel that you have not received yet, newest first. On a channel you never ran, the first runs fill in the back catalog (run 1 gets the 8 newest, run 2 the next 8, and so on). To receive only videos uploaded from now on, set `publishedAfter` to today's date together with `onlyNewVideos`.

**Where is the "only new videos" memory kept?**
In a named key-value store in your own Apify account, `youtube-channel-transcripts-only-new-videos`, one record per channel. Delete it to start over.

**Why are some items missing a transcript?**
The video has captions disabled, is private, age restricted or a live stream still running. Those items show the reason in `errorCode` and are free.

**Can I get transcripts in a specific language?**
Put the language codes in `languages`, in order of preference. If the video has none of them, the first manual caption is used, then the auto-generated one.

### Limitations

- Only videos with captions can be transcribed.
- Channels are listed from the Videos and Live tabs; members-only videos are skipped.
- YouTube blocks most datacenter IPs, so residential proxy is the default. Keep it on.
- Something broke? Open an issue on the Actor page. Issues are answered within 12 hours.

This Actor collects only public data and respects the site's terms.

### Changelog

- **2026-09-14:** lower price, from US$ 3.50 per 1,000 on paid plans (US$ 5.00 on Free).
- **2026-09-13, 0.1:** first release. Channel URLs or handles, videos per channel, published-after filter, only-new-videos mode, Shorts on or off, SRT/VTT, video details.

Keywords: youtube channel transcripts, youtube channel transcript, full channel transcript, bulk youtube transcripts, channel to text.

# Actor input Schema

## `channelUrls` (type: `array`):

YouTube channel URLs or handles: https://www.youtube.com/@veritasium, @veritasium, /channel/UC..., /c/name or /user/name. Videos are listed newest first. Playlist, search and single video URLs also work.

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

How many videos to transcribe from each channel, newest first. Raise it to get a whole channel.

## `publishedAfter` (type: `string`):

Skip videos published before this date (YYYY-MM-DD). Skipped videos produce no item and are not charged.

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

Remembers which videos of each channel, playlist or search already got delivered (in a named key-value store in your account, 'youtube-channel-transcripts-only-new-videos') and skips them on the next runs. Ideal for a daily or weekly schedule. Videos without captions are tried again next time, free.

## `includeShorts` (type: `boolean`):

Include Shorts when listing a channel or a search. Off: regular videos and past live streams only.

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

Language codes in order of preference (e.g. en, es, pt-BR). If none is available, the first manual caption is used, then the auto-generated one.

## `captionType` (type: `string`):

Which captions to use. Videos without the requested type come back with errorCode NO\_CAPTIONS\_IN\_LANGUAGE and are not charged.

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

Adds a 'segments' array with text, start and duration (seconds) for each caption line.

## `subtitleFormats` (type: `array`):

Adds ready-to-use 'srt' and/or 'vtt' fields with the full subtitle file. Same price.

## `maxItems` (type: `integer`):

Hard limit for the whole run, across all inputs. Protects your budget.

## `tryDatacenterFirst` (type: `boolean`):

Each video is tried twice through datacenter proxy before falling back to the proxy below. Keeps runs fast and cheap.

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

YouTube blocks most datacenter IPs; residential proxy is the default and recommended.

## Actor input object example

```json
{
  "channelUrls": [
    "https://www.youtube.com/@veritasium"
  ],
  "maxVideosPerSource": 10,
  "onlyNewVideos": false,
  "includeShorts": false,
  "languages": [
    "en",
    "pt",
    "pt-BR",
    "es"
  ],
  "captionType": "any",
  "includeSegments": true,
  "subtitleFormats": [],
  "maxItems": 50,
  "tryDatacenterFirst": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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 = {
    "channelUrls": [
        "https://www.youtube.com/@veritasium"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/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 = {
    "channelUrls": ["https://www.youtube.com/@veritasium"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/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 '{
  "channelUrls": [
    "https://www.youtube.com/@veritasium"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scrapewise/youtube-channel-transcripts --silent --output-dataset

```

## MCP server setup

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