# YouTube Channel Scraper — Subscribers, Links & All Videos (`fabrikit/youtube-channel-scraper`) Actor

Scrape YouTube channels without an API key: subscribers, total views, video count, about text, join date, website and social links, plus the channel's videos, Shorts and live streams (newest, popular or oldest first). Find channels by keyword. From US$0.90 per 1,000 videos.

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

## Pricing

from $0.90 / 1,000 channel 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

## YouTube Channel Scraper — Subscribers, Links & All Videos

**YouTube Channel Scraper extracts channel profiles and their video lists from youtube.com**: subscriber count, total views, number of videos, join date, country, about text, website and social links, plus every upload, Short and live stream of the channel, newest, most popular or oldest first. Paste channel links, @handles or channel IDs, or type a keyword to find channels. No YouTube API key, no Google account, no browser.

**Price: US$0.90 per 1,000 videos** and US$1.00 per 1,000 channel profiles. Pay only for the rows you get.

### What you get

**One profile row per channel** (`type: "channel"`)

- Channel ID, name, @handle and canonical URL
- Subscribers (as a number and as YouTube shows it), total views, video count
- Join date (ISO), country, about text, keywords, verification badge, family-safe flag
- Website plus Instagram, Facebook, X, TikTok and LinkedIn as separate columns, and the full list of links on the channel
- Avatar, banner, RSS feed URL and the names of the channel tabs

**One row per video** (`type: "video"`), from the tabs you choose

- Video ID, URL, title, thumbnail
- Views, duration (text and seconds), relative date ("2 weeks ago") and an approximate ISO date
- `contentType`: `video`, `short` or `stream`
- Live tab extras: `isLive` with the current number of viewers, `isUpcoming` with the scheduled time
- Position in the list, the order used, and the channel's ID, name, handle and subscriber count on every row

E-mail addresses and phone numbers that appear in channel descriptions are replaced by `[email hidden]` / `[phone hidden]`.

### Use cases

- **Influencer and creator research**: compare subscribers, total views and upload frequency of a list of channels, and collect their website and social profiles.
- **Competitor tracking**: schedule a daily run on rival channels with "Only videos from the last N days" and get just their new uploads and streams.
- **Content strategy**: pull a channel's most popular videos of all time in one short run to see which topics and lengths work.
- **Channel discovery**: search channels by keyword ("vegan recipes", "home workouts") and get the top matches with their stats.
- **Datasets for analytics and AI**: full upload history of a channel as clean JSON, CSV or Excel.

### How to use

1. Add one or more channels: `https://www.youtube.com/@NASA`, `@NASA`, `UCLA_DiR1FfKNvjuUpBHmylQ`, or old `/c/` and `/user/` links.
2. Pick the tabs (Videos, Shorts, Live streams), the order and how many rows per tab.
3. Run, then download the dataset or read it through the API.

Latest 10 uploads of a channel plus its profile (the prefilled example):

```json
{ "channels": ["https://www.youtube.com/@NASA"], "contentTabs": ["videos"], "maxVideosPerTab": 10 }
```

All-time most viewed videos and Shorts of two channels:

```json
{
  "channels": ["@NASA", "@Duolingo"],
  "contentTabs": ["videos", "shorts"],
  "sortVideosBy": "popular",
  "maxVideosPerTab": 50
}
```

New videos and streams from the last 7 days (good for a daily schedule):

```json
{ "channels": ["@NASA"], "contentTabs": ["videos", "streams"], "publishedWithinDays": 7, "maxVideosPerTab": 100 }
```

Find channels by keyword and keep only their profile rows:

```json
{ "searchQueries": ["space agency"], "maxChannelsPerSearch": 10, "maxVideosPerTab": 0 }
```

#### Input fields

| Field | What it does |
|---|---|
| `channels` | Channel links, @handles or `UC…` IDs |
| `searchQueries`, `maxChannelsPerSearch` | Find channels by keyword and take the top N of each search |
| `contentTabs` | `videos`, `shorts`, `streams` (default: videos) |
| `sortVideosBy` | `latest`, `popular` or `oldest`, as offered by the channel |
| `maxVideosPerTab` | Rows per tab per channel (0 = profiles only) |
| `publishedWithinDays` | Keep only items from the last N days (approximate) |
| `maxItems` | Exact cap on video rows for the whole run |
| `includeChannelProfile` | Save the profile row (default on) |
| `region` | Country sent to YouTube and used for a residential proxy if needed |
| `proxyConfiguration` | Apify Proxy settings |

### Output example

```json
{
  "type": "channel",
  "channelId": "UCLA_DiR1FfKNvjuUpBHmylQ",
  "channelName": "NASA",
  "channelHandle": "@NASA",
  "channelUrl": "https://www.youtube.com/@NASA",
  "subscriberCount": 15100000,
  "subscriberCountText": "15.1M subscribers",
  "videoCount": 6191,
  "totalViews": 1130111474,
  "joinedDate": "2008-06-03",
  "websiteUrl": "https://www.nasa.gov",
  "instagramUrl": "https://www.instagram.com/nasa",
  "facebookUrl": "https://www.facebook.com/NASA",
  "xUrl": "https://x.com/nasa",
  "isVerified": true,
  "rssUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=UCLA_DiR1FfKNvjuUpBHmylQ",
  "scrapedAt": "2026-10-19T17:41:43.120Z"
}
```

```json
{
  "type": "video",
  "videoId": "ErAqN6gXqZQ",
  "url": "https://www.youtube.com/watch?v=ErAqN6gXqZQ",
  "title": "NASA's SpaceX Crew-13 Mission (Official NASA Trailer)",
  "contentType": "video",
  "viewCount": 103000,
  "publishedText": "2 weeks ago",
  "publishedAt": "2026-10-05T00:00:00.000Z",
  "duration": "1:02",
  "durationSeconds": 62,
  "isLive": false,
  "position": 2,
  "sortedBy": "latest",
  "channelName": "NASA",
  "channelSubscriberCount": 15100000,
  "scrapedAt": "2026-10-19T17:41:43.375Z"
}
```

The dataset has two table views: **Overview** (all rows) and **Channel profiles**.

### Pricing

| Event | Price |
|---|---|
| Video, Short or stream row (`channel-video`) | US$0.90 per 1,000 |
| Channel profile row (`channel-profile`) | US$1.00 per 1,000 |

Examples: the latest 20 videos of 50 channels = 1,000 videos + 50 profiles = **US$0.65**. Profiles only for 500 channels = **US$0.50**. Platform usage is included; there is only a tiny fixed start fee per run.

### How it compares

- **YouTube Data API**: official, with exact upload dates, but it needs a Google Cloud project and an API key, and the default daily quota (10,000 units, with each search costing 100) caps bigger jobs. This Actor needs no key and returns profiles and video lists in one flat dataset.
- **General YouTube scrapers**: our own [YouTube Videos Scraper](https://apify.com/fabrikit/youtube-videos-scraper) covers search, playlists and single videos, with optional per-video details (likes, exact publish date, tags, full description). Use it when you need those details; use this Actor when the channel is the unit: profile, links, totals and complete tab lists at a lower price per video.

### Limits (read before you run)

- Subscriber counts are rounded by YouTube itself (15.1M), here and in the official API.
- `publishedAt` is computed from YouTube's relative date ("3 weeks ago"), so it is approximate (day precision at best). Shorts have no date or duration in the channel feed.
- No comments, likes or exact upload dates: those need a visit to each video page.
- Business e-mail addresses behind YouTube's "View email address" button are never collected.
- Profiles are not counted in `maxItems`; `maxItems` limits video rows only.

### Integrations

Run it from the Apify API or the JavaScript and Python clients, schedule it in Apify, or connect it to n8n, Make, Zapier, Google Sheets, Slack and webhooks. AI agents can call it through the Apify MCP server.

### FAQ

**Is it legal to scrape YouTube channels?** The Actor reads public channel pages without logging in and does not collect personal contact data. You are responsible for using the data in line with YouTube's terms and the laws that apply to you (for example GDPR). This is not legal advice.

**Do I need a proxy?** The default Apify datacenter proxy is enough in normal conditions. If YouTube starts blocking, the Actor switches to Apify residential proxies by itself for the rest of the run.

**How many videos can I get per channel?** The whole tab: the Actor follows YouTube's paging until the list ends or your limit is reached. A tab page holds about 30 videos or 48 Shorts.

**Why is a tab empty?** Some channels have no Shorts or Live tab; the run log says so and the run continues.

**What happens with a wrong link?** Video, playlist and non-YouTube links are skipped with a warning; a channel that does not exist is reported in the log and in the `SUMMARY` record.

### Changelog

- **0.1 (October 2026)**: first release. Channel profiles with links and totals; Videos, Shorts and Live tabs; latest / popular / oldest order; date filter; channel search by keyword.

***

### En español

**YouTube Channel Scraper** extrae perfiles de canales de YouTube (suscriptores, vistas totales, número de videos, fecha de creación, país, descripción, sitio web y redes sociales) y la lista de videos, Shorts y transmisiones de cada canal, ordenada por más nuevos, más populares o más antiguos. Acepta enlaces, @handles, IDs de canal o palabras clave para buscar canales. Sin API key ni login. Desde **US$0,60 por 1.000 videos** y US$1,00 por 1.000 perfiles. Los correos y teléfonos de las descripciones se ocultan.

# Actor input Schema

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

YouTube channels to scrape, one per line: a channel link (`https://www.youtube.com/@NASA`, `/channel/UC…`, `/c/…`, `/user/…`; links to a tab such as `/videos` work too), a bare `@handle`, or a `UC…` channel ID. Video and playlist links are skipped.

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

Search YouTube for channels that match each keyword (for example `space agency` or `vegan recipes`) and scrape the top matches like any other channel. Leave empty if you already know the channels.

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

How many matching channels to take from each keyword search, in YouTube's relevance order.

## `contentTabs` (type: `array`):

Which lists of each channel to collect: regular uploads (Videos tab), Shorts, and live streams (Live tab: upcoming, live now and past broadcasts). A channel without one of these tabs simply skips it.

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

The order the channel itself offers on each tab: newest first, most viewed first, or oldest first. Use Popular to get a channel's all-time hits in a short run. Small tabs without these options are read newest first.

## `maxVideosPerTab` (type: `integer`):

Maximum rows from each selected tab of each channel. With Videos + Shorts and 20 you get up to 20 uploads and 20 Shorts per channel. Set 0 to get only the channel profile rows (no videos).

## `publishedWithinDays` (type: `integer`):

Optional. Keep only videos and past streams published in the last N days; each tab is read newest first and stops at the first older item. YouTube shows relative dates such as "3 weeks ago", so the cut-off is approximate. Shorts carry no date in the channel feed and are not filtered. Leave empty for no date filter.

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

Hard cap on video rows for the whole run (all channels and tabs together). The run stops when it is reached. Channel profile rows are not counted.

## `includeChannelProfile` (type: `boolean`):

Save one row per channel with subscribers, total views, video count, about text, join date, country, website and social links, avatar, banner and verification badge. Billed as one `channel-profile` event per channel.

## `region` (type: `string`):

Country YouTube uses for the request, and the country of the residential proxy if the run has to switch to one. Numbers and dates are always read from the English interface.

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

Apify datacenter proxy by default. If YouTube answers with blocks twice in a row, the run moves to Apify residential proxies for the rest of the run on its own.

## Actor input object example

```json
{
  "channels": [
    "https://www.youtube.com/@NASA"
  ],
  "maxChannelsPerSearch": 5,
  "contentTabs": [
    "videos"
  ],
  "sortVideosBy": "latest",
  "maxVideosPerTab": 10,
  "maxItems": 1000,
  "includeChannelProfile": true,
  "region": "US",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All channel profiles and videos collected during the run

## `profiles` (type: `string`):

Profile columns: subscribers, video count, total views, join date, country, website

# 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": [
        "https://www.youtube.com/@NASA"
    ],
    "contentTabs": [
        "videos"
    ],
    "maxVideosPerTab": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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