# YouTube Channel Analyzer: Analytics & Competitor Analysis (`cygnix_labs/youtube-channel-analyzer`) Actor

YouTube channel analyzer for creators and marketers: subscribers, views, upload cadence, best upload day and hour, outlier videos vs channel median, winning title patterns and topics, engagement rate, Shorts vs long-form, competitor comparison and recommendations. $0.025 per channel report.

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

## Pricing

$25.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 Analyzer: Analytics, Outliers & Competitor Analysis

**Answer first:** this **YouTube channel analyzer** turns any public channel (yours or a competitor's) into a ready-to-use **YouTube analytics report**: subscribers, total views, **upload cadence**, **median views**, **engagement rate**, **best upload day and hour** in your time zone, **outlier videos** (views vs the channel's own median), **title patterns and topics that win**, **Shorts vs long-form**, a **multi-channel competitor comparison** and plain-English **recommendations**. No API key, no login. **$0.025 per channel report**, with no start fee and no extra scraper cost in normal runs.

| Quick facts | |
|---|---|
| Best for | YouTube competitor analysis, channel audits, content strategy, finding outlier video ideas, best time to upload on YouTube, creator vetting for sponsorships, monthly client reports |
| Input | Channel handles (`@mkbhd`), channel URLs (`youtube.com/@name`, `youtube.com/channel/UC...`, `/c/`, `/user/`) or any video URL from the channel |
| Output | One row per channel: channel stats, `uploadsPerWeek`, `medianViews`, `medianEngagementRatePct`, `viewsPerSubscriberPct`, `bestUploadDays`, `bestTimeBlocks`, `outlierVideos`, `titlePatterns`, `topTopics`, `durationPerformance`, `trend`, `recommendations`, `summary` + a Markdown `REPORT` with a comparison table |
| Our price | **$0.025** per completed channel report. Channels that can't be analyzed are **never charged** |
| Data cost | **$0** in normal runs: public YouTube pages and feeds, no proxy, no third-party scraper |
| Needs | Nothing. No YouTube Data API key, no OAuth, no cookies |

### What you get per channel

- **Channel stats:** name, handle, channel ID, subscribers, total views, total videos, join date, country, description, external links.
- **Recent video performance:** the latest 30 long-form videos and 15 Shorts by default (up to 150 + 60), each with views, likes, comments, engagement rate, views per day, duration and an **outlier score**.
- **Upload cadence:** uploads per week (long-form and Shorts separately), median days between uploads, days since the last upload, uploads in the last 30 / 90 days.
- **Best upload day and hour:** weekdays and 3-hour windows ranked by how much they beat the channel's typical video, in the time zone you choose. Small samples are shrunk toward 1.0 and flagged `lowSample`, so one lucky upload can't win on its own.
- **Outlier videos:** every video with views at least 2x the channel median (you can change the threshold), plus the weakest uploads. Outliers are where most video ideas come from.
- **Title patterns:** numbers, questions, "how to", lists, "vs", brackets, colons, ALL-CAPS words, emoji, first person, years, emotional words, and title length. Each one shows its **lift**: median views with the pattern vs without it.
- **Topics:** recurring title keywords and two-word phrases ranked by performance (`topTopics`), the topics the channel covers most (`mostCoveredTopics`) and the ones that lag (`weakTopics`).
- **Video length:** which duration bucket performs best (under 5, 5-10, 10-20, 20-40 and 40+ minutes).
- **Trend:** recent median views vs older uploads, so you can see whether the channel is growing or slowing.
- **Recommendations:** what to post, when, how to title it and what to drop, written from the numbers above.
- **Competitor comparison:** add 2+ channels and the `REPORT` record gets a side-by-side table: subscribers, median views, uploads per week, engagement, views per subscriber, outliers, best day and window.

### How it works

1. Reads the channel page, its About panel and the Videos and Shorts tabs, the same public data anyone sees in a browser.
2. For each video it reads the exact view count, likes, comment count and publish date. Exact publish times come from YouTube's public RSS feeds, which cover the latest 15 long-form videos and 15 Shorts. Older videos keep their date, so they count for the best day but not the best hour, and the row's `notes` say so.
3. **Outlier score = video views ÷ the channel's median views** (1.0 = a typical video, 3.0 = three times typical). It's computed separately for long-form and Shorts, and videos under 3 days old are left out of the scoring because they haven't collected their views yet.
4. Days, time windows, title patterns, topics and lengths are ranked on the same score, so a 5k-subscriber channel and a 20M one compare fairly.
5. If YouTube ever blocks a request, the actor can fall back to `streamers/youtube-channel-scraper` on your account (about $0.0013 per video, capped by `maxScraperSpendUsd`, default $0.25). This is rare, and the row's `dataSource` tells you when it happened.

### Input examples

Your channel against two competitors, times in New York:

```json
{ "channels": ["@yourchannel", "@competitor1", "https://www.youtube.com/@competitor2"], "timezone": "America/New_York" }
```

Deep dive on one channel (150 videos, Shorts off, outliers at 3x):

```json
{ "channels": ["youtube.com/channel/UCsBjURrPoezykLs9EqgamOA"], "videosPerChannel": 150, "shortsPerChannel": 0, "outlierThreshold": 3 }
```

Channel from a video link:

```json
{ "channels": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"] }
```

| Field | Default | What it does |
|---|---|---|
| `channels` | required | Handles, channel URLs or video URLs |
| `videosPerChannel` | 30 | Latest long-form videos to analyze (5-150) |
| `shortsPerChannel` | 15 | Latest Shorts to analyze (0-60, 0 = skip) |
| `timezone` | UTC | Zone for the best day and hour (`Asia/Riyadh`, `UTC+3`, `EST`, `London`) |
| `includeEngagement` | true | Likes, comments and engagement rate |
| `outlierThreshold` | 2 | Outlier = views at least this many times the median |
| `minVideoAgeDays` | 3 | Younger videos are listed but not scored |
| `useFallbackScraper` / `maxScraperSpendUsd` | true / $0.25 | Fallback only when YouTube blocks a request |

### Sample output (real run, 20 Oct 2026, times in UTC; trimmed)

```json
{
  "channelName": "Marques Brownlee", "channelHandle": "@mkbhd", "subscribers": 21400000, "totalViews": 5800350438, "totalVideos": 1859,
  "videosAnalyzed": 30, "shortsAnalyzed": 15, "uploadsPerWeek": 1.34, "shortsPerWeek": 0.54, "daysSinceLastUpload": 3.22,
  "medianViews": 5632724, "medianShortsViews": 4757454, "medianEngagementRatePct": 2.03, "viewsPerSubscriberPct": 26.32,
  "bestUploadDay": "Sat", "bestUploadTimeBlock": "21-24", "outlierCount": 5,
  "topOutlier": {"title": "iPhone 18 Pro/Duo Impressions: Mogged", "url": "https://www.youtube.com/watch?v=Od6M0AXpcxQ", "publishedAt": "2026-09-10T07:29:55.000Z", "views": 28127612, "likes": 366514, "outlierScore": 4.99, "durationSec": 1034},
  "longForm": {
    "trend": {"recentMedianViews": 10660542, "olderMedianViews": 4467028, "changePct": 139},
    "bestUploadDays": [{"day": "Sat", "videos": 3, "medianIndex": 1.96, "medianViews": 11015257}, {"day": "Thu", "videos": 5, "medianIndex": 1.51, "medianViews": 8520212}, ...],
    "bestTimeBlocks": [{"timeBlock": "21-24", "videos": 5, "medianIndex": 1.83}, ...],
    "titlePatterns": [{"pattern": "ALL-CAPS word", "videosWith": 3, "medianIndexWith": 1.51, "medianIndexWithout": 0.97, "lift": 1.56}, ...],
    "topTopics": [{"topic": "iphone", "videos": 3, "medianIndex": 2.27, "medianViews": 12764351}, ...],
    "durationPerformance": [...], "outlierVideos": [...], "underperformers": [...], "videos": [... 30 videos with views, likes, comments, outlierScore ...]
  },
  "shorts": { ... same structure for the 15 latest Shorts ... },
  "recommendations": [
    "Upload long-form on Sat / Thu: those days beat the channel median by 1.96x / 1.51x (3 / 5 videos).",
    "Best long-form upload window: 21-24 (UTC), 1.83x median over 5 videos; you usually publish around 21:00.",
    "5 long-form outliers (>= 2x median). Biggest: \"iPhone 18 Pro/Duo Impressions: Mogged\" at 4.99x. Make follow-ups / part 2s on that idea and reuse its title and thumbnail angle.",
    "Long-form titles with ALL-CAPS word get 1.56x the views of titles without (3 videos). Use it more.",
    "Double down on long-form topics that over-perform: \"iphone\" (2.27x, 3 videos).",
    ...
  ],
  "summary": "Marques Brownlee (21,400,000 subscribers): 30 videos, median 5,632,724 views, 1.34/week; 15 Shorts, median 4,757,454 views. Best day Sat, best window 21-24 UTC. 5 outlier(s) >= 2x median, engagement 2.03%."
}
```

Each run also saves `REPORT` (Markdown with the competitor comparison table) and `SUMMARY` (JSON) in the key-value store.

### Pricing

| What | Price |
|---|---|
| Channel report | **$0.025** per channel that's analyzed |
| Channel not found / invalid / under 3 videos | $0 |
| Scraper or proxy cost | $0 in normal runs (fallback only: ~$0.0013 per video, capped) |

Example: you plus 4 competitors = **$0.125**. Weekly tracking of 10 channels = **$1 a month**.

Your Apify **Max cost per run** is checked **before** anything is fetched. If it covers fewer reports than the channels you list, the extra channels are skipped and come back as `NOT_ANALYZED` with the reason and `charged: false`.

### How it compares (Apify Store, checked 20 Oct 2026, FREE-plan prices)

| Actor | Price per channel | Notes |
|---|---|---|
| **cygnix_labs/youtube-channel-analyzer** (this) | **$0.025** all-in | Stats, cadence, best day/hour, outliers, title patterns, topics, Shorts vs long-form, comparison, recommendations |
| seemuapps/youtube-channel-growth-analyzer | $0.02 | Growth metrics |
| salomon.labs/youtube-channel-analyzer | $0.03 | Audience language and sponsorship focus |
| centorprat/youtube-influencer-audit | $0.04 (+$0.03 deep) | Fake-subscriber and engagement audit |
| feeng/youtube-channel-competitor-intelligence | $0.02 + $0.002 per video (~$0.08 at 30 videos) | Content gap |
| apricot_blackberry/youtube-creator-analyzer | $0.05 start + $0.035 per result | Creator performance |
| seemuapps/youtube-content-gap-finder | $0.05 per analysis + $0.02 per gap | Topic gaps |

Plain scrapers (for example `streamers/youtube-channel-scraper`, $0.0013 per video) give you raw rows to analyze yourself. This actor gives you the analysis.

### For AI agents / MCP

**When to call it:** the user wants to analyze a YouTube channel, compare YouTube competitors, find outlier or viral video ideas on a channel, learn the best time to upload, audit a creator before a sponsorship, or get YouTube analytics without the YouTube Data API.

Connect the Apify MCP server with only this actor (Claude, ChatGPT, Cursor, VS Code, any MCP client):

```
https://mcp.apify.com?tools=cygnix_labs/youtube-channel-analyzer
```

Or `search-actors` for `youtube channel analyzer`, `youtube analytics` or `youtube competitor analysis`.

Example `call-actor` input: `{ "channels": ["@mkbhd", "@unboxtherapy"], "videosPerChannel": 30, "timezone": "America/New_York" }`. **Read the result:** keep rows where `status == "ANALYZED"`. `summary` is a quotable one-liner, `recommendations[]` is ready to show, `longForm.outlierVideos[]` lists the breakout videos and `bestUploadDay` / `bestUploadTimeBlock` give the timing. Cost is $0.025 per channel; pass `maxTotalChargeUsd` to cap it. The actor runs with limited permissions and pay-per-event pricing, so it suits autonomous agents.

Example prompt: *"Compare my channel @mychannel with @rival1 and @rival2. Which topics and title styles get them outlier views, and when should I upload?"*

### FAQ

**Do I need a YouTube API key or access to the channel?** No. Only public data is used, so it works on any public channel, including competitors.

**How is this different from YouTube Studio analytics?** Studio shows private metrics (watch time, CTR, retention) for your own channel only. This actor works on any channel from public data, so you can benchmark competitors and find their outliers.

**How accurate are the numbers?** View, like and subscriber counts are what YouTube shows publicly. Subscribers are rounded by YouTube (e.g. 4.31M), and comment counts of 1,000+ are rounded (e.g. 21K). The `notes` field lists every limit that applied to a run.

**Why do only some videos have an exact upload hour?** YouTube's public feeds give exact times for the latest 15 videos and 15 Shorts. Older videos have the date only, so they count for the best day. The latest uploads are the ones that reflect the current schedule anyway.

**What counts as engagement rate?** (likes + comments) ÷ views × 100 per video. The channel figure is the median across videos.

**Channel not found or has very few videos?** You get a `NOT_ANALYZED` row with the reason, and it isn't charged. At least 3 public videos are needed.

**Live streams?** Videos that are live now or scheduled are skipped. Past streams and premieres listed on the Videos tab are included.

### Changelog

- **0.1** (2026-10-20): First release. Channel stats, long-form and Shorts analysis, best upload day and hour, outliers, title patterns, topics, duration, trend, competitor comparison and recommendations. Max cost per run is checked before fetching.

### More tools by Cygnix Labs

- [Best Time to Post: Instagram, TikTok, YouTube & LinkedIn](https://apify.com/cygnix_labs/social-best-time-to-post)
- [Hashtag Research & Generator: Instagram + TikTok Sets](https://apify.com/cygnix_labs/hashtag-research-strategy)
- [Website SEO Audit + AEO/GEO Checker](https://apify.com/cygnix_labs/site-seo-aeo-audit)

Questions or a feature request? Open an issue on this actor's Issues tab. We answer within 24 hours.

# Actor input Schema

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

Your channel and/or competitors. Handles (@mkbhd), channel URLs (youtube.com/@mkbhd, youtube.com/channel/UC...) or any video URL from the channel. One report per channel.

## `videosPerChannel` (type: `integer`):

Most recent long-form uploads to analyze. 30 is a good balance; use 60-150 for a deeper topic and title analysis.

## `shortsPerChannel` (type: `integer`):

Most recent Shorts to analyze separately (0 = skip Shorts).

## `timezone` (type: `string`):

IANA names (America/New_York, Europe/London, Asia/Kolkata), offsets (UTC+3) or abbreviations (EST, PST, IST) all work.

## `includeEngagement` (type: `boolean`):

Adds like and comment counts and engagement rate per video. Turn off for a faster views-only analysis.

## `outlierThreshold` (type: `number`):

A video is an outlier when its views are at least this many times the channel's median views.

## `minVideoAgeDays` (type: `integer`):

Very new videos have not collected their views yet, so they are left out of outlier, day/hour and topic scores (still listed).

## `useFallbackScraper` (type: `boolean`):

Normally all data comes from public YouTube pages at no extra cost. If YouTube blocks a request, the actor can call streamers/youtube-channel-scraper on your Apify account (about $0.0013 per video, capped below).

## `maxScraperSpendUsd` (type: `number`):

Hard cap for fallback scraper runs in this run (billed by that scraper, separate from our report fee). Usually $0.

## Actor input object example

```json
{
  "channels": [
    "@mkbhd",
    "https://www.youtube.com/@veritasium"
  ],
  "videosPerChannel": 30,
  "shortsPerChannel": 15,
  "timezone": "UTC",
  "includeEngagement": true,
  "outlierThreshold": 2,
  "minVideoAgeDays": 3,
  "useFallbackScraper": true,
  "maxScraperSpendUsd": 0.25
}
```

# Actor output Schema

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

No description

## `report` (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 = {
    "channels": [
        "@mkbhd",
        "https://www.youtube.com/@veritasium"
    ]
};

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

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

```

## MCP server setup

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

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/XWVvemsp0KYa2aYNY/builds/rQjejGchHK2CixHIv/openapi.json
