# YouTube Outlier Finder: Videos That Beat Their Own Channel (`wellbuilt_zythem/youtube-outliers`) Actor

Find YouTube videos with many times their channel's usual views. Search by keyword, upload date, length and country; get outlier score, channel median views, views per subscriber and views per day. No API key. Pay per outlier.

- **URL**: https://apify.com/wellbuilt_zythem/youtube-outliers.md
- **Developed by:** [Carlos Escanez](https://apify.com/wellbuilt_zythem) (community)
- **Categories:** Social media, Marketing, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.50 / 1,000 outlier videos

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 Outlier Finder: Videos That Beat Their Own Channel

Find the YouTube videos that got **many times more views than their channel usually gets**. Those are the topics that work right now, and the ones worth making your own version of.

Type a few keywords, pick an upload window, and get a ranked list: the video, its views, the channel's usual views, and how many times it beat them.

No YouTube API key. No account. You pay per outlier delivered, not per video searched.

### What you get for each video

| Field | What it means |
|---|---|
| `outlierScore` | Views divided by the channel's median views on its recent videos. **30 = thirty times its normal.** |
| `channelMedianViews` | Median views of the channel's recent long videos (videos younger than 7 days are left out, they have not finished counting). |
| `viewsPerSubscriber` | Views divided by subscribers. Used as the score when a channel has fewer than 5 videos to compare. |
| `scoreBasis` | `channel_median` or `subscribers`: which of the two the score comes from. |
| `views`, `viewsPerDay` | Views now, and views per day since upload. |
| `subscribers` | Channel subscribers as YouTube shows them (rounded, like "4.2K"). Empty when the channel hides them. |
| `publishedText`, `publishedApprox` | "3 days ago" as YouTube shows it, and the approximate date. |
| `durationSeconds`, `title`, `thumbnail`, `url` | The video. |
| `channelName`, `channelHandle`, `channelUrl` | The channel. |
| `query` | The keyword that found it. |

### How to use it

1. Add your keywords, one per line: `what if`, `history explained`, `a day in the life medieval`.
2. Pick **Uploaded in the last**: a month is the sweet spot.
3. Keep **Minimum outlier score** at 3 and **Maximum channel subscribers** at 250,000 to find ideas that work for small channels.
4. Run. Results come sorted by score, highest first.

**Country** sets where YouTube searches from (US, GB, ES, MX...). The keywords decide the language: English keywords give English videos.

### Example result

From a test run on 27 October 2026, keyword "what if", last month:

| Score | Views | Channel median | Subscribers |
|---|---|---|---|
| 9,675x | 4.9M | 504 | 3,040 |
| 834x | 447K | 536 | 4,230 |
| 187x | 1.76M | 9,400 | 4,650 |

### Good to know

- **Search results, not all of YouTube.** Each keyword reads up to 10 pages of YouTube search (about 20 videos per page). More keywords find more outliers.
- **Numbers are rounded by YouTube.** Subscribers and the channel's recent views come as "4.2K" or "1M", so the score is close, not exact to the unit.
- **Shorts.** The channel median is taken from the channel's long videos. For videos under 4 minutes the score can read high.
- **Channel hides subscribers:** `subscribers` is empty and the score uses the channel median.
- **Live streams happening now** are skipped: their view count is people watching, not views.

### Pricing

Pay per event: one charge per outlier video delivered. Videos searched and rejected are not charged. Set a maximum total charge on the run if you want a hard cap.

### Run summary

Each run saves `RUN_SUMMARY` in the key-value store: videos searched, how many passed each filter, why the rest were rejected, and failed search pages if any.

# Actor input Schema

## `queries` (type: `array`):

Topics to search on YouTube, one per line, for example "what if" or "a day in the life medieval". Up to 50 per run.

## `uploadWindow` (type: `string`):

Only videos uploaded in this window. A month is the sweet spot: long enough for views to build up, recent enough to copy the idea while it is hot.

## `duration` (type: `string`):

YouTube's own length filter: under 4 minutes, 4 to 20 minutes, or over 20 minutes.

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

Order of YouTube's search results before scoring. Most viewed finds the biggest breakouts first.

## `pagesPerQuery` (type: `integer`):

Each page is about 20 videos. 1 to 10.

## `minOutlierScore` (type: `integer`):

How many times the channel's usual views (median of its recent videos) a video must reach. 3 means three times its normal. When the channel has too few videos to compare, views per subscriber is used instead.

## `minViews` (type: `integer`):

Ignore videos with fewer views than this.

## `maxSubscribers` (type: `integer`):

Skip channels bigger than this, to find ideas that work for small channels. 0 means no limit.

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

Outliers delivered per run, highest score first.

## `country` (type: `string`):

Two-letter country code YouTube searches from, for example US, GB, ES or MX. The keywords decide the language of the results.

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

Not needed in our tests. Turn it on only if YouTube starts refusing requests.

## Actor input object example

```json
{
  "queries": [
    "what if",
    "history explained"
  ],
  "uploadWindow": "month",
  "duration": "any",
  "sortBy": "views",
  "pagesPerQuery": 1,
  "minOutlierScore": 3,
  "minViews": 10000,
  "maxSubscribers": 250000,
  "maxResults": 20,
  "country": "US",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `runSummary` (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 = {
    "queries": [
        "what if",
        "history explained"
    ],
    "pagesPerQuery": 1,
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("wellbuilt_zythem/youtube-outliers").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 = {
    "queries": [
        "what if",
        "history explained",
    ],
    "pagesPerQuery": 1,
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("wellbuilt_zythem/youtube-outliers").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 '{
  "queries": [
    "what if",
    "history explained"
  ],
  "pagesPerQuery": 1,
  "maxResults": 20
}' |
apify call wellbuilt_zythem/youtube-outliers --silent --output-dataset

```

## MCP server setup

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

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/6LDBILUGcJPKasx3d/builds/dDnb2YeJiOODgaMca/openapi.json
