YouTube Channel Finder — Keyword & Similar Channels
Pricing
from $1.00 / 1,000 channels
YouTube Channel Finder — Keyword & Similar Channels
Find YouTube channels by keyword, or channels similar to one you name. Every channel comes with subscribers, median and average views of recent videos, upload frequency, last upload, country and topic keywords. Filter by size, country and activity. No login, no API key.
Pricing
from $1.00 / 1,000 channels
Rating
0.0
(0)
Developer
Berkan Kaplan
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
2
Monthly active users
10 days ago
Last modified
Categories
Share
foXLabs YouTube series: Channel Email Scraper · Channel Videos Scraper · Search Scraper · Comments Scraper
🧭 Map a YouTube niche: get the channels YouTube returns for a keyword, or the channels closest to one you name — each with the audience and activity figures that tell you which ones matter: subscribers, median views of recent uploads, upload frequency, last upload, country and the topics the channel keeps returning to. Built for influencer marketing, lookalike prospecting, market research and creator CRMs. No YouTube API key, no login, no cookies.
🔍 What is YouTube Channel Finder — and when should you use it?
Give this Actor keywords — it asks YouTube's channel search and finds the creators behind the videos that rank — or seed channels, and it finds the channels YouTube shows next to their videos and the channels that cover the same topics, scored and ranked. Every channel comes as one row, read live, with figures you can sort and filter by.
Use it when you need: a wide list of the channels in a niche, filtered to the size and activity you work with; channels similar to the creators who already perform for you; who covers a topic, how big they are and how often they publish; a weekly feed of channels you have not seen yet.
Use something else when: you need the creators' e-mail addresses and links (YouTube Channel Email Scraper — this Actor's channelIds can be given to it as input), a channel's own videos (YouTube Channel Videos Scraper), or videos by keyword (YouTube Search Scraper); or audience demographics and estimated earnings — YouTube does not publish them.
🤖 Use with AI agents
Already on the Apify MCP server? Ask for this Actor by name: foxlabs/youtube-channel-finder. Checked on 2026-10-08: the server lists it as the tool foxlabs--youtube-channel-finder.
Your agent can pay for its own runs. The Actor is pay-per-event only, runs with limited permissions and does not use Standby — Apify's conditions for agentic payments — and Apify Store lists it as eligible for them (read from the Store on 2026-10-08). For an agent with a wallet and no human to sign in, Apify sells a prepaid, spend-capped API token over x402 at agi.apify.com; the terms of that path are Apify's own (see apify.com/agents.md). Billing is the same either way: per delivered channel row; status rows are free.
Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
I want YouTube channels from the Apify Actor `foxlabs/youtube-channel-finder`.Input: `searchKeywords` is a list of niches or topics; `similarTo` is a list of channels (URLs, @handles or IDs) to find similar channels to. `maxChannels` caps the rows, `similarPerSeed` the similar channels per seed. Filters: `minSubscribers`, `maxSubscribers`, `countries`, `uploadedWithinDays`, `minMedianViews`, and `minKeywordMatchPercent` (keeps channels whose recent titles are about the keyword).Start with: {"searchKeywords":["budget mechanical keyboards"],"maxChannels":50,"minSubscribers":1000}Ask me for the niche or the seed channels, run the Actor, then show the channels as a table sorted by median recent views.
The machine-readable API, MCP config and OpenAPI definition live at apify.com/foxlabs/youtube-channel-finder.md.
📋 Overview
Everything you need to turn a keyword or a channel into a list of the channels around it — in one Actor, with no login, cookies or API key.
Why pick this Actor:
- 🔎 Keyword in, channels out — YouTube's channel search and the creators behind the videos that rank for the keyword, followed to the end of the results and searched again while enough new channels keep coming: one keyword brought 602 to 815 different channels in five runs.
- 🧭 Similar channels, with the reason — name a channel; get the channels YouTube shows next to its videos and the channels that cover the same topics, scored and ranked, with the shared topics in the row.
- 📊 Figures you can sort by — subscribers, median and average views of the latest uploads, uploads per month, days since the last upload, like rate, share of Shorts, country, and the topics the channel's own titles keep returning to.
- 🎯 Filters before you pay — size, country, recent activity, median views, and how much of a channel's recent output is on topic. A channel that does not pass is not delivered and not charged.
- 🔁 Only what is new — a named list remembers what was delivered; a scheduled run brings only channels you have not received.
- 💰 Pay per channel — $1 per 1,000 channels found by keyword, $4 per 1,000 similar channels. Status rows and filtered-out channels are free.
- 🤖 Agent-ready — on the Apify MCP server and open to agentic payments (x402).
✨ Features
- 🔑 Keywords —
searchKeywords, withdiscoverFromto choose YouTube's channel search, the creators behind the top videos, or both. - 💡 Wider sweeps —
expandKeywordsalso searches the phrases YouTube's search box suggests (its list holds up to 14, the keyword itself among them in the lists we recorded). - 🧬 Similar channels —
similarTowithsimilarPerSeedandminSimilarityPercent; each row carriessimilarityScore,matchScoreandsharedKeywords. - 🧹 Filters —
minSubscribers,maxSubscribers,countries,uploadedWithinDays,minMedianViews,minKeywordMatchPercent. - ⚖️ Fair shares —
maxChannelsPerKeywordcovers several keywords evenly. - 🔁 Only new —
onlyNewChannelswith alistName. - 🧾 A last word in every run — the status message says how many channels each filter removed.
🎬 Quick Start
curl -X POST "https://api.apify.com/v2/acts/foxlabs~youtube-channel-finder/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"searchKeywords":["budget mechanical keyboards"],"maxChannels":50,"minSubscribers":1000}'
The answer is the dataset itself: 50 channels with their figures, usually after four to seven seconds of run time.
🚀 Getting Started (3 steps)
- Name the niche or the seeds — type a keyword into Search keywords, or a channel into Find channels similar to.
- Set the filters and the limit — subscriber range, countries, recent activity;
maxChannels(default 100) caps the rows. - Run and export — download the dataset as JSON, CSV, Excel, HTML or XML. To keep a niche list current, tick Only channels not delivered before, give the list a name and put the run on a schedule.
📥 Input
{"searchKeywords":["budget mechanical keyboards"],"maxChannels":50,"minSubscribers":1000}
| Field | Type | Description |
|---|---|---|
searchKeywords | array | Niches or topics, one per line. |
expandKeywords | boolean | Also search the phrases YouTube's search box suggests for each keyword. Default off. |
maxKeywordSuggestions | integer | How many suggestions per keyword at most (default 10, up to 14 — as many as YouTube's list holds; the keyword itself, when it is one of them, is not searched twice). |
similarTo | array | Channels to find similar channels to: channel URLs, @handles or channel IDs (up to 50). |
similarPerSeed | integer | Similar channels per seed (default 25, up to 200). |
minSimilarityPercent | integer | Similar channels below this topic similarity are left out (default 10). |
maxChannels | integer | How many channel rows to deliver in total (default 100). |
discoverFrom | string | Where a keyword looks: channels (YouTube's channel search), videos (the creators behind the top videos) or channels-and-videos (default). |
maxChannelsPerKeyword | integer | Upper limit per keyword, so several keywords are covered evenly. |
minSubscribers / maxSubscribers | integer | Subscriber range (default from 0). |
countries | array | Country names or two-letter codes: United States, US, DE. |
uploadedWithinDays | integer | Only channels whose latest upload is this recent. |
minMedianViews | integer | Only channels whose recent uploads reach this median. |
minKeywordMatchPercent | integer | Keyword rows only: deliver a channel only if at least this share of its recent video titles mention the keyword's topic (default 0). |
onlyNewChannels | boolean | Remember delivered channels under listName and skip them in later runs. Default off. |
listName | string | Name of that memory: letters, digits and hyphens, up to 40 characters (default default). |
proxyConfiguration | object | Nothing to change for normal use: requests go out directly, and a kind of request YouTube refuses is moved to Apify Proxy by the Actor itself. |
Give keywords, seed channels, or both. Seed channels are handled first.
More recipes
- A niche, sized and filtered — active channels with an audience:
{"searchKeywords":["budget mechanical keyboards"],"maxChannels":300,"minSubscribers":1000,"uploadedWithinDays":90,"minKeywordMatchPercent":20} - Channels similar to ones you already work with:
{"similarTo":["@51Drones","https://www.youtube.com/@jameshoffmann"],"similarPerSeed":20,"minSubscribers":1000} - A wide sweep, new channels only on every weekly run:
{"searchKeywords":["skincare"],"expandKeywords":true,"maxChannels":1000,"minSubscribers":10000,"onlyNewChannels":true,"listName":"skincare-q4"}
📤 Output
One row per channel (type: "channel"). A line that brought nothing — a keyword without results, a seed that is not a channel — comes back as a free row with type: "status" and the reason in error, so nothing disappears silently. A run whose filters removed every channel writes one such row with the run's last word, so a dataset never comes back empty without a reason (an "only new" run that finds nothing new is the exception). Every row has the same 46 columns.
| Field | Description |
|---|---|
type | channel, or status |
channelId / channelUrl / handle / title | The channel. channelId is the stable key; a channel appears once per run |
description | The channel's full description |
country / countryCode | Country as the channel states it, and its ISO code; null when the channel states none |
joinedDate | When the channel was created |
isVerified | The channel carries YouTube's verified or official-artist badge; null when the place the channel was found does not show badges |
subscribers / subscribersText / sizeTier | Subscriber count as YouTube publishes it (rounded: "14.4K" → 14400); null when YouTube shows no count, never 0. The tier: under 1K, 1K-10K, 10K-100K, 100K-1M or 1M+ |
totalViews / videoCount | Lifetime views and number of videos |
recentVideosAnalyzed / recentVideosSource | How many recent uploads the figures below are based on (the latest 15 at most) · where they were read: feed (the channel's public feed: unrounded counts, exact times) or uploads list (the channel's uploads list, read when the feed does not answer: rounded views, ages as YouTube words them, no likes — see When YouTube's feed fails). A channel for which neither answered is not delivered (see the FAQ). A channel without public videos shows 0 and no source |
medianViewsRecent / avgViewsRecent / avgLikesRecent | Over those uploads, from unrounded counts. From the uploads list the views are YouTube's rounded figures ("9.8M views") and avgLikesRecent is null |
viewsPerSubscriber / likeRate / shortsShareRecent | Median recent views ÷ subscribers · likes ÷ views (0.02 = 2%) · share of those uploads that are Shorts (0–1). likeRate and shortsShareRecent are null from the uploads list |
lastUploadAt / daysSinceLastUpload | The latest upload. From the uploads list lastUploadAt is null, and daysSinceLastUpload is within a day for an upload of the last two weeks, whose age YouTube words in days, and an estimate beyond — the middle of the days the wording covers ("3 weeks ago" → 24); null unless each of those uploads shows an age (a channel that uploads Shorts only shows none) |
uploadsLast30Days / uploadsPerMonth / recentVideosSpanDays | Activity. uploadsLast30Days counts within the latest 15 uploads, so it tops out at 15; uploadsPerMonth is the rate over the days those uploads span. From the uploads list uploadsLast30Days counts the uploads YouTube words as less than a month old, and the other two rest on estimated ages — they are null when the newest and the oldest of the uploads are worded alike in weeks, months or years ("2 years ago"), which does not tell them apart, and all three are null unless each upload shows an age |
latestVideo / topRecentVideo | videoId, title, url, publishedAt, views, likes, isShort. From the uploads list views is rounded and publishedAt, likes and isShort are null |
topKeywords | Up to 8 words and two-word phrases that recur in the channel's recent video titles: what the channel is about, in its own words. The titles are those of the feed's 15 latest uploads; when the feed did not answer, those of the 15 latest uploads in the channel's uploads list — the same holds for keywordMatch and the similarity scores |
keywordMatch | Keyword rows: the share of recent video titles that mention the keyword's topic (0–1) |
searchKeyword / expandedFrom / searchRank | Keyword rows: the search that found the channel, the keyword you gave when it was one of YouTube's suggestions, and the position at which YouTube listed the channel (or its video) |
discoveredBy | channel-search, video-search, related-videos or search (the last two on similar-channel rows) |
seedChannelId / seedTitle / input | Similar-channel rows: the channel the row is similar to, and the line you gave for it |
similarityScore / matchScore / sharedKeywords | Similar-channel rows: how alike the two channels' topics are (0–1); what the list is sorted by; the topics the two channels share, strongest first |
relatedInSeedVideos / foundBySearches | Similar-channel rows: next to how many of the seed's latest videos YouTube showed the channel (0–8), and how many of the searches for the seed's topics found it |
scrapedAt / error | When the row was made · null on channel rows, the reason on status rows |
Sample — a keyword row as the Actor returned it on 2026-10-07 for "budget mechanical keyboards", nothing shortened, plus the column added on 2026-10-08, recentVideosSource, filled in with what it says for a row read from the feed (46 columns in all). The channel has 233,000 subscribers and titles that are 93% on topic; daysSinceLastUpload shows it has not published since 2022.
{"type": "channel","channelId": "UCllGwtW6scxAjM28fIgEozg","channelUrl": "https://www.youtube.com/channel/UCllGwtW6scxAjM28fIgEozg","handle": "@TaeKeyboards","title": "TaeKeyboards","description": "I check out everything to do with mechanical keyboards! Inlcuding unboxings & reviews, tutorials, builds, event coverage, and much more!\n\nOfficial Website : www.taekeyboards.com","country": "Australia","countryCode": "AU","joinedDate": "2015-06-19","isVerified": false,"subscribers": 233000,"subscribersText": "233K subscribers","totalViews": 59246495,"videoCount": 254,"sizeTier": "100K-1M","recentVideosAnalyzed": 15,"recentVideosSource": "feed","lastUploadAt": "2022-09-02T21:00:14+00:00","daysSinceLastUpload": 1495,"uploadsLast30Days": 0,"uploadsPerMonth": 0.9,"recentVideosSpanDays": 460,"avgViewsRecent": 95405,"medianViewsRecent": 59903,"avgLikesRecent": 2362,"likeRate": 0.0248,"viewsPerSubscriber": 0.257,"shortsShareRecent": 0,"latestVideo": { "videoId": "MMfqT3CJfZ4", "title": "Affordable Alice-Style Mechanical Keyboard - Praxis IM", "url": "https://www.youtube.com/watch?v=MMfqT3CJfZ4", "publishedAt": "2022-09-02T21:00:14+00:00", "views": 59903, "likes": 1527, "isShort": false },"topRecentVideo": { "videoId": "2RQpQNobUTU", "title": "Full Metal Keycaps!", "url": "https://www.youtube.com/watch?v=2RQpQNobUTU", "publishedAt": "2021-07-01T20:35:35+00:00", "views": 324751, "likes": 8368, "isShort": false },"topKeywords": ["mechanical", "mechanical keyboard", "keyboard", "custom mechanical", "custom", "keyboard build", "keyboard kpop", "kpop mech"],"keywordMatch": 0.93,"seedChannelId": null,"seedTitle": null,"similarityScore": null,"sharedKeywords": [],"relatedInSeedVideos": null,"foundBySearches": null,"matchScore": null,"discoveredBy": "video-search","searchKeyword": "budget mechanical keyboards","expandedFrom": null,"searchRank": 273,"input": null,"scrapedAt": "2026-10-07T15:52:45.577Z","error": null}
On a similar-channel row the keyword columns are null and these are filled instead (from a row for the seed @jameshoffmann, same day):
{"title": "Lance Hedrick","subscribers": 454000,"seedChannelId": "UCMb0O2CdPBNi-QqPk5T3gsQ","seedTitle": "James Hoffmann","similarityScore": 0.307,"sharedKeywords": ["coffee", "espresso", "good", "aeropress", "fellow", "incredible", "brews", "pot"],"relatedInSeedVideos": 7,"foundBySearches": 1,"matchScore": 0.627,"discoveredBy": "related-videos","input": "@jameshoffmann"}
🧠 How it works
How a keyword is searched
For each keyword the Actor asks YouTube's channel search (the channels YouTube ranks for the keyword, mostly by name and description) and its video search (the channels behind the videos that rank), page by page, until it has maxChannels rows or the results end (a pass is 60 pages at most). One more stop protects a run whose filters let almost nothing through: after reading 50 channels for every row you asked for (300 at least) the run ends, and its status message says "Stopped after reading N channels: the filters let too few through" — or, when channels were being left for a later run because YouTube did not give their recent videos, "… too few of them could be delivered".
YouTube does not return the same list twice. When a search has been followed to its end, the Actor follows it again and keeps the channels the first pass did not bring; it does so while a pass still adds enough (at least 10 channels, and at least 5% of what that search had brought before), five passes at most.
keywordMatch says how much of a channel's recent output is about the keyword: the share of its recent video titles that contain at least one topic word of the keyword. General words ("best", "review", "how") and qualifiers ("budget", "easy", "beginner") are not topic words, so "budget mechanical keyboards" is matched on mechanical and keyboards. A regular plural counts as its singular ("keyboards" is "keyboard", "batteries" is "battery"), and so do a few dozen listed irregular ones; other irregular plurals do not ("tornadoes" is not "tornado"). The two spellings of a compound count as one ("skin care" in a title is "skincare"). It is a title match and nothing more: a channel that names products instead of the topic scores low — topKeywords shows what its titles do say.
With expandKeywords the Actor first asks YouTube's search box for its suggestions ("skincare" → "skincare routines", "skincare for men", …) and searches those too. Suggestions can drift away from the niche; each row names the search that found it.
How similar channels are found
For each seed channel:
- What the seed is about. The words and two-word phrases that recur in the titles of its latest videos (about 30 from its Videos tab and the 15 in its feed — or, when the feed does not come and the Videos tab holds nothing, the 15 latest uploads in its uploads list), plus its description at a third of the weight.
- Candidates. The channels YouTube lists in the "related videos" column next to the seed's eight latest long videos, and the channels found by five searches: the seed's strongest word on its own, then its next strongest terms tied to that word (for a drone channel: "drone", "drone dji", "drone ban", …).
- Scoring. Every candidate is read like any other channel.
similarityScoreis the cosine similarity between the two channels' term weights — 0 when they share no term, 1 for identical profiles — andsharedKeywordslists what they share.matchScoreadds 0.08 for each seed video (up to four) next to which YouTube showed the candidate, but only when the candidate'ssimilarityScoreis 0.05 or more: talk shows and big general channels turn up next to everything. - Delivery. Candidates that pass
minSimilarityPercentand your filters are delivered best first,similarPerSeedat most.
The candidates are read before the first row goes out — the ranking needs them: all of them up to 400 a seed (the 400 most promising beyond that; no seed of ours had that many), unless YouTube stops answering, which ends the reading after 12 failures in a row. A seed with 200 candidates costs about 400 small requests whatever similarPerSeed is — about twice that while YouTube's feed is failing, with a large answer for each candidate's uploads list (a seed with about 200 candidates: about 800 requests and 77 seconds in a local test run through a proxy on 2026-10-08); you are charged for delivered rows only.
A channel is delivered once per run: under the first seed or keyword that has room for it. Seeds are not listed as similar to one another.
🧪 Data quality — measured
Measured on the Apify platform on 2026-10-07.
| One keyword, 1,000+ subscribers (300 channels) | One keyword widened to 11 searches, 10,000+ subscribers (1,000 channels) | Three seeds (60 similar channels) | |
|---|---|---|---|
| Subscriber count | 100% | 100% | 100% |
Recent-video figures (medianViewsRecent, likeRate) | 100% | 100% | 100% |
uploadsPerMonth | 299 of 300 | 98% | 100% |
| Country | 90% | 80% | 88% |
topKeywords | 299 of 300 | 998 of 1,000 | 100% |
isVerified known | 99% | 99% | 72% |
| Unique channels | 300 of 300 | 1,000 of 1,000 | 60 of 60 |
- Similar channels, judged by hand. For the seeds
@51Drones,@jameshoffmannand@LabMuffinBeautySciencewe went through the 20 delivered channels of each — their names and the topics their titles keep returning to: all 60 were in the seed's niche or right next to it (three of the skincare seed's twenty are mainly hair-care channels). Every row had a similarity of 0.17 or more and at least one shared topic; 35 of the 60 had been shown by YouTube next to one of the seed's latest videos. - How much of a keyword's list is on topic. Of the 300 channels delivered for "budget mechanical keyboards", 113 (38%) had no recent title that mentions "mechanical" or "keyboard": 107 of the 219 channels that came from video search — creators with a video that ranks for the keyword — against 6 of the 81 that came from channel search.
minKeywordMatchPercentleaves them out before they are charged. - Suggestions drift. In the widened "skincare" run, the search "skincare videos" brought 78 channels of which 59% had no recent title on that search's topic, and "skincare shorts" 90 with 53%; for "skincare" itself it was 26%. Every row names its search, so a drifting one can be dropped.
- A second look at a search pays. For "budget mechanical keyboards", followed to the end, the channel search brought 381 channels on its first pass and 105 and 14 on the next two; the video search 170, then 33, 67, 30 and none — 776 different channels in all.
isVerifiedon similar-channel rows is known only when one of the seed's topic searches also found the channel; the related-videos list carries no badge.- Views and likes are not rounded in a row read from the feed (
recentVideosSource: "feed"). The feed is answered from copies of different age, so its counts can run a little behind: in 1,941 pairs of readings of the same video minutes apart (the runs of our Channel Email Scraper on 2026-10-07, which reads the same feeds) the later reading was lower in 75, by more than 1% in 6 — all six on videos under three days old. - When YouTube's feed fails. The figures above are from a day on which the feeds answered. On 2026-10-08 YouTube's feed service answered "not found" or "server error" for channels that have a feed: by our run records from 01:25 UTC at the latest and until some time between 06:47 UTC, when our last run with failing feeds ended, and 09:48, when all 40 feeds we asked for answered again. We asked the feeds of 40 channels that had answered the day before, up to six times each: at 02:01 UTC 8 answered at the first request and 25 within six; at 02:25, 14 and 39; at 02:58, none and 2; at 04:56, none at all. At 03:02, 20 of those channels asked from eight addresses gave 13 feeds in 312 answers — 10 of the 20 from at least one address, 10 from none — and single requests from outside Apify, made through a web tool at about 04:58, 05:54 and 06:55, got "not found" as well. Others describe the same fault of this endpoint as recurring, in windows of hours, since December 2025 (threads at n8n and Google's developer forum, an issue at Miniflux, a pull request at RSS-Bridge, as we read them on 2026-10-08). None of the 1,360 rows of our three measured runs of 2026-10-07 had come without its recent-video figures. The Actor therefore asks a feed again (see the FAQ), and for a channel whose feed does not come it reads the channel's uploads list instead.
- What the uploads list gives instead. At 05:19 UTC that day, with the feeds still failing, the uploads list of each of those 40 channels answered (read locally, through a proxy — not in a platform run). It holds a channel's latest uploads of every kind, 100 at most: on three channels we checked, their newest videos and Shorts — and one channel's past streams — stood in it. For 35 of the 40 its newest uploads were exactly those of the feed recorded the day before, so topic and similarity are read from the same titles. Against the feeds recorded the day before: median views within ±10% for 38 of the 40 channels (the list shows rounded figures: "9.8M views"). For the 35 channels whose 15 newest uploads were the same in both — 33 of them with ages in the list: the number of uploads in the last 30 days was the same for all 33; days since the last upload the same for all 10 that had uploaded within two weeks, and within ±15 days for 24 of the 33 (the estimate is rough for a channel that has been silent for long: the largest difference was 163 days); uploads per month within ±25% for 24 of the 31 for which both sources give one. Two of the 40 upload Shorts only: their list shows views but no ages, so their activity columns stay empty. In a second comparison, made at one moment (10:05 UTC, 120 channels, the feeds answering again and the list read in a local test run of our Channel Email Scraper, which reads a channel's recent videos with the same code), median views were within ±10% for 118 of 119 channels. The list carries no likes: the like columns are
null. On the platform, during the failure (build 0.1.20): the prefilled input brought 49 of its 50 rows from the list, all 49 with topic and view figures, 48 withdaysSinceLastUploadanduploadsLast30Daysand 43 withuploadsPerMonth; a seed run read the list for 191 candidates and delivered its 5 channels in 65 seconds. A channel for which neither the feed nor the list answers is not delivered: it would hold neither the figures nor the topic.
⏱️ Performance — measured
A channel costs two small requests (its About panel and its RSS feed; a feed that does not come is asked up to five more times, and then the channel's uploads list once); a search page is one request. On the platform with the default 1,024 MB, 2026-10-07:
- 50 channels for one keyword with a subscriber filter (the prefilled input): 4 to 7 seconds of run time in nine runs.
- 300 channels with 1,000+ subscribers for one keyword (737 channels seen, 350 read): 43 seconds.
- One keyword followed to the end with filters on (776 channels seen, 372 read, 50 delivered): 78 seconds.
- 1,000 channels with 10,000+ subscribers across 11 searches (2,618 seen, 1,191 read): 66 seconds — 2,624 requests, none refused or retried.
- Similar channels for three seeds, 20 each (639 candidates read): 50 seconds — 1,345 requests, none refused or retried.
Run times vary from run to run. Over that day, across builds, the same inputs took 37 to 65 seconds for the 300 channels (five runs), 62 to 69 for the 1,000 (five runs; a sixth took 141) and 40 to 50 for the three seeds (five runs).
💼 Use cases
1. Influencer marketing — a wide list of the channels in a niche.
Input: your niche keyword with a subscriber range and uploadedWithinDays: 90. Output: the active channels of the niche with their median views — 215 to 240 for one keyword in four runs. Use: shortlist by medianViewsRecent instead of subscriber counts.
2. Lookalike prospecting — more creators like the ones who already perform.
Input: similarTo with your best creators. Output: the closest channels, each with matchScore and sharedKeywords. Use: an outreach list with the reason for every match.
3. Market and competitor research — who covers a topic.
Input: topic keywords with expandKeywords. Output: channels with size, country, upload frequency and topKeywords. Use: a map of the niche: who is big, who is active, where they are based.
4. Creator marketplaces and CRMs — keep a niche list current.
Input: the same keywords weekly with onlyNewChannels and a listName. Output: only channels you have not received. Use: feed new creators into your database.
5. Lead pipelines — from niche to contact.
Input: a niche keyword with minKeywordMatchPercent: 20. Output: on-topic channelIds. Use: pass them to YouTube Channel Email Scraper for public e-mail addresses and links.
🔗 Integration
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('foxlabs/youtube-channel-finder').call({"similarTo":["@51Drones"],"similarPerSeed":20,"minSubscribers":1000});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const row of items.filter((r) => r.type === 'channel')) console.log(row.title, row.subscribers, row.matchScore, row.sharedKeywords.join(', '));
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('foxlabs/youtube-channel-finder').call(run_input={"searchKeywords": ["budget mechanical keyboards"], "maxChannels": 50, "minSubscribers": 1000})for row in client.dataset(run.default_dataset_id).iterate_items():if row['type'] == 'channel':print(row['title'], row['subscribers'], row['medianViewsRecent'], row['keywordMatch'])
Written for apify-client 3 for Python, where call() returns a run object; with version 2 it returns a dict — write run['defaultDatasetId'] there.
Automation (n8n / Zapier / Make): schedule or webhook → run the Actor with your searchKeywords and onlyNewChannels → handle the JSON dataset → push new channels to a sheet, a CRM or a dashboard.
📊 Pricing
Pay-per-event. Every delivered row carries exactly one of two events:
| Event | When | Price |
|---|---|---|
channel | a row found by keyword | $0.001 a row ($1 per 1,000) |
similar-channel | a row of a "similar to" search (it has a seed and a match score) | $0.004 a row ($4 per 1,000) |
Plus Apify's run-start event ($0.00005 a run, also for a run that delivers nothing; Apify counts this event per GB of run memory, and this Actor runs with 1 GB at most). Current pricing.
Not charged: status rows, channels that did not pass your filters or the similarity threshold, candidates that were read to rank a seed's list but not delivered, channels left for a later run, and channels that could not be read.
Spending limit. Set a maximum cost per run in the run options. Before every row the Actor checks that it still fits; when the next row would not, it stops delivering, keeps what it has delivered, and says so in its status message.
❓ FAQ
How many channels does one keyword bring? It depends on the keyword, and on YouTube: the same search returns a different part of its results every time, so the Actor follows each search to its end up to five times. "budget mechanical keyboards", followed to the end, brought 664, 709, 776 and 815 different channels in four runs on 2026-10-07, and 602 in one on 2026-10-08. Use several keywords, or expandKeywords, for a larger list: "skincare" widened to 11 searches delivered 1,000 channels with 10,000 or more subscribers; a second run of the same list delivered another 1,000 and a third 438, and no channel came twice.
Why is a channel in the list that has little to do with my keyword? Channel search brings the channels YouTube ranks for the keyword — mostly, not only, by name and description; video search brings every creator who made one video that ranks. keywordMatch and topKeywords tell them apart. Set minKeywordMatchPercent (20 is a good start) and channels whose recent titles do not return to the topic are neither delivered nor charged.
Why does a seed return fewer rows than similarPerSeed? Fewer candidates passed, or the run reached maxChannels first. The status message says how many channels each filter removed in the whole run; how many candidates each seed had, and how many of them passed, is in the run's SOURCE_REPORT record (key-value store, under report.groups). Lower minSimilarityPercent or loosen the subscriber filter for a wider list.
How far can I trust a similarityScore? We judged 258 scored channels by hand, from their names and recurring title terms, for three seeds (a drone, a coffee and a skincare channel). At 0.20 and above, 127 of 132 were in the seed's niche or right next to it; between 0.10 and 0.20, 49 of 62; between 0.05 and 0.10, 23 of 64. That is why 0.10 is the default threshold. The score compares words, so it can be fooled by them — a "coffee shop jazz" music channel shares "coffee" with a coffee channel. topKeywords shows what a channel's titles are really about.
Is the seed's language a problem? We measured English seeds only. The score compares words separated by spaces and knows English filler words. Across languages channels share few words, so an English seed mostly finds English channels. In languages written without spaces (Japanese, Chinese, Thai) titles do not split into words and the score stays near 0.
Why does a row say recentVideosSource: "uploads list"? The recent-video figures, and the titles a channel's topic is read from, come from the channel's public feed, and YouTube's feed service does not always answer. On 2026-10-07 it did: none of the 1,360 rows of the three runs measured that day came without them. In the night of 2026-10-08 it did not: the service answered "not found" or "server error" for channels that do have a feed — by 01:25 UTC, at 04:56 for every one of 40 channels we asked, and until some time between 06:47 and 09:48. How often that happens we cannot say from two days; others describe it as recurring (see Data quality). So the Actor asks a feed that does not come up to five more times (once more while the last channels of a run brought next to no feeds), and when it still does not come it reads the channel's uploads list: the same latest uploads, with rounded views and their ages as YouTube words them. Such a row has its topic (topKeywords, keywordMatch, the similarity to a seed) and its view and activity figures (see the output table for how exact each one is); its like columns are null. It is charged like any other row, and the run's status message counts those rows. For the feed's unrounded figures you run the search again later: that is a new run, charged like any other, YouTube may list other channels then, and a list (onlyNewChannels) that has delivered a channel will not deliver it a second time.
Why are the recent-video figures empty for a channel? In a delivered row only when the channel has no public videos: it shows recentVideosAnalyzed: 0 and no source. A channel that has videos is delivered with figures from its feed or from its uploads list. When neither gives them — on 2026-10-08 the list answered every time it was asked in five platform runs of build 0.1.20, 879 times in all — the row would hold neither the figures nor the topic a channel is paid for, so the channel is not delivered: it is left for a later run, not charged, and a list (onlyNewChannels) does not remember it, so the list's next run can deliver it whole. (An uploads list that holds nothing but a stream on air or a premiere to come gives no upload to read either; we have seen no such list.) The status message says how many channels were left; it does not name them. To get just those later, run the same input with onlyNewChannels and the same listName: without a list a later run delivers — and charges — the other channels again.
What do my filters do with a channel whose feed did not answer? minSubscribers, maxSubscribers and countries work as always. minKeywordMatchPercent and minSimilarityPercent judge by the titles of the uploads list, uploadedWithinDays and minMedianViews by its figures. What that list does not carry — the age of the last upload for a channel that uploads Shorts only, or everything when the list did not answer either — cannot be judged: the channel is not delivered and not charged, and the status message counts it among the channels "left for a later run" — not under "no recent upload". If nothing could be delivered and, of the channels that passed your subscriber and country filters, more were left for that reason than were turned down, the run ends as failed and says so: run it again later. (A run that skipped channels as already delivered to its list does not end as failed for this.) A seed is read the same way: from its Videos tab and its feed, and from its uploads list when the feed does not come and the Videos tab holds nothing; when none of them gives a title the seed's line gets a status row that says its videos could not be read, and can be run again later.
Can I run it on a schedule without getting the same channels again? Yes. Turn on onlyNewChannels and give the list a listName. Delivered channels are remembered in a key-value store named youtube-channels-<listName> in your account. For a seed, the next run then brings the next best channels. A run that is killed before it could save its list — a timeout, for instance — is made up for: the list's next run first reads back what that run delivered.
Does it need a proxy or an API key? Neither. Requests go out directly; a kind of request YouTube refuses is moved to Apify Proxy by the Actor itself. (YouTube refused none of the requests in the runs quoted under Performance. In 3 of our 29 similar-channel runs it refused four requests; the Actor moved that kind of request — "related videos", in the run where it was recorded — to Apify Proxy, and the runs completed.)
Is a channel without a visible subscriber count delivered? Yes, with subscribers: null — unless you set a subscriber filter, which it cannot pass.
Can I export to CSV / Excel / JSON? Yes — directly from the Apify dataset.
🐛 Troubleshooting
- "No channels delivered … did not pass your filters" — the run's status message, and the one status row in its dataset, list how many channels each filter removed. Loosen the one with the largest number.
- "For N channels YouTube's feed did not answer: their topic and their upload and view figures come from the channel's uploads list instead …" — those rows carry
recentVideosSource: "uploads list": rounded views and estimated activity, and no likes. They are charged like any other row. The feed's unrounded figures need a new run later; see the FAQ for what that costs and what a list does. - "N channels were left for a later run: YouTube's feed did not answer, and the uploads list did not give what is needed …" — those channels are not in the dataset and not charged: neither source gave their recent videos, or the figure one of your filters asks for. A list does not remember them. To get just those later, run the same input with
onlyNewChannelsand the samelistName; without a list the later run delivers — and charges — the other channels again. - "Nothing delivered … YouTube's feed did not answer, and the uploads list did not give what is needed either" — of the channels that passed your subscriber and country filters, more were left for a later run (see above) than were turned down. No row is charged; run it again later.
- "…: its videos could not be read (YouTube's feed did not answer, and neither its Videos tab nor its uploads list gave them); run it again later." (a seed's status row) — what the seed is about could not be read, so no similar channels were looked for. Nothing is charged for the line.
- "… candidate channels were found and N read, none passed (… N whose recent videos could not be read: YouTube's feed did not answer, and the uploads list did not give them …) — run it again later" (a seed's status row) — those candidates could not be scored against the seed. Nothing is charged; run the seed again later.
- A seed line came back as a status row — the
errorcolumn says why: not a channel address, no channel at that handle, or the same channel as another line. - "The run stopped at maxChannels before it got to N of its M searches" — the limit was reached before those keywords were looked at. Raise
maxChannels, or setmaxChannelsPerKeywordso the keywords share the run. - "Stopped after reading N channels: the filters let too few through" — the run read 50 channels for every row you asked for without filling the list. Loosen the filters or raise
maxChannels. While channels are being left for a later run the message ends "too few of them could be delivered": run it again later. - "… another run of the list … is in progress, or was cut off in the last three minutes" — two runs of the same
listNamewould deliver the same channels; start the second when the first has finished.
🚧 What it does not do
- No contact columns: e-mail addresses and links are not extracted or checked. (The
descriptioncolumn is the creator's own text and often contains them.) For checked public e-mail addresses and links use YouTube Channel Email Scraper. - No audience demographics, no estimated earnings, no transcripts, no comments.
- Subscriber counts are YouTube's rounded figures; YouTube publishes no exact ones.
- Similarity is measured on video titles and the channel's own description, in the language the channel writes in.
- YouTube decides what a search returns and what it shows next to a video; both change from one request to the next, so two runs of the same input do not return identical lists.
- YouTube can change its pages at any time; a number or date that cannot be read is
null. The one estimate the Actor makes is marked: in a row read from the uploads list (recentVideosSource), the activity columns rest on the ages YouTube words ("3 weeks ago").isVerifiedand the Shorts flag are read from a marker on the page: if YouTube changes the marker they readfalse.
⚖️ Is it legal to scrape YouTube channel data?
The Actor reads only what YouTube shows to every visitor who is not signed in: no login, no cookies, no CAPTCHA solving. Channel names, descriptions and figures are public information published by the channels themselves; a channel can belong to a private person, and its description can hold contact details, so use the data for a lawful purpose under the law that applies to you (the GDPR in the EU, for instance) and check that your use fits YouTube's terms. YouTube is a trademark of Google LLC; this Actor is not affiliated with, endorsed or sponsored by YouTube or Google.
🤝 Support & contact
- 🌐 Website: data.foxlabs.com.tr
- 📧 Email: info@foxlabs.com.tr
- 🐛 Issues: open a ticket in the Actor's Issues tab
- 🧰 More data actors: Fox Labs on Apify
Changelog
0.1.21 — 2026-10-08
- A channel whose recent videos neither YouTube's feed nor the uploads list gave is no longer delivered and charged — as a keyword row with empty upload and view columns and no topic: it is left for a later run, and a list does not remember it. The status message counts such channels apart from the ones your filters turned down.
- A seed whose feed does not come and whose Videos tab holds nothing is now read from its uploads list; when that gives no title either, its line says that its videos could not be read and can be run again — it said "YouTube listed no other channels next to its videos or for its topics".
- A run that delivers nothing ends as failed when, of the channels that passed your subscriber and country filters, more were left for a later run than were turned down; what those two filters turned down no longer counts against it.
0.1.20 — 2026-10-08
- When YouTube's feed does not answer for a channel, its topic and its upload and view figures are now read from the channel's uploads list — the same latest uploads, with rounded views and activity from the ages YouTube shows — instead of the Videos tab and empty columns. The new column
recentVideosSourcesays where a row's figures come from (feedoruploads list);uploadedWithinDaysandminMedianViewsjudge such a channel by those figures. Like columns staynullin such a row. A seed channel is profiled as before: from its Videos tab and, when it answers, its feed.
0.1.19 — 2026-10-08
- A run that delivers nothing now says "no rows charged" (it said "nothing charged"; the run-start event applies to every run). This README was corrected after an independent fact-check — the list is in the Changelog tab.
0.1.18 — 2026-10-08
- While YouTube's feed service is down altogether, a feed that does not come is asked one more time instead of five, so an outage does not slow a run down for nothing.
0.1.17 — 2026-10-08
- When YouTube's feed does not answer for a channel, it is asked up to five more times. A channel whose feed still does not come shows
recentVideosAnalyzed: null(it was0), takes its topic from its Videos tab, is counted in the status message, and is no longer called inactive, off topic or dissimilar for lack of a feed.
0.1 — 2026-10-07 — first version
- Channels by keyword: YouTube's channel search and the creators behind the top videos, each search followed up to five times; optional widening with YouTube's search suggestions.
- Similar channels for a seed channel, with an explained score and the shared topics.
- Audience and activity figures per channel; filters by size, country, activity and topic match.
- "Only new channels" lists; runs that continue after a restart; a spending limit that is exact. The full list is in the Changelog tab.