Niches
Endpoints for exploring YouTube niches, including market dynamics, channels, keywords, and videos.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/niches/search |
Search niches by keyword |
| GET | /api/v1/niches/:id |
Get niche details |
| GET | /api/v1/niches/:id/channels |
List channels in a niche |
| GET | /api/v1/niches/:id/keywords |
Get niche keywords |
| GET | /api/v1/niches/:id/videos |
List videos in a niche |
Search Niches
GET /api/v1/niches/search
Search for niches by name, with filters for market type, channel count, and Skool presence.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
q |
string | Yes | Search query (matches niche name) |
market_type |
string | No | Filter by market type (see values below) |
min_channels |
integer | No | Minimum channel count |
has_skool |
string | No | Set to true to filter niches with Skool communities |
sort_by |
string | No | Sort field: channels (default), demand, supply, monetization, skool_mrr |
page |
integer | No | Page number (default: 1) |
per_page |
integer | No | Results per page (default: 25) |
Market Types
| Value | Description |
|---|---|
tiny |
Fewer than 3 channels — too early to classify |
hidden |
Very few creators but some audience demand — a hidden gem waiting to be tapped |
unestablished |
Low creator activity and low audience interest — not yet a proven niche |
rising |
Growing audience demand but creators are still small — the opportunity zone |
declining |
Established creators but audience interest is fading |
established |
Mature creators with proven, sustained audience demand |
Example Request
curl -X GET "https://tuberalytics.com/api/v1/niches/search?q=fitness&min_channels=10" \
-H "Authorization: Bearer sk_live_your_api_key"
import requests
response = requests.get(
"https://tuberalytics.com/api/v1/niches/search",
params={"q": "fitness", "min_channels": 10},
headers={"Authorization": "Bearer sk_live_your_api_key"}
)
data = response.json()
require "net/http"
require "json"
uri = URI("https://tuberalytics.com/api/v1/niches/search?q=fitness&min_channels=10")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer sk_live_your_api_key"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
const response = await fetch(
"https://tuberalytics.com/api/v1/niches/search?q=fitness&min_channels=10",
{ headers: { "Authorization": "Bearer sk_live_your_api_key" } }
);
const data = await response.json();
$ch = curl_init("https://tuberalytics.com/api/v1/niches/search?q=fitness&min_channels=10");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer sk_live_your_api_key"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$data = json_decode($response, true);
Example Response
{
"data": [
{
"id": 15,
"name": "home fitness",
"slug": "home-fitness",
"channels_count": 87,
"market_type": "established",
"supply_score": 7.2,
"demand_score": 8.4,
"monetization_score": 6.9,
"total_skool_mrr": 125000,
"avg_views_per_video": 45000
}
],
"meta": {
"current_page": 1,
"per_page": 25,
"total_pages": 2,
"total_count": 34
}
}
Get Niche
GET /api/v1/niches/:id
Get full details for a niche, including market dynamics scores and monetization data.
Example Request
curl -X GET "https://tuberalytics.com/api/v1/niches/15" \
-H "Authorization: Bearer sk_live_your_api_key"
import requests
response = requests.get(
"https://tuberalytics.com/api/v1/niches/15",
headers={"Authorization": "Bearer sk_live_your_api_key"}
)
data = response.json()
require "net/http"
require "json"
uri = URI("https://tuberalytics.com/api/v1/niches/15")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer sk_live_your_api_key"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
const response = await fetch("https://tuberalytics.com/api/v1/niches/15", {
headers: { "Authorization": "Bearer sk_live_your_api_key" }
});
const data = await response.json();
$ch = curl_init("https://tuberalytics.com/api/v1/niches/15");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer sk_live_your_api_key"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$data = json_decode($response, true);
Example Response
{
"data": {
"id": 15,
"name": "home fitness",
"slug": "home-fitness",
"channels_count": 87,
"market_type": "established",
"supply_score": 7.2,
"demand_score": 8.4,
"monetization_score": 6.9,
"total_skool_mrr": 125000,
"avg_views_per_video": 45000,
"description": "Content focused on home workout routines, equipment reviews, and fitness challenges...",
"youtube_revenue_score": 6.5,
"niche_rpm": 4.20,
"total_videos": 12500,
"total_subscribers": 35000000,
"median_channel_subscribers": 92000,
"skool_channels_count": 12,
"market_dynamics_computed_at": "2026-03-30T03:00:00Z",
"created_at": "2026-01-20T10:00:00Z",
"updated_at": "2026-03-30T03:00:00Z"
}
}
List Niche Channels
GET /api/v1/niches/:id/channels
List all channels in a niche, sorted by subscriber count.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
page |
integer | No | Page number (default: 1) |
per_page |
integer | No | Results per page (default: 25) |
Example Request
curl -X GET "https://tuberalytics.com/api/v1/niches/15/channels" \
-H "Authorization: Bearer sk_live_your_api_key"
import requests
response = requests.get(
"https://tuberalytics.com/api/v1/niches/15/channels",
headers={"Authorization": "Bearer sk_live_your_api_key"}
)
data = response.json()
require "net/http"
require "json"
uri = URI("https://tuberalytics.com/api/v1/niches/15/channels")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer sk_live_your_api_key"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
const response = await fetch("https://tuberalytics.com/api/v1/niches/15/channels", {
headers: { "Authorization": "Bearer sk_live_your_api_key" }
});
const data = await response.json();
$ch = curl_init("https://tuberalytics.com/api/v1/niches/15/channels");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer sk_live_your_api_key"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$data = json_decode($response, true);
Example Response
{
"data": [
{
"id": 120,
"youtube_channel_id": "UCexample123",
"title": "THENX",
"handle": "@THENX",
"subscriber_count": 8500000,
"average_views": 320000,
"quality_classification": "established",
"has_skool": true,
"skool_estimated_mrr": 45000
}
],
"meta": {
"current_page": 1,
"per_page": 25,
"total_pages": 4,
"total_count": 87
}
}
Get Niche Keywords
GET /api/v1/niches/:id/keywords
Get ranked keywords for a niche, including autocomplete suggestions.
Example Request
curl -X GET "https://tuberalytics.com/api/v1/niches/15/keywords" \
-H "Authorization: Bearer sk_live_your_api_key"
import requests
response = requests.get(
"https://tuberalytics.com/api/v1/niches/15/keywords",
headers={"Authorization": "Bearer sk_live_your_api_key"}
)
data = response.json()
require "net/http"
require "json"
uri = URI("https://tuberalytics.com/api/v1/niches/15/keywords")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer sk_live_your_api_key"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
const response = await fetch("https://tuberalytics.com/api/v1/niches/15/keywords", {
headers: { "Authorization": "Bearer sk_live_your_api_key" }
});
const data = await response.json();
$ch = curl_init("https://tuberalytics.com/api/v1/niches/15/keywords");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer sk_live_your_api_key"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$data = json_decode($response, true);
Example Response
{
"data": [
{
"name": "home workout no equipment",
"rank": 1,
"autocompletes": ["home workout no equipment for beginners", "home workout no equipment women"],
"suggestions": ["bodyweight workout", "at home HIIT"]
},
{
"name": "resistance band exercises",
"rank": 2,
"autocompletes": ["resistance band exercises for arms", "resistance band exercises full body"],
"suggestions": ["band workout routine", "resistance training at home"]
}
]
}
List Niche Videos
GET /api/v1/niches/:id/videos
List videos in a niche, with optional outlier filtering.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
outliers |
string | No | Set to true for positive outliers only |
page |
integer | No | Page number (default: 1) |
per_page |
integer | No | Results per page (default: 25) |
Example Request
curl -X GET "https://tuberalytics.com/api/v1/niches/15/videos?outliers=true" \
-H "Authorization: Bearer sk_live_your_api_key"
import requests
response = requests.get(
"https://tuberalytics.com/api/v1/niches/15/videos",
params={"outliers": "true"},
headers={"Authorization": "Bearer sk_live_your_api_key"}
)
data = response.json()
require "net/http"
require "json"
uri = URI("https://tuberalytics.com/api/v1/niches/15/videos?outliers=true")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer sk_live_your_api_key"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
const response = await fetch(
"https://tuberalytics.com/api/v1/niches/15/videos?outliers=true",
{ headers: { "Authorization": "Bearer sk_live_your_api_key" } }
);
const data = await response.json();
$ch = curl_init("https://tuberalytics.com/api/v1/niches/15/videos?outliers=true");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer sk_live_your_api_key"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$data = json_decode($response, true);
Example Response
{
"data": [
{
"id": 1501,
"youtube_video_id": "xyz789abc123",
"channel_id": 120,
"title": "10 Min Morning Workout (No Equipment Needed)",
"published_at": "2026-03-10T08:00:00Z",
"view_count": 8500000,
"like_count": 250000,
"is_positive_outlier": true,
"average_views_ratio": 26.5,
"views_per_day": 425000
}
],
"meta": {
"current_page": 1,
"per_page": 25,
"total_pages": 12,
"total_count": 285
}
}