# YouTube Channel Info Scraper - Stats and Links (`sumitr_mardy/youtube-channel-info`) Actor

Export public YouTube channel subscribers, lifetime views, country, joined date and external links. Discover creators by keyword and compare recent upload activity with average views. Recent statistics included; business email is a prompt-presence boolean only.

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

## Pricing

from $1.00 / 1,000 channel profiles

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 Info Scraper

Export public YouTube channel subscribers, lifetime views, country, joined dates and external links. Discover creators by keyword and compare their recent long-form upload activity. Not affiliated with YouTube or Google.

**No email addresses.** hasBusinessEmail only records whether YouTube presents the sign-in-for-business-email prompt. It does not reveal or verify an address. This Actor never signs in or attempts the email CAPTCHA; email-like addresses in public description text are redacted and mailto/email-containing links are omitted.

### Quick start

```json
{
  "channels": ["@MrBeast", "@veritasium"],
  "includeRecentStats": true
}
```

Discovery:

```json
{
  "searchQueries": ["home workout"],
  "maxChannelsPerSearch": 40,
  "minSubscribers": 10000,
  "includeRecentStats": true
}
```

For video listings, search, Shorts and video details use [YouTube Scraper](https://apify.com/sumitr_mardy/youtube-scraper). For threads and replies use [YouTube Comments Scraper](https://apify.com/sumitr_mardy/youtube-comments-scraper). This Actor focuses on channel profiles and activity.

### Input

| Field | Default | Meaning |
|---|---|---|
| channels | \[] | Public @handles, youtube.com/@handle, /channel/UC…, /c/…, /user/… or video URLs. Unicode handles accepted. Bare video IDs are not accepted. |
| searchQueries | \[] | Keywords searched with the Channels type filter, up to 20 queries. |
| maxChannelsPerSearch | 20 | 1–500 new saved channels per query after subscriber filtering and global dedupe. |
| includeRecentStats | true | Read first Videos-tab page, up to 30 public long-form uploads. No extra event price. |
| minSubscribers | 0 | Filter using the rounded subscriber count from About. Lower channels omitted and not charged. |
| language | en | Search locale. About/date/count and Videos requests use English for stable parsing. |
| country | US | Client/search country, not a filter on creator country. |

Provide channels or searchQueries; at most 1,000 combined input entries. HTTP and HTTPS YouTube URLs are normalized; credentials, non-YouTube hosts and unsupported URL forms produce free invalid_input rows. Video URLs resolve through public next → video owner data, never /player.

Channel IDs deduplicate globally across handles, URLs, videos and search queries within the running process. Direct inputs run first; subsequent searches do not save or charge those same channels again. Search position counts saved qualifying rows. A search inspects at most max(100, 5×maxChannelsPerSearch), capped at 2,500 candidates; filters or exhausted results can produce fewer than the requested maximum.

### Output

One row per unique successfully saved channel. Every success/failure row always has these same **35 keys**, never null. Missing text is empty, numeric values 0 and arrays \[].

| Field | Type |
|---|---|
| inputIndex | number |
| input | string |
| source | string |
| query | string |
| channelId | string |
| handle | string |
| url | string |
| title | string |
| description | string |
| subscribers | number |
| subscribersText | string |
| views | number |
| viewsText | string |
| videos | number |
| videosText | string |
| joinedDate | string |
| country | string |
| links | array |
| linkDomains | array |
| hasBusinessEmail | boolean |
| keywords | array |
| avatar | string |
| banner | string |
| isVerified | boolean |
| recentVideosCount | number |
| avgViewsRecent | number |
| medianViewsRecent | number |
| lastUploadText | string |
| daysSinceLastUpload | number |
| recentStatsIncluded | boolean |
| position | number |
| status | string |
| subStatus | string |
| error | string |
| scrapedAt | string |

links contains objects with title and url; linkDomains are unique external hostnames. Country is the creator-declared country and may be absent. Empty links or country are normal. Joined date is ISO YYYY-MM-DD when supplied. Subscriber counts are rounded as YouTube displays them; lifetime views come from the full About view-count text and are exact as reported there, not a real-time independent measurement. Raw text remains in subscribersText, viewsText and videosText. Hidden/missing counts become 0; inspect raw text before treating 0 as a confirmed zero.

recentVideosCount is the size of the first public Videos-tab page, at most 30. avgViewsRecent and medianViewsRecent use displayed video counts, which may be rounded. Shorts are excluded. Live-only/Shorts-only channels or an absent Videos tab can have zero recent long-form rows. With includeRecentStats=false, recent fields stay empty/zero and recentStatsIncluded=false. With the option enabled, recentStatsIncluded=true even if the channel has no available Videos tab. If an available recent-stat request fails, the channel becomes a free failure rather than silently selling incomplete enrichment.

lastUploadText preserves wording such as 3 days ago. daysSinceLastUpload is approximate: weeks×7, months×30.4375, years×365.25; hours/minutes become fractional days. A value 0 can mean today or unavailable, so inspect lastUploadText. This is not a full upload-history or engagement-rate analysis. Avatar/banner and verification reflect available public metadata.

### Status and pricing

| status / subStatus | Meaning | Channel event |
|---|---|---|
| ok / channel | Unique profile saved, optional recent stats included | Charged |
| no_results / no_results | A search produced no new qualifying channels | Free |
| failed / invalid_input | Unsupported input or configuration | Free |
| failed / not_found, terminated | Channel unavailable | Free |
| failed / http_NNN, blocked, parse_error, network_error | Public data could not be fetched/extracted | Free |
| failed / free_work_limit, cost_limit_reached | Work or spending cap stopped remaining work | Free |

Per saved channel: FREE **$0.002**, BRONZE $0.0015, SILVER $0.0012, GOLD and higher **$0.001**. Recent stats are included at the same rate. Default Actor start is $0.00005 per GB, minimum one event. Failed, empty, duplicate and filtered channels have no channel event; the start fee still applies. Platform usage is included, with no separate URL fee or dataset-item event.

### Reliability and limits

The measured 256 MB spike completed 115/115 About checks over 110 distinct channel IDs: 50 handles, 5 direct-ID rechecks and 60 keyword discoveries. Country filled 87/115, links 79/115 and joined date 115/115; optional missing fields were retained correctly. Discovery used 4 pages. One expected fake-handle HTTP404; no challenge, proxy or retry. Conservative recent-mode cost bound $0.036943/1,000 by assigning all run costs to just the 65 recent-stat rows; see published launch records for product validation. This sample is not a guaranteed success rate or evidence of superiority over a competitor.

Public YouTube JSON can change. About continuation is taken only from the header engagement-panel endpoint; discovery continuation only from the last continuation item. No cookies, API key, sign-in, business email reveal, CAPTCHA solving, residential proxy or player endpoint. At most 3 channels concurrently; each channel's requests are sequential. Ordinary transient failures have bounded retries and one default datacenter fallback. A real bot/consent challenge stops the host immediately with no IP rotation around it. Independent deadlines and a free-work loss guard bound unsuccessful searches.

Deduplication state is in memory. Restart/migration can reprocess work; use channelId for downstream dedupe and prefer moderate batches when exact restart behavior matters. It is not a transactional exactly-once service. Public description/link redaction can remove email-like strings; no contact-address product is provided.

### Public presets

- [YouTube Channel Info Scraper - Subscribers, Views and Links](https://apify.com/sumitr_mardy/youtube-channel-info/examples/youtube-channel-info-scraper-subscribers-views-and-links)
- [Find YouTube Channels by Keyword - Influencer Discovery](https://apify.com/sumitr_mardy/youtube-channel-info/examples/find-youtube-channels-by-keyword-influencer-discovery)
- [YouTube Channel Activity Check - Last Upload and Average Views](https://apify.com/sumitr_mardy/youtube-channel-info/examples/youtube-channel-activity-check-last-upload-and-average-views)

The profile preset disables recent stats for quicker metadata-only exports; the activity/discovery presets enable them. To schedule repeated monitoring, duplicate a task, save your channels/keywords, then create an Apify Console schedule for that saved task and timezone. This Actor does not create schedules automatically.

### API examples

```bash
curl -X POST "https://api.apify.com/v2/acts/sumitr_mardy~youtube-channel-info/run-sync-get-dataset-items?format=json" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"channels":["@MrBeast","@veritasium"],"includeRecentStats":true}'
```

```python
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("sumitr_mardy/youtube-channel-info").call(
    run_input={"searchQueries": ["home workout"], "maxChannelsPerSearch": 40,
               "minSubscribers": 10000, "includeRecentStats": True}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["title"], row["subscribers"], row["avgViewsRecent"], row["status"])
```

Use asynchronous runs for large batches/searches and download the dataset after completion.

### Use it from AI agents (MCP)

Hosted OAuth:

```json
{"mcpServers":{"channels":{"url":"https://mcp.apify.com/?tools=sumitr_mardy/youtube-channel-info"}}}
```

Hosted Bearer alternative:

```json
{"mcpServers":{"channels":{"url":"https://mcp.apify.com/?tools=sumitr_mardy/youtube-channel-info","headers":{"Authorization":"Bearer YOUR_APIFY_TOKEN"}}}}
```

Stdio:

```json
{"mcpServers":{"channels":{"command":"npx","args":["-y","@apify/actors-mcp-server","--tools","sumitr_mardy/youtube-channel-info"],"env":{"APIFY_TOKEN":"YOUR_APIFY_TOKEN"}}}}
```

Ask for public channels or a niche keyword, a subscriber threshold and whether recent long-form activity matters. Inspect status, raw count text and optional-field absence. Do not request email addresses or interpret the business-email prompt as a revealed contact. Combine with [YouTube Scraper](https://apify.com/sumitr_mardy/youtube-scraper) and [YouTube Comments Scraper](https://apify.com/sumitr_mardy/youtube-comments-scraper) for public videos and discussions.

# Actor input Schema

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

Public @handles, channel URLs (/channel, /c, /user), or video URLs. Video URLs resolve via public owner data. Duplicate channel IDs are saved once per run.

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

Discover channels using the Channels type filter. At most 20 queries; up to 1,000 total URL/query inputs.

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

Maximum new qualifying channel rows per query, after subscriber filtering and global dedupe. Result availability may be lower.

## `includeRecentStats` (type: `boolean`):

Fetch the first Videos-tab page (up to 30 public long-form uploads); excludes Shorts. Recent stats are included in channel pricing.

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

Minimum rounded subscriber count from About. Lower channels are omitted without a channel event.

## `language` (type: `string`):

Locale for channel discovery. About/date/count and Videos tab requests use English for stable parsing.

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

Two-letter YouTube search/client country. Does not filter creator country.

## Actor input object example

```json
{
  "channels": [
    "@MrBeast",
    "@veritasium"
  ],
  "maxChannelsPerSearch": 20,
  "includeRecentStats": true,
  "minSubscribers": 0,
  "language": "en",
  "country": "US"
}
```

# Actor output Schema

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

No description

# 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": [
        "@MrBeast",
        "@veritasium"
    ]
};

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

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

```

## MCP server setup

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

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/a6e660yD2X2jUVZ4o/builds/HKwyCpGL332uN03Yn/openapi.json
