# YouTube Channel Scraper – Stats, Links, Emails & Channel Search (`brii3343/youtube-channel-scraper`) Actor

Get complete YouTube channel data: subscribers, exact total views and video count, join date, country, links, social profiles, emails and recent activity (last upload, median views). Find channels by keyword and filter by subscribers, country and activity. Optional videos and Shorts.

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

## Pricing

from $0.65 / 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/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 — channel stats, links, emails, recent activity and channel search

Get **complete YouTube channel profiles**: subscribers, exact total views and video count, join date, country, verified badge, description, keywords, avatar and banner, every link of the channel with social profiles sorted by network, emails written on the channel, whether the channel has a business email, and **recent activity** (last upload with exact time, uploads in the last 30 days, average and median views of the latest uploads, like rate). **Find channels by keyword** with filters (subscribers, country, active in the last N days, with email) to build creator and influencer lists. Optionally get each channel's videos, Shorts and live streams with exact numbers.

#### Why this Actor

- **Checked against the real pages.** We compared 29 channels field by field with their YouTube pages and feeds: name, handle, subscribers, video count, total views, join date, country, links, verified badge, business email flag and last upload matched in **879 of 880 checks** (the only difference: a video that gained 6 views between the two readings).
- **Is the channel still active? How many views does it really get?** Totals say little about a creator today. Every row has the last upload date and time, uploads in the last 30 days, uploads per week, the average and **median views of the latest uploads**, the like rate and the share of Shorts, from the channel's 15 most recent uploads.
- **Find channels, not just read them.** Search YouTube channels by keyword and keep only those that match your filters: subscribers between min and max, country, active in the last N days, with an email. **Channels skipped by the filters are free.** A search goes to the end of YouTube's list ("fitness coach": 339 channels, no duplicates).
- **Links sorted for you.** Every link of the channel with its title, plus `socialLinks` by network (Instagram, TikTok, X, Facebook, LinkedIn, Twitch, Discord, Patreon, Threads, Spotify…), the `website`, and `emails` written in the description or links.
- **Videos too, with exact numbers.** Optionally the channel's videos, Shorts and live streams, one row each with exact views, likes, comment count, date, duration and description. A channel with 536 uploads came back complete: 449 videos + 87 Shorts, in date order, no duplicates.
- **Fast.** 1,048 channels (50 given by name and 20 searches of 50) in about 2 minutes and 20 seconds.
- **Clear errors, never charged.** Channels that do not exist, wrong links, playlists and the same channel given twice get a status row with the reason, free.

#### Use cases

- **Influencer marketing**: micro-influencers for a topic and country (for example 10K-100K subscribers, United States, active in the last 30 days), with their social profiles, website and emails.
- **Sponsorship and outreach lists**: creators that upload regularly, with median views to estimate the reach of a sponsored video.
- **Competitor and market research**: size, growth signals and activity of every channel in a niche.
- **Lead generation for agencies and tools that sell to creators**: channels with a store, memberships, a website or a business email.
- **Monitoring**: the same list of channels every week (subscribers, total views, last upload), for dashboards and alerts.

#### Input

| Field | Description |
|---|---|
| Channels | One per line: `@handle`, channel ID (`UC…`), channel link (`/@handle`, `/channel/UC…`, `/c/…`, `/user/…`) or a video link (you get the channel that published it). Old channel names are tried as `/c/` and `/user/` links too. |
| Find channels by keyword | One search per line, as in the YouTube search bar with the "Channels" filter. |
| Max channels per search | Default 50. YouTube lists a few hundred channels per search at most. |
| Search filters | Min and max subscribers, channel countries (names or 2-letter codes), active within N days, only channels with an email. They apply to searches; channels you list by name are always returned. |
| Videos of each channel | Videos, Shorts and live streams per channel (0 = channel data only), newest first, most popular or oldest first, only videos newer than a date or an age (`7 days`, `3 months`). |
| Include the latest 15 uploads | Adds `latestUploads` to each channel row (ID, title, type, exact publish time, views, likes), free. |
| Search country | Country used for keyword searches (`US`, `GB`, `DE`, `IN`…). |

Example input: 50 fitness micro-influencers in the United States or United Kingdom, active in the last 30 days:

```json
{
  "searchQueries": ["home workout", "fitness coach"],
  "maxChannelsPerSearch": 25,
  "minSubscribers": 10000,
  "maxSubscribers": 100000,
  "channelCountries": ["US", "United Kingdom"],
  "activeWithinDays": 30
}
```

#### Output

One row per channel (`type`: `channel`). Real output (description and lists shortened here):

```json
{
  "type": "channel",
  "channelId": "UCBB7sYb14uBtk8UqSQYc9-w",
  "url": "https://www.youtube.com/@SteveRamsey",
  "handle": "@SteveRamsey",
  "name": "Steve Ramsey - Woodworking for Mere Mortals",
  "description": "Woodworking for Mere Mortals is dedicated to beginners who want to learn woodworking on a ...",
  "subscriberCount": 1970000,
  "subscriberCountText": "1.97M subscribers",
  "videoCount": 794,
  "viewCount": 338259405,
  "joinedDate": "2008-05-10",
  "country": "United States",
  "countryCode": "US",
  "isVerified": true,
  "isArtist": false,
  "hasMemberships": false,
  "hasStore": true,
  "tabs": ["Home", "Videos", "Shorts", "Live", "Playlists", "Posts", "Store"],
  "keywords": ["Woodworking", "How-to", "DIY", "woodworking for mere mortals"],
  "isFamilySafe": true,
  "avatarUrl": "https://yt3.googleusercontent.com/ytc/AIdro_nQ0eOGcisyW6KnwWnidTVPqCoUr5o9hiYODFlke6W5cg=s900-c-k-c0x00ffffff-no-rj",
  "bannerUrl": "https://yt3.googleusercontent.com/7ESbayULFSqKl7NStF9x3YjoXbLtDTBjFAKWgCbRsAm4Z0CdYBrIKwoyLIjDC6BwFwLd7MzkYg=w2560-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
  "links": [
    { "title": "Learn woodworking THIS WEEKEND", "url": "https://theweekendwoodworker.com/" },
    { "title": "ShopWWMM: Premium Plans", "url": "https://shopwwmm.com/" }
  ],
  "socialLinks": {
    "facebook": "http://www.facebook.com/WoodworkingForMereMortals",
    "instagram": "https://www.instagram.com/steveramsey_wwmm/"
  },
  "website": "https://theweekendwoodworker.com/",
  "emails": [],
  "hasBusinessEmail": true,
  "rssUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=UCBB7sYb14uBtk8UqSQYc9-w",
  "lastUploadAt": "2026-08-28T16:02:03.000Z",
  "daysSinceLastUpload": 31,
  "uploadsLast30Days": 0,
  "uploadsPerWeek": 0.13,
  "recentUploads": 15,
  "recentShortsShare": 0,
  "recentAverageViews": 60132,
  "recentMedianViews": 37531,
  "recentLikeRate": 0.0494,
  "source": "search",
  "input": "woodworking",
  "position": 4,
  "scrapedAt": "2026-09-29T14:06:37.849Z"
}
```

- Activity fields (`lastUploadAt` … `recentLikeRate`) come from the channel's 15 most recent uploads (videos, Shorts and streams). Average and median views count only uploads older than 2 days, so a video published an hour ago does not pull them down. `recentLikeRate` = likes / views.
- With "Include the latest 15 uploads", `latestUploads` lists them with `id`, `type`, `title`, `url`, `publishedAt`, `viewCount`, `likeCount`.
- Video rows (`type`: `video`, `short`, `stream`) have `id`, `url`, `title`, `description`, `publishedDate`, `durationSeconds`, `duration`, `viewCount`, `likeCount`, `commentCount`, `commentsTurnedOff`, `hashtags`, `isLive`, `liveViewers`, `isMembersOnly`, `thumbnailUrl` and the channel's `channelId`, `channelName`, `channelHandle`, `channelUrl`, `channelSubscribers`.
- Status rows (`status`: `invalid_input`, `not_found`, `duplicate`, `no_results`, `error`) explain what could not be read, and are not charged.

#### Pricing

Pay per result: **$1.20 per 1,000 channels** and **$1.20 per 1,000 videos** (lower on higher Apify plans: $1.00, $0.80, $0.65). Status rows, channels skipped by the filters and the latest uploads inside the channel row are free. You can set a maximum cost per run: the Actor stops exactly at your limit, and when you ask for videos every channel is charged together with its videos, so you get complete channels (only the last one may have fewer videos).

#### Good to know

- **The business email behind "View email address" is not collected.** YouTube shows it only to signed-in users after a CAPTCHA, and this Actor reads only public data. `hasBusinessEmail` tells you whether the channel has one; `emails` has the addresses the channel writes publicly in its description and links.
- **Numbers YouTube does not show stay empty (`null`)**: subscribers hidden by the creator (and on auto-generated "Topic" channels), the total views of brand-new channels (YouTube shows the total after a few days), the country when the creator has not set one. Subscribers are rounded as YouTube shows them (`1.97M` → `1970000`); total views and video count are exact.
- **Video count** includes Shorts and live streams, as YouTube counts them. Channels without public videos have `videoCount` 0.
- **A keyword search gives what YouTube lists**: a few hundred channels at most. For more channels in a niche, use several related keywords (duplicates across searches are removed).

#### FAQ

**How do I find micro-influencers?** Search your topic with `minSubscribers` 10,000, `maxSubscribers` 100,000, your countries and `activeWithinDays` 30. Sort the results by `recentMedianViews` to see who really gets views.

**Can I get videos from a keyword search instead of channels?** Use our [YouTube Scraper](https://apify.com/brii3343/youtube-scraper) for videos from searches, playlists and hashtags, and our [YouTube Transcript Scraper](https://apify.com/brii3343/youtube-transcript-scraper) for transcripts.

**Does it need my YouTube account or cookies?** No. It reads only public data.

# Actor input Schema

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

One per line: @handle, channel ID (UC…), channel link (/@handle, /channel/UC…, /c/…, /user/…) or a video link (you get the channel that published it).

## `searchQueries` (type: `array`):

One search per line, as in the YouTube search bar with the “Channels” filter. Combine with the filters below to build lists of creators (for example: home workout, 10K–500K subscribers, United States, active in the last 30 days).

## `maxChannelsPerSearch` (type: `integer`):

Channels returned for each search term (after the filters). YouTube lists a few hundred channels per search at most.

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

Only channels with at least this many subscribers (as shown by YouTube, e.g. 12.5K = 12,500).

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

Only channels with at most this many subscribers. Useful for finding micro-influencers.

## `channelCountries` (type: `array`):

Only channels whose country (set by the creator in the channel's About section) is one of these. English names (Germany) or 2-letter codes (DE). Channels without a country are skipped.

## `activeWithinDays` (type: `integer`):

Only channels that uploaded a video, Short or stream in the last N days.

## `onlyWithEmail` (type: `boolean`):

Only channels that write an email address in their public description. (The business email that YouTube shows only after signing in is not collected; the field hasBusinessEmail tells you if a channel has one.)

## `maxVideos` (type: `integer`):

Latest (or most popular / oldest) long-form videos to get for each channel. 0 = channel data only.

## `maxShorts` (type: `integer`):

Shorts to get for each channel.

## `maxStreams` (type: `integer`):

Past and current live streams to get for each channel.

## `videosSort` (type: `string`):

Order of the channel's tabs on YouTube (Latest, Popular, Oldest).

## `videosNewerThan` (type: `string`):

A date (2026-09-01) or an age (7 days, 2 weeks, 3 months). With “Newest first” the Actor stops at the first older video.

## `includeLatestUploads` (type: `boolean`):

Adds latestUploads to each channel row: ID, title, type, exact publish time, views and likes of the channel's 15 most recent uploads (free, no extra charge).

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

2-letter country code used for keyword searches (YouTube ranks channels by region). Results are always read in English.

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

How many channels or videos are read at the same time.

## Actor input object example

```json
{
  "channels": [
    "@veritasium",
    "UCsXVk37bltHxD1rDPwtNM8Q",
    "https://www.youtube.com/@mkbhd"
  ],
  "searchQueries": [
    "home workout",
    "italian cooking"
  ],
  "maxChannelsPerSearch": 10,
  "channelCountries": [
    "US",
    "United Kingdom"
  ],
  "onlyWithEmail": false,
  "maxVideos": 0,
  "maxShorts": 0,
  "maxStreams": 0,
  "videosSort": "newest",
  "includeLatestUploads": false,
  "country": "US",
  "maxConcurrency": 10
}
```

# Actor output Schema

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

One row per channel (subscribers, total views, videos, join date, country, links, emails, recent activity) and, if requested, one row per video, Short or stream.

# 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": [
        "@veritasium",
        "https://www.youtube.com/@kurzgesagt"
    ],
    "searchQueries": [
        "home workout"
    ],
    "maxChannelsPerSearch": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("brii3343/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": [
        "@veritasium",
        "https://www.youtube.com/@kurzgesagt",
    ],
    "searchQueries": ["home workout"],
    "maxChannelsPerSearch": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("brii3343/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": [
    "@veritasium",
    "https://www.youtube.com/@kurzgesagt"
  ],
  "searchQueries": [
    "home workout"
  ],
  "maxChannelsPerSearch": 10
}' |
apify call brii3343/youtube-channel-scraper --silent --output-dataset

```

## MCP server setup

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