# YouTube Channel Scraper (`s-r/youtube-channel-scraper`) Actor

- **URL**: https://apify.com/s-r/youtube-channel-scraper.md
- **Developed by:** [SR](https://apify.com/s-r) (community)
- **Categories:** Social media, Marketing
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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 Scraper: Full Channel Profiles Without an API Key

Hosted **youtube channel scraper** and no-quota YouTube channel data API that returns the complete public profile of any YouTube channel as structured JSON. Subscriber count, total lifetime views, video count, channel creation date, country, description, external links, keywords, avatar, and banner all come back in one row per channel. Optionally attach the channel's recent videos as extra rows. Run it from the Apify Store with one click, or call it from your own service through the Apify API. Pay per channel, not per month.

If you've been looking for a **youtube channel scraper python** repo that stays maintained, or a bulk channel data extractor that reads @handles, `UC…` IDs, and full URLs interchangeably, this Actor is the hosted alternative. It reads YouTube's internal InnerTube web API (the same one the youtube.com channel page calls), so there's no API key, no OAuth screen, and no daily quota to burn.

### What you get

- **Subscriber count** as both an integer (`subscriber_count`) and the localized display string (`subscriber_count_text`, for example "4.8M subscribers").
- **Total lifetime views** for the whole channel (`total_view_count` plus `total_view_count_text`), the aggregate view figure from the About panel.
- **Video count** (`video_count`), the number of public uploads.
- **Channel creation date** (`joined_date` and the raw `joined_date_text` like "Joined Jan 21, 2009"), useful for age and credibility checks.
- **Country** (`country`) and **channel keywords** (`keywords`) straight from the About metadata.
- **External links** (`links`), the title-and-URL pairs a creator lists in their About panel, so you capture their website, Discord, merch store, and social profiles.
- **Identity and branding** fields: `channel_id`, `channel_name`, `handle`, canonical `channel_url`, full `description`, `avatar_url`, `banner_url`, and the `is_family_safe` flag.
- **Recent videos on demand** when `include_videos` is on: one extra row per video with `video_id`, `url`, `title`, `view_count`, `published_text`, and `duration_text`.
- **No YouTube Data API quota** and no key to manage.

### Why scrape YouTube channels

The official YouTube Data API can return channel statistics, but getting there is friction-heavy. You register a Google Cloud project, enable the API, generate credentials, and then work inside a 10,000-units-per-day quota. Once you fan out across thousands of channels plus their video lists, you hit the ceiling fast. For anything involving user-owned data you also get pulled into the OAuth consent flow, token refresh, and Google's verification review. That is a lot of plumbing for what is, at heart, public profile data anyone can read in a browser.

This Actor skips all of it. It calls YouTube's InnerTube endpoints directly, the same requests the youtube.com channel page fires when it renders the header and About tab. No API key, no OAuth, no quota accounting. You pass channel URLs, @handles, or `UC…` IDs and get back a clean profile row for each one, with both the parsed integer and the original localized string for every count so you can verify the value matches the page.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `channels` | array | **required** | YouTube channel URLs, `@handles`, or channel IDs (`UC…`). One per line. |
| `include_videos` | boolean | `false` | Also emit the channel's recent videos as separate rows (`type=video`). |
| `max_videos` | integer | `30` | Recent videos to collect per channel (1–1000). Only used when `include_videos` is on. |
| `country` | string | `US` | Two-letter country code (`gl`). |
| `language` | string | `en` | Two-letter interface language code (`hl`). |

### Output

Results are pushed to the Apify dataset as JSON records. Every channel produces one row with `type` set to `channel`. When `include_videos` is on, each of that channel's recent videos follows as its own row with `type` set to `video`.

A channel row:

```json
{
  "type": "channel",
  "channel_id": "UCBJycsmduvYEL83R_U4JriQ",
  "channel_name": "Marques Brownlee",
  "handle": "@mkbhd",
  "channel_url": "https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ",
  "description": "I promise to always keep it real with you guys...",
  "subscriber_count": 20100000,
  "subscriber_count_text": "20.1M subscribers",
  "total_view_count": 4200000000,
  "total_view_count_text": "4,200,000,000 views",
  "video_count": 1750,
  "joined_date": "2008-03-21",
  "joined_date_text": "Joined Mar 21, 2008",
  "country": "United States",
  "links": [
    { "title": "Website", "url": "https://mkbhd.com" },
    { "title": "X", "url": "https://x.com/mkbhd" }
  ],
  "keywords": "tech reviews smartphones",
  "avatar_url": "https://yt3.googleusercontent.com/...",
  "banner_url": "https://yt3.googleusercontent.com/...",
  "is_family_safe": true,
  "input": "@mkbhd",
  "fetched_in_seconds": 2.9
}
````

A video row (only when `include_videos` is on):

```json
{
  "type": "video",
  "channel_id": "UCBJycsmduvYEL83R_U4JriQ",
  "video_id": "dQw4w9WgXcQ",
  "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "title": "The Best Phones of the Year",
  "view_count": "1.2M views",
  "published_text": "2 weeks ago",
  "duration_text": "14:07",
  "input": "@mkbhd",
  "fetched_in_seconds": 2.9
}
```

Download the dataset as JSON, JSONL, CSV, or Excel from the Apify console, stream it through the Apify API, or pipe it to webhooks, S3, BigQuery, or any of Apify's integrations.

### Use cases

**Influencer discovery and vetting.** Feed a list of @handles and get subscriber counts, upload cadence signals (video count against join date), country, and the creator's own external links in one pass. Join date plus lifetime views tells you fast whether a channel is a steady long-term creator or a recently inflated account.

**Competitor benchmarking.** Track a set of rival channels on a schedule and diff each run against the last. Subscriber growth, view accumulation, and new-upload counts over time turn into a competitive scoreboard, no YouTube Studio login required.

**Sponsorship and media-kit research.** Before a deal, pull the hard numbers a creator would otherwise send in a media kit: subscribers, total views, upload volume, and country reach. Both the integer and the localized string come back for each count, so you can cross-check against the live page.

**Creator databases and lead lists.** Build or enrich a directory of channels in a niche. The external links field is the standout here, surfacing the website, store, and social handles creators publish on their About tab, giving you contact and cross-platform paths straight out of the profile.

### How it compares

| | This Actor | streamers/youtube-channel-scraper |
|---|---|---|
| Primary output | Full channel profile (subscribers, lifetime views, video count, join date, country, external links) | Channel-to-video list |
| Subscriber count | Yes (integer + text) | Not the focus |
| Total lifetime views | Yes | No |
| Video count and join date | Yes | No |
| External links from About | Yes | No |
| Recent videos | Optional, billed only when enabled | Core output, every row billed |
| Access method | InnerTube web API, no key, no quota | Scraper |
| Price | $0.001 per channel row, $0.001 per video row | $0.0013 per row |

The competitor Actor is really a "channel to video list": its job is to turn a channel into its uploads, and it bills every row. This Actor emits a richer channel profile first and only charges for video rows when you explicitly turn `include_videos` on. At $0.001 per row against their $0.0013, we undercut by roughly 23 percent.

### Pricing

Pay-per-event, so your bill scales linearly with usage and there's no monthly subscription.

- **$0.001** per channel row (`type=channel`)
- **$0.001** per video row (`type=video`), charged only when `include_videos` is on
- **$0.002** per-run actor-start fee

Scraping 1,000 channels with videos off costs $1.00 plus the $0.002 start fee. Turn videos on and each returned video adds another $0.001.

### Limits and gotchas

- **Two row types share one dataset.** Channel rows carry the profile fields; video rows carry `video_id`, `url`, `title`, `view_count`, `published_text`, and `duration_text`. Filter on the `type` field to separate them.
- **Video rows appear only when `include_videos` is on.** With the default off, you get exactly one row per channel and pay only channel-row prices.
- **`max_videos` is capped at 1,000** and is ignored entirely when `include_videos` is off.
- **Two billing events.** A run charges the $0.002 start fee once, then $0.001 per channel row and $0.001 per video row. Budget both.
- **Free-tier runs are capped at 10 results per run.** Upgrade to a paid Apify plan to lift the cap; paying users are never limited.
- **Counts come back as both integer and text.** `subscriber_count` and `total_view_count` are parsed integers; the `_text` variants preserve YouTube's localized display string so you can verify against the page.
- **Country and language shape the output.** `country` (`gl`) and `language` (`hl`) affect localized strings and the join-date wording. Set them to match the market you're reporting on.

### FAQ

#### How do I get a YouTube channel's subscriber count?

Pass the channel's URL, @handle, or `UC…` ID in `channels` and read `subscriber_count` (an integer like `20100000`) plus `subscriber_count_text` (the localized "20.1M subscribers" string) on the returned channel row. No API key needed.

#### Can I scrape a channel's total view count?

Yes. Every channel row includes `total_view_count` as an integer and `total_view_count_text` as the localized string. This is the lifetime aggregate view figure from the About panel, not a per-video number.

#### How do I find when a YouTube channel was created?

The `joined_date` field gives the creation date, and `joined_date_text` preserves the raw "Joined …" string. Combined with `video_count`, it's a quick way to gauge how established and active a channel is.

#### Can I get the external links a creator lists on their channel?

Yes. The `links` field returns the title-and-URL pairs from the About panel, so you capture the creator's website, merch store, Discord, and social profiles in one shot. That makes it the go-to field for outreach and creator-database lead lists.

#### Do I need to enable the videos option to get channel stats?

No. Channel statistics come back on the channel row whether or not `include_videos` is on. Turn videos on only when you also want the channel's recent uploads as separate rows, which adds $0.001 per video.

### Related Actors

- [Youtube Scraper](https://apify.com/s-r/youtube-scraper) - Scrape YouTube videos by search term, channel, or video URL.
- [Youtube Shorts Scraper](https://apify.com/s-r/youtube-shorts-scraper) - Scrape YouTube Shorts from any channel with full engagement data.
- [Free Youtube Channel Email Reveal](https://apify.com/s-r/free-youtube-channel-email-reveal) - Reveal the business email listed on a YouTube channel.

# Actor input Schema

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

YouTube channel URLs, @handles, or channel IDs (UC…). One per line.

## `include_videos` (type: `boolean`):

Also emit the channel's recent videos as separate rows (type=video).

## `max_videos` (type: `integer`):

Only used when 'Include recent videos' is on (1–1000).

## `country` (type: `string`):

Two-letter country code (gl).

## `language` (type: `string`):

Two-letter interface language code (hl).

## Actor input object example

```json
{
  "channels": [
    "@mkbhd"
  ],
  "include_videos": false,
  "max_videos": 30,
  "country": "US",
  "language": "en"
}
```

# 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": [
        "@mkbhd"
    ],
    "max_videos": 30,
    "country": "US",
    "language": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("s-r/youtube-channel-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 = {
    "channels": ["@mkbhd"],
    "max_videos": 30,
    "country": "US",
    "language": "en",
}

# Run the Actor and wait for it to finish
run = client.actor("s-r/youtube-channel-scraper").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 '{
  "channels": [
    "@mkbhd"
  ],
  "max_videos": 30,
  "country": "US",
  "language": "en"
}' |
apify call s-r/youtube-channel-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Channel Scraper",
        "description": "",
        "version": "0.1",
        "x-build-id": "7to1EMgP5q3syF4mL"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/s-r~youtube-channel-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-s-r-youtube-channel-scraper",
                "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/s-r~youtube-channel-scraper/runs": {
            "post": {
                "operationId": "runs-sync-s-r-youtube-channel-scraper",
                "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/s-r~youtube-channel-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-s-r-youtube-channel-scraper",
                "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": [
                    "channels"
                ],
                "properties": {
                    "channels": {
                        "title": "Channels",
                        "type": "array",
                        "description": "YouTube channel URLs, @handles, or channel IDs (UC…). One per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "include_videos": {
                        "title": "Include recent videos",
                        "type": "boolean",
                        "description": "Also emit the channel's recent videos as separate rows (type=video).",
                        "default": false
                    },
                    "max_videos": {
                        "title": "Max videos per channel",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Only used when 'Include recent videos' is on (1–1000).",
                        "default": 30
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Two-letter country code (gl).",
                        "default": "US"
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Two-letter interface language code (hl).",
                        "default": "en"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
