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

Subscribers, total views, video count, country, joined date, description, links and socials for any YouTube channel, by URL or keyword. Optional latest videos. No API key or login needed.

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

## Pricing

from $1.50 / 1,000 results

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?

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 Scraper

### What does YouTube Channel Scraper do?

YouTube Channel Scraper returns one clean record per YouTube channel with the numbers and profile details shown on the channel page and in its About panel. Give it channel URLs in any format (@handle, /channel/UC..., /c/name or /user/name), or give it keywords and it finds matching channels through YouTube search with the channel filter. For each channel you get the channel ID, handle, title, full description, subscriber count, exact video count, exact total views, country, joined date, avatar, banner, verified status, channel keywords and every external link from the About panel, with YouTube's redirect wrapper removed so you get the real website and social profile URLs. Turn on latest videos to add the newest uploads with views, published time and duration. It needs no YouTube API key, no login and no cookies. You are only charged for channels that come back complete with an ID and a title.

### What data can I extract from a YouTube channel?

| Field | Example | Notes |
|---|---|---|
| `channelId` | `UCBJycsmduvYEL83R_U4JriQ` | Always present |
| `channelUrl` | `https://www.youtube.com/@mkbhd` | Handle URL when the channel has one |
| `handle` | `@mkbhd` | |
| `title` | `Marques Brownlee` | Always present |
| `description` | Full About text | |
| `subscriberCount` | `21400000` | Number. YouTube rounds this itself (21.4M) |
| `videoCount` | `1859` | Exact number from the About panel |
| `viewCount` | `5782176119` | Exact total channel views |
| `country` | `United States` | `null` when the channel does not show one |
| `joinedDate` | `2008-03-21` | ISO date |
| `avatar`, `banner` | Image URLs | Largest size offered |
| `isVerified` | `true` | Verified badge next to the channel name |
| `keywords` | `["MKBHD", "Marques"]` | Only present when the channel set keywords |
| `links` | `[{ "title": "Twitter", "url": "http://twitter.com/MKBHD" }]` | Websites and socials, unwrapped |
| `latestVideos` | See below | Only when Include latest videos is on |
| `input` | The URL or keyword that found the channel | |

### How do I use YouTube Channel Scraper?

1. Paste channel URLs, or type search keywords, or both.
2. Optionally turn on Include latest videos.
3. Click Start and download the results as JSON, CSV, Excel or through the API.

#### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `channelUrls` | array of strings | | Channel URLs: @handle, /channel/UC..., /c/name or /user/name |
| `searchKeywords` | array of strings | | Keywords to find channels with YouTube search |
| `maxChannelsPerKeyword` | integer | 10 | Channels to scrape per keyword (1 to 500) |
| `includeLatestVideos` | boolean | false | Add the newest videos from the Videos tab |
| `maxLatestVideos` | integer | 10 | Latest videos per channel (1 to 30) |
| `maxConcurrency` | integer | 5 | Channels processed at the same time |
| `maxRequestRetries` | integer | 5 | Attempts per channel, each on a new proxy IP |
| `proxy` | object | Apify residential | Proxy settings |

```json
{
    "channelUrls": ["https://www.youtube.com/@NASA", "https://www.youtube.com/@mkbhd"],
    "searchKeywords": ["astronomy"],
    "maxChannelsPerKeyword": 5,
    "includeLatestVideos": true,
    "maxLatestVideos": 5,
    "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

#### Output example

A real record from a test run (October 2026):

```json
{
    "channelId": "UCBJycsmduvYEL83R_U4JriQ",
    "channelUrl": "https://www.youtube.com/@mkbhd",
    "handle": "@mkbhd",
    "title": "Marques Brownlee",
    "description": "MKBHD: Quality Tech Videos | YouTuber | Geek | Consumer Electronics | Tech Head | Internet Personality!\n\nbusiness@MKBHD.com\n\nNYC",
    "subscriberCount": 21400000,
    "videoCount": 1859,
    "viewCount": 5782176119,
    "country": "United States",
    "joinedDate": "2008-03-21",
    "avatar": "https://yt3.googleusercontent.com/qu4TmIaYUlS41-dJ9gZ7DUR3nilvmB5_11i6OKSdvNnBNiyOusZP1bMN6ICnuxtjFBb6ioKgRQ=s900-c-k-c0x00ffffff-no-rj",
    "banner": "https://yt3.googleusercontent.com/zi_48HwHU4s0Hnb6tZuvRzTfCPHrLEnrtIMDLzMauDEyDmURh9JZ4wrNd3lKr7m9uVnT4YjYKw=w2560-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
    "isVerified": true,
    "links": [
        { "title": "Twitter", "url": "http://twitter.com/MKBHD" },
        { "title": "Instagram", "url": "http://instagram.com/MKBHD" },
        { "title": "The Studio", "url": "http://youtube.com/c/TheStudio" },
        { "title": "Reddit", "url": "http://reddit.com/r/MKBHD" },
        { "title": "Discord", "url": "http://discord.gg/MKBHD" }
    ],
    "input": "https://www.youtube.com/@mkbhd",
    "keywords": ["MKBHD", "MarquesBrownlee", "Marques", "Brownlee"]
}
```

With Include latest videos on, each record also gets a `latestVideos` list. A real entry from the same test runs:

```json
"latestVideos": [
    {
        "id": "q_ADBlrIRsM",
        "title": "ISS through my Telescope (Compilation)",
        "url": "https://www.youtube.com/watch?v=q_ADBlrIRsM",
        "viewCount": 4300000,
        "publishedText": "6 years ago",
        "duration": 543
    }
]
```

### FAQ

#### Do I need a YouTube API key or an account?

No. The scraper reads the same public data YouTube shows to a logged-out visitor. There is no quota to manage and nothing to log in to.

#### Which channel URL formats work?

`youtube.com/@handle`, `youtube.com/channel/UC...`, `youtube.com/c/name` and `youtube.com/user/name`. Extra path parts such as `/videos` or `/about` are fine. URLs on other hosts are refused and listed in `FAILED_ITEMS`.

#### Why is the subscriber count rounded?

YouTube only publishes a rounded subscriber figure (for example 21.4M) to everyone except the channel owner. The scraper turns it into a number (21400000). Video count and total views are exact.

#### Does it return the channel's business email?

No. YouTube hides the business email behind a sign-in and a captcha. Emails written in the description text are returned as part of `description`.

#### What happens when a channel cannot be scraped?

It is retried on a fresh proxy IP up to Max request retries times. Channels that do not exist, URLs that are not channels and channels that still fail are skipped, not charged, and listed with the reason in the `FAILED_ITEMS` record of the run's key-value store.

#### How do I scrape videos, comments or transcripts from a channel?

Use the sibling actors below. This actor focuses on channel information.

### Known limits

- Subscriber counts are YouTube's rounded figures.
- `latestVideos` comes from the first page of the Videos tab, so at most 30 videos. Shorts and live streams are not included.
- `viewCount` and `duration` in `latestVideos` are YouTube's rounded display values (4.3M views).
- Keyword search returns channels in YouTube's order and stops when YouTube has no more channel results.
- Channels without an About panel (some auto-generated Topic channels) are skipped.
- Labels such as `country` are returned in English. The description stays in the channel's own language.

### Related YouTube scrapers

- [YouTube Scraper](https://apify.com/muhammad_noman_riaz/youtube-super-scraper): full video details from searches, channels and video URLs.
- [YouTube Transcript Scraper](https://apify.com/muhammad_noman_riaz/youtube-video-transcript-super-scraper): timestamped transcripts in any language.
- [YouTube Comments Scraper](https://apify.com/muhammad_noman_riaz/youtube-comments-super-scraper): comments and replies from any video.

# Actor input Schema

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

YouTube channel URLs: youtube.com/@handle, /channel/UC..., /c/name or /user/name. Each channel returns one result.

## `searchKeywords` (type: `array`):

Find channels with YouTube search (channel filter). Each keyword returns up to Max channels per keyword channels, in YouTube's order.

## `maxChannelsPerKeyword` (type: `integer`):

How many channels to scrape for each search keyword.

## `includeLatestVideos` (type: `boolean`):

Adds the newest videos from each channel's Videos tab (id, title, URL, views, published text, duration in seconds).

## `maxLatestVideos` (type: `integer`):

How many of the newest videos to add per channel when latest videos are included. Read from the first page of the Videos tab, so at most 30.

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

Maximum number of channels processed at the same time.

## `maxRequestRetries` (type: `integer`):

How many times a channel or keyword is tried, each time on a new proxy IP, before it is skipped.

## `proxy` (type: `object`):

Proxy used for requests to YouTube. Residential proxies are recommended; YouTube often blocks datacenter IPs.

## Actor input object example

```json
{
  "channelUrls": [
    "https://www.youtube.com/@NASA"
  ],
  "maxChannelsPerKeyword": 10,
  "includeLatestVideos": false,
  "maxLatestVideos": 10,
  "maxConcurrency": 5,
  "maxRequestRetries": 5,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `channels` (type: `string`):

One item per channel with counts, about data, links and optional latest videos

# 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/@NASA"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhammad_noman_riaz/youtube-channel-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/TZ2pXHcKwiBD2XBRN/builds/7piN0cUOsovzC87Ya/openapi.json
