# YouTube Channel Tracker: Competitor Growth & Breakout Videos (`feedwise/youtube-channel-tracker`) Actor

Track any YouTube channels: subscriber growth, new uploads, fastest-growing and breakout videos, Shorts vs long-form performance, posting pace and like rate, with changes since your last run. No API key or login. For creators, agencies and brand teams.

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

## Pricing

from $10.00 / 1,000 channel reports

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 Tracker — competitor growth, new uploads and breakout videos

Give it a list of YouTube channels. Get **one report per channel**: subscribers, posting pace, median
views for long videos and Shorts, like rate, breakout videos and, on every repeat run, **what changed
since last time**: subscriber growth, new uploads and the fastest-growing videos.

Schedule it daily or weekly and you have a competitor dashboard for your niche, with no API key and no
login.

- **Plain-English signals** you can paste into Slack or a sheet: "Subscribers +12.4K (+0.62%) since 2026-09-24", "2 new uploads since 2026-09-24: "We're trying something new..."", "Breakout short: "What happens if you cut the green rope?" has 23.3x the channel's median views (48M)", "Posts about every 4.8 days", "Long videos outperform Shorts 3.1x on median views".
- **Breakout detection**: videos and Shorts with at least 3x the channel's median views, so you see which topics and formats are working for a competitor.
- **Fastest growing since last run**: views gained per video and per day between runs.
- **Shorts vs long-form**: separate medians, the Shorts share of recent uploads, and which format wins.
- **Posting pace**: uploads in the last 7 and 30 days, average days between uploads, days since the last upload.
- **Pay per channel report**, not per video. Use `onlyChanged` to skip, and not pay for, channels that posted nothing new.

### Who uses this

- **Creators**: watch the channels in your niche, copy what breaks out, and time your uploads.
- **Agencies and managers**: one weekly report across every client and competitor channel.
- **Brands and sponsors**: vet creators by real median views and like rate, not subscriber counts.
- **Analysts**: track growth across a watchlist over time (each run is a dated snapshot).

### Input

```json
{
  "channels": ["@veritasium", "https://www.youtube.com/@mkbhd", "UCHnyfMqiRRG1u-2MsSQLbXA"],
  "compareWithLastRun": true,
  "stateKey": "my-niche",
  "onlyChanged": false,
  "maxItems": 10
}
```

Channels can be an `@handle`, a channel URL (`/@name`, `/channel/UC…`, `/c/name`, `/user/name`) or a
channel ID. The first run saves a baseline; every later run with the same `stateKey` compares against
the previous one.

### Output (one row per channel)

```json
{
  "channel": "Veritasium",
  "handle": "@veritasium",
  "subscribers": 21300000,
  "videoCount": 537,
  "subscriberChange": 100000,
  "subscriberChangePct": 0.47,
  "newUploadsSinceLastRun": 1,
  "newUploads": [{ "title": "We're trying something new...", "url": "https://www.youtube.com/watch?v=ONAuUyml0yI", "views": 564513, "published": "2026-09-30T19:19:10+00:00" }],
  "fastestGrowing": [{ "title": "The Closest Thing We Have to Alien Technology", "viewsGained": 1200000, "viewsPerDay": 400000 }],
  "uploadsLast7Days": 2,
  "uploadsLast30Days": 7,
  "avgDaysBetweenUploads": 4.8,
  "daysSinceLastUpload": 0,
  "medianVideoViews": 6392850,
  "medianShortViews": 2056801,
  "medianLikeRatePct": 2.7,
  "shortsShareOfRecentUploadsPct": 66.7,
  "breakouts": [{ "title": "What happens if you cut the green rope?", "type": "short", "views": 48000000, "timesMedian": 23.3 }],
  "recentVideos": ["…"],
  "recentShorts": ["…"],
  "signals": ["…"]
}
```

### How the numbers work

- Data comes from each channel's public page, its Shorts tab and its public RSS feed, read at run time.
- The latest 15 uploads have exact publish dates, exact views and likes. Older videos have the
  rounded view counts YouTube shows (for example 6.4M) and approximate dates (`publishedIsApprox`).
- Medians use the last 10 videos or Shorts that are at least two days old, so a brand-new upload
  doesn't drag the median down.
- YouTube rounds subscriber counts for large channels (21.3M), so subscriber growth moves in steps.
- Upload counts come from the latest 15 uploads; `uploadCountsCapped` is true when a very active
  channel posted more than that.

### Pricing

Pay per channel report. Channels that can't be found, and unchanged channels when `onlyChanged` is on,
are free.

### FAQ

**Do I need a YouTube API key?** No. It reads public pages that anyone can open without logging in.

**Can it track my own channel?** Yes. Add your channel and schedule the actor to get a daily growth log.

**What about transcripts or comments?** This actor is built for channel-level tracking. It does not
download videos, transcripts or comments.

# Actor input Schema

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

One per line: @handle, a channel URL (https://www.youtube.com/@mkbhd, /channel/UC…, /c/name) or a channel ID (UC…).

## `compareWithLastRun` (type: `boolean`):

Save each channel's subscribers and video views and, on the next run, report subscriber growth, new uploads and the fastest-growing videos since then. Schedule the actor daily or weekly to get a regular competitor report.

## `stateKey` (type: `string`):

Name for this tracking list. Use a different name for each separate list you track, so their histories don't mix.

## `onlyChanged` (type: `boolean`):

On repeat runs, skip (and don't charge for) channels that posted nothing new since the last run. First runs always report, to create the baseline.

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

How many items to include in each list (recent videos, recent Shorts, breakouts, new uploads).

## `concurrency` (type: `integer`):

How many channels to read at the same time.

## Actor input object example

```json
{
  "channels": [
    "@veritasium",
    "https://www.youtube.com/@mkbhd",
    "@NASA"
  ],
  "compareWithLastRun": true,
  "stateKey": "default",
  "onlyChanged": false,
  "maxItems": 10,
  "concurrency": 4
}
```

# Actor output Schema

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

One row per channel: subscribers, growth and new uploads since the last run, breakout videos, Shorts vs long-form performance and posting pace.

# 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": [
        "@veritasium",
        "https://www.youtube.com/@mkbhd",
        "@NASA"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("feedwise/youtube-channel-tracker").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": [
        "@veritasium",
        "https://www.youtube.com/@mkbhd",
        "@NASA",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("feedwise/youtube-channel-tracker").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": [
    "@veritasium",
    "https://www.youtube.com/@mkbhd",
    "@NASA"
  ]
}' |
apify call feedwise/youtube-channel-tracker --silent --output-dataset

```

## MCP server setup

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

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/m2LYzQsvPmv47YUSA/builds/YnbH2eGagnVp6Vrk1/openapi.json
