# YouTube Channel Scraper: Videos & Channel Stats (`deepmine/youtube-channel-scraper`) Actor

YouTube channel scraper: every video of any channel with exact views and likes, comments, publish time and duration, plus the channel's subscribers, total views, video count, joined date, location and links. Sort newest, popular or oldest, filter by date. Shorts and live too. No login.

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

## Pricing

from $0.29 / 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.
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

YouTube channel scraper: paste channel links and get one row per video with its exact views and likes, comments, publish time and duration, plus the channel's subscribers, total views, video count, joined date, location and links. Newest, most popular or oldest first, with a date filter; Shorts and live streams when you want them. No login, no YouTube API key, no browser.

| 🎬 Video | 📺 Channel | 👥 Subscribers | 👀 Views | ❤️ Likes | 💬 Comments | 📅 Published | ⏱️ Length |
|---|---|---|---|---|---|---|---|
| [Lose 150 Lbs Together, Win $250,000](https://www.youtube.com/watch?v=RE3_PGwDwhw) | MrBeast | 522,000,000 | 77,033,518 | 1,286,103 | 48,135 | 2026-10-17 16:00 UTC | 00:43:16 |
| [Eat Everything In A Grocery Store, Win $1,000,000](https://www.youtube.com/watch?v=plN7JMbadRg) | MrBeast | 522,000,000 | 276,983,664 | 4,166,094 | 155,622 | 2026-10-03 16:00 UTC | 00:57:59 |
| [The NEW Tesla Roadster: My Honest Reaction](https://www.youtube.com/watch?v=scwlR0QHGOk) | Marques Brownlee | 21,400,000 | 9,089,392 | 156,539 | 18,681 | 2026-10-17 02:09 UTC | 00:22:45 |
| [Apple Homeview Impressions: Not Convinced!](https://www.youtube.com/watch?v=QVv3mQzlrN0) | Marques Brownlee | 21,400,000 | 9,892,275 | 102,697 | 7,639 | 2026-10-13 22:42 UTC | 00:11:47 |

<sub>Collected 2026-10-18 with the prefilled input: the newest videos of @MrBeast and @mkbhd.</sub>

**$0.49 per 1,000 videos on Starter** ($0.65 Free, $0.39 Scale, $0.29 Business). The prefilled run (100 videos) costs about $0.05. Nothing per run and nothing for videos your date filter leaves out.

### What you type

| Input | Example | You get |
|---|---|---|
| 📺 Channel links | `https://www.youtube.com/@MrBeast`, `@mkbhd`, `https://www.youtube.com/channel/UC...` | The channel's videos, with the channel's stats in every row |
| 🎬 Max videos per channel | `50` | Up to that many regular videos per channel (50 when an API call leaves it out) |
| 📱 Max Shorts / 🔴 Max live streams per channel | `0` | The channel's Shorts and live streams too, when above 0 |
| 🔃 Sort by | `Popular` | Newest first (default), most popular first, or oldest first, as the channel's own buttons |
| 📅 Published after | `2026-09-01` or `30 days` | Only videos from that date on; a newest-first channel stops at the first older video |
| All three maximums `0` | `0`, `0`, `0` | Channel info only: one row per channel (`type` `channel`) with its subscribers, total views and videos, description, links, country and joined date, charged as one video |

A link ending in `/videos`, `/shorts` or `/streams` reads that tab only. You can also import a CSV file or a Google Sheet of links.

### Speed

Measured on Apify at the default 512 MB on 2026-10-16: the prefilled run (100 videos) took 23 s, with the first row 3.8 s in; 400 videos of @veritasium and @TED took 91 s, about 4.4 videos a second. Each video's own page is read for its exact likes, its comment count and its exact publish time, which a listing-only scraper doesn't give.

### Moving from streamers' Fast YouTube Channel Scraper

Its saved inputs run here unchanged: `startUrls` (with or without `"method": "GET"`), `maxResults`, `maxResultsShorts`, `maxResultStreams`, `oldestPostDate` and `sortVideosBy` (`NEWEST`, `POPULAR`, `OLDEST`), and its channel-info-only mode (all three maximums `0`). Every row has all 32 keys its dataset declares, under the same names (`id`, `title`, `duration`, `channelName`, `channelUsername`, `channelUrl`, `date`, `url`, `viewCount`, `fromYTUrl`, `type`, `thumbnailUrl`, `input`, `order`, `streamType`, `standardizedUrl`, `progressKey`, `aboutChannelInfo`...), so code that reads them keeps working.

| | streamers/youtube-channel-scraper | This Actor |
|---|---|---|
| Price per 1,000 videos, Starter | $1.00 | $0.49 |
| Price per 1,000 videos, Free / Scale / Business | $1.30 / $0.80 / $0.50 | $0.65 / $0.39 / $0.29 |
| Publish date | as YouTube labels it (`6 days ago`) | exact time, e.g. `2026-10-17T16:00:18Z` |
| Duration | `5:13` | `00:43:16` and `durationSeconds` |
| Likes and comments | no (their YouTube Scraper has them) | in every row, exact |
| Tags, category, description links | no | yes |

Prices are from the Apify Store on 2026-10-18.

### Output

One row per video (one per channel when all three maximums are `0`). A real row, shortened:

```json
{
  "title": "Lose 150 Lbs Together, Win $250,000",
  "type": "video",
  "id": "RE3_PGwDwhw",
  "url": "https://www.youtube.com/watch?v=RE3_PGwDwhw",
  "thumbnailUrl": "https://i.ytimg.com/vi/RE3_PGwDwhw/maxresdefault.jpg",
  "viewCount": 77033518,
  "likes": 1286103,
  "commentsCount": 48135,
  "date": "2026-10-17T16:00:18Z",
  "duration": "00:43:16",
  "durationSeconds": 2596,
  "hashtags": [],
  "originalLanguage": "English",
  "originalLanguageCode": "en",
  "isPaidContent": false,
  "isMonetized": true,
  "channelName": "MrBeast",
  "channelUrl": "https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA",
  "channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA",
  "channelUsername": "MrBeast",
  "numberOfSubscribers": 522000000,
  "channelTotalVideos": 1008,
  "channelTotalViews": 143240927814,
  "channelJoinedDate": "Feb 19, 2012",
  "channelLocation": "United States",
  "isChannelVerified": true,
  "input": "https://www.youtube.com/@MrBeast",
  "fromChannelListPage": "videos",
  "order": 0
}
```

Also in every row: `text` (the description) and `descriptionLinks`, `keywords` (tags), `category`, `originalLanguage` and `originalLanguageCode` (the language spoken in the video, e.g. English / `en`), `audioTracks` (dubbed videos: each audio track's language, and whether it's the original or YouTube's automatic dub; `null` with one audio track), `isPaidContent` ("Includes paid promotion"), `isMonetized` (YouTube serves ads on it to a logged-out viewer; `null` on Shorts), `captionTracks` (each caption track's language, name, whether it's automatic, and its link), `videoPreviews` (YouTube's storyboard preview images per size), `isEmbeddable`, `dateText`, `isAgeRestricted`, `isMembersOnly`, `isUnlisted`, `commentsTurnedOff`, `collaborators`, `location`, `streamType` (live streams: `scheduled`, `live` or `ended`), `standardizedUrl` (the channel's About link) and `progressKey` (`{url, label}`, the channel tab read), `channelAvatarUrl`, `channelBannerUrl`, `channelDescription`, `channelDescriptionLinks`, `channelCreatedAt` (the channel's creation time to the second when the run reads the channel's own feed, else `null`; `channelJoinedDate` always has the day), `aboutChannelInfo` (the channel fields again, in one object, as streamers' rows have them), `inputChannelUrl`, `fromYTUrl` and `scrapedAt`. `subtitles`, `translatedTitle`, `translatedText`, `transcriptionUrl`, `aiVideoDescription` and `aiVideoSummary` are always `null` (kept so rows line up with streamers' YouTube Actors).

Output tabs: **🎬 Videos**, **📈 Stats**, **📺 Channels** and **📝 Details**. Download as JSON, CSV, Excel or HTML, or read it through the Apify API.

### Good to know

- **Views, likes and comment counts are exact** (77,033,518 views, 1,286,103 likes, 48,135 comments). Subscribers are rounded as YouTube shows them (MrBeast: 522M, saved as 522,000,000); the channel's total views and video count are exact.
- **The publish time is exact** (to the second, UTC) for almost every video; the few that YouTube's free sources don't date in time keep the day.
- **Each video is charged once per run**, even when two of your links list it. Your spending limit is respected to the video.
- **A channel that doesn't exist** is skipped and named in the run's status message, and so are videos YouTube refused to show (not charged). A run that saved nothing because of such errors ends as failed, never as an empty success.
- Need subtitles, keyword search or playlists? [YouTube Scraper](https://apify.com/deepmine/youtube-scraper) has them, with the same fields.

### Related Actors

- [YouTube Scraper](https://apify.com/deepmine/youtube-scraper): channel videos, Shorts and live streams, keyword search, playlists and video links, with subtitles.
- [YouTube Comments Scraper](https://apify.com/deepmine/youtube-comments-scraper): every comment and reply of any video or Short.
- [YouTube Transcript API](https://apify.com/deepmine/youtube-transcript-scraper): transcripts with timestamps, in the video's language or yours.

### Did it help?

A short review helps other people find it: https://apify.com/deepmine/youtube-channel-scraper/reviews

# Actor input Schema

## `startUrls` (type: `array`):

Channel links or @handles, e.g. https://www.youtube.com/@MrBeast, @mkbhd or https://www.youtube.com/channel/UC... Each channel gives up to 🎬 Max videos (and the Shorts and live streams below). A link ending in /videos, /shorts or /streams reads that tab only. You can import a CSV or Google Sheet of links.

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

Regular videos per channel (the Videos tab). You pay per video saved. 0 = none. Left out (API): 50, or 0 when you set only Shorts or live streams. All three maximums 0: one row per channel with its info only (subscribers, views, videos, description, links), charged as one video.

## `maxResultsShorts` (type: `integer`):

Shorts per channel (the Shorts tab). 0 = none.

## `maxResultStreams` (type: `integer`):

Live streams and past streams per channel (the Live tab). 0 = none.

## `sortVideosBy` (type: `string`):

Order of each channel's videos, as the channel's Latest / Popular / Oldest buttons. Empty = newest first.

## `oldestPostDate` (type: `string`):

Keep only videos published on or after this date, e.g. 2026-09-01 or 30 days. Videos the date leaves out are not charged. Empty = any date.

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

Leave as is: Apify datacenter proxy works for every YouTube call this Actor makes.

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

Words you'd type in YouTube's search box, one per line, e.g. web scraping. Each term returns up to maxResults videos (plus maxResultsShorts Shorts and maxResultStreams live streams).

## `sortingOrder` (type: `string`):

Order of search results. Empty = YouTube's relevance. Values: relevance, date, views, rating.

## `dateFilter` (type: `string`):

Only search results uploaded in this period. Empty = any time. Values: hour, today, week, month, year.

## `lengthFilter` (type: `string`):

Only search results of this length. Empty = any length. Values: under4, between420, plus20.

## `videoType` (type: `string`):

Search for videos or for movies. Empty = videos. Values: video, movie.

## `searchFeatures` (type: `array`):

Only search results with all of these, e.g. HD and Subtitles/CC. Empty = no feature filter. Values: isLive, is4K, isHD, hasSubtitles, hasCC, is360, isVR180, is3D, isHDR, hasLocation, isBought.

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

Shorts only: channel names without the @ (e.g. MrBeast) or channel links. Reads each channel's Shorts tab, up to maxResultsShorts (1 when that is 0). For a channel's regular videos, put its link or @handle in startUrls instead. Accepted so saved inputs from other YouTube Shorts scrapers run.

## `sortChannelShortsBy` (type: `string`):

NEWEST, POPULAR or OLDEST: order of the Shorts read for channels (the Shorts tab's Latest / Popular / Oldest). Empty = the sortVideosBy order.

## `transcriptionAndSubtitle` (type: `string`):

Subtitles aren't part of YouTube Channel Scraper; the videos are saved without them. YouTube Scraper (apify.com/deepmine/youtube-scraper) downloads them.

## `subtitlesLanguage` (type: `string`):

Subtitles aren't part of YouTube Channel Scraper; the videos are saved without them. YouTube Scraper (apify.com/deepmine/youtube-scraper) downloads them.

## `subtitlesFormat` (type: `string`):

Subtitles aren't part of YouTube Channel Scraper; the videos are saved without them. YouTube Scraper (apify.com/deepmine/youtube-scraper) downloads them.

## `preferAutoGeneratedSubtitles` (type: `boolean`):

Take YouTube's automatic subtitles before a person-made track.

## `isHD` (type: `boolean`):

true = only search results with this feature, the same as adding isHD to searchFeatures. Accepted so saved inputs from other YouTube scrapers run.

## `hasSubtitles` (type: `boolean`):

true = only search results with this feature, the same as adding hasSubtitles to searchFeatures. Accepted so saved inputs from other YouTube scrapers run.

## `hasCC` (type: `boolean`):

true = only search results with this feature, the same as adding hasCC to searchFeatures. Accepted so saved inputs from other YouTube scrapers run.

## `is3D` (type: `boolean`):

true = only search results with this feature, the same as adding is3D to searchFeatures. Accepted so saved inputs from other YouTube scrapers run.

## `isLive` (type: `boolean`):

true = only search results with this feature, the same as adding isLive to searchFeatures. Accepted so saved inputs from other YouTube scrapers run.

## `isBought` (type: `boolean`):

true = only search results with this feature, the same as adding isBought to searchFeatures. Accepted so saved inputs from other YouTube scrapers run.

## `is4K` (type: `boolean`):

true = only search results with this feature, the same as adding is4K to searchFeatures. Accepted so saved inputs from other YouTube scrapers run.

## `is360` (type: `boolean`):

true = only search results with this feature, the same as adding is360 to searchFeatures. Accepted so saved inputs from other YouTube scrapers run.

## `hasLocation` (type: `boolean`):

true = only search results with this feature, the same as adding hasLocation to searchFeatures. Accepted so saved inputs from other YouTube scrapers run.

## `isHDR` (type: `boolean`):

true = only search results with this feature, the same as adding isHDR to searchFeatures. Accepted so saved inputs from other YouTube scrapers run.

## `isVR180` (type: `boolean`):

true = only search results with this feature, the same as adding isVR180 to searchFeatures. Accepted so saved inputs from other YouTube scrapers run.

## `aiVideoDescription` (type: `boolean`):

Accepted so saved inputs from other YouTube scrapers run: not offered, ignored (AI text columns are not written; subtitles are always in the row).

## `aiVideoSummary` (type: `boolean`):

Accepted so saved inputs from other YouTube scrapers run: not offered, ignored (AI text columns are not written; subtitles are always in the row).

## `saveSubsToKVS` (type: `boolean`):

Accepted so saved inputs from other YouTube scrapers run: not offered, ignored (AI text columns are not written; subtitles are always in the row).

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.youtube.com/@MrBeast"
    },
    {
      "url": "https://www.youtube.com/@mkbhd"
    }
  ],
  "maxResults": 50,
  "maxResultsShorts": 0,
  "maxResultStreams": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "transcriptionAndSubtitle": "NONE",
  "subtitlesLanguage": "en",
  "subtitlesFormat": "srt",
  "preferAutoGeneratedSubtitles": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "startUrls": [
        {
            "url": "https://www.youtube.com/@MrBeast"
        },
        {
            "url": "https://www.youtube.com/@mkbhd"
        }
    ],
    "maxResults": 50,
    "maxResultsShorts": 0,
    "maxResultStreams": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("deepmine/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 = {
    "startUrls": [
        { "url": "https://www.youtube.com/@MrBeast" },
        { "url": "https://www.youtube.com/@mkbhd" },
    ],
    "maxResults": 50,
    "maxResultsShorts": 0,
    "maxResultStreams": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("deepmine/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 '{
  "startUrls": [
    {
      "url": "https://www.youtube.com/@MrBeast"
    },
    {
      "url": "https://www.youtube.com/@mkbhd"
    }
  ],
  "maxResults": 50,
  "maxResultsShorts": 0,
  "maxResultStreams": 0
}' |
apify call deepmine/youtube-channel-scraper --silent --output-dataset

```

## MCP server setup

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