# YouTube Channel Scraper — Subscribers, Stats & Contacts (`seemuapps/youtube-channel-scraper`) Actor

Scrape YouTube channel details in bulk from handles or URLs — subscribers, total views, video count, join date, country, upload cadence, emails and social links.

- **URL**: https://apify.com/seemuapps/youtube-channel-scraper.md
- **Developed by:** [Seemu Scraping](https://apify.com/seemuapps) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 channel scrapeds

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 Scraper — Subscribers, Stats & Contacts

Scrape YouTube channel details in bulk. Paste a list of @handles, channel URLs or channel IDs and get one clean row per channel with subscribers, total views, video count, join date, country, recent upload activity, business email and social links.

Works with up to 5,000 channels per run. No login, no YouTube account needed. Export to JSON, CSV, Excel or Google Sheets.

### What you get

For every channel:

**Identity**

- **channelId**, **channelUrl**, **handle**, **title**, **description**
- **thumbnailUrl** (profile picture) and **bannerUrl**
- **country**, **joinedAt**, **madeForKids**, **channelKeywords** (the creator's own tags), **topicCategories**

**Size and reach**

- **subscriberCount** (and **subscriberCountHidden** when the creator hides it), **totalViews**, **videoCount**, **avgViewsPerVideo**
- **sizeTier** — `nano` (<10k), `micro` (10k–100k), `mid` (100k–1M), `macro` (1M–10M) or `mega` (>10M)

**Recent activity** (from the channel's 10 latest uploads)

- **lastUploadAt** and **uploadsPerMonth** — is the channel still active, and how often does it post?
- **avgViewsRecent**, **avgLikesRecent**, **avgCommentsRecent** — what a new video gets today, not lifetime averages
- **engagementRate** — (likes + comments) / views, as a percentage
- **shortsShareRecent** — share of recent uploads that are Shorts
- **latestVideoTitle**, **latestVideoUrl**

**Contacts and links**

- **email** (the business email when one is listed) and **allEmails**
- **website**, **instagram**, **tiktok**, **twitter**, **facebook**, **linkedin**, **discord**, **patreon**, **otherLinks**
- **externalLinks** — every link from the channel's About panel with its label

### Use cases

- **Influencer vetting** — check subscribers, engagement and posting cadence for a list of creators before you reach out
- **Subscriber tracking** — schedule the actor daily or weekly to monitor subscriber and view growth for a watchlist of channels
- **Lead enrichment** — turn a spreadsheet of channel links into emails, websites and social profiles
- **Competitor benchmarking** — compare size, upload frequency and engagement across competing channels
- **Agency reporting** — pull fresh stats for every creator on your roster in one run

### How to use

1. Add your channels to **Channels**, one per line. Any of these work:
   - `@mkbhd`
   - `https://www.youtube.com/@veritasium`
   - `https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA` or just `UCX6OQ3DkcsbYNE6H8uQQuVA`
   - Legacy links such as `youtube.com/c/name` or `youtube.com/user/name`
   - Any video or Shorts URL — you get the channel that uploaded it
2. Leave **Include recent activity** and **Include About links & contacts** on for full enrichment, or switch them off for a faster, lighter run.
3. Run the actor. Results stream into the **Dataset** tab.

Duplicate channels (for example a handle and a video from the same creator) are returned once. Inputs that don't match a channel are skipped and noted in the log.

### Output format

Each dataset record:

```json
{
  "input": "@mkbhd",
  "channelId": "UCBJycsmduvYEL83R_U4JriQ",
  "channelUrl": "https://www.youtube.com/@mkbhd",
  "handle": "@mkbhd",
  "title": "Marques Brownlee",
  "description": "MKBHD: Quality Tech Videos | YouTuber | Geek ...",
  "thumbnailUrl": "https://yt3.ggpht.com/...",
  "bannerUrl": "https://yt3.googleusercontent.com/...",
  "subscriberCount": 21300000,
  "subscriberCountHidden": false,
  "totalViews": 5680980169,
  "videoCount": 1852,
  "avgViewsPerVideo": 3067484,
  "sizeTier": "mega",
  "country": "US",
  "joinedAt": "2008-03-21T15:25:54Z",
  "madeForKids": false,
  "channelKeywords": ["MKBHD", "MarquesBrownlee"],
  "topicCategories": ["Lifestyle (sociology)", "Technology"],
  "externalLinks": [
    { "title": "Twitter", "url": "https://twitter.com/MKBHD" },
    { "title": "Instagram", "url": "https://instagram.com/MKBHD" }
  ],
  "lastUploadAt": "2026-09-22T17:49:42Z",
  "recentVideosAnalyzed": 10,
  "uploadsPerMonth": 9.5,
  "avgViewsRecent": 8684111,
  "avgLikesRecent": 152264,
  "avgCommentsRecent": 7749,
  "engagementRate": 1.84,
  "shortsShareRecent": 0.3,
  "latestVideoTitle": "The Apple Watch Has a Problem",
  "latestVideoUrl": "https://www.youtube.com/watch?v=pOX1l1edBME",
  "email": "business@mkbhd.com",
  "allEmails": ["business@mkbhd.com"],
  "website": null,
  "instagram": "https://instagram.com/MKBHD",
  "twitter": "https://x.com/MKBHD",
  "discord": "https://discord.gg/MKBHD",
  "otherLinks": ["https://reddit.com/r/MKBHD"],
  "scrapedAt": "2026-09-23T02:45:57.731Z"
}
```

### Pricing

You pay per channel returned. Channels that can't be found are never charged.

### Related actors

- **YouTube Channel Finder** — discover channels by niche keyword instead of pasting a list
- **YouTube Channel Growth Analyzer** — deeper growth metrics across a channel's recent uploads
- **YouTube Channel Videos Scraper** — list every video a channel has published

# Actor input Schema

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

YouTube channels to scrape, one per line. Accepts @handles (@mkbhd), channel URLs (youtube.com/@handle, /channel/UC…, /c/name, /user/name), raw channel IDs (UC…), or any video / Shorts URL to get the uploader's channel. Up to 5,000 per run.

## `includeRecentActivity` (type: `boolean`):

Analyze each channel's 10 latest uploads for last upload date, uploads per month, average views/likes/comments, engagement rate and Shorts share.

## `includeLinks` (type: `boolean`):

Read each channel's About panel for its external links (website, Instagram, TikTok, X, Facebook, LinkedIn, Discord, Patreon) and pull any public email from the description.

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

Optional. Leave off by default. Enable Apify Proxy only if YouTube starts blocking requests from the default network.

## Actor input object example

```json
{
  "channels": [
    "@mkbhd",
    "https://www.youtube.com/@veritasium",
    "UCX6OQ3DkcsbYNE6H8uQQuVA"
  ],
  "includeRecentActivity": true,
  "includeLinks": true
}
```

# Actor output Schema

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

One record per channel: input, channelId, channelUrl, handle, title, description, thumbnailUrl, bannerUrl, subscriberCount, totalViews, videoCount, avgViewsPerVideo, sizeTier, country, joinedAt, madeForKids, channelKeywords, topicCategories, externalLinks, lastUploadAt, uploadsPerMonth, avgViewsRecent, engagementRate, shortsShareRecent, latestVideoTitle, email, website, instagram, tiktok, twitter, facebook, linkedin, discord, patreon.

# 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",
        "https://www.youtube.com/@veritasium",
        "UCX6OQ3DkcsbYNE6H8uQQuVA"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("seemuapps/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",
        "https://www.youtube.com/@veritasium",
        "UCX6OQ3DkcsbYNE6H8uQQuVA",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("seemuapps/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 '{
  "channels": [
    "@mkbhd",
    "https://www.youtube.com/@veritasium",
    "UCX6OQ3DkcsbYNE6H8uQQuVA"
  ]
}' |
apify call seemuapps/youtube-channel-scraper --silent --output-dataset

```

## MCP server setup

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