# YouTube Channel & Playlist Scraper (+ Transcripts) (`tpai/youtube-channel-playlist-scraper`) Actor

List every video, Short and live stream of YouTube channels or playlists with title, views, duration and date, and optionally the full transcript of each video. $1 per 1,000 videos.

- **URL**: https://apify.com/tpai/youtube-channel-playlist-scraper.md
- **Developed by:** [Tom](https://apify.com/tpai) (community)
- **Categories:** Videos, Social media, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 video listeds

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 Scraper (+ transcripts)

Get **every video of a YouTube channel or playlist** in one run: Videos, **Shorts** and **Live streams**, with title, views, duration, publish date, thumbnail and channel info (name, ID, subscribers). Turn on one option and you also get the **full transcript of every video**. That's ideal for building AI knowledge bases from a whole channel.

### Why use it?

- 📺 **Channels and playlists:** works with `@handle`, `/channel/UC…`, `/c/…` and `?list=` playlist URLs, including "Uploads" playlists.
- 🎬 **Videos, Shorts and Lives:** pick the tabs you need.
- 📝 **Optional transcripts:** the entire channel's spoken content in one dataset, in your preferred language.
- ⚡ **Fast and cheap:** no browser and no API key. $1 per 1,000 videos.
- 🛡️ **Reliable:** retries and a residential proxy fallback are included.

### Use cases

- **Channel → AI knowledge base / RAG:** chat with all the videos of a creator or a course.
- **Competitor and creator analysis:** posting frequency, views, best-performing titles, Shorts vs. long-form.
- **Influencer marketing:** shortlist channels and check their recent performance.
- **Content repurposing:** turn a channel's videos into articles, newsletters or social posts.
- **Archiving and monitoring:** run it on a schedule to catch every new upload.

### Input example

```json
{
  "startUrls": ["https://www.youtube.com/@3blue1brown", "https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi"],
  "contentTypes": ["videos", "shorts"],
  "maxVideosPerSource": 100,
  "includeTranscripts": true,
  "transcriptLanguage": "en"
}
```

### Output example

```json
{
  "videoId": "LKrwhjOI8Nc",
  "title": "There's never been a better time to go into math",
  "type": "video",
  "viewCount": 2600000,
  "duration": "40:44",
  "durationSeconds": 2444,
  "publishedTimeText": "2 weeks ago",
  "url": "https://www.youtube.com/watch?v=LKrwhjOI8Nc",
  "thumbnailUrl": "https://i.ytimg.com/vi/LKrwhjOI8Nc/hqdefault.jpg",
  "channelId": "UCYO_jab_esuFRV4b17AJtAw",
  "channelName": "3Blue1Brown",
  "channelSubscribers": 8730000,
  "transcript": "…full text of the video…",
  "transcriptLanguage": "en",
  "transcriptAutoGenerated": false,
  "success": true
}
```

### Pricing

- **$1 per 1,000 videos** listed ($0.001 per video, Short or live).
- **+ $3 per 1,000 transcripts** ($0.003), only when you enable transcripts and the video has captions. Videos without captions are not charged for the transcript.

Cap your spending per run with **Maximum cost per run**.

### Notes

- Items are returned newest first, as on the channel page. `maxVideosPerSource` applies to each selected tab separately.
- View counts are displayed rounded by YouTube (e.g. "2.6M") and converted to numbers.
- Transcripts are YouTube's own captions (creator-made or auto-generated). There is no speech-to-text.

### Questions or ideas?

Open an issue in the **Issues** tab. We usually reply within 24–48 hours.

### More YouTube tools from the same developer

- **YouTube Transcript Scraper:** transcripts with SRT and VTT, $3 per 1,000.
- **YouTube Scraper (search & video details):** search results with filters, $1.50 per 1,000.
- **YouTube Comments Scraper** and **YouTube Channel & Playlist Scraper.**

# Actor input Schema

## `startUrls` (type: `array`):

One per line: channel URL (https://www.youtube.com/@handle, /channel/UC…, /c/…), @handle, or playlist URL (…?list=…).

## `contentTypes` (type: `array`):

Which channel tabs to extract (ignored for playlists).

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

Newest first. Applies separately to each selected channel tab.

## `includeTranscripts` (type: `boolean`):

Adds the full transcript text and timestamped segments to each video ($3 per 1,000 transcripts, only when available).

## `transcriptLanguage` (type: `string`):

Preferred caption language codes, comma-separated (e.g. 'en' or 'fr,en'). Falls back to the original language.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.youtube.com/@3blue1brown",
    "https://www.youtube.com/playlist?list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi"
  ],
  "contentTypes": [
    "videos"
  ],
  "maxVideosPerSource": 100,
  "includeTranscripts": false,
  "transcriptLanguage": "en"
}
```

# Actor output Schema

## `videos` (type: `string`):

One item per video, Short or live stream.

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

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

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

```

## MCP server setup

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

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/6LYIEeuOhTefuY8oQ/builds/FPWxw36gNRUiMpB0v/openapi.json
