# YouTube Niche Scout (`kuromaro/youtube-niche-scout`) Actor

Analyze YouTube search results to find profitable, low-competition niches for content creators. Get engagement rates, niche scores, and views-per-subscriber metrics.

- **URL**: https://apify.com/kuromaro/youtube-niche-scout.md
- **Developed by:** [Takuma](https://apify.com/kuromaro) (community)
- **Categories:** Social media, Videos
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Niche Scout

Analyze YouTube search results to discover profitable content niches.
For each keyword, the actor fetches the top videos, scores them by demand vs.
competition, and returns enriched data you can use to make data-driven decisions
about what content to create.

### Features

- **Niche opportunity score** — balances average view count against the number of
  competing videos. A high score means high demand with low supply.
- **Engagement rate** — `(likeCount + commentCount) / viewCount` per video.
- **Views per subscriber** — measures how well a video outperforms its channel audience.
- **YouTube Data API v3 support** — accurate view counts, subscriber counts, like/comment
  data for up to 200 results per run.
- **yt-dlp fallback** — works without an API key (up to 50 results, limited metadata).
- **Multi-language support** — bias results toward EN, JA, ES, FR, DE, PT, KO, or ZH.
- **Date filtering** — restrict results to videos published after a given date.
- **Sort options** — by relevance, view count, or upload date.

### Input

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `keyword` | string | Yes | — | Topic to analyze (e.g. `home workout beginners`) |
| `youtubeApiKey` | string | No | — | Google Cloud API key (YouTube Data API v3). Omit to use yt-dlp. |
| `maxResults` | integer | No | `50` | Videos to analyze (max 200 with API, 50 with yt-dlp) |
| `publishedAfter` | string | No | — | ISO date filter, e.g. `2026-01-01` |
| `sortBy` | enum | No | `relevance` | `relevance` / `viewCount` / `date` |
| `language` | enum | No | `en` | Relevance language code |
| `proxyConfiguration` | object | No | — | Apify Proxy settings |

#### Example input

```json
{
  "keyword": "sourdough bread for beginners",
  "youtubeApiKey": "YOUR_GOOGLE_API_KEY",
  "maxResults": 50,
  "publishedAfter": "2025-01-01",
  "sortBy": "viewCount",
  "language": "en"
}
````

### Output

Each item in the dataset represents one video:

```json
{
  "videoId": "dQw4w9WgXcQ",
  "title": "Sourdough Bread for Beginners (Full Tutorial)",
  "channelName": "BreadBakers",
  "channelId": "UCxxxxxx",
  "publishedAt": "2025-03-15T10:00:00Z",
  "duration": 1245,
  "viewCount": 850000,
  "likeCount": 42000,
  "commentCount": 3100,
  "channelSubscribers": 120000,
  "engagementRate": 0.053,
  "viewsPerSubscriber": 7.08,
  "nicheScore": 28333.3,
  "keyword": "sourdough bread for beginners",
  "searchRank": 1
}
```

#### Field descriptions

| Field | Description |
|---|---|
| `videoId` | YouTube video ID |
| `title` | Video title |
| `channelName` | Channel name |
| `channelId` | YouTube channel ID |
| `publishedAt` | ISO 8601 publish date |
| `duration` | Video length in seconds |
| `viewCount` | Total view count |
| `likeCount` | Total like count |
| `commentCount` | Total comment count |
| `channelSubscribers` | Channel subscriber count (0 when using yt-dlp fallback) |
| `engagementRate` | `(likeCount + commentCount) / viewCount` |
| `viewsPerSubscriber` | `viewCount / channelSubscribers` |
| `nicheScore` | `avgViews / videoCount` — higher = better niche opportunity |
| `keyword` | The keyword that produced this result |
| `searchRank` | Position in the search results (1-indexed) |

### How the niche score works

```
nicheScore = (average viewCount across all results) / (number of results)
```

A niche with 3 results averaging 500 000 views each scores **much** higher than one
with 50 results averaging 10 000 views — because it has high audience demand and low
creator competition.

Use `nicheScore` to compare keywords head-to-head.

### Getting a YouTube Data API key

1. Go to [Google Cloud Console](https://console.cloud.google.com/).
2. Create a project and enable **YouTube Data API v3**.
3. Generate an API key under **Credentials**.
4. Paste the key into the `youtubeApiKey` field.

The free quota is **10 000 units/day**. Each run uses roughly 3–5 units per video
(search + video details + channel stats).

### Use cases

- Identify underserved YouTube niches before creating a channel.
- Benchmark competitor engagement rates for any keyword.
- Find trending topics by filtering `publishedAfter` to recent months.
- Build keyword research pipelines by running the actor on many keywords in sequence.

### Pricing

This actor uses **pay-per-event** billing. You are charged **1 event per keyword analyzed**
(regardless of how many videos are returned).

# Actor input Schema

## `keyword` (type: `string`):

The topic or keyword to analyze on YouTube (e.g. 'home workout for beginners').

## `youtubeApiKey` (type: `string`):

Google Cloud API key with YouTube Data API v3 enabled. If omitted, yt-dlp fallback is used (fewer results, no subscriber data).

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

Maximum number of videos to analyze. API mode supports up to 200; yt-dlp fallback is capped at 50.

## `publishedAfter` (type: `string`):

Only return videos published after this date. Format: YYYY-MM-DD or RFC 3339 (e.g. 2026-01-01).

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

How to order search results.

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

Language code to bias search results toward.

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

Optional Apify Proxy configuration for requests.

## Actor input object example

```json
{
  "maxResults": 50,
  "publishedAfter": "2026-01-01",
  "sortBy": "relevance",
  "language": "en"
}
```

# 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 = {
    "publishedAfter": "2026-01-01"
};

// Run the Actor and wait for it to finish
const run = await client.actor("kuromaro/youtube-niche-scout").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 = { "publishedAfter": "2026-01-01" }

# Run the Actor and wait for it to finish
run = client.actor("kuromaro/youtube-niche-scout").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "publishedAfter": "2026-01-01"
}' |
apify call kuromaro/youtube-niche-scout --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=kuromaro/youtube-niche-scout",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Niche Scout",
        "description": "Analyze YouTube search results to find profitable, low-competition niches for content creators. Get engagement rates, niche scores, and views-per-subscriber metrics.",
        "version": "0.1",
        "x-build-id": "wpuCiAUlYni063k2C"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kuromaro~youtube-niche-scout/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kuromaro-youtube-niche-scout",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/kuromaro~youtube-niche-scout/runs": {
            "post": {
                "operationId": "runs-sync-kuromaro-youtube-niche-scout",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/kuromaro~youtube-niche-scout/run-sync": {
            "post": {
                "operationId": "run-sync-kuromaro-youtube-niche-scout",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "keyword"
                ],
                "properties": {
                    "keyword": {
                        "title": "Search Keyword",
                        "type": "string",
                        "description": "The topic or keyword to analyze on YouTube (e.g. 'home workout for beginners')."
                    },
                    "youtubeApiKey": {
                        "title": "YouTube Data API Key (optional)",
                        "type": "string",
                        "description": "Google Cloud API key with YouTube Data API v3 enabled. If omitted, yt-dlp fallback is used (fewer results, no subscriber data)."
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Maximum number of videos to analyze. API mode supports up to 200; yt-dlp fallback is capped at 50.",
                        "default": 50
                    },
                    "publishedAfter": {
                        "title": "Published After (optional)",
                        "type": "string",
                        "description": "Only return videos published after this date. Format: YYYY-MM-DD or RFC 3339 (e.g. 2026-01-01)."
                    },
                    "sortBy": {
                        "title": "Sort By",
                        "enum": [
                            "relevance",
                            "viewCount",
                            "date"
                        ],
                        "type": "string",
                        "description": "How to order search results.",
                        "default": "relevance"
                    },
                    "language": {
                        "title": "Relevance Language",
                        "enum": [
                            "en",
                            "ja",
                            "es",
                            "fr",
                            "de",
                            "pt",
                            "ko",
                            "zh"
                        ],
                        "type": "string",
                        "description": "Language code to bias search results toward.",
                        "default": "en"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Optional Apify Proxy configuration for requests."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
