# YouTube Channel & Shorts Scraper: Info, Videos, Likes (`t3data/youtube-channel`) Actor

Scrape YouTube channels: subscribers, total views, join date, country, links, avatar and banner, plus every video, Short and live stream with exact views, likes, duration and publish date. Pay only for results you get.

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

## Pricing

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

## YouTube Channel & Shorts Scraper: Info, Videos, Likes

Scrape **YouTube channels, videos and Shorts** with no API key and no quota. Get channel info (subscribers, total views, join date, country, links, avatar, banner) plus every video, Short and live stream with **exact views, likes and publish date**. **You only pay for results you get**: channels that fail are free.

| | |
|---|---|
| 💲 **Price** | $1.50 per 1,000 results. One result = one channel-info row, or one video, Short or stream. |
| ⚡ **Speed** | 483 results (3 channels: info + 100 videos + 60 Shorts each) in ~18 seconds |
| 📥 **Input** | Channel URLs, @handles or channel IDs |
| 📤 **Output** | A channel row, then one row per video, Short or live stream |
| 🔀 **Sort** | Latest, most popular or oldest, like the channel page; optional "published after" date |

### What people use it for

- **Competitor and creator research**: what a channel posts, how often, and what performs best
- **Influencer vetting**: subscribers, views per video and like ratios before a sponsorship deal
- **Shorts research**: which Shorts take off for a channel or niche, with exact views and likes
- **Tracking over time**: schedule a weekly run and chart subscribers and views per video
- **Lead lists**: channel name, country, links and description for outreach to creators
- **Content pipelines**: feed video lists into [YouTube Transcripts](https://apify.com/t3data/youtube-transcripts) or [YouTube Comments](https://apify.com/t3data/youtube-comments)

### How to use it

1. Paste one or more channel URLs or @handles.
2. Choose how many videos, Shorts and live streams to get per channel, and the sort order.
3. Click **Start**, then download the results as JSON, CSV or Excel, or fetch them through the API.

### For AI agents and automations

- **One job:** get YouTube channel info (subscribers, links, about) plus its videos, Shorts and streams with exact views, likes and dates. Minimal input: `{ "channels": ["@mkbhd"], "maxVideos": 20, "maxShorts": 0 }`
- **Fast enough for a single tool call:** one channel with 20 videos finishes in a few seconds; ~480 rows from 3 channels in ~18 seconds, which fits inside the Apify MCP server's default 30-second wait for small inputs. For big jobs, start the run asynchronously and read the dataset when it finishes.
- **Where the results are:** dataset items (fields below). A **run summary** is in the key-value store record `OUTPUT`: `status` (`SUCCEEDED`, `PARTIAL`, `STOPPED_AT_SPEND_LIMIT`, `ABORTED`, `NO_RESULTS`, `SOURCE_UNAVAILABLE`), `results`, `errorsByCode` and a plain-English `message`.
- **Predictable billing:** pay per event. Only successful results are charged; error rows are free.
- **Respects "Max cost per run":** it never starts work your budget can't pay for, then stops cleanly with status `STOPPED_AT_SPEND_LIMIT`. Everything fetched up to that point is kept.
- **Graceful on abort and restarts:** partial results are always kept, and a platform restart resumes without duplicates or double charges.
- **Honest failures:** if the source blocks every request or changes its format, the run fails with a clear message and you pay $0, instead of quietly returning empty results.
- Works with the **Apify MCP server** (Claude, Cursor, other agents), agentic payments, and the API.

### Input examples

Channel info only (one result per channel):

```json
{ "channels": ["@mkbhd", "@veritasium", "https://www.youtube.com/@MrBeast"], "maxVideos": 0, "maxShorts": 0 }
```

The 50 most popular Shorts of a channel:

```json
{ "channels": ["@MrBeast"], "includeChannelInfo": false, "maxVideos": 0, "maxShorts": 50, "sortBy": "popular" }
```

Everything a channel posted since September 1:

```json
{ "channels": ["https://www.youtube.com/@mkbhd"], "maxVideos": 500, "maxShorts": 500, "maxStreams": 50, "publishedAfter": "2026-09-01" }
```

### Output

From a real run. A **channel** row:

```json
{
  "type": "channel",
  "status": "ok",
  "input": "https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA",
  "channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA",
  "channelName": "MrBeast",
  "handle": "@MrBeast",
  "channelUrl": "https://www.youtube.com/@MrBeast",
  "description": "SUBSCRIBE FOR A COOKIE!\nNew MrBeast or MrBeast Gaming video every single Saturday at noon eastern time! ...",
  "subscriberCount": 521000000,
  "subscriberCountText": "521M subscribers",
  "videoCount": 1007,
  "videoCountText": "1,007 videos",
  "isVerified": true,
  "avatarUrl": "https://yt3.googleusercontent.com/nxYrc_1_2f77DoBadyxMTmv7ZpRZapHR5jbuYe7PlPd5cIRJxtNNEYyOC0ZsxaDyJJzXrnJiuDE=s900-c-k-c0x00ffffff-no-rj",
  "bannerUrl": "https://yt3.googleusercontent.com/mHMO_eEMp0dPvh0ADwXhPXNYb_GnjSVsLI8biqF1CpxT8OPl7izhNQsDPD3JHhd5y5Mg9GrP=w2560-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
  "keywords": "mrbeast6000 beast mrbeast Mr.Beast mr",
  "isFamilySafe": true,
  "rssUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=UCX6OQ3DkcsbYNE6H8uQQuVA",
  "country": "United States",
  "joinedDate": "2012-02-19",
  "totalViews": 142830800258,
  "links": [
    { "title": "$1,000,000 Contest", "url": "https://www.themostdangerousgames.com/" },
    { "title": "Twitter", "url": "https://twitter.com/MrBeast" }
  ],
  "availableTabs": ["Home", "Videos", "Shorts", "Shows", "Posts", "Search"],
  "scrapedAt": "2026-10-16T16:43:36.134Z"
}
```

A **video** row (Shorts look the same, with `"type": "short"`):

```json
{
  "status": "ok",
  "input": "@veritasium",
  "position": 1,
  "likeCount": 100022,
  "publishedAt": "2026-10-12",
  "type": "video",
  "videoId": "NiCgcUTL9_Q",
  "title": "The Absurd Engineering Behind the Internet",
  "viewCountText": "7.2M views",
  "viewCount": 7291091,
  "duration": "34:32",
  "durationSeconds": 2072,
  "isLive": false,
  "publishedTimeText": "3 days ago",
  "publishedAtApprox": "2026-10-13T16:47:56.097Z",
  "thumbnailUrl": "https://i.ytimg.com/vi/NiCgcUTL9_Q/hqdefault.jpg",
  "url": "https://www.youtube.com/watch?v=NiCgcUTL9_Q",
  "dateText": "Oct 12, 2026",
  "channelId": "UCHnyfMqiRRG1u-2MsSQLbXA",
  "channelName": "Veritasium",
  "channelHandle": "@veritasium",
  "channelUrl": "https://www.youtube.com/@veritasium"
}
```

| Field | Meaning |
|---|---|
| `type` | `channel`, `video`, `short`, `stream`, or `error` (free) |
| `subscriberCount` / `subscriberCountText` | Number (from YouTube's rounded "21.4M") and the original text |
| `videoCount`, `totalViews`, `joinedDate`, `country`, `links` | From the channel's About panel |
| `avatarUrl`, `bannerUrl` | Largest available images |
| `viewCount`, `likeCount` | **Exact** counts (with **Exact views, likes and dates** on) |
| `publishedAt` | Exact publish date (YYYY-MM-DD); `publishedTimeText` / `publishedAtApprox` are YouTube's "3 days ago" and an estimate from it |
| `duration`, `durationSeconds` | Video length (not shown by YouTube for Shorts in lists) |
| `position` | Rank in the channel tab for the chosen sort order |
| `isLive` | A stream that is live right now |

### Cost examples

| Job | Results | Cost |
|---|---|---|
| Info for 1,000 channels | 1,000 | $1.50 |
| Info + last 20 videos + 20 Shorts for 100 channels | 4,100 | ~$6.15 |
| Full back catalog of a 2,000-video channel | ~2,001 | ~$3.00 |

Set **Max cost per run** to cap any run, and the actor stops cleanly at the limit.

### Integrations

- **API**: `client.actor("t3data/youtube-channel").call({ channels: [...] })` (JS), or `client.actor("t3data/youtube-channel").call(run_input={"channels": [...]})` (Python). Full snippets are on the **API** tab.
- **AI agents (MCP)**: available as a tool through the Apify MCP server.
- **No-code**: Make, Zapier, n8n, Google Sheets, Slack and webhooks, through Apify integrations. Use **Schedules** to track channels weekly.
- **Export**: JSON, CSV, Excel, XML, HTML or RSS.

### Error codes (never charged)

| Code | Meaning |
|---|---|
| `INVALID_URL` | Not a channel link (video and playlist links are rejected with a hint) |
| `CHANNEL_NOT_FOUND` | The handle doesn't exist, or the channel was terminated |
| `NO_VIDEOS` | The channel has no Videos/Shorts/Live tab (only when channel info is off) |
| `SOURCE_UNAVAILABLE` (run status) | Every request was blocked, or the source changed its format. The run fails with $0 charged; retry later |
| `BLOCKED` | YouTube kept refusing after every retry (rare; try again) |

### FAQ

**Are subscriber counts exact?** YouTube only shows rounded subscriber numbers ("21.4M") to everyone, including its own API. `subscriberCount` converts them to a number. Video views and likes are exact.

**Do I get likes for Shorts?** Yes, with **Exact views, likes and dates** on (the default). Channels that hide like counts return `null`.

**Can I get only Shorts, or only channel info?** Yes. Set the other limits to 0 and untick **Channel info** if you don't need it.

**Can I get a channel's email?** No. YouTube hides business emails behind sign-in and a captcha, and we don't collect them.

**Do I need a proxy or a YouTube API key?** No. A residential proxy and IP rotation are built in, and their cost is included in the price.

**Is it legal?** It reads only publicly visible channel and video data. Handle any personal data according to the privacy rules that apply to you (e.g. GDPR).

**Something broke?** Open an issue on the **Issues** tab with the channel URL. Fixes usually ship within a day.

### Limits

- Subscriber counts are YouTube's rounded figures.
- Shorts durations aren't shown in channel lists.
- Members-only and private videos aren't listed.

### More from T3 Data

- [YouTube Transcripts](https://apify.com/t3data/youtube-transcripts): full transcripts, SRT and AI-ready chunks for videos, playlists and channels
- [YouTube Comments Scraper](https://apify.com/t3data/youtube-comments): comments and replies with likes, pinned and creator-hearted flags
- [Google News Scraper](https://apify.com/t3data/google-news): news by keyword, topic or location, with real article URLs and full text
- [Google Ads Transparency Scraper](https://apify.com/t3data/google-ads-transparency): every ad an advertiser or domain runs on Google, with dates, images and YouTube videos
- [Google Trends Scraper](https://apify.com/t3data/google-trends): interest over time, by region, related queries, and trending now
- [Google Hotels Scraper](https://apify.com/t3data/google-hotels): hotel prices, ratings and booking-site prices for any city and dates

***

*This Actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by YouTube or Google. It only accesses publicly visible channel and video data.*

# Actor input Schema

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

Channel URLs (youtube.com/@handle, /channel/UC…, /c/name, /user/name), bare @handles, or channel IDs (UC…).

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

One row per channel: name, handle, subscribers, video count, total views, join date, country, description, links, avatar and banner. Counts as one result.

## `maxVideos` (type: `integer`):

Long-form videos from the Videos tab. 0 = skip.

## `maxShorts` (type: `integer`):

Shorts from the Shorts tab. 0 = skip.

## `maxStreams` (type: `integer`):

Past and current live streams from the Live tab. 0 = skip.

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

Same as the sort buttons on the channel's Videos, Shorts and Live tabs.

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

Only videos published on or after this date (YYYY-MM-DD). With Latest sorting, listing stops at the first older video, so it stays fast.

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

Fetch each video's exact view count, like count and publish date (one small extra request per video). Included in the price.

## `maxConcurrency` (type: `integer`):

How many channels to process at the same time.

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

Residential proxy is strongly recommended — YouTube blocks datacenter IPs. Proxy cost is included in the price.

## Actor input object example

```json
{
  "channels": [
    "https://www.youtube.com/@mkbhd"
  ],
  "includeChannelInfo": true,
  "maxVideos": 20,
  "maxShorts": 20,
  "maxStreams": 0,
  "sortBy": "latest",
  "includeVideoDetails": true,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

One item per channel (info row) and per video, Short or live stream, plus free error rows for channels that failed.

## `summary` (type: `string`):

One JSON object: status (SUCCEEDED, PARTIAL, STOPPED_AT_SPEND_LIMIT, ABORTED, NO_RESULTS, SOURCE_UNAVAILABLE), results count, failed inputs by error code, and a plain-English message.

# 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/@mkbhd"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("t3data/youtube-channel").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/@mkbhd"] }

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

```

## MCP server setup

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

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/qmxQem3wpffxEMqx3/builds/OMfzz43MPNtZshyjJ/openapi.json
