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

Scrape every video of any YouTube channel: title, URL, views, duration, publish date and thumbnail, plus channel stats on every row (subscribers, total views, video count, country, joined date, links). Add Shorts and live streams, sort newest or popular. No API key, no login.

- **URL**: https://apify.com/xmolodtsov/youtube-channel-scraper.md
- **Developed by:** [GoFetch](https://apify.com/xmolodtsov) (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.50 / 1,000 youtube video results

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

### What does YouTube Channel Scraper do?

YouTube Channel Scraper collects the videos of any public YouTube channel together with the channel's stats. Add channel URLs, @handles or channel IDs and get one row per video from the channel's **Videos** tab, and optionally its **Shorts** and **Live** tabs: title, URL, views, duration, publish date and thumbnail, plus the channel's subscribers, total views, video count, location, joined date, description and links on every row.

It uses the same field names as the most widely used YouTube channel scrapers on Apify Store (`id`, `title`, `viewCount`, `date`, `channelName`, `numberOfSubscribers`, `channelTotalViews`, `standardizedUrl` and the rest), so an existing pipeline, spreadsheet or dashboard can switch to it without renaming its video and channel columns. On top of that it can fill the fields that listing-only scrapers leave empty: exact view counts, **likes**, **comment counts**, the full **description**, **hashtags** and the members-only flag. No YouTube API key, no quota, and you pay only per video returned.

Who uses it:

- **Marketers and agencies** track competitor channels: what they publish, how often, and which videos take off.
- **Influencer and partnership teams** vet creators by subscribers, total views, posting rhythm and recent performance.
- **Analysts and researchers** build datasets of a channel's full upload history for trend and engagement studies.
- **Content creators** study what works in their niche: top videos by views, typical lengths, titles and hashtags.
- **Lead generation teams** collect channel descriptions, countries and external links (websites, Instagram, TikTok, Discord) at scale.

Highlights:

- **Whole channels, three tabs**: regular videos, Shorts and live streams (live now, upcoming and past), each with its own cap.
- **Channel stats on every row**: subscribers, total views, video count, country, joined date, verified badge, avatar, banner, description and links from the About panel.
- **Sort and filter like the channel page**: newest, popular or oldest first, and an "only videos published after" date filter.
- **Optional video details**: exact views, likes, comment count, upload day, description and hashtags, from Apify's datacenter proxy.
- **Plain HTTP, no browser**: a 50-video channel takes a few seconds.
- **Honest failure semantics**: blocked runs fail loudly so your integration retries; unknown channels are reported, never billed.

### What data you get

One dataset item per video. Channel fields repeat on every row, and again nested under `aboutChannelInfo`, so each row stands on its own in a spreadsheet.

| Field | Example | Description |
|---|---|---|
| `id`, `url`, `standardizedUrl` | `plN7JMbadRg` | Video ID, its URL (`/shorts/…` for Shorts) and the canonical `watch?v=` URL for every type |
| `title` | `Eat Everything In A Grocery Store, Win $1,000,000` | Video title |
| `type` | `video` | `video`, `shorts` or `stream` |
| `duration`, `durationSeconds` | `57:59`, `3479` | Length as listed, and in seconds |
| `date` | `12 days ago` | As listed on the channel; `2026-10-03` with video details on (see the note under Input) |
| `viewCount` | `262000000` | Views; exact with video details on |
| `thumbnailUrl` | `https://i.ytimg.com/vi/…/hq720.jpg` | Largest thumbnail |
| `channelName`, `channelUsername`, `channelId`, `channelUrl` | `MrBeast`, `MrBeast`, `UCX6OQ3D…` | Channel name, handle (without @), ID and URL |
| `numberOfSubscribers` | `521000000` | Subscribers (YouTube shows them rounded) |
| `channelTotalVideos`, `channelTotalViews` | `1006`, `142830800258` | Video count and lifetime views |
| `channelDescription`, `channelDescriptionLinks` | `[{"text": "Follow", "url": "https://instagram.com/mrbeast"}]` | About text and its links |
| `channelLocation`, `channelJoinedDate` | `United States`, `Feb 19, 2012` | Country and joined date |
| `isChannelVerified`, `isAgeRestricted` | `true`, `false` | Verified badge; `true` when YouTube marks the channel not family-safe |
| `channelAvatarUrl`, `channelBannerUrl` | `https://yt3.googleusercontent.com/…` | Avatar and banner images |
| `input`, `inputChannelUrl`, `fromYTUrl`, `fromChannelListPage` | `@MrBeast`, `https://www.youtube.com/@MrBeast/videos`, `videos` | Where the row came from |
| `order` | `0` | Position in the channel's tab, starting at 0 |
| `streamType` | `ended` | For live streams: `live`, `upcoming` or `ended` |
| `likes`, `commentsCount` | `4028662`, `150000` | With video details on |
| `text`, `hashtags` | `"I trapped 4 strangers…"`, `["#lofi"]` | Full description and its hashtags, with video details on |
| `isMembersOnly` | `false` | Members-only videos (their views are hidden) |

Without video details, numbers come from the channel listing, which YouTube abbreviates: "262M views" becomes `262000000`. Turn on **Add video details** when you need exact counts. A value YouTube doesn't show is `null`, never a guessed `0`.

### How to use YouTube Channel Scraper

1. Open the Actor in Apify Console and go to the **Input** tab.
2. Add channel URLs to **YouTube channels** (one per line, or paste many with Bulk edit), and/or @handles and UC… channel IDs to **Channel handles or IDs**.
3. Set **Max videos per channel**, and **Max Shorts per channel** or **Max live streams per channel** if you want those tabs too.
4. Optionally pick **Sort by**, set **Only videos published after**, or turn on **Add video details**.
5. Click **Start**. Download the results from the **Output** tab as JSON, CSV, Excel or HTML, or read them through the API.

#### Use it as a YouTube channel API

This call runs the Actor and returns the videos. Synchronous calls time out after 5 minutes, so for large channels start a run and read its dataset afterwards.

```bash
curl -X POST "https://api.apify.com/v2/acts/xmolodtsov~youtube-channel-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls": [{"url": "https://www.youtube.com/@Apify"}], "maxResults": 20}'
```

With the Apify Python client:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("xmolodtsov/youtube-channel-scraper").call(run_input={
    "startUrls": [{"url": "https://www.youtube.com/@NASA"}],
    "channels": ["@LofiGirl"],
    "maxResults": 100,
    "sortVideosBy": "POPULAR",
    "includeVideoDetails": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["channelName"], item["title"], item["viewCount"], item["likes"])
```

#### Use it from an AI agent (MCP)

Connect your MCP client to `https://mcp.apify.com?tools=xmolodtsov/youtube-channel-scraper` and the agent can list a channel's videos and stats as a tool call. The usual pricing and free-plan limits apply.

### Pricing

Pay per event, all-inclusive: you are charged per video returned, and the proxy and platform usage are included. There are no start fees, no extra charge for video details or date filters, and no separate compute bill.

| Apify plan | Price per video | Price per 1,000 videos |
|---|---|---|
| Free | $0.001 | $1.00 |
| Starter (Bronze) | $0.0006 | $0.60 |
| Scale (Silver) | $0.0005 | $0.50 |
| Business (Gold) | $0.0005 | $0.50 |

Platinum and Diamond plans pay the Gold price. Unknown channels, channels without videos and errors are never charged, because they produce no rows.

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

One video is one charge, whatever tab it comes from and whether video details are on.

Example: you add 20 channels and set **Max videos per channel** to 100 and **Max Shorts per channel** to 50. Three channels have fewer than 100 videos, so the run returns 2,700 rows. You pay $1.62 on Starter or $1.35 on Business. Duplicate videos are removed across the whole run, so a collaboration that appears on two channels is charged once.

To cap spending, set a maximum cost per run in Console or the API. The Actor stops cleanly at that limit and keeps every video fetched so far.

#### Is it free?

You can try it on the free Apify plan. Free-plan runs are limited to **10 results per run** and **5 runs per calendar month per account**. These limits are set by the developer of this Actor, not by Apify, and any paid Apify plan removes them. A capped run still succeeds and says so in its status message. Once the five runs are used, further runs end successfully with an explanation and no results until the 1st of the next month.

### Input

| Field | Default | What it does |
|---|---|---|
| `startUrls` | (none) | Channel URLs as `[{"url": "…"}]`: `youtube.com/@handle`, `/channel/UC…`, `/c/name` or `/user/name` (a tab suffix such as `/videos` is fine) |
| `channels` | (none) | Strings: `@handle`, a handle without the @, a `UC…` channel ID, or a channel URL. Use it, `startUrls` or both. |
| `maxResults` | `50` | Videos per channel from the Videos tab; `0` skips it |
| `maxResultsShorts` | `0` | Shorts per channel from the Shorts tab |
| `maxResultStreams` | `0` | Live streams per channel from the Live tab |
| `sortVideosBy` | `NEWEST` | `NEWEST`, `POPULAR` or `OLDEST`: the channel page's sort buttons |
| `oldestPostDate` | (none) | `2026-01-31` or an age such as `30 days`; forces `NEWEST` |
| `includeVideoDetails` | `false` | Adds exact views, likes, comment count, upload day, description and hashtags |
| `proxyConfiguration` | Apify Proxy | Datacenter by default; pick residential or your own proxies if you prefer |

Example input:

```json
{
    "startUrls": [
        { "url": "https://www.youtube.com/@Apify" }
    ],
    "channels": ["@LofiGirl", "UCX6OQ3DkcsbYNE6H8uQQuVA"],
    "maxResults": 50,
    "maxResultsShorts": 10,
    "maxResultStreams": 5,
    "sortVideosBy": "NEWEST",
    "oldestPostDate": "90 days",
    "includeVideoDetails": true
}
```

**About the date filter.** Channel pages show relative dates such as "3 weeks ago" or "1 year ago". The Actor reads them as the youngest age they can mean and allows one more day, so a borderline video is kept rather than lost, and each tab stops at the first video that is certainly older. The slack therefore follows YouTube's label: without details, a kept video can be older than your date by up to the label's unit (a week, a month, a year). **For precise cut-offs, turn on Add video details**: the upload day decides, and since YouTube gives it as the US-Pacific calendar day, one day of slack applies.

**Date formats.** With details on, `date` is the upload day (`2026-10-14`). A video whose watch page gives no calendar day, such as a stream that started a few hours ago, keeps the listing's text instead, so a details run can mix both formats for live streams. The Shorts tab shows no dates at all, so Shorts are filtered only with details on. Live streams that are on air or scheduled have no date in the list and are kept.

### Output

Example item (video details on, channel links shortened):

```json
{
    "id": "vadHXNBy4jQ",
    "title": "8h of halloween lofi 🎃 spooky ambience to get chills to",
    "url": "https://www.youtube.com/watch?v=vadHXNBy4jQ",
    "type": "video",
    "duration": "8:00:00",
    "date": "2026-10-14",
    "viewCount": 158545,
    "thumbnailUrl": "https://i.ytimg.com/vi/vadHXNBy4jQ/hq720.jpg",
    "channelName": "Lofi Girl",
    "channelUrl": "https://www.youtube.com/channel/UCSJ4gkVC6NrvII8umztf0Ow",
    "channelUsername": "LofiGirl",
    "channelId": "UCSJ4gkVC6NrvII8umztf0Ow",
    "numberOfSubscribers": 15800000,
    "channelTotalVideos": 469,
    "channelDescription": "Lofi House is now available! 🌇",
    "channelDescriptionLinks": [{ "text": "Discord", "url": "https://discord.com/invite/hUKvJnw" }],
    "channelLocation": "France",
    "channelJoinedDate": "Mar 18, 2015",
    "channelTotalViews": 2709053109,
    "isChannelVerified": true,
    "channelBannerUrl": "https://yt3.googleusercontent.com/…",
    "channelAvatarUrl": "https://yt3.googleusercontent.com/…",
    "isAgeRestricted": false,
    "inputChannelUrl": "https://www.youtube.com/@LofiGirl",
    "input": "@LofiGirl",
    "order": 0,
    "fromYTUrl": "https://www.youtube.com/@LofiGirl/videos",
    "fromChannelListPage": "videos",
    "streamType": null,
    "standardizedUrl": "https://www.youtube.com/watch?v=vadHXNBy4jQ",
    "aboutChannelInfo": { "channelName": "Lofi Girl", "numberOfSubscribers": 15800000, "…": "…" },
    "durationSeconds": 28800,
    "likes": 1641,
    "commentsCount": 88,
    "text": "As jack-o'-lanterns light up the dark, step into the warm, mysterious atmosphere…",
    "hashtags": [],
    "isMembersOnly": false
}
```

The **Overview** table in Console shows title, URL, views, date, type, duration, channel and subscribers:

![YouTube Channel Scraper output: channel videos with views, dates and subscribers](https://api.apify.com/v2/key-value-stores/2DxCOvbMjhvK3S1qP/records/youtube-channel-scraper-output.png)

### Guarantees and failure semantics

**Only real videos are charged.** The dataset holds video rows only. A channel that doesn't exist, a line that isn't a channel, or a channel without videos in the tabs you asked for produces no row and no charge; the run's status message names them, for example `Scraped 240 videos from 4 of 6 channels (1 not found: @misspelled; 1 with no videos in the requested tabs: @newchannel)`.

**Errors are retried, then reported.** Every request gets up to three attempts, each from a fresh IP address of the same proxy type. The Actor never switches you to a pricier proxy behind your back.

**When a run fails.** A run is marked **FAILED**, so your integration can retry the batch, when:

- no video was returned and at least one channel got no valid answer from YouTube (blocked, rate-limited or timed out), or
- more than 20% of the channels, and more than two, got no valid answer, or
- a tab the channel has came back as a page the Actor could not read a single video from (`outdated:`, a YouTube page change that needs an Actor update), or
- the input has no valid channel or an invalid setting.

The status message starts with a reason code (`blocked:`, `quota:`, `timeout:`, `network:`, `server:`, `outdated:` or `invalid:`). A run where YouTube answered for every channel but there was nothing to return ends **SUCCEEDED** with zero results. Stopping at your maximum cost per run is a normal **SUCCEEDED** run.

**Duplicates.** Two inputs that point to the same channel (an @handle and its UC… ID, say) are scraped once; the second is named as a duplicate. A video seen on two channels (a collaboration) is returned and charged once.

**Partial channels.** If a channel's later page or its About panel fails after the retries, the videos already fetched stay in the dataset and the status message lists the channel "with errors". A channel that returned nothing and only errors counts as failed. If video details fail for some videos, their rows keep the listing data and the details fields stay `null`. If details fail for the whole first batch before any worked, the run fails (`blocked:` or `outdated:`) instead of returning listing-only rows.

**Run statistics.** The run's key-value store holds a `STATISTICS` record: per-channel outcomes and tab counts, requests and failures by reason for each YouTube endpoint, and the bytes transferred.

### Integrations

- **Apify API and clients**: start runs and read results from any language, or with the JavaScript and Python clients.
- **Make, Zapier and n8n**: run the Actor from a workflow and pass new videos to the next step.
- **Google Sheets, Slack and webhooks**: send results where your team works, or trigger your own endpoint when a run finishes.
- **Schedules**: check your watch-list of channels every day with **Only videos published after** set to `1 day` and get just the new uploads.
- **Other Actors**: feed the video URLs into a transcript or comments scraper for deeper analysis.

### More scrapers from this developer

**TikTok:** [TikTok Search Scraper](https://apify.com/xmolodtsov/tiktok-search-scraper): videos and creators for any keyword, pay per result · [TikTok Profile Scraper (Pay Per Result)](https://apify.com/xmolodtsov/tiktok-profile-scraper): profiles, followers and latest posts by username · [TikTok Comments Scraper](https://apify.com/xmolodtsov/tiktok-comments-scraper): comments and full reply threads from any video · [TikTok Hashtag Scraper](https://apify.com/xmolodtsov/tiktok-hashtag-scraper): videos for any hashtag, with views, likes and music · [TikTok Sound & Music Scraper](https://apify.com/xmolodtsov/tiktok-sound-scraper): videos that use a sound or song

**Social & news:** [Reddit Search Scraper](https://apify.com/xmolodtsov/reddit-scraper): posts by keyword, subreddit or author · [Google News Scraper](https://apify.com/xmolodtsov/google-news-scraper): Google News results as clean full-text articles

**E-commerce:** [Prom.ua Product Search Scraper](https://apify.com/xmolodtsov/prom-ua): Prom.ua product search results, no browser needed · [Amazon Product Search & Bestsellers Scraper](https://apify.com/xmolodtsov/amazon-search-scraper): search results, Best Sellers and product details from Amazon

**Maps & leads:** [Google Maps Scraper](https://apify.com/xmolodtsov/google-maps-scraper): places, leads and emails from Google Maps

**Ads:** [Facebook Ad Library Scraper (Meta Ads Library)](https://apify.com/xmolodtsov/facebook-ads-library-scraper): ads from the Meta Ad Library, with EU reach and payers

**Video:** [YouTube Transcript Scraper](https://apify.com/xmolodtsov/youtube-transcript-scraper): transcripts, subtitles and captions from YouTube videos · [YouTube Shorts Scraper](https://apify.com/xmolodtsov/youtube-shorts-scraper): Shorts of any channel with exact views, likes and duration · [YouTube Search Scraper](https://apify.com/xmolodtsov/youtube-search-scraper): search results and videos for any keyword · [YouTube Comments Scraper](https://apify.com/xmolodtsov/youtube-comments-scraper): comments, replies and likes from any video

### FAQ

#### Is it legal to scrape YouTube channels?

This Actor collects only publicly available data: what any visitor sees on a channel page without logging in. It never signs in and cannot see private videos or members-only content beyond the fact that it exists. Channel pages can still contain personal data, such as a creator's name, country and links, which laws such as the GDPR in the EU and the CCPA in California protect. Collect personal data only when you have a legitimate reason, and store and process it responsibly. Check that your use respects YouTube's Terms of Service. This is not legal advice; if you are unsure, consult a lawyer.

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

No. The Actor reads the same pages a logged-out browser does, so there is no API key, no daily quota and no Google Cloud project to set up. It also never logs in.

#### Can I scrape every video of a channel?

Yes. Set **Max videos per channel** at or above the channel's video count (shown in `channelTotalVideos`) and the Actor follows the Videos tab to its end. Add **Max Shorts per channel** and **Max live streams per channel** for the other tabs, since YouTube keeps Shorts and streams out of the Videos tab.

#### Why are views rounded?

The channel page itself shows rounded numbers ("1.2M views"), and that is what the listing contains. Turn on **Add video details** to open each video's page and get the exact count, plus likes and comments. Subscriber counts are always rounded, because YouTube shows them that way everywhere.

#### How fast is it?

Listing runs on plain HTTP: in our tests a channel's first 50 videos arrive in a few seconds, and several channels are scraped in parallel. **Add video details** costs one extra request per video, so expect runs roughly ten times slower; the price per result stays the same.

#### Can I get only new videos since my last run?

Yes. Set **Only videos published after** to an age such as `1 day` or `7 days`, keep **Sort by** on Newest, and schedule the Actor. Each channel stops at the first older video, so a daily run over 100 channels returns only the fresh uploads.

#### Does it work with channel handles in other languages?

Yes. Any public channel works, whatever its language: the Actor accepts @handles, `/c/` and `/user/` URLs and channel IDs. Titles and descriptions come back in the channel's own language; dates and labels are read in English.

#### What about members-only videos and live streams?

Members-only videos are listed with `isMembersOnly: true`; YouTube hides their views, so `viewCount` is `null`. Streams that are live right now have `streamType: "live"` and no view count (YouTube shows "watching", not views); scheduled streams are `upcoming`, and finished ones are `ended` with their duration and views.

#### Do I need a proxy?

No setup needed: Apify's datacenter proxy is the default and works for YouTube channel pages. You can switch to residential proxies or your own proxies in **Proxy configuration**; the Actor never changes the proxy type on its own.

### Support

Found a bug, a channel that should work but doesn't, or a field you need? Open an issue in the **Issues** tab on this Actor's page with the run link, and we'll take a look.

# Changelog

This Actor's version history is a separate document: https://apify.com/xmolodtsov/youtube-channel-scraper/changelog.md

# Actor input Schema

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

Channel URLs, one per line: youtube.com/@handle, /channel/UC…, /c/name or /user/name, with or without a tab such as /videos. Paste many at once with Bulk edit; links to remote URL lists are not read (they are reported as invalid). Have only @handles or channel IDs? Put them in <em>Channel handles or IDs</em> below. Duplicate channels are scraped once.

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

Optional, alongside or instead of the URLs above: @handles (@MrBeast), handles without the @, or UC… channel IDs, one per line.

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

How many regular videos to take from each channel's Videos tab (not Shorts, not live streams). 0 skips the Videos tab. <strong>Free Apify plan:</strong> a run returns at most 10 results in total, whatever this value (a limit set by the developer, not by Apify).

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

How many Shorts to take from each channel's Shorts tab. 0 skips it. The Shorts tab lists title, views and thumbnail only; turn on <em>Add video details</em> for the date, likes, comment count and description.

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

How many live streams (live now, upcoming and past) to take from each channel's Live tab. 0 skips it. Channels without a Live tab return none.

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

The sort buttons at the top of the channel's Videos, Shorts and Live tabs: newest first, most popular first, or oldest first. With a date filter set, newest first is always used.

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

Optional. A date (2026-01-31) or an age such as <code>30 days</code>: <code>1 day</code> keeps today's videos, <code>2 days</code> yesterday's and today's. Works with newest-first order only (it is switched on automatically) and stops each tab at the first video that is certainly older. Without details the Actor only sees YouTube's relative labels ("3 weeks ago", "1 year ago"), so a video can be kept that is older by up to the label's unit — a week, a month or a year. <strong>For precise cut-offs turn on <em>Add video details</em></strong>: it uses the upload day (YouTube's US-Pacific date, one day of slack). The Shorts tab shows no dates, so Shorts are filtered only with details on.

## `includeVideoDetails` (type: `boolean`):

Opens each video's watch page for the exact view count, likes, comment count, upload date (YYYY-MM-DD), full description and hashtags. One extra request per video, so runs are roughly 10× slower; the price per result stays the same.

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

Optional. Apify datacenter proxy by default, which works for YouTube channel pages. Change it only to use residential proxies or your own proxies.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.youtube.com/@Apify"
    }
  ],
  "maxResults": 10,
  "maxResultsShorts": 0,
  "maxResultStreams": 0,
  "sortVideosBy": "NEWEST",
  "includeVideoDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One item per video from the channel's Videos, Shorts or Live tab: title, URL, views, date, duration and type, plus the channel's subscribers, total views, video count, location, joined date, description and links.

# 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/@Apify"
        }
    ],
    "maxResults": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("xmolodtsov/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/@Apify" }],
    "maxResults": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("xmolodtsov/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/@Apify"
    }
  ],
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call xmolodtsov/youtube-channel-scraper --silent --output-dataset

```

## MCP server setup

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