ChannelCrawler APIapp.channelcrawler.com ↗
Search 25M+ YouTube channels by keyword, category, country, language, and subscriber range. Returns channel stats, engagement rates, and email availability.
What is the ChannelCrawler API?
The ChannelCrawler API provides 3 endpoints to search and retrieve data from a database of over 25 million YouTube channels. The search_channels endpoint accepts filters for keyword, category, country, language, and subscriber range, returning a search ID, total match count, email availability count, and an array of channel objects with engagement and audience metadata. Individual channel details are retrievable by channel ID.
curl -X GET 'https://api.parse.bot/scraper/b1063f39-0d68-47c0-8358-8b02d6cb5c13/search_channels?sort=_score&country=United+States&keyword=gaming&category=Gaming&language=English&sort_direction=asc&max_subscribers=1000000&min_subscribers=10000' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace app-channelcrawler-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: ChannelCrawler SDK — search YouTube channels, inspect results, get details."""
from parse_apis.channelcrawler_youtube_channel_search_api import (
ChannelCrawler, Sort, SortDirection, ChannelNotFound
)
client = ChannelCrawler()
# Search for gaming channels sorted by subscriber count
for channel in client.searchresults.search(keyword="gaming", sort=Sort.SUBSCRIBERS, sort_direction=SortDirection.DESC, limit=5):
print(channel.title, channel.subscribers, channel.has_email)
# Drill into one channel's full details
top = client.searchresults.search(keyword="cooking", limit=1).first()
if top:
detail = top.details()
print(detail.name, detail.youtube_url, detail.subscribers_display)
# Fetch a known channel directly by ID
try:
mrbeast = client.channels.get(channel_id="UCX6OQ3DkcsbYNE6H8uQQuVA")
print(mrbeast.name, mrbeast.description[:80])
except ChannelNotFound as exc:
print(f"channel gone: {exc}")
print("exercised: searchresults.search / channel_summary.details / channels.get")
Search for YouTube channels by keyword, category, country, language, and subscriber range. Creates a new search and returns a search ID along with total matching channel and email counts. Returns up to 10 channel results per search. The channels array may be empty on the free tier; use get_channel_details with known channel IDs for detailed channel data.
| Param | Type | Description |
|---|---|---|
| sort | string | Sort field: '_score' for relevance, 'core.subscribers' for subscriber count |
| country | string | Country filter (e.g., 'United States') |
| keyword | string | Search keyword (e.g., 'gaming', 'cooking'). Either keyword or category is required. |
| category | string | Topic category filter (e.g., 'Animals', 'Gaming', 'Music'). Either keyword or category is required. |
| language | string | Language filter (e.g., 'English') |
| sort_direction | string | Sort direction: 'asc' or 'desc' |
| max_subscribers | integer | Maximum subscriber count filter |
| min_subscribers | integer | Minimum subscriber count filter |
{
"type": "object",
"fields": {
"channels": "array of channel objects with id, title, username, subscribers, topics, engagement_rate, avg_views_per_video, has_email, avatar_url, youtube_url, links",
"search_id": "string — UUID identifying this search, usable with get_search_results",
"total_with_email": "integer — number of matching channels that have an email on file",
"channels_returned": "integer — number of channels in the channels array",
"total_matching_channels": "integer — total number of channels matching the search criteria"
},
"sample": {
"data": {
"channels": [
{
"id": "UC5c9VlYTSvBSCaoMu_GI6gQ",
"links": [
"https://discord.gg/totalgaming",
"https://facebook.com/totalgaming093"
],
"title": "Total Gaming",
"topics": [
"Gameplay Walkthroughs & Tutorials"
],
"username": "@totalgaming093",
"has_email": true,
"avatar_url": "https://yt3.ggpht.com/ytc/AIdro_l7o9hDEiDVLvAW00YMnnYKzf4UpyJWhREfNWD3V33mBhM=s800-c-k-c0x00ffffff-no-rj",
"subscribers": 45700000,
"youtube_url": "https://youtube.com/channel/UC5c9VlYTSvBSCaoMu_GI6gQ",
"engagement_rate": 8.31,
"avg_views_per_video": 990803.5
}
],
"search_id": "2a2dcd37-b4ed-5092-b420-40400f26b994",
"total_with_email": 200703,
"channels_returned": 10,
"total_matching_channels": 1620150
},
"status": "success"
}
}About the ChannelCrawler API
Search and Filter YouTube Channels
The search_channels endpoint accepts up to seven filter parameters — keyword, category, country, language, min_subscribers, max_subscribers, and sort — and returns a UUID search_id along with total_matching_channels and total_with_email. The response includes a channels array of up to 10 objects per search, each containing id, title, username, subscribers, topics, engagement_rate, avg_views_per_video, has_email, and avatar_url. Either keyword or category must be supplied; all other filters are optional.
Re-query Results with a Search ID
The get_search_results endpoint accepts a search_id UUID from a prior search_channels call and re-returns the same counts and channel array with optional re-sorting via sort and sort_direction. This is useful when you need to retrieve results from a previously executed search without re-running the full filter query.
Individual Channel Lookup
The get_channel_details endpoint takes a channel_id (e.g., UCX6OQ3DkcsbYNE6H8uQQuVA) and returns the channel's name, description, youtube_url, and subscribers_display. Note that subscribers_display may return '0' for channels where YouTube does not expose the subscriber count publicly.
The ChannelCrawler API is a managed, monitored endpoint for app.channelcrawler.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when app.channelcrawler.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official app.channelcrawler.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Filter YouTube channels by
min_subscribersandmax_subscribersto identify mid-tier creators for influencer outreach - Use
total_with_emailfromsearch_channelsto estimate the size of a reachable creator pool in a given niche - Query channels by
categoryandcountryto build regional creator lists for localized campaigns - Retrieve
engagement_rateandavg_views_per_videoto compare creator performance before partnership decisions - Look up
get_channel_detailsby channel ID to pull full channel descriptions for content categorization - Use
has_emailfield to filter the channels array down to contactable creators only - Re-sort a previous search by subscriber count using
get_search_resultswithsort=core.subscribers
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does ChannelCrawler have an official developer API?+
What does the `search_channels` endpoint return beyond the channel list?+
search_channels returns total_matching_channels (the full count of channels matching your filters), total_with_email (how many of those have an email on file), search_id (a UUID for re-querying), and channels_returned (the count in the current response array). The channels array itself contains up to 10 objects, each including engagement_rate, avg_views_per_video, has_email, and topics.Does the API return video-level data such as individual video titles, view counts, or upload history?+
Why might `subscribers_display` show '0' in `get_channel_details`?+
subscribers_display returns '0' rather than an estimated or cached figure. The subscribers field in the search_channels channel objects may carry a different value sourced from ChannelCrawler's indexed data.Does the API support pagination to retrieve more than 10 channels per search?+
total_matching_channels field shows how many total results exist, but retrieving beyond the first 10 is not supported by the current endpoints. You can fork this API on Parse and revise it to add pagination support if the underlying data supports it.