Channels
Endpoints for searching, viewing, and analyzing YouTube channels.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/channels/search |
Search channels by keyword |
| GET | /api/v1/channels/:id |
Get channel details |
| GET | /api/v1/channels/:id/profile |
Get AI-generated channel profile |
| GET | /api/v1/channels/:id/videos |
List channel videos |
| GET | /api/v1/channels/:id/competitors |
List channel competitors |
| GET | /api/v1/channels/:id/keywords |
Get channel and audience keywords |
| GET | /api/v1/channels/:id/skool |
Get Skool community data |
Search Channels
GET /api/v1/channels/search
Search for YouTube channels by keyword, subscriber count, or tier.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
q |
string | Yes | Search query (matches title or handle) |
min_subs |
integer | No | Minimum subscriber count |
max_subs |
integer | No | Maximum subscriber count |
tier |
string | No | Quality tier filter (see values below) |
has_skool |
string | No | Set to true to filter channels with Skool communities |
sort_by |
string | No | Sort field: subscribers (default), views, outliers, skool_mrr |
page |
integer | No | Page number (default: 1) |
per_page |
integer | No | Results per page (default: 25, max: 100) |
Channel Tiers
| Value | Description |
|---|---|
dormant |
Fewer than 5 videos or no uploads in the past 12 months — inactive channel |
steady |
Active but modest performance — consistently publishing without breakout growth |
rising |
Gaining momentum with above-average engagement and growing view counts |
established |
250K+ subscribers and 10M+ total views — a proven player in their niche |
viral |
Producing breakout content with high outlier ratios and strong engagement |
mega_viral |
Exceptional viral performance — consistently generating massive view-to-subscriber ratios |
mega_channel |
10M+ subscribers — one of YouTube's largest channels |
Example Request
curl -X GET "https://tuberalytics.com/api/v1/channels/search?q=ai+automation&min_subs=10000" \
-H "Authorization: Bearer sk_live_your_api_key"
import requests
response = requests.get(
"https://tuberalytics.com/api/v1/channels/search",
params={"q": "ai automation", "min_subs": 10000},
headers={"Authorization": "Bearer sk_live_your_api_key"}
)
data = response.json()
require "net/http"
require "json"
uri = URI("https://tuberalytics.com/api/v1/channels/search?q=ai+automation&min_subs=10000")
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/channels/search?q=ai+automation&min_subs=10000",
{ headers: { "Authorization": "Bearer sk_live_your_api_key" } }
);
const data = await response.json();
$ch = curl_init("https://tuberalytics.com/api/v1/channels/search?q=ai+automation&min_subs=10000");
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": 170,
"youtube_channel_id": "UCbo-KbSjJDG6JWQ_MTZ_rNA",
"title": "Nick Saraev",
"handle": "@nicksaraev",
"thumbnail_url": "https://yt3.ggpht.com/example",
"country": "CA",
"subscriber_count": 336000,
"view_count": 12741587,
"video_count": 291,
"average_views": 42598,
"quality_classification": "rising",
"has_skool": true,
"skool_estimated_mrr": 3864,
"positive_outliers_count": 30
}
],
"meta": {
"current_page": 1,
"per_page": 25,
"total_pages": 3,
"total_count": 67
}
}
Get Channel
GET /api/v1/channels/:id
Retrieve full details for a single channel.
Example Request
curl -X GET "https://tuberalytics.com/api/v1/channels/170" \
-H "Authorization: Bearer sk_live_your_api_key"
import requests
response = requests.get(
"https://tuberalytics.com/api/v1/channels/170",
headers={"Authorization": "Bearer sk_live_your_api_key"}
)
data = response.json()
require "net/http"
require "json"
uri = URI("https://tuberalytics.com/api/v1/channels/170")
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/channels/170", {
headers: { "Authorization": "Bearer sk_live_your_api_key" }
});
const data = await response.json();
$ch = curl_init("https://tuberalytics.com/api/v1/channels/170");
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": 170,
"youtube_channel_id": "UCbo-KbSjJDG6JWQ_MTZ_rNA",
"title": "Nick Saraev",
"handle": "@nicksaraev",
"thumbnail_url": "https://yt3.ggpht.com/example",
"banner_url": "https://yt3.ggpht.com/banner_example",
"country": "CA",
"description": "AI automation educator teaching entrepreneurs to build and sell AI services...",
"subscriber_count": 336000,
"view_count": 12741587,
"video_count": 291,
"average_views": 42598,
"median_views": 20271,
"quality_classification": "rising",
"has_skool": true,
"skool_estimated_mrr": 3864,
"positive_outliers_count": 30,
"avg_views_to_subs_ratio": 0.131,
"is_faceless": false,
"is_verified": false,
"is_viral": false,
"last_published_at": "2026-03-28T14:00:00Z",
"channel_created_at": "2023-01-15T00:00:00Z",
"niches": ["AI Automation", "AI Business & Monetization"],
"created_at": "2026-01-15T10:00:00Z",
"updated_at": "2026-03-30T12:00:00Z"
}
}
Get Channel Profile
GET /api/v1/channels/:id/profile
Get the AI-generated profile for a channel, including content style analysis, title formulas, and thumbnail patterns.
Returns
404if the channel has not been analyzed yet.
Example Request
curl -X GET "https://tuberalytics.com/api/v1/channels/170/profile" \
-H "Authorization: Bearer sk_live_your_api_key"
import requests
response = requests.get(
"https://tuberalytics.com/api/v1/channels/170/profile",
headers={"Authorization": "Bearer sk_live_your_api_key"}
)
data = response.json()
require "net/http"
require "json"
uri = URI("https://tuberalytics.com/api/v1/channels/170/profile")
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/channels/170/profile", {
headers: { "Authorization": "Bearer sk_live_your_api_key" }
});
const data = await response.json();
$ch = curl_init("https://tuberalytics.com/api/v1/channels/170/profile");
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": {
"summary": "AI automation educator teaching entrepreneurs to build profitable businesses with no-code tools...",
"language": "English",
"content_style": "educational",
"title_writing_style": "dollar amounts, time frames, ALL CAPS course titles",
"content_angles": ["AI automation tutorials", "business case studies", "tool reviews", "income reports"],
"title_formulas": ["[TOOL] FULL COURSE [Duration] (Build & Sell [Type])", "$[Amount] of [Skill] Hacks in [Duration]"],
"thumbnail_styles": ["face with laptop screen", "income proof screenshots", "bold text with dollar amounts"]
}
}
List Channel Videos
GET /api/v1/channels/:id/videos
List videos for a specific channel, with optional outlier filtering.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
kind |
string | No | Filter by video kind |
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/channels/170/videos?outliers=true" \
-H "Authorization: Bearer sk_live_your_api_key"
import requests
response = requests.get(
"https://tuberalytics.com/api/v1/channels/170/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/channels/170/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/channels/170/videos?outliers=true",
{ headers: { "Authorization": "Bearer sk_live_your_api_key" } }
);
const data = await response.json();
$ch = curl_init("https://tuberalytics.com/api/v1/channels/170/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": 789,
"youtube_video_id": "dQw4w9WgXcQ",
"title": "N8N FULL COURSE 6 HOURS (Build & Sell AI Automations)",
"published_at": "2026-03-20T10:00:00Z",
"view_count": 917263,
"like_count": 28000,
"comment_count": 1800,
"is_positive_outlier": true,
"average_views_ratio": 21.5,
"views_per_day": 12500
}
],
"meta": {
"current_page": 1,
"per_page": 25,
"total_pages": 50,
"total_count": 291
}
}
List Channel Competitors
GET /api/v1/channels/:id/competitors
Get the discovered competitors for a channel, including keyword and niche overlap data.
Example Request
curl -X GET "https://tuberalytics.com/api/v1/channels/170/competitors" \
-H "Authorization: Bearer sk_live_your_api_key"
import requests
response = requests.get(
"https://tuberalytics.com/api/v1/channels/170/competitors",
headers={"Authorization": "Bearer sk_live_your_api_key"}
)
data = response.json()
require "net/http"
require "json"
uri = URI("https://tuberalytics.com/api/v1/channels/170/competitors")
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/channels/170/competitors", {
headers: { "Authorization": "Bearer sk_live_your_api_key" }
});
const data = await response.json();
$ch = curl_init("https://tuberalytics.com/api/v1/channels/170/competitors");
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": 201,
"title": "Nate Herk",
"handle": "@nateherk",
"subscriber_count": 592000,
"tracked": true,
"keyword_overlap_count": 18,
"niche_overlap_count": 2
},
{
"id": 305,
"title": "The AI Advantage",
"handle": "@aiadvantage",
"subscriber_count": 429000,
"tracked": false,
"keyword_overlap_count": 12,
"niche_overlap_count": 1
}
]
}
Get Channel Keywords
GET /api/v1/channels/:id/keywords
Get the channel keywords (what the channel creates content about) and audience keywords (what the channel's audience searches for).
Example Request
curl -X GET "https://tuberalytics.com/api/v1/channels/170/keywords" \
-H "Authorization: Bearer sk_live_your_api_key"
import requests
response = requests.get(
"https://tuberalytics.com/api/v1/channels/170/keywords",
headers={"Authorization": "Bearer sk_live_your_api_key"}
)
data = response.json()
require "net/http"
require "json"
uri = URI("https://tuberalytics.com/api/v1/channels/170/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/channels/170/keywords", {
headers: { "Authorization": "Bearer sk_live_your_api_key" }
});
const data = await response.json();
$ch = curl_init("https://tuberalytics.com/api/v1/channels/170/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": {
"channel_keywords": [
{ "name": "n8n ai automation", "position": 1 },
{ "name": "ai agent building", "position": 2 },
{ "name": "no-code automation", "position": 3 }
],
"audience_keywords": [
{ "name": "best ai automation tools 2026", "position": 1 },
{ "name": "how to sell ai services", "position": 2 }
]
}
}
Get Skool Communities
GET /api/v1/channels/:id/skool
Get Skool community data for a channel, including membership count and estimated revenue.
Returns an empty
dataarray if the channel has no Skool community.
Example Request
curl -X GET "https://tuberalytics.com/api/v1/channels/170/skool" \
-H "Authorization: Bearer sk_live_your_api_key"
import requests
response = requests.get(
"https://tuberalytics.com/api/v1/channels/170/skool",
headers={"Authorization": "Bearer sk_live_your_api_key"}
)
data = response.json()
require "net/http"
require "json"
uri = URI("https://tuberalytics.com/api/v1/channels/170/skool")
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/channels/170/skool", {
headers: { "Authorization": "Bearer sk_live_your_api_key" }
});
const data = await response.json();
$ch = curl_init("https://tuberalytics.com/api/v1/channels/170/skool");
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": "Maker School",
"url": "https://www.skool.com/makerschool",
"member_count": 2100,
"price_cents": 18400,
"is_paid": true,
"estimated_mrr_cents": 38640000
}
]
}