# YouTube Channel Search Scraper (`parsebird/youtube-channel-search-scraper`) Actor

Find YouTube channels by keyword, niche, or topic. Search video results, channel-only search, or both. Get subscriber counts, video counts, verification status, country, links, and full profile data.

- **URL**: https://apify.com/parsebird/youtube-channel-search-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:** Videos, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 channels

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### YouTube Channel Search Scraper

Find [YouTube](https://www.youtube.com) channels by keyword, niche, product, or creator type — search video results, run a channel-only search, or both, and get back structured channel profiles instead of a list of videos. Built for influencer marketing teams, brand partnership scouts, market researchers, and anyone who needs a list of relevant YouTube channels with subscriber counts, video counts, and contact-ready profile data.

<table><tr>
<td style="border-left:4px solid #FF0000;padding:12px 16px;font-weight:600">
Search up to 500 terms at once, filter by subscriber count, video count, and verification status, and get subscriber counts, video counts, total views, country, join date, tags, external links, and avatar/banner images for every channel — no YouTube Data API key needed.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
YouTube Channel Search Scraper (parsebird/youtube-channel-search-scraper) — Finds YouTube channels by keyword, niche, or product and returns full channel profiles. Input: {"searchTerms": ["coffee roasting"], "discoveryMode": "both", "maxChannelsPerSearchTerm": 10, "maxTotalResults": 10, "verifiedOnly": false, "languageHint": "en", "countryHint": "US"}. Key inputs: searchTerms (string array, up to 500 terms), searchTermsFiles (TXT/CSV file URLs, up to 20), searchUrls (array of {url} — replay a youtube.com/results URL), discoveryMode ("video_results" | "channel_filter" | "both", default "both"), maxChannelsPerSearchTerm (integer, unlimited if empty), maxTotalResults (integer, unlimited if empty), minSubscribers/maxSubscribers/minVideos (integer), verifiedOnly (boolean), excludedChannels (array of {url}), languageHint/countryHint (2-letter codes). Output per channel: channel (id, handle, title, url, description, isVerified, isFamilySafe, isUnlisted, isNoindex), metrics (subscribers, subscriberText, videos, videoText, totalViews, totalViewText), profile (country, joinedText, keywords, tags, rssUrl, tabs, externalLinks, availableCountryCodes, ownerUrls, alternateUrls), images (thumbnailUrl, avatarUrl, bannerUrl, avatarImages), discoverySource (sourceKind, value, discoverySurface, rank, sourceUrl), sourceVideo. API: POST https://api.apify.com/v2/acts/parsebird~youtube-channel-search-scraper/runs?token=YOUR_TOKEN. Get token: https://console.apify.com/account#/integrations
```

### What does YouTube Channel Search Scraper do?

The **YouTube Channel Search Scraper** turns a keyword, niche, or product name into a list of matching **YouTube channels** — not videos. Enter search terms, pick a discovery mode, and the actor:

- 🔍 Searches YouTube's internal API directly — no browser, no headless Chrome, no YouTube Data API key
- 📺 Finds channels two ways: from the channels behind matching **video** results, from a **channel-only** search, or both at once
- 📊 Enriches every match with a full channel profile — subscribers, videos, total views, country, join date, description, tags, and links
- ✅ Filters by minimum/maximum subscriber count, minimum video count, and verification badge
- 🚫 Lets you exclude specific channels by handle or channel URL so you never see the same channel twice
- 📁 Accepts up to 500 search terms at once — typed in, uploaded as TXT/CSV files, or replayed from a `youtube.com/results` URL you already filtered on YouTube
- 🖼️ Returns every avatar size and the channel banner image, ready to display without a second request
- ⚡ Runs on lightweight infrastructure (128–512 MB) — fast and cost-efficient

YouTube Channel Search Scraper uses YouTube's own internal InnerTube API — the same API that powers youtube.com and every channel's "About" tab — so subscriber counts, video counts, and verification status are always current.

### What data can you extract with YouTube Channel Search Scraper?

| Field | Description |
|-------|-------------|
| `channel.id` | Stable YouTube channel ID |
| `channel.handle` | Public handle (e.g. `@mkbhd`) |
| `channel.title` | Public channel name |
| `channel.url` | Main public channel URL |
| `channel.description` | Public channel description |
| `channel.isVerified` | Whether YouTube marks the channel as verified |
| `metrics.subscribers` | Public subscriber count |
| `metrics.videos` | Public video count |
| `metrics.totalViews` | Total public channel views |
| `profile.country` | Country shown on the channel |
| `profile.joinedText` | Channel creation date, as shown by YouTube |
| `profile.tags` | Public channel tags |
| `profile.externalLinks` | Public links shared by the channel (site, socials) |
| `profile.tabs` | Public channel tabs (Videos, Shorts, Live, Playlists, ...) |
| `images.avatarUrl` / `images.bannerUrl` | Channel avatar and banner images |
| `discoverySource` | Which search term/URL and surface first found this channel |
| `sourceVideo` | The video that first surfaced the channel, if found via video results |

The full output has five nested objects — `channel`, `metrics`, `profile`, `images`, `discoverySource` — plus `sourceVideo`. See the [output example](#output-example) below for every field.

### How to search YouTube channels with YouTube Channel Search Scraper

1. Open [YouTube Channel Search Scraper](https://apify.com/parsebird/youtube-channel-search-scraper) on Apify
2. Enter one or more **Search Terms** — a niche, product, or creator type (e.g. "coffee roasting", "react tutorials")
3. Optionally upload a **Search Terms File** (TXT or CSV) or paste a **Search URL** you already filtered on YouTube
4. Choose a **Discovery Mode** — video results, channel search, or both
5. Set **Max Channels per Search Term** and **Max Total Channels** to control run size and cost
6. Add filters — **Min/Max Subscribers**, **Min Videos**, **Verified Only**, or a list of **Excluded Channels**
7. Click **Start** and wait for results
8. Export your data as **JSON, CSV, or Excel** from the dataset tab

**Quick start input:**

```json
{
    "searchTerms": ["coffee roasting"],
    "discoveryMode": "both",
    "maxChannelsPerSearchTerm": 10,
    "maxTotalResults": 10
}
```

**Find established, verified channels in a niche:**

```json
{
    "searchTerms": ["personal finance", "budgeting tips"],
    "discoveryMode": "both",
    "maxTotalResults": 50,
    "minSubscribers": 50000,
    "verifiedOnly": true
}
```

**Channel-only search across many niches, skipping ones you already have:**

```json
{
    "searchTerms": ["home coffee roasting", "espresso machines", "pour over coffee"],
    "discoveryMode": "channel_filter",
    "maxChannelsPerSearchTerm": 20,
    "excludedChannels": [
        { "url": "https://www.youtube.com/@mkbhd" }
    ]
}
```

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `searchTerms` | string array | No\* | — | Topics, products, niches, or creator types to search for. Up to 500 terms across all sources. |
| `searchTermsFiles` | string array | No\* | — | Up to 20 uploaded TXT or CSV files, one term per line. |
| `searchUrls` | array of `{url}` | No\* | — | Public `youtube.com/results` URLs to run again. |
| `discoveryMode` | string | No | `both` | `video_results`, `channel_filter`, or `both`. |
| `maxChannelsPerSearchTerm` | integer | No | unlimited | Stop after saving this many channels per source. |
| `maxTotalResults` | integer | No | unlimited | Stop after saving this many channels in the run. |
| `minSubscribers` | integer | No | — | Skip channels below this public subscriber count. |
| `maxSubscribers` | integer | No | — | Skip channels above this public subscriber count. |
| `minVideos` | integer | No | — | Skip channels below this public video count. |
| `verifiedOnly` | boolean | No | false | Only save channels with YouTube's verification badge. |
| `excludedChannels` | array of `{url}` | No | — | Channel handle or channel URLs to leave out. |
| `languageHint` | string | No | `en` | 2-letter YouTube page language hint. |
| `countryHint` | string | No | `US` | 2-letter YouTube country hint. |
| `proxyConfiguration` | object | No | Apify Proxy | Proxy settings for requests to YouTube. |

\* At least one of `searchTerms`, `searchTermsFiles`, or `searchUrls` is required.

### Output example

```json
{
    "channel": {
        "id": "UCVY9i3lgTlPIDsvkybOkfMQ",
        "handle": "@roasterkat",
        "title": "Roaster Kat",
        "url": "https://www.youtube.com/channel/UCVY9i3lgTlPIDsvkybOkfMQ",
        "description": "I'm Kat Melheim aka: Roaster Kat - roaster, barista, writer...",
        "isVerified": false,
        "isFamilySafe": true,
        "isUnlisted": false,
        "isNoindex": false
    },
    "metrics": {
        "subscribers": 20600,
        "subscriberText": "20.6K subscribers",
        "subscriberCountIsExact": false,
        "videos": 243,
        "videoText": "243 videos",
        "totalViews": 1206801,
        "totalViewText": "1,206,801 views"
    },
    "profile": {
        "country": "United States",
        "joinedText": "Joined Sep 26, 2018",
        "keywords": "\"Coffee Kat\" Coffee \"Coffee Brewing\" Barista Roaster",
        "tags": ["Coffee Kat", "Coffee", "Coffee Brewing", "Barista", "Roaster"],
        "rssUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=UCVY9i3lgTlPIDsvkybOkfMQ",
        "tabs": [
            { "title": "Videos", "url": "https://www.youtube.com/@roasterkat/videos" }
        ],
        "externalLinks": ["https://www.instagram.com/roasterkat"],
        "availableCountryCodes": ["US", "CA", "GB"],
        "ownerUrls": ["http://www.youtube.com/@roasterkat"],
        "alternateUrls": []
    },
    "images": {
        "thumbnailUrl": "https://yt3.googleusercontent.com/.../s200-c-k-c0x00ffffff-no-rj",
        "avatarUrl": "https://yt3.googleusercontent.com/.../s160-c-k-c0x00ffffff-no-rj",
        "bannerUrl": "https://yt3.googleusercontent.com/.../w2560-fcrop64=1...",
        "avatarImages": [
            { "url": "https://yt3.googleusercontent.com/.../s72-...", "width": 72, "height": 72 }
        ]
    },
    "discoverySource": {
        "sourceKind": "keyword",
        "value": "coffee roasting",
        "discoverySurface": "channel_filter",
        "rank": 1,
        "sourceUrl": "https://www.youtube.com/results?search_query=coffee+roasting&sp=EgIQAg%3D%3D"
    },
    "sourceVideo": null
}
```

### Use cases

- **Influencer discovery** — Build a shortlist of channels in a niche before reaching out for sponsorships
- **Competitor monitoring** — Track channel growth (subscribers, video count) for competing creators or brands
- **Market research** — See how many active channels exist in a niche and how established they are
- **Lead generation** — Find channels with public contact links for partnership or agency outreach
- **Content gap analysis** — Compare your channel's subscriber/video ratio against others in the same space
- **Brand safety checks** — Filter for verified, family-safe channels before a sponsorship deal
- **Academic and media research** — Collect structured channel-level data for creator economy studies

### How much does it cost to search YouTube channels?

YouTube Channel Search Scraper uses [pay-per-event pricing](https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event). You are charged per channel saved to the dataset — no compute fees on top.

| Event | Price per event | Price per 1,000 |
|-------|------------------|------------------|
| `channel-scraped` | $0.0015 | **$1.50** |

Each channel pushed to the dataset counts as one event (pricing shown is the Free plan rate; Bronze, Silver, and Gold subscribers pay less per event). For example, saving 200 channels costs $0.30 on the Free plan.

[Apify's Free plan](https://apify.com/pricing) includes monthly platform credits, enough for thousands of channels at no extra cost — a free way to try the actor before committing to a paid plan.

### Integrations and API access

Use YouTube Channel Search Scraper programmatically via the [Apify API](https://docs.apify.com/api/v2), [JavaScript client](https://docs.apify.com/api/client/js), or [Python client](https://docs.apify.com/api/client/python).

**Python:**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("parsebird/youtube-channel-search-scraper").call(run_input={
    "searchTerms": ["personal finance", "budgeting tips"],
    "discoveryMode": "both",
    "maxTotalResults": 50,
    "minSubscribers": 50000,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["channel"]["title"], item["metrics"]["subscribers"])
```

**JavaScript:**

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: "YOUR_API_TOKEN" });

const run = await client.actor("parsebird/youtube-channel-search-scraper").call({
    searchTerms: ["personal finance", "budgeting tips"],
    discoveryMode: "both",
    maxTotalResults: 50,
    minSubscribers: 50000,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => console.log(item.channel.title, item.metrics.subscribers));
```

You can also connect YouTube Channel Search Scraper to [Google Sheets](https://apify.com/integrations/google-sheets), [Slack](https://apify.com/integrations/slack), [Zapier](https://apify.com/integrations/zapier), [Make](https://apify.com/integrations/make), and other tools via [Apify integrations](https://apify.com/integrations). Use [Apify Schedules](https://docs.apify.com/platform/schedules) to re-run a search daily or weekly and track how a niche's channel list changes over time.

### Is it legal to scrape YouTube channel data?

Scraping publicly available data is generally considered legal, based on the [2022 US appeals court ruling](https://blog.apify.com/is-web-scraping-legal/) in *hiQ Labs v. LinkedIn*. This actor only reads channel information that YouTube already shows to any visitor on a channel's public "About" page — it does not log in, bypass authentication, or access private data.

Always review [YouTube's Terms of Service](https://www.youtube.com/t/terms) and comply with applicable laws in your jurisdiction, especially around how you use subscriber contact information. For general guidance, see [Apify's guide to web scraping legality](https://blog.apify.com/is-web-scraping-legal/).

### Related YouTube Actors

- [YouTube Search Scraper](https://apify.com/parsebird/youtube-search-scraper) — Scrape YouTube video, playlist, and shorts search results
- [YouTube Thumbnail Downloader](https://apify.com/parsebird/youtube-thumbnail-downloader) — Download high-resolution thumbnails from any YouTube video

### FAQ

**What's the difference between "video results" and "channel search" discovery mode?**
`video_results` searches YouTube for matching videos and returns the channel behind each one — useful for finding channels that are actively producing relevant content right now. `channel_filter` runs YouTube's own channel-only search, which is closer to searching a channel directory. `both` runs channel search first, then fills any remaining quota with video results.

**Why do some channels get skipped even though they matched my search?**
A channel is skipped if it's in your `excludedChannels` list, if it was already found by an earlier search term, or if it doesn't meet a subscriber/video filter you set. Channels that hide their subscriber or video count are always skipped when a `minSubscribers`, `maxSubscribers`, or `minVideos` filter is active, since there's no public number to compare.

**Why is `metrics.subscribers` an approximation for large channels?**
YouTube itself shows large counts in an abbreviated form (e.g. "21.1M subscribers") rather than the exact number. `metrics.subscriberCountIsExact` tells you whether the count came from YouTube's exact form or was estimated from an abbreviated one.

**What does `discoverySource.rank` mean?**
It's the channel's position in the results for the surface (`video_results` or `channel_filter`) and search term/URL that first found it — rank 1 is the first result YouTube returned.

**Can I re-run a search I already did manually on YouTube?**
Yes. Copy the URL from your browser's address bar after searching and filtering on youtube.com/results and add it to `searchUrls`. The actor replays the same query and filters through YouTube's API.

**Can I schedule recurring runs?**
Yes. Use [Apify's scheduling feature](https://docs.apify.com/platform/schedules) to run the scraper daily, weekly, or at any custom interval, and pair it with [integrations](https://apify.com/integrations) to send new channels straight to a spreadsheet or Slack channel.

**Can I use this with my AI assistant or MCP server?**
Yes. Copy the AI assistant block from the top of this page into ChatGPT, Claude, or Cursor. You can also connect this actor to any agent framework via the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp).

**Something isn't working. How do I get help?**
Open an issue in the [Issues tab](https://apify.com/parsebird/youtube-channel-search-scraper/issues) on the actor page. Include your input configuration and any error messages.

# Actor input Schema

## `searchTerms` (type: `array`):

Topics, products, niches, or creator types to search for (e.g. 'coffee roasting', 'react tutorials'). Up to 500 terms across all sources combined.

## `searchTermsFiles` (type: `array`):

Upload up to 20 TXT or CSV files with one search term per line (for CSV, the first column of each row — do not include a header row). Combined with Search Terms above, up to 500 terms total.

## `searchUrls` (type: `array`):

Public youtube.com/results URLs to run again, filters and all (e.g. a URL you copied after searching and filtering on YouTube).

## `discoveryMode` (type: `string`):

Where to look for channels: in video search results (channel of each matching video), a channel-only search, or both.

## `maxChannelsPerSearchTerm` (type: `integer`):

Stop after saving this many channels for each keyword or URL. Leave empty to save every channel the source returns.

## `maxTotalResults` (type: `integer`):

Stop the whole run after saving this many channels. Leave empty to exhaust every source.

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

Only save channels with at least this many public subscribers. Channels that hide their subscriber count are skipped.

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

Only save channels with at most this many public subscribers. Channels that hide their subscriber count are skipped.

## `minVideos` (type: `integer`):

Only save channels with at least this many public videos. Channels with no public video count are skipped.

## `verifiedOnly` (type: `boolean`):

Save only channels YouTube marks with a verification badge.

## `excludedChannels` (type: `array`):

Channels to leave out of the results. Add a YouTube handle URL (youtube.com/@handle) or channel URL (youtube.com/channel/UC...) for each one.

## `languageHint` (type: `string`):

Two-letter YouTube page language hint, e.g. en, es, fr, de, ja.

## `countryHint` (type: `string`):

Two-letter YouTube country hint, e.g. US, GB, IN, DE.

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

Proxy servers to use for requests to YouTube. Using Apify Proxy is recommended for larger runs to avoid rate limiting.

## Actor input object example

```json
{
  "searchTerms": [
    "coffee roasting"
  ],
  "searchUrls": [],
  "discoveryMode": "both",
  "maxChannelsPerSearchTerm": 10,
  "maxTotalResults": 10,
  "verifiedOnly": false,
  "excludedChannels": [],
  "languageHint": "en",
  "countryHint": "US",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "searchTerms": [
        "coffee roasting"
    ],
    "searchUrls": [],
    "discoveryMode": "both",
    "maxChannelsPerSearchTerm": 10,
    "maxTotalResults": 10,
    "excludedChannels": [],
    "languageHint": "en",
    "countryHint": "US",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/youtube-channel-search-scraper").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 = {
    "searchTerms": ["coffee roasting"],
    "searchUrls": [],
    "discoveryMode": "both",
    "maxChannelsPerSearchTerm": 10,
    "maxTotalResults": 10,
    "excludedChannels": [],
    "languageHint": "en",
    "countryHint": "US",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/youtube-channel-search-scraper").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 '{
  "searchTerms": [
    "coffee roasting"
  ],
  "searchUrls": [],
  "discoveryMode": "both",
  "maxChannelsPerSearchTerm": 10,
  "maxTotalResults": 10,
  "excludedChannels": [],
  "languageHint": "en",
  "countryHint": "US",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/youtube-channel-search-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/t4fK3cDWYnSqd3EEE/builds/OI5gokE4ipiWBkbj0/openapi.json
