# YouTube Channel Scraper - Videos, Streams & Channel Stats (`tenfoldfleet/youtube-channel-scraper`) Actor

Get all videos of a YouTube channel with exact views, likes, comment count and publish date, plus live streams and channel stats: subscribers, total views, video count, country, joined date and links. By @handle or URL, no API key. $0.80 per 1,000 videos; failed inputs are free.

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

## Pricing

from $0.80 / 1,000 videos

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

### What does YouTube Channel Scraper do?

**YouTube Channel Scraper** gets **every video of a YouTube channel** from [YouTube](https://www.youtube.com) with **exact view counts, exact like counts, exact comment counts and the real publish date** (for example `2026-10-03`, not "6 days ago"). It also returns the channel's **live streams** (live now, upcoming and past) and one row of **channel stats**: subscribers, **exact total views**, exact video count, description, country, joined date, links, avatar and banner.

Give it channel **@handles**, channel URLs or channel IDs. It works like a **YouTube channel API** with no API key, no quota and no login, on plain HTTP requests (no browser). **$0.80 per 1,000 videos**, and channels that can't be found are **free**.

### Why use this YouTube channel scraper?

- 🎯 **Exact numbers, not rounded ones**: most channel scrapers give only a relative date like "6 days ago" and no like or comment counts. This one returns `207578319` views, `3555568` likes, `131706` comments and `2026-10-03`, so you can compute engagement rates and posting schedules.
- 📈 **Competitor and creator research**: find a channel's most popular videos (sort by Popular), how often it uploads and how its views develop.
- 🤝 **Influencer marketing**: compare subscribers, total views, likes per view and comments per view across creators before you reach out.
- 🔴 **Live stream tracking**: list upcoming streams with their scheduled time, streams that are live now with concurrent viewers, and past streams with their views.
- 🧠 **AI and data pipelines**: feed titles, full descriptions and hashtags into an LLM, a dashboard or a spreadsheet.
- 🗓️ **Monitoring**: schedule a daily run with **Published after** set to "2 days" and collect only the new uploads.

Runs on the Apify platform, so you get an **API**, scheduling, webhooks and integrations with Make, Zapier, n8n and Google Sheets. It also works as an **MCP tool for AI agents** through the [Apify MCP server](https://mcp.apify.com).

### What data can it extract?

**Video and stream rows** (`type`: `video` or `stream`):

| Field | Example |
|---|---|
| `videoId`, `url` | `plN7JMbadRg`, `https://www.youtube.com/watch?v=plN7JMbadRg` |
| `title` | `Eat Everything In A Grocery Store, Win $1,000,000` |
| `viewCount`, `viewCountText` | `207578319` (exact), `207M views` |
| `likeCount`, `commentCount` | `3555568`, `131706` (null when comments are off) |
| `publishedAt`, `publishedTimeText` | `2026-10-03`, `6 days ago` |
| `durationSec`, `durationText` | `3479`, `57:59` |
| `isLive`, `isUpcoming`, `concurrentViewers`, `scheduledStartText` | live and scheduled streams |
| `isMembersOnly` | `true` for members-only videos (YouTube hides their view count) |
| `description`, `hashtags` | full description; hashtags from title and description |
| `thumbnailUrl` | `https://i.ytimg.com/vi/plN7JMbadRg/hqdefault.jpg` |
| `channelId`, `channelName`, `channelHandle`, `channelSubscriberCountText` | `UCX6OQ3DkcsbYNE6H8uQQuVA`, `MrBeast`, `@MrBeast`, `520M subscribers` |
| `detailsFetched` | `true` when the exact numbers were loaded |

**Channel rows** (`type`: `channel`):

| Field | Example |
|---|---|
| `channelId`, `channelName`, `channelHandle`, `url` | `UCX6OQ3DkcsbYNE6H8uQQuVA`, `MrBeast`, `@MrBeast`, `https://www.youtube.com/@MrBeast` |
| `subscriberCount`, `subscriberCountText` | `520000000`, `520M subscribers` (YouTube only shows a rounded count) |
| `viewCount` | `142153736720` (exact total channel views) |
| `videoCount` | `1006` (exact) |
| `description`, `country`, `joinedDate` | full description, `United States`, `2012-02-19` |
| `links` | `[{"title": "Twitter", "url": "https://twitter.com/MrBeast"}]` (real targets, not youtube.com/redirect links) |
| `isVerified`, `avatarUrl`, `bannerUrl`, `keywords` | verified badge, images, channel keywords |

### How to scrape a YouTube channel

1. Click **Try for free**.
2. Add channels: `@MrBeast`, `https://www.youtube.com/@NASA`, `/channel/UC...`, `/c/...` or `/user/...` URLs, or channel IDs.
3. Set **Max videos per channel** (default 50) and, if you want live streams, **Max live streams per channel**.
4. Pick **Sort videos by**: Newest, Most popular or Oldest first. Optionally set **Published after** (`2026-09-01` or `30 days`).
5. Leave **Fetch exact views, likes, comments and date** on for exact numbers, or turn it off for a faster list with rounded values (same price).
6. Click **Start**, then download the results as **JSON, CSV, Excel or HTML**, or read them through the API.

#### Call it from the API

```bash
curl -X POST "https://api.apify.com/v2/acts/tenfoldfleet~youtube-channel-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"channelUrls": ["@MrBeast"], "maxVideosPerChannel": 20, "sortBy": "popular"}'
```

### How much does it cost to scrape a YouTube channel?

You pay per result: **$0.80 per 1,000 videos or streams** ($0.0008 each) and $0.0008 per channel stats row, plus a tiny $0.00005 per run start. Exact details cost the same as the quick list. A channel that doesn't exist, a channel without videos or a missing Live tab is **not charged**, and neither are videos dropped by **Published after**. Set **Max results in total** or a max cost per run and the scraper stops there.

### Input

```json
{
    "channelUrls": ["@MrBeast", "https://www.youtube.com/@NASA"],
    "maxVideosPerChannel": 50,
    "maxStreamsPerChannel": 5,
    "includeChannelInfo": true,
    "sortBy": "newest",
    "publishedAfter": "2026-09-01",
    "fetchExactDetails": true,
    "maxItems": 0
}
```

### Output

```json
{
    "type": "video",
    "videoId": "plN7JMbadRg",
    "url": "https://www.youtube.com/watch?v=plN7JMbadRg",
    "title": "Eat Everything In A Grocery Store, Win $1,000,000",
    "viewCount": 207578319,
    "viewCountText": "207M views",
    "likeCount": 3555568,
    "commentCount": 131706,
    "publishedAt": "2026-10-03",
    "publishedTimeText": "6 days ago",
    "durationSec": 3479,
    "durationText": "57:59",
    "isLive": false,
    "isUpcoming": false,
    "isMembersOnly": false,
    "concurrentViewers": null,
    "scheduledStartText": null,
    "description": "I trapped 4 strangers in an entire supermarket ...",
    "hashtags": [],
    "thumbnailUrl": "https://i.ytimg.com/vi/plN7JMbadRg/hqdefault.jpg",
    "channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA",
    "channelName": "MrBeast",
    "channelHandle": "@MrBeast",
    "channelSubscriberCountText": "520M subscribers",
    "sourceInput": "@MrBeast",
    "detailsFetched": true,
    "scrapedAt": "2026-10-10T03:37:09.112Z"
}
```

Inputs that fail come back as free rows with `input`, `reason` (`channel_not_found`, `no_videos_tab`, `no_videos`, `no_streams_tab`, `no_streams`, `invalid_input`, `blocked`) and `error`. The dataset has two views: **Videos and streams** and **Channels**. Download everything as JSON, CSV, Excel or HTML.

### Tips

- **Shorts are not included.** For a channel's Shorts with views, likes and hashtags, use our [YouTube Shorts Scraper](https://apify.com/tenfoldfleet/youtube-shorts-scraper).
- For the comments of the videos you found, use our [YouTube Comments Scraper](https://apify.com/tenfoldfleet/youtube-comments-scraper); for their captions, our [YouTube Transcript Scraper](https://apify.com/tenfoldfleet/youtube-transcript-scraper).
- **Published after** is exact when exact details are on. With them off, it relies on YouTube's rounded "2 months ago" text, so it can include videos up to one week, month or year older than your date. With **Newest first** the scraper stops at the cutoff; with other orders it skips older videos but still pages through the channel.
- Set **Max videos per channel** to 0 and keep **Channel stats** on to get channel stats only, for example for a list of influencers.
- The same video found through two inputs is returned (and charged) once.
- If an exact-details lookup fails after retries, you still get the video's title, rounded views, age and duration with `detailsFetched: false`.

### FAQ

#### Do I need a YouTube API key or account?

No. The scraper reads public YouTube pages. No login, cookies or API quota.

#### Are the view, like and comment counts exact?

Yes, with **Fetch exact views, likes, comments and date** on (the default). Subscriber counts are always rounded, because YouTube itself only shows `520M subscribers`.

#### Can I get a channel's most popular videos?

Yes. Set **Sort videos by** to **Most popular first**. **Oldest first** gives a channel's first uploads.

#### Does it scrape live streams?

Yes. Set **Max live streams per channel** above 0 to read the channel's Live tab: streams that are live now (with concurrent viewers), upcoming streams (with their scheduled time) and past streams. Channels without a Live tab return a free `no_streams_tab` row.

#### How many videos can it get from one channel?

All of them: set **Max videos per channel** as high as you need (up to 100,000 per channel). With exact details on it saves about 3 videos per second, so 1,000 videos take about 5 minutes; for very large channels raise the run timeout (default 1 hour) or turn exact details off for a much faster list. A run that nears its timeout stops 2 minutes early and keeps everything collected so far.

### Disclaimer

This scraper collects public data only. It does not access private videos, accounts or personal data beyond what channels publish themselves. Make sure your use of the data complies with YouTube's Terms of Service and the laws that apply to you, such as GDPR.

# Actor input Schema

## `channelUrls` (type: `array`):

YouTube channels to scrape: @handles (@MrBeast), channel URLs (https://www.youtube.com/@NASA, /channel/UC..., /c/..., /user/...) or channel IDs (UC...).

## `maxVideosPerChannel` (type: `integer`):

How many videos to return from each channel's Videos tab. 0 = skip videos. Shorts are not included (see our YouTube Shorts Scraper).

## `maxStreamsPerChannel` (type: `integer`):

How many live streams (live now, upcoming and past) to return from each channel's Live tab. 0 = skip streams.

## `includeChannelInfo` (type: `boolean`):

Return one row per channel with subscribers, exact total views, exact video count, description, country, joined date, links, avatar and banner.

## `sortBy` (type: `string`):

Order in which videos and streams are taken from each channel, as on YouTube's Latest / Popular / Oldest buttons.

## `publishedAfter` (type: `string`):

Only videos and streams published on or after this date, e.g. 2026-09-01, or a period such as "30 days". With exact details on, the date is checked exactly; with them off it uses YouTube's rounded "2 months ago" text and can include videos up to one week, month or year older. Works best with Newest first, where the scraper stops at the cutoff.

## `fetchExactDetails` (type: `boolean`):

Load each video's exact view count, like count, comment count, publish date and full description. Turn off for a faster list with rounded views ("207M views") and relative dates ("6 days ago"). Same price either way.

## `maxItems` (type: `integer`):

Stop after this many results (videos, streams and channel rows) across all channels. 0 = no limit (the run's max cost still applies).

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

Apify datacenter proxy works for YouTube. Channel pages retry through residential proxy only if the datacenter IPs are blocked, so there is no need to pick residential.

## Actor input object example

```json
{
  "channelUrls": [
    "@MrBeast",
    "https://www.youtube.com/@NASA"
  ],
  "maxVideosPerChannel": 10,
  "maxStreamsPerChannel": 5,
  "includeChannelInfo": true,
  "sortBy": "newest",
  "fetchExactDetails": true,
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `channels` (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 = {
    "channelUrls": [
        "@MrBeast",
        "https://www.youtube.com/@NASA"
    ],
    "maxVideosPerChannel": 10,
    "maxStreamsPerChannel": 5,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tenfoldfleet/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 = {
    "channelUrls": [
        "@MrBeast",
        "https://www.youtube.com/@NASA",
    ],
    "maxVideosPerChannel": 10,
    "maxStreamsPerChannel": 5,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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