# YouTube Channel Stats Scraper — Subscribers, Views & Growth (`inovaflow/youtube-channel-stats-scraper`) Actor

Bulk YouTube channel checker: subscribers, total views, video count, country, joined date, verified badge, links, avatar, banner and latest upload for any list of channel URLs, @handles or IDs. Add a tracker name to get growth since the last run. No login, no API key.

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

## Pricing

from $1.00 / 1,000 channels

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

**Paste a list of YouTube channels, get their numbers back — subscribers, views, videos, country, last upload — and, run after run, how much each one grew.**

If you manage a creator roster, watch competitors, or vet channels before a campaign, you know the chore: open each channel, copy the subscriber count, click "…more" for the total views and join date, scroll to see when they last posted. For ten channels it's annoying. For five hundred, every week, it's a job.

We built this for ourselves first, and now we're sharing it. Paste channel links, @handles or IDs (or find channels by keyword) and you get one clean row per channel: **subscribers, exact total views, exact video count, country, joined date, verified badge, avatar, banner, description, links, latest upload and recent views**. Give the run a **tracker name** and schedule it — every run then compares each channel with the previous one and adds the change: subscribers gained, views per day, new videos, and growth since tracking started. No login, no API key, no spreadsheet formulas.

It's built to be cheap at scale: every channel is three small requests (a few dozen kilobytes) through Apify's datacenter proxy.

### Who it's for

- **Agencies and talent managers** — *"how did every creator on our roster grow this week?"*
- **Brands vetting influencers** — *"which of these 300 channels posted in the last 30 days, and what do their recent videos really get?"*
- **Competitor and market watchers** — track a set of channels daily and spot who is accelerating.
- **Data teams and AI agents** — flat JSON, one call, stable field names.

### What you get per channel

`title`, `handle`, `channelUrl`, `channelId`, `subscribers`, `totalViews`, `videoCount`, `avgViewsPerVideo`, `country`, `joinedDate`, `channelAgeDays`, `verified`, `description`, `tags`, `isFamilySafe`, `avatarUrl`, `bannerUrl`, `website`, `instagram`, `tiktok`, `twitter`, `facebook`, `links` (every link, labelled by platform), `hasBusinessEmail` (YouTube shows a business e-mail to signed-in viewers), `latestUploadAt`, `latestVideoTitle`, `latestVideoUrl`, `latestVideoViews`, `uploadsLast30Days`, `recentAvgViews`, `recentMedianViews`.

With a tracker: `previousCheckedAt`, `daysSincePreviousCheck`, `subscribersChange`, `subscribersChangePct`, `totalViewsChange`, `viewsPerDaySincePrevious`, `videoCountChange`, `newUploadSincePrevious`, `trackingSince`, `subscribersChangeSinceStart`, `totalViewsChangeSinceStart`, `videoCountChangeSinceStart`.

Three table views are built in: **Channel stats**, **Growth (tracker)** and **Profile & links**. A channel that no longer exists still gets a row (`status: not_found`) so a tracker notices it — those rows are free.

### Options

- **Channels** — `https://www.youtube.com/@mkbhd`, `@mkbhd`, `UCBJycsmduvYEL83R_U4JriQ`, `/c/` and `/user/` URLs, or any video / Shorts link (its channel is used). Up to 10,000 per run.
- **Keywords** (optional) — by default each keyword finds the creators behind the videos YouTube ranks for it; switch to `channels` for YouTube's channel-name search. Cap with *Maximum channels per keyword* and narrow with the subscriber range.
- **Tracker name** — any name; runs with the same name share one saved snapshot (a named key-value store `yt-channel-stats-<name>` in your account). Delete that store to start over.
- **Latest upload and recent views** (on) — reads the public uploads feed (latest 15 uploads).

### How to set it up

1. Paste your channels (one per line).
2. For growth tracking, type a tracker name, e.g. `roster`.
3. Run it — then, in **Schedules**, run the same input daily or weekly. Open the **Growth (tracker)** view after the second run.

And that's it. A hundred channels take about a minute, a thousand about ten.

### Pricing

Pay per channel delivered — see the Pricing tab. Channels that don't exist, keyword finds outside your subscriber range, and duplicates are never charged.

> **Tip:** turn off *Latest upload and recent views* if you only need subscribers, views and videos — each channel then needs one request less.

### Notes

- Subscriber counts are rounded by YouTube itself (21.3M, 11.2K), so small subscriber changes on big channels show up only when the rounded number moves. Total views and video counts are exact — `totalViewsChange` and `viewsPerDaySincePrevious` are the precise growth signals.
- `uploadsLast30Days` counts the 15 most recent uploads, so 15 means "15 or more".
- Only public data is read. Found a bug or need a field? Open an issue on the **Issues** tab — we answer fast and build custom versions on request.

# Actor input Schema

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

One per line: `https://www.youtube.com/@mkbhd`, `@mkbhd`, `UCBJycsmduvYEL83R_U4JriQ`, a `/c/` or `/user/` URL — or any video / Shorts link (its channel is used). Up to 10,000 per run.

## `keywords` (type: `array`):

Find channels by keyword too — `chess`, `home workout`. See the next option for how channels are found.

## `searchMode` (type: `string`):

`videos` (recommended) = the channels behind the videos YouTube ranks for the keyword — real creators in the niche, 200+ per keyword. `channels` = YouTube's channel-name search (about 150 per keyword; often ranks tiny name-alike channels first).

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

How many channels to take from each keyword's search results.

## `minSubscribers` (type: `integer`):

Skip keyword finds below this subscriber count (they are not delivered or charged). Channels you paste are always delivered.

## `maxSubscribers` (type: `integer`):

Skip keyword finds above this subscriber count.

## `trackerName` (type: `string`):

Any name, e.g. `competitors` or `my roster`. Runs with the same name share one saved snapshot (a named key-value store `yt-channel-stats-<name>` in your account), so each row gets subscribers / views / videos change since the last run and since tracking started. Leave empty for a one-off check.

## `includeLatestUpload` (type: `boolean`):

Reads the channel's public uploads feed (latest 15 uploads): latest upload date and title, uploads in the last 30 days, and average / median views of recent videos. One small extra request per channel.

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

Channels read at the same time.

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

Apify datacenter proxy by default — YouTube's channel data answers it. Switch to residential only if you see blocks in the log.

## Actor input object example

```json
{
  "channels": [
    "https://www.youtube.com/@mkbhd",
    "https://www.youtube.com/@veritasium"
  ],
  "keywords": [
    "chess",
    "home workout"
  ],
  "searchMode": "videos",
  "maxChannelsPerKeyword": 20,
  "trackerName": "competitors",
  "includeLatestUpload": true,
  "maxConcurrency": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `stats` (type: `string`):

One row per channel: subscribers, views, videos, country, joined date, verified, latest upload.

## `growth` (type: `string`):

Change since the previous run of the same tracker.

## `profile` (type: `string`):

Avatar, banner, description, website and socials.

## `summary` (type: `string`):

Channels delivered and charged, inputs not found, tracker status, keywords report.

# 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": [
        "https://www.youtube.com/@mkbhd",
        "https://www.youtube.com/@veritasium"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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