# YouTube Channel Search Scraper (find channels by keyword) (`steadydata/youtube-channel-search`) Actor

Find YouTube channels by keyword: channel id, name, handle, subscriber count, video count, verified badge and thumbnail, ranked as YouTube ranks them. Up to 200 keywords per run. No email addresses or contact details. Only delivered channels are charged.

- **URL**: https://apify.com/steadydata/youtube-channel-search.md
- **Developed by:** [Steadydata Team](https://apify.com/steadydata) (community)
- **Categories:** Videos, AI, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 channel listeds

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?

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 channels by keyword)

Find YouTube channels by topic, **up to 200 keywords per run**: channel id, name, handle,
subscriber count, video count, verified badge and thumbnail, ranked the way YouTube ranks
them. **You only pay for channels that are actually delivered.**

### Why this scraper

- **Channels, not videos.** Ordinary YouTube search returns videos. This uses YouTube's
  own "channels only" filter, so a keyword like `yoga for beginners` returns the
  channels that publish on it, each with its subscriber count.
- **Built for keyword lists.** Paste 200 topics and get one flat table with the keyword
  and the rank on every row, ready to sort by subscribers or to compare niches.
- **Built on a lightweight route.** YouTube's internal API answers in about 2 KB per
  channel, which is where the low price comes from.
- **Only delivered channels are charged.** A keyword without channels comes back as a
  clear error record at no cost.
- **A hard cost ceiling you control.** `maxResultsPerQuery` is the cap: one delivered
  channel is one charged event.

### Who this is for

Niche and competitor research: who publishes on a topic, how big they are, whether they
are verified. Useful for sizing a niche before entering it, for finding channels to study,
and as the first step before pulling their videos or transcripts with the other actors
from the same publisher.

### Who this is not for

**Read this before you buy.** This actor does not return email addresses, business
contacts or any other way to reach the channel owner, and it never will. Channel
discovery is often sold with emails attached; that turns a channel into a person record.
If you are building an outreach list, this is the wrong tool and you should not buy it.

### Input example

```json
{
    "queries": ["tech reviews", "yoga for beginners", "woodworking"],
    "maxResultsPerQuery": 50,
    "language": "en",
    "country": "US"
}
```

### Output example

```json
{
    "query": "tech reviews",
    "rank": 1,
    "channelId": "UCBJycsmduvYEL83R_U4JriQ",
    "channelUrl": "https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ",
    "name": "Marques Brownlee",
    "handle": "@mkbhd",
    "subscriberCount": 21300000,
    "isVerified": true,
    "thumbnailUrl": "https://yt3.ggpht.com/...",
    "status": "ok"
}
```

A keyword that returns nothing produces an error record instead, and is **not** charged:

```json
{
    "input": "qzxwv nonsense 99999",
    "status": "error",
    "errorCode": "NO_RESULTS",
    "error": "No channels found for query 'qzxwv nonsense 99999'"
}
```

Error codes: `INVALID_QUERY`, `NO_RESULTS`, `BLOCKED`. `INPUT_TRUNCATED` appears once when your input is longer than this actor accepts.

### Related actors from steadydata

- [youtube-channel-details](https://apify.com/steadydata/youtube-channel-details): the full profile of the channels you found
- [youtube-channel-videos](https://apify.com/steadydata/youtube-channel-videos): their videos

### Pricing

Pay per event: one `channel-listed` event per delivered channel. No charge for keywords
that fail or return nothing, no separate platform-usage surcharge.

### FAQ

**Why is the subscriber count rounded?**
Because YouTube rounds it in search results: it says "21.3M subscribers", not the exact
figure. The number is converted faithfully from what YouTube shows.

**Why is the video count sometimes empty?**
YouTube does not show it for every channel in search results. The field is left empty
rather than filled with a guess.

**Do results differ per country?**
Yes. Set `country` to the market you care about; channel rankings differ per region.

**Is personal data collected?**
No. Public channel metadata only. No email addresses, no contact details, no owner names
beyond the channel's own display name.

**What happens when YouTube changes something?**
Internal routes shift from time to time. The actor is monitored daily and fixed fast, and
while it is broken you are not charged, because only delivered channels cost anything.

# Actor input Schema

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

Topics to find channels for, e.g. 'tech reviews' or 'yoga for beginners'. Up to 200 per run.

## `maxResultsPerQuery` (type: `integer`):

Stop after this many channels per keyword. This is your cost ceiling: one delivered channel is one charged event.

## `language` (type: `string`):

Interface language, e.g. en, nl, de.

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

ISO country code, e.g. US, NL, DE. Channel rankings differ per region.

## Actor input object example

```json
{
  "queries": [
    "tech reviews"
  ],
  "maxResultsPerQuery": 50,
  "language": "en",
  "country": "US"
}
```

# Actor output Schema

## `results` (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": [
        "tech reviews"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadydata/youtube-channel-search").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": ["tech reviews"] }

# Run the Actor and wait for it to finish
run = client.actor("steadydata/youtube-channel-search").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": [
    "tech reviews"
  ]
}' |
apify call steadydata/youtube-channel-search --silent --output-dataset

```

## MCP server setup

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

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/bVTtf1udfU7czAggq/builds/Wip18OpOaURDvKnF6/openapi.json
