# YouTube Similar Channels Finder - Lookalike Creators (`neverempty/youtube-similar-channels-finder`) Actor

For influencer marketers and agencies: YouTube channels similar to a seed channel, with id, handle, subscribers, country and the videos they appeared next to. For @mkbhd, Mrwhosetheboss sat next to 5 of 5 videos read in 4 of 4 runs. Shortlist creators from an @handle, URL or channel id.

- **URL**: https://apify.com/neverempty/youtube-similar-channels-finder.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** Social media, Videos, Marketing
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $14.60 / 1,000 similar channel returneds

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 Similar Channels Finder - Lookalike Creators

For influencer marketers, agencies and YouTube creators: give a seed channel and get **the YouTube channels YouTube itself recommends next to its videos**, ranked, with each channel's id, name, @handle, URL, subscriber count, video count, country and **the evidence** - which of the seed's videos it appeared next to, which related video, and how high in the panel. Measured on 2026-09-21 (UTC): for @mkbhd, Mrwhosetheboss appeared next to 5 of the 5 videos read in 4 of 4 runs, and for @kurzgesagt Veritasium did in 3 of 3. Lower down the list the ranking moves from run to run, because YouTube's panel does. Use it to build creator shortlists, find competitors, or plan collaborations without guessing keywords.

Export as JSON, CSV or Excel.

Unofficial. Public data only. Not affiliated with YouTube or Google.

### What you can use it for

- **Influencer discovery**: start from one creator who fits your campaign and get a ranked list of lookalike creators, then filter by subscriber range (for example 10,000 to 100,000 for micro-influencers).
- **Competitor research**: see which channels YouTube places next to your own videos, and how consistently.
- **Collaboration planning**: find channels whose audience YouTube already treats as overlapping with yours.
- **Lead lists for agencies**: one row per channel with id, handle, URL, subscribers and country, ready for a spreadsheet or CRM.

### How it works

1. Enter seed channels as `@handle`, a channel URL, or a channel id (`UC...`) - any of the three works.
2. For each seed channel the Actor opens its public **Videos tab** and checks that the page is **the channel you asked for** (its own channel id).
3. It opens the seed's latest long-form videos (5 by default) and reads the **related-videos panel** YouTube shows next to each one, as it is served to a visitor who is not signed in. Every related video's channel is counted; for a collaboration video, every collaborating channel is counted. A video page is only used if YouTube names the seed as its owner. The seed channel itself is never returned.
4. Channels are ranked by **how many of the seed's videos they appeared next to** (`sourceVideosWithChannel`), then by how often (`appearances`), then by how high in the panel (`bestPosition`). The row carries up to 10 pieces of evidence so you can check each match yourself.
5. With `includeChannelDetails` on, each returned channel's public About page is read for its subscriber count, video count, total views, country, join date, verified badge and description.

**Coverage, stated plainly:** only the first screen of each page is read - about 30 videos on the Videos tab and 20 to 26 videos in each related panel. YouTube loads more through its internal API (`/youtubei/`), which YouTube's robots.txt disallows, so this Actor does not read it. It also never uses YouTube search (`/results`, disallowed too). Channels that only post Shorts get a free `no-long-form-videos` row: when measured, the related panel next to Shorts was not topical, so no ranking is made from it. The related panel is YouTube's recommendation at the moment of the run and can change between runs; channels that appeared next to only 1 video are weaker matches than those that appeared next to most of them - `minSourceVideos` keeps only the consistent ones.

### Input

| Field | Default | What it does |
| --- | --- | --- |
| `channels` | example channel | Seed channels: `@handle`, channel URL (`/@name`, `/channel/UC...`, `/c/...`, `/user/...`) or channel id `UC...`, one per line (commas and spaces also separate entries). A repeated channel is read and charged once; the repeat gets a free `duplicate` row. Up to 200 per run. |
| `videosPerChannel` | `5` | How many of the seed's latest long-form videos to open (1-30). More videos give steadier rankings and more candidates. |
| `maxSimilarChannels` | `20` | At most this many similar channels per seed, best-ranked first (1-200). |
| `minSourceVideos` | `1` | Keep only channels that appeared next to at least this many of the seed's videos. |
| `includeChannelDetails` | `true` | Read each returned channel's About page for subscribers, video count, total views, country, join date, verified badge and description. |
| `minSubscribers` | none | Skip channels whose displayed subscriber count is lower. Skipped channels are not returned or charged; a channel whose count could not be read is kept. |
| `maxSubscribers` | none | Skip channels whose displayed subscriber count is higher. |
| `maxResults` | `1000` | Stop after this many rows in total; a free row says what was not returned. |
| `useProxy` | `true` | Retry a page through a proxy (datacenter first, then residential) only if YouTube answers it with a bot check or an error. |

```json
{
    "channels": ["@veritasium", "https://www.youtube.com/@mkbhd", "UCsXVk37bltHxD1rDPwtNM8Q"],
    "videosPerChannel": 5,
    "maxSimilarChannels": 20,
    "minSourceVideos": 2,
    "maxSubscribers": 5000000
}
```

If you leave `channels` out, the example channel `@mkbhd` is read (it appears in `inputChannel` and the run log says so). An empty list is rejected with a free `invalid-input` row.

### Output

One row per similar channel. This row was read on 2026-09-21 (UTC) in a production run for the seed `@mkbhd` (the evidence list is cut to 2 of its 10 entries here):

```json
{
    "source": "youtube-similar-channels",
    "status": "ok",
    "inputChannel": "@mkbhd",
    "sourceChannelId": "UCBJycsmduvYEL83R_U4JriQ",
    "sourceChannelTitle": "Marques Brownlee",
    "sourceChannelHandle": "@mkbhd",
    "sourceChannelUrl": "https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ",
    "sourceVideosRead": 5,
    "rank": 1,
    "channelId": "UCMiJRAwDNSNzuYeN2uWa0pA",
    "channelTitle": "Mrwhosetheboss",
    "channelHandle": "@Mrwhosetheboss",
    "channelUrl": "https://www.youtube.com/@Mrwhosetheboss",
    "sourceVideosWithChannel": 5,
    "sourceVideoShare": 1,
    "appearances": 13,
    "appearancesAsCollaborator": 5,
    "bestPosition": 2,
    "averagePosition": 14.5,
    "evidence": [
        {
            "sourceVideoId": "ohqxP8EEumo",
            "sourceVideoTitle": "iPhone 18 Pro Review: All About that Chip",
            "relatedVideoId": "n6hPB3Arr_M",
            "relatedVideoTitle": "iPhone 18 Pro Unboxing - This Needs Explaining",
            "position": 2
        },
        {
            "sourceVideoId": "ohqxP8EEumo",
            "sourceVideoTitle": "iPhone 18 Pro Review: All About that Chip",
            "relatedVideoId": "JstGCPsj9wg",
            "relatedVideoTitle": "How Tech Companies Lie to You.",
            "position": 9
        }
    ],
    "subscriberCount": 22900000,
    "subscriberCountText": "22.9M subscribers",
    "subscriberCountIsRounded": true,
    "videoCount": 1935,
    "totalViews": 9110530184,
    "joinedDate": "2011-04-20",
    "country": "United Kingdom",
    "isVerified": true,
    "description": "Let's become the Greatest Tech Community on the Planet 🌍 I'm Arun Maini and I'm on a mission to make the most FUN and USEFUL Tech videos on the Planet! 🙏",
    "channelDetailsStatus": "ok",
    "scrapedAt": "2026-09-21T11:57:21.240Z"
}
```

| Field | Meaning |
| --- | --- |
| `inputChannel`, `sourceChannel*` | The seed as you typed it, and the channel YouTube confirmed for it. |
| `sourceVideosRead` | How many of the seed's video pages were used (a page YouTube did not serve, or one owned by another channel, is not counted). |
| `rank` | Position in this seed's list, 1 = strongest match. |
| `channelId`, `channelTitle`, `channelHandle`, `channelUrl` | The similar channel. |
| `sourceVideosWithChannel`, `sourceVideoShare` | How many of the videos read had this channel in their related panel, and that as a share (1 = next to all of them). |
| `appearances`, `appearancesAsCollaborator` | Total times the channel appeared across those panels, and how many of them were as a collaborator on a joint video. |
| `bestPosition`, `averagePosition` | Its highest and average place in the related panels (1 = top). |
| `evidence` | Up to 10 entries: the seed video, the related video that belongs to this channel, and its position. |
| `subscriberCount`, `subscriberCountText`, `subscriberCountIsRounded` | The subscriber count as YouTube displays it ("25.6M subscribers" is 25,600,000 rounded). YouTube does not publish exact counts. |
| `videoCount`, `totalViews`, `joinedDate`, `country`, `isVerified`, `description` | From the channel's public About page; `null` when YouTube does not show it. |
| `channelDetailsStatus` | `ok`, `not-requested` (details off), `not-found`, `blocked` or `unreadable` - the details are `null` unless it is `ok`. |

Rows whose `status` is not `ok` are free and carry a `note` that says why: `invalid-input`, `duplicate`, `no-such-channel`, `different-channel-returned`, `no-long-form-videos`, `no-similar-channels`, `no-filter-match`, `blocked`, `unreadable`, `not-checked` and `budget-reached`.

### Pricing

Pay per result: **$0.02 per similar channel returned ($20 per 1,000)**, with lower prices on higher Apify plans. Free rows (reasons, duplicates, channels that could not be read) are never charged. The About page reads for channel details are included in the row price. The Actor stops before it would exceed the maximum total charge you set for a run, returns a free `budget-reached` row that says how many channels were left out, and never reads pages for rows it could not charge for.

### Notes

- The related-videos panel is YouTube's recommendation for a visitor who is not signed in, in English and the United States (`hl=en&gl=US`). It changes over time, so two runs a week apart can rank differently.
- Subscriber counts are YouTube's rounded display values, not exact numbers.
- No YouTube Data API key and no sign-in are used. Only public pages that YouTube's robots.txt allows are requested: the Videos tab, watch pages and About pages.

# Actor input Schema

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

Channels to find lookalikes for: an @handle (@mkbhd), a channel URL (https://www.youtube.com/@mkbhd, /channel/UC..., /c/..., /user/...) or the channel id itself (UC...). One per line; commas and spaces also separate entries. A repeated channel is read and charged once and the repeat gets a free 'duplicate' row. Video links are not accepted: give the channel. If you leave this field out, the example channel is read. An empty list is rejected. Up to 200 channels per run.

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

How many of the seed channel's latest long-form videos (from its Videos tab, newest first) are opened. The channels YouTube shows in the related-videos panel next to them are counted. More videos give steadier results and more candidates; each video is one extra page request. The Videos tab shows about 30 videos without scrolling, so 30 is the highest value.

## `maxSimilarChannels` (type: `integer`):

At most this many similar channels are returned for each seed channel, best-ranked first (ranked by how many of the seed's videos they appeared next to, then by how often, then by how high in the panel).

## `minSourceVideos` (type: `integer`):

1 returns every channel seen in the related panels. Raise it (for example to 2 or 3 with 5 videos read) to keep only channels YouTube recommends consistently next to the seed's videos. It cannot be larger than videosPerChannel.

## `includeChannelDetails` (type: `boolean`):

On = each returned channel's public About page is read (one request per returned channel) for its subscriber count (rounded, as YouTube shows it), video count, total views, country, join date, verified badge and description. Off = faster; those fields are null. Required for the subscriber filters.

## `minSubscribers` (type: `integer`):

Skip similar channels whose displayed subscriber count is below this number. Skipped channels are not returned or charged. A channel whose count could not be read is kept, not guessed. Needs includeChannelDetails on.

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

Skip similar channels whose displayed subscriber count is above this number (for example 100000 to find micro-influencers). Skipped channels are not returned or charged. A channel whose count could not be read is kept. Needs includeChannelDetails on.

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

Reading stops once this many similar-channel rows have been returned across all seed channels, and a free row says what was not returned because of it.

## `useProxy` (type: `boolean`):

Every page is requested directly first. Only if YouTube answers a page with a bot check, an error or no response is that page retried through a proxy session (datacenter first, then residential). With it off, that answer is retried directly and then returned as a free 'blocked' row.

## Actor input object example

```json
{
  "channels": [
    "@mkbhd"
  ],
  "videosPerChannel": 5,
  "maxSimilarChannels": 20,
  "minSourceVideos": 1,
  "includeChannelDetails": true,
  "maxResults": 1000,
  "useProxy": true
}
```

# Actor output Schema

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

One row per similar channel found for each seed channel, ranked: the channel's id, name, @handle and URL, how many of the seed's videos it appeared next to in YouTube's related-videos panel, how often and how high, up to 10 pieces of evidence (which seed video and which related video), and, when channel details are on, its subscriber count (rounded as YouTube shows it), video count, total views, country, join date and description. Channels that do not exist, bot checks, invalid input and channels with no long-form videos come back as free rows that say why.

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

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/youtube-similar-channels-finder").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"] }

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

```

## MCP server setup

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

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/0iSBzhmZtCmgqcCsV/builds/guUux3s1MHp7sM5kt/openapi.json
