# YouTube Channel Stats: Subscribers, Views, No API Key (`glitchbound/youtube-channel-stats`) Actor

Subscribers, total views, video count, age, country, description and contact links for any YouTube channel. Plus the date of its last upload, so you can tell an active channel from a dormant one. No Google API key, no quota, no browser.

- **URL**: https://apify.com/glitchbound/youtube-channel-stats.md
- **Developed by:** [Daniel Meshulam](https://apify.com/glitchbound) (community)
- **Categories:** Social media, Videos, Lead generation
- **Stats:** 6 total users, 5 monthly users, 65.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Stats: Subscribers, Views, No API Key

Subscribers, total views, video count, age, country, description and contact
links for any YouTube channel — **plus the date of its last upload**, so you
can tell an active channel from a dormant one.

No Google Cloud project. No Data API key. No quota. No browser.

### Why that matters

The YouTube Data API gives you 10,000 quota units a day and a channel lookup
costs about 100. A list of two hundred channels burns a fifth of your daily
quota, and when it runs out your pipeline stops until midnight Pacific.

This reads YouTube's own public channel pages. There is nothing to run out of.

### What you paste

```
@mkbhd
mkbhd
https://www.youtube.com/@veritasium
https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ
UCBJycsmduvYEL83R_U4JriQ
```

### What you get back

| field | notes |
|---|---|
| `title`, `handle`, `channelId`, `channelUrl` | who it is |
| `subscriberCount` | parsed integer, **approximate** — see below |
| `subscriberCountText` | exactly what YouTube printed |
| `viewCount` / `viewCountText` | lifetime views, **exact** |
| `videoCount` / `videoCountText` | public videos |
| `joinedDateText` | when the channel was created |
| `latestVideoAt` | **when it last actually posted** |
| `country` | as declared |
| `description`, `keywords` | what it says it is about |
| `links` | socials and sites from the About tab |
| `avatarUrl`, `bannerUrl`, `isFamilySafe` | |

### Two honest notes on the numbers

**Subscriber counts are rounded by YouTube, not by us.** The page says
"21.1M subscribers", so `subscriberCount` is 21,100,000 and the real figure is
somewhere in a band about a hundred thousand wide. You get both the parsed
number, so you can sort and filter, and the original string, so nobody mistakes
a rounded figure for an exact one. Total views and video counts are printed in
full and are exact.

**A channel that hides its subscriber count returns no number at all.** Not
zero. `minSubscribers` therefore excludes it, and `maxSubscribers` keeps it,
because an unknown count is not evidence of a small channel or a large one.

### Why `latestVideoAt` is here

A channel with two million subscribers that has posted nothing in fourteen
months is a completely different proposition from one posting weekly, and
YouTube's About page does not tell you which you are looking at. This costs one
extra request per channel and you can turn it off with
`includeLatestVideoDate`.

### Good for

- **Sponsorship and influencer scouting** — size, activity and contact links
  in one row, filterable by subscriber band and country
- **Competitor tracking** — who is growing, who has gone quiet
- **Media buying** — building a shortlist without opening 200 tabs
- **Enriching a channel list** you already have from somewhere else

### Related

**YouTube Latest Videos** — the sibling. This Actor tells you what a channel
*is*; that one tells you what it recently *published*, with live view counts
per video. Same wedge: no API key, no quota.

### Pricing

Pay per channel returned. Nothing else: not the run, not filtered channels, not
a handle that turns out not to exist.

# Actor input Schema

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

One per line. A handle (@mkbhd), a channel URL, or a channel id (UC...).

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

Only channels at or above this. A channel that hides its subscriber count is excluded when this is set, because no number is not zero.

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

Only channels at or below this. Channels that hide their count are KEPT, because an unknown count is not evidence of a large one.

## `countries` (type: `array`):

Keep only channels declaring one of these countries, e.g. United States. Channels that declare none are excluded when this is set.

## `includeLatestVideoDate` (type: `boolean`):

Reads the channel's feed for the date of its most recent upload. Costs one extra request per channel. Turn off if you only need the headline numbers.

## `maxResults` (type: `integer`):

Hard ceiling on rows returned and charged. Defaults to 1,000 if left out. Set 0 for a dry run that returns and charges nothing.

## Actor input object example

```json
{
  "channels": [
    "@MKBHD",
    "@veritasium",
    "@mrbeast"
  ],
  "includeLatestVideoDate": true,
  "maxResults": 200
}
```

# Actor output Schema

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

All rows this run produced, as JSON.

# 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",
        "@veritasium",
        "@mrbeast"
    ],
    "maxResults": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("glitchbound/youtube-channel-stats").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",
        "@veritasium",
        "@mrbeast",
    ],
    "maxResults": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("glitchbound/youtube-channel-stats").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",
    "@veritasium",
    "@mrbeast"
  ],
  "maxResults": 200
}' |
apify call glitchbound/youtube-channel-stats --silent --output-dataset

```

## MCP server setup

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

```

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/vovNbTlovymfOQFev/builds/wpjBMauBVA2sdFbl9/openapi.json
