Youtube Creator Leads Finder
Pricing
from $4.80 / 1,000 creator leads
Youtube Creator Leads Finder
YouTube Creator Leads Finder discovers YouTube creators by keyword/niche, filters channels by region and subscriber size, then extracts public contact signals from About pages—emails, websites, and social links—to build outreach-ready lead lists.
Pricing
from $4.80 / 1,000 creator leads
Rating
0.0
(0)
Developer
Delowar Munna
Maintained by CommunityActor stats
1
Bookmarked
67
Total users
8
Monthly active users
7 days ago
Last modified
Categories
Share
Find the right creators. Then find the best way to reach them.
Discover YouTube creators by niche and export outreach-ready leads — business emails, Instagram, X, TikTok, LinkedIn and websites — alongside exact subscriber, view and video counts. Filter to the creator size you actually sell to before you spend anything.

What it does
- Discovers creators from keyword/niche searches — you don't need a channel list to start
- Enriches channels you already have — paste handles, URLs, IDs or even video links
- Qualifies them by subscriber range, so you only keep creators in your target tier
- Extracts public contact details from each channel's About page
- Tells you when it can't — a detected-but-gated email is reported, not silently dropped
What it does NOT do
- ❌ Does not reveal YouTube's protected business email. Some channels hide their address behind a "View email address" verification wall. This Actor does not bypass that — it reports
hasHiddenEmail: trueso you know one exists, and moves on. - ⚠️
Search Regionis not a country filter. It changes how YouTube ranks results for a market; it does not guarantee the creators returned are based there. For a real filter on the creator's own declared country, useCreator Country— see the caveat below. - ❌ Does not scrape private, deleted or age-gated channels. These are reported and skipped.
- ⚠️
isVerifiedis not currently populated — it is alwaysnull. No data source available to this Actor reports the verified badge reliably: the YouTube Data API does not expose it at all, and the browserless extraction path returns it inconsistently (it reports unverified for channels that are plainly verified). Rather than fill the column with a confidentfalsethat would be wrong for many large creators, we returnnull, which means "unknown" — not "unverified". Treat the field as reserved; do not filter or score on it.
Why this Actor
Most YouTube tools answer one question: "Given this channel, can I find an email?"
This one answers the whole workflow: find creators that fit your campaign, then find every public route to reach them.
| This Actor | Typical YouTube email scraper | |
|---|---|---|
| Subscriber range targeting | ✅ minSubscribers / maxSubscribers | ❌ |
| Niche classification | ✅ 23 categories from YouTube's own topic data | ❌ |
| Metric accuracy | ✅ Exact integers via YouTube Data API v3 (4480) | ⚠️ Parsed from display text ("4.4K") |
| Stable primary key | ✅ channelId + handle + URL | ⚠️ Often URL only |
| Output shape | ✅ Flat — imports straight into Sheets/CRM | ⚠️ Often nested objects |
At a Glance
| Feature | Value |
|---|---|
| Architecture | YouTube Data API v3 + browserless HTML parsing (no Chromium) |
| Memory | 1 GB default (up to 4 GB if you force browser mode) |
| Throughput | ~100 channels in a few minutes |
| Output Fields | 44 structured fields per creator |
| Contact Success | 40-60% have social links, 10-20% have a visible email |
| Concurrency | 20 parallel requests |
| Deduplication | Automatic by channelId |
| Login / cookies | None required |
How It Works
- Search YouTube — enter keywords or niches (e.g. "AI tools", "Shopify dropshipping")
- Discover channels — from both channel results and video results
- Fetch metadata — YouTube Data API v3 returns exact subscribers, views, country and niche
- Filter by size — min/max subscriber thresholds applied before anything is saved
- Extract contacts — the About page is parsed for email, website and social profiles
- Export — structured dataset ready for CRM import or outreach
Input
Supply Search Keywords, Channel Inputs, or both. At least one is required.
| Parameter | Type | Default | Description |
|---|---|---|---|
| searchQueries | Array | [] | Keywords to discover creators you don't know yet. Max 20 per run |
| channelInputs | Array | [] | Channels you already have, to enrich. Max 500 per run. Searching is free either way |
| maxChannels | Integer | 10 | Max channels per keyword (1–500) |
| maxTotalChannels | Integer | 100 | Spend cap — hard ceiling on leads saved across the whole run. 0 = no limit |
| minSubscribers | Integer | 0 | Minimum subscriber count |
| maxSubscribers | Integer | 0 | Maximum subscriber count (0 = no limit) |
| regionCode | String | "US" | Search Region — ISO 3166-1 alpha-2 code. Ranking/localization only, not a creator-country filter |
| searchLanguage | String | "en" | ISO 639-1 language for YouTube's search interface. Pair with Search Region for non-English markets |
| channelCountry | Array | [] | Creator Country — a real filter. Keeps only creators declaring one of these ISO codes, e.g. ["DE","AT","CH"] |
| joinedAfter | String | "" | Keep channels created on/after this date (YYYY-MM-DD) |
| joinedBefore | String | "" | Keep channels created on/before this date (YYYY-MM-DD) |
| excludeKeywords | String[] | [] | Skip creators matching any of these words — for ambiguous search terms. Skipped before contact extraction, so they cost nothing |
| includeSocialLinks | Boolean | true | Extract Contacts — visit the About page for email, website and socials |
| scanLinkedWebsites | Boolean | true | If YouTube has no email, scan the creator's site(s) — bounded: up to 3 sites, 6 pages each |
| scanVideoDescriptions | Boolean | true | Last resort — check the 50 most recent video descriptions |
| validateEmails | Boolean | false | MX + disposable/role check on each address found |
maxTotalChannelsis your budget control. Without it, a run costs up tokeywords × maxChannels. With it, you know the ceiling before you press Start.
Accepted Channel Input formats
Mix these freely in the same list — duplicates across formats are collapsed automatically.
| Format | Example |
|---|---|
| Handle | @mkbhd |
| Channel URL | https://www.youtube.com/@veritasium |
| Channel ID | UCBJycsmduvYEL83R_U4JriQ |
| Channel ID URL | https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ |
| Video URL | https://www.youtube.com/watch?v=dQw4w9WgXcQ → resolved to the uploader |
| Short video URL | https://youtu.be/dQw4w9WgXcQ |
| Shorts / Live | https://www.youtube.com/shorts/... |
| Legacy | https://www.youtube.com/c/Name, /user/Name |
Anything unrecognised is listed in the run log and skipped — never silently dropped.
Search Region vs Creator Country
These are different things and it matters:
| What it does | Guarantees the creator is there? | |
|---|---|---|
Search Region (regionCode) | Localizes and ranks YouTube's search results for a market | ❌ No |
Creator Country (channelCountry) | Filters on the creator's own declared country, after extraction | ✅ Yes |
⚠️ Read this before using Creator Country. Many creators never set a country on their channel. While the filter is active, those channels are skipped — we can't claim a match for a country that was never declared. The run log reports exactly how many were dropped for this reason, so you can decide whether to widen the filter.
Example — German-speaking creators, established channels only
{"searchQueries": ["technik reviews"],"regionCode": "DE","searchLanguage": "de","channelCountry": ["DE", "AT", "CH"],"joinedBefore": "2022-01-01","minSubscribers": 5000}
regionCode + searchLanguage shape what YouTube shows us; channelCountry then filters what we keep.
Example 1 — Find AI creators
{"searchQueries": ["AI tools"],"maxChannels": 10,"maxTotalChannels": 100,"regionCode": "US"}
Example 2 — Micro-influencers with an email, outreach-ready
{"searchQueries": ["fitness workouts", "home gym"],"maxChannels": 50,"maxTotalChannels": 100,"minSubscribers": 10000,"maxSubscribers": 500000}
Example 3 — Enrich a list you already have (no search, no search charge)
{"channelInputs": ["@mkbhd","https://www.youtube.com/@veritasium","UCBJycsmduvYEL83R_U4JriQ","https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"maxTotalChannels": 500}
Example 4 — Discover and enrich in one run
{"searchQueries": ["AI automation tools"],"channelInputs": ["@mkbhd", "@LinusTechTips"],"maxChannels": 50,"maxTotalChannels": 100,"minSubscribers": 10000}
Output
Every run returns 44 structured fields per creator. Below is one real record from a live run, shown through each of the three dataset views you can switch between in the Apify UI.
Output views
Overview
Key columns for a quick scan — who the creator is, how big they are, and whether you can reach them.
{"channelName": "The Diary Of A CEO","channelHandle": "@thediaryofaceo","channelURL": "https://www.youtube.com/@thediaryofaceo","subscribers": 18600000,"country": "GB","niche": "Lifestyle","email": "commercial@stevenbartlett.com","hasEmail": true,"hasContact": true,"contactabilityScore": 72,"qualificationTier": "Warm","isQualified": true,"status": "success","scrapedAt": "2026-07-29T14:17:00.134Z"}
Contact Details
Everything needed for outreach — email, website and every social profile found. Import this view straight into a CRM.
{"channelName": "The Diary Of A CEO","channelHandle": "@thediaryofaceo","channelURL": "https://www.youtube.com/@thediaryofaceo","email": "commercial@stevenbartlett.com","emailSource": "linked_website","emailConfidence": 70,"emailValidationStatus": "mx_valid","emailCount": 4,"hasEmail": true,"hasHiddenEmail": false,"website": "https://www.stevenbartlett.com/","instagram": "https://www.instagram.com/steven/","twitter": "https://twitter.com/StevenBartlett","tiktok": null,"linkedin": "https://www.linkedin.com/in/steven-bartlett-56986834","facebook": "https://www.facebook.com/SteveBartlettShow/?ref=br_rs","primaryAggregatorUrl": null,"contactLinks": [],"hasLinks": true,"hasContact": true,"contactabilityScore": 72,"qualificationTier": "Warm"}
Creator Profile
Full channel profile and metrics for qualification and analysis, including how each lead was discovered.
{"channelName": "The Diary Of A CEO","channelId": "UCGq-a57w-aPwyi3pW7XLiHw","channelHandle": "@thediaryofaceo","channelURL": "https://www.youtube.com/@thediaryofaceo","thumbnailUrl": "https://yt3.ggpht.com/JHCZDz37bsTmwoE1o4LEodF5vhsHfk29kCEauDTFr27-7hHXsHHvvWGzcG77v32ERrkpfInkGQ=s800-c-k-c0x00ffffff-no-rj","subscribers": 18600000,"videoCount": 835,"totalViews": 1627761334,"avgViewsPerVideo": 1949415,"isVerified": null,"country": "GB","niche": "Lifestyle","joinedDate": "2019-03-22","channelDescription": "64% of our viewers don't realise they don't subscribe, please double check, thank you!!","keywords": [],"searchKeyword": null,"searchRank": 5,"discoverySource": "direct_channel","status": "success","errorMessage": null,"scrapedAt": "2026-07-29T14:17:00.134Z"}
Full record
The raw export contains all 44 fields, including the nested emails array with per-address
provenance:
{"emails": [{"email": "commercial@stevenbartlett.com","sourceType": "linked_website","sourceUrl": "https://www.stevenbartlett.com/enquiries","validationStatus": "mx_valid","isDisposable": false,"isPrimary": true},{"email": "bookings@stevenbartlett.com","sourceType": "linked_website","sourceUrl": "https://www.stevenbartlett.com/enquiries","validationStatus": "mx_valid","isDisposable": false,"isPrimary": false},{"email": "press@stevenbartlett.com","sourceType": "linked_website","sourceUrl": "https://www.stevenbartlett.com/enquiries","validationStatus": "role_valid","isDisposable": false,"isPrimary": false},{"email": "events@stevenbartlett.com","sourceType": "linked_website","sourceUrl": "https://www.stevenbartlett.com/enquiries","validationStatus": "mx_valid","isDisposable": false,"isPrimary": false}],"emailCount": 4,"externalLinks": ["https://www.stevenbartlett.com/","https://www.instagram.com/steven/","https://twitter.com/StevenBartlett","https://www.facebook.com/SteveBartlettShow/?ref=br_rs","https://www.linkedin.com/in/steven-bartlett-56986834","https://smarturl.it/DOACbook","https://link.thediaryofaceo.com/FmnyJ9b"],"keywords": []}
Flat by design — every field is a scalar except contactLinks, externalLinks,
keywords and emails, so CSV headers stay stable for CRM import.
Field reference (44 fields)
Identity
| Field | Type | Description |
|---|---|---|
channelName | String | Channel display name |
channelId | String | Unique YouTube channel ID (UC...) — stable primary key |
channelURL | String | Full channel URL |
channelHandle | String | @handle |
thumbnailUrl | String | Channel avatar |
Metrics
| Field | Type | Description |
|---|---|---|
subscribers | Integer | Exact subscriber count |
videoCount | Integer | Total videos published |
totalViews | Integer | Lifetime channel views |
avgViewsPerVideo | Integer | totalViews / videoCount — reach proxy |
isVerified | Boolean | null | Verified badge. Currently always null — see "What it does NOT do" |
Qualification
| Field | Type | Description |
|---|---|---|
country | String | The creator's actual country, as declared on the channel |
niche | String | Detected category (23 niches from YouTube topic data) |
joinedDate | String | Channel creation date (YYYY-MM-DD) |
channelDescription | String | Channel About text |
keywords | Array | Channel-declared keywords, useful for niche matching |
Contact
| Field | Type | Description |
|---|---|---|
email | String | Primary business email, or null |
emailSource | String | Where it was found — channel_about · channel_description · linked_website · video_description |
emailConfidence | Integer | 0-100 — how much the extractor trusts this address, based on source and context |
emailValidationStatus | String | Domain-level deliverability signal — see below. Not mailbox verification |
emails | Array | Every address found, each with sourceType, sourceUrl, validationStatus, isDisposable, isPrimary |
emailCount | Integer | How many distinct addresses were found |
hasEmail | Boolean | A usable email was found |
hasHiddenEmail | Boolean | An email exists but YouTube gates it — we detect, we do not bypass |
website | String | Website URL |
instagram / twitter / tiktok | String | Profile URLs |
linkedin / facebook | String | Profile URLs |
contactLinks | Array | Overflow — Discord, Telegram and anything uncategorised |
primaryAggregatorUrl | String | Link hub — Linktree, Beacons, Bio.link and similar |
externalLinks | Array | Every link found, flat — the raw material behind the categorised columns |
hasLinks | Boolean | At least one external link was found |
hasContact | Boolean | Any actionable route exists (email, website or social) |
Provenance & status
| Field | Type | Description |
|---|---|---|
searchKeyword | String | Which keyword surfaced this lead |
discoverySource | String | keyword_search · direct_channel · video_to_channel |
inputUrl | String | The exact value you supplied in Channel Inputs; null for keyword discovery |
searchRank | Integer | Position in the search results that surfaced this lead |
status | String | See the status contract below |
errorMessage | String | Why extraction failed; null on success |
scrapedAt | String | ISO 8601 timestamp |
Lead qualification
| Field | Type | Description |
|---|---|---|
contactabilityScore | Integer | 0–100 outreach-readiness score. Email presence and confidence (max 60) + alternative contact routes (max 28) + credibility (max 12) |
qualificationTier | String | Hot (72+) · Warm (60–71) · Cold (40–59) · Unqualified (<40) |
isQualified | Boolean | Whether the score clears your minQualificationScore |
The score is computed from deterministic, published rules — not AI — so it is predictable, free, and explainable to anyone who asks why a lead ranked where it did. Sort by it to work your best leads first.
Status contract
Every row carries a status, and failures appear in the dataset instead of vanishing.
| Status | Meaning | Charged? |
|---|---|---|
success | Extracted, and at least one contact route was found | ✅ creator-lead |
no_contact | Extracted fine — full metrics — but no email, website or social | ✅ creator-lead |
blocked | YouTube blocked the request (CAPTCHA / rate limit) | ❌ Never |
timeout | The channel page did not load in time | ❌ Never |
not_found | Channel does not exist | ❌ Never |
private_channel | Private or unavailable | ❌ Never |
error | Any other failure — see errorMessage | ❌ Never |
Failure rows carry the same columns as any other row, so CSV exports stay rectangular. To work with leads only, filter to status == "success" (or include no_contact if socials-free leads are still useful to you).
Previously a channel that 404'd or timed out simply disappeared — you counted rows, found fewer than expected, and had no way to tell whether YouTube had run out of results or something had broken. These rows close that gap, and the run log prints a breakdown by reason.
Contact extraction
Where emails come from
Email discovery runs as a cascade — each step runs only when the cheaper ones found nothing, so a run never pays for work it doesn't need:
| Step | Source | emailSource value | Cost |
|---|---|---|---|
| 1 | Email shown on the About page | channel_about | free |
| 2 | Channel description | channel_description | free |
| 3 | The creator's own website — home, /contact, /about | linked_website | ~1–3 cheap HTTP requests |
| 4 | Recent video descriptions (3 most recent) | video_description | 1 YouTube API unit |
Steps 3 and 4 are the reason this Actor finds emails that About-page-only scrapers miss — many creators publish their business address on their own site, not on YouTube. Both can be turned off individually.
Step 3 is strictly bounded: max 3 pages, 3s per request, 8s total per channel, HTTP only, no browser, never follows off-site links.
Every address is reported with the source it came from, so you can judge how much to trust it.
Multiple emails
email is the primary address — a deliverable, non-disposable one is preferred over a role inbox, which is preferred over an unverifiable one. The full emails[] array carries every address found, each with its source and source URL — useful via the API, while the flat columns keep CSV exports clean.
Deliverability signal
We do not claim to verify emails, and there is no verification option or charge. Verifying that a specific mailbox exists is impossible without actually sending mail, so selling it as a feature would be dishonest.
What we do provide is a cheap, honest signal in emailValidationStatus, used to rank which address becomes the primary and to inform the contactability score:
| Value | Meaning |
|---|---|
mx_valid | The domain publishes mail servers |
role_valid | Domain accepts mail, but it's a role inbox (info@, sales@) |
no_mx | Domain publishes no mail servers — likely undeliverable |
disposable | Known throwaway provider |
unknown | Lookup failed or timed out — deliberately not treated as bad |
This tells you about the domain, never the individual mailbox. Treat it as a ranking hint, not a guarantee.
Other contacts
Contacts come from the channel About page:
- Email — from publicly visible text and the channel description
- Website, Instagram, X / Twitter, TikTok, LinkedIn, Facebook — first-class columns
- Overflow (in
contactLinks) — Discord, Telegram, and link aggregators: Linktree, Beacons, Bio.link, Lnk.bio, AllMyLinks, Tap.bio, Campsite.bio, Solo.to, Koji, Shorby, Many.link
About the gated business email. Many channels put their address behind YouTube's "View email address" verification wall. This Actor does not attempt to defeat that — no login, no cookies, no CAPTCHA solving. Instead it sets hasHiddenEmail: true, so a blank email is never ambiguous: either no address is published, or one exists that YouTube won't release.
Pricing
Pay-per-event — you are billed per event, not for platform usage.
You pay for leads you can act on
| Event | Fires when |
|---|---|
creator-lead | Once per creator delivered to your dataset |
email-validated | Per address checked, only when Validate Emails is on |
Searching is free — there is no per-keyword fee and no run start fee, so a run that finds nothing costs nothing. Failure rows are never charged: channels that were blocked, timed out, could not be found, or whose contact lookup failed are delivered so you can see what happened, but never billed.
Live rates are on the Pricing tab of this Actor's page. This README deliberately quotes no figures — rates change and a second copy only goes stale.
Estimating a run
Event counts are fully predictable from your input and your results:
creator-lead = creators delivered (never more than maxTotalChannels)email-validated = addresses checked (0 when Validate Emails is off)(free) = every failure row
So maxTotalChannels is a hard ceiling on your creator-lead count — set it and you know the maximum before you press Start.
email-validated counts addresses, not leads: a creator publishing four contact addresses bills four, and a creator with none bills zero. In a measured 16-lead run, 9 leads with email produced 12 validation events.
What you are NOT charged for
- ✅ Channels filtered out by
minSubscribers/maxSubscribers— skipped before saving - ✅ Channels filtered out by
channelCountry,joinedAfterorjoinedBefore - ✅ Channels beyond your
maxTotalChannelscap - ✅ Leads with no contact route at all (
status: "no_contact") — delivered with full metrics, free - ✅ Every failure row — blocked, timed-out, not-found, private
- ✅ Failed and retried requests
- ✅ Website and video-description scanning — bundled, never a separate charge, because they can legitimately find nothing
- ✅ Proxy, compute and platform infrastructure — all included
Known limitations
- Gated business emails cannot be extracted. Where YouTube hides an address behind verification, you get
hasHiddenEmail: true, not the address. - Email availability is creator-dependent. Roughly 10–20% of channels publish an email on YouTube itself; the website and video-description steps lift this, but no tool can find an address a creator never published. 40–60% expose at least one social link.
Search Regionis a ranking hint, not a country filter. UseCreator Countryfor a real filter, or thecountryoutput field to filter downstream.Creator Countryskips channels with no declared country. YouTube does not require creators to set one. The run log reports how many were dropped for this reason.- Keyword discovery is not exhaustive. It returns what YouTube ranks for your keyword, not every channel in the niche. Use several related keywords for broader coverage.
- Very large runs may hit YouTube rate limiting. The Actor backs off automatically, but throughput degrades.
FAQ
Why do some rows have no email?
The Actor checks four sources in order — About page, channel description, the creator's own website, then recent video descriptions. If all four come up empty, the creator most likely publishes no address at all. Check hasHiddenEmail — true means one exists but YouTube gates it. Also check hasContact: a lead with no email but an active Instagram is still reachable.
How is email chosen when several are found?
A validated, non-disposable address wins. Otherwise the cascade order decides, since earlier sources are more authoritative. Every address is in emails[] with isPrimary marking the chosen one.
Do you verify that emails actually work?
No, and we don't offer it as a feature or charge for it. Proving a mailbox exists requires sending mail. What you get in emailValidationStatus is a domain-level signal — does the domain publish mail servers, is it a throwaway provider, is it a role inbox — used to rank which address becomes primary. Treat it as a hint, not a guarantee.
Can you get the hidden "View email address" email? No, and this is deliberate. Retrieving it requires defeating YouTube's verification wall. We report its existence instead.
How is niche determined?
From YouTube's own topic metadata, mapped to 23 categories (Technology, Fitness, Gaming, Education, …). It is the channel's classification, not a guess from its title.
Can I feed in my own list of channels?
Yes — use Channel Inputs, which accepts handles, channel URLs, channel IDs and video URLs (up to 500, mixed freely). Searching is free either way, so this costs no more than keyword discovery. You can combine it with Search Keywords in the same run; each lead records which route found it via discoverySource and inputUrl.
My keyword means two different things — how do I get rid of the wrong ones?
Use Exclude Keywords. Searching Gemini returns astrology and tarot channels next to the AI ones, because Gemini is also a zodiac sign; adding tarot, zodiac and horoscope removes them. Terms are matched as whole words against the channel name, description and channel keywords, case-insensitively — so ai will not match "said".
Excluded creators are skipped before their contact details are fetched, so they cost you nothing. Worth knowing what it cannot do: it filters on the words a creator actually publishes, so a channel with a sparse description and no keywords may slip through. In a real 10-result Gemini search it removed 7 of the 9 off-target channels while keeping the one genuine AI channel.
How do I get only leads I can actually contact?
Filter your export on hasEmail (email specifically) or hasContact (email, website or any social profile). Every row carries both flags, plus contactabilityScore and qualificationTier if you would rather rank than filter. Sorting or filtering after export is free and non-destructive — you keep the full result set and can widen your criteria without re-running.
Am I charged for creators with no contact details?
Yes — every creator delivered is charged one creator-lead event, with or without contact details, because the channel profile itself (exact subscriber, view and video counts, niche, country, join date) is the deliverable. What is never charged is a row we failed to extract: blocked, timed out, not found, private, or whose contact lookup failed.
What is the largest run I can do?
Up to 500 channels per keyword and 20 keywords, bounded by maxTotalChannels. Start small — maxChannels: 10 — to sanity-check results before scaling.
Is this GDPR / CAN-SPAM safe? The Actor collects only publicly published business contact information. How you use it is your responsibility — outreach is regulated by GDPR, CAN-SPAM, CCPA and local law depending on your and the recipient's jurisdiction.
How do I get this into my CRM? Export the Contact Details view as CSV. Output is flat, so headers are stable. See Integrations below.
Integrations & export
Export as JSON, CSV, Excel or HTML from the dataset tab, or pull via API.
Because the output is flat (every field is a scalar except contactLinks), it drops directly into:
- Google Sheets / Excel
- Airtable
- HubSpot, Pipedrive and other CRM importers
- Zapier / Make automations
- The Apify API and MCP server
# Fetch the contact view as CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&view=contacts"
Use cases
Marketing agencies — build influencer shortlists in any niche, filtered to the subscriber tier your client pays for.
SaaS companies — find creators who review tools in your category and reach out for partnerships.
eCommerce brands — find creators in your product niche and build an ambassador pipeline.
Creator marketplaces — maintain a creator database at scale, filtered by size, niche and contactability.
Performance
| Channels | Estimated time |
|---|---|
| 10 | ~30-40 seconds |
| 50 | ~2-3 minutes |
| 100 | ~3-5 minutes |
Architecture
- YouTube Data API v3 — channel metadata in ~200ms (exact subscribers, views, country, niche)
- Browserless HTML parsing — search results and About-page contacts are read straight from YouTube's initial payload. No Chromium, so runs are cheaper and faster
- Browser only when needed — video URLs need the watch page to resolve their uploader, so those runs use Puppeteer automatically. Force it with
YT_FORCE_BROWSER=1 - Session pooling and adaptive backoff (2s → 30s on errors)
- Layered fallbacks — API → HTML payload → DOM
Best practices
- Set
maxTotalChannels— it is your spend ceiling; never run uncapped while testing - Start at
maxChannels: 10to validate results before scaling - Use specific keywords — "AI automation tools" beats "AI"
- Filter by subscribers — target the tier you actually sell to
- Filter your export on
hasEmailfor outreach lists,hasContactfor broader campaigns - Run several related keywords — one keyword never covers a niche
Compliance
- Collects only publicly available YouTube channel data
- Uses the YouTube Data API v3 within Google's usage policies
- No login, cookies, sessions or CAPTCHA bypass
- Does not access gated or private content
- Intended for legitimate creator discovery, influencer research and business outreach
- You are responsible for complying with applicable law in your jurisdiction when contacting anyone
Changelog
v1.9
- Email fill rate raised from 3/6 to 5/6 on a benchmark set. Video-description scan widened from 3 to 50 videos (costs the same single API unit, since
playlistItemsbills per call and caps at 50); website scan now covers up to 3 linked sites, follows the site's own contact links rather than only guessing paths, decodes Cloudflare-obfuscateddata-cfemailaddresses, and recognises UK-English/enquiriespages - Recurrence gate (an address must appear in ≥2 video descriptions) and brand affinity (prefer a domain matching the channel) keep precision as the scan widens — a sponsor's one-off address no longer gets picked up as the creator's
- Default memory cut to 1 GB (from 2 GB). The browserless path never needs more, and Apify bills allocated memory × time — so this roughly halves compute cost per run. Ceiling raised to 4 GB so forced browser runs still have headroom
- Input reorganised into five clearer sections: Search Keywords · Channel Inputs · Filters & Settings · Contact Extraction · CRM & Integrations
- Search Region, Search Language and Creator Country are now dropdowns instead of free text — no more guessing ISO codes. Creator Country is multi-select for regional targeting
- "Validate emails" reworded, not removed. It performs an MX lookup plus disposable- and role-address detection, and is now described as a domain-level deliverability check rather than verification — proving a specific mailbox exists is impossible without sending mail. Off by default; when on it also improves which address is chosen as primary and lifts the contactability score
v1.8
- Added lead scoring — every lead now carries a 0–100
contactabilityScore, a fixed-bandqualificationTier(Hot 72+ / Warm 60+ / Cold 40+ / Unqualified), and anisQualifiedflag against your ownminQualificationScore. Deterministic rules, no AI - Added webhook delivery — set
webhookUrland every lead is POSTed as JSON in real time for Zapier / Make / n8n / CRM inserts. Best-effort: a failed POST never fails the run - Richer email validation — statuses are now
mx_valid,role_valid,no_mx,disposable,unknown, so a role inbox (info@, sales@) is distinguishable from a personal one - New output fields:
keywords,emailConfidence,emailValidationStatus,externalLinks,primaryAggregatorUrl,hasLinks,searchRank - Primary-email selection now prefers a real mailbox over a role inbox over an unvalidated address, instead of taking the first one found
v1.7
- Fixed mostly-empty emails. YouTube does not server-render the About-page links or the full channel description — they arrive via a continuation request. Contact data is now fetched through TikHub's channel-description endpoint, which returns the complete payload. HTML parsing remains only as a degraded fallback
- Fully browserless. Video URLs are now resolved to their uploader through TikHub too, so no run needs Chromium. The browser survives only behind
YT_FORCE_BROWSER=1 - Verified status now comes from TikHub, which reports it authoritatively (the Data API does not expose it)
- Aligned with the
youtube-channel-contacts-scraperarchitecture:BROWSERLESS=true, 2 GB memory, shared@tikhub_api_keysecret
v1.6
- Runs without a browser by default. Search results, channel metadata and About-page contacts are all read from YouTube's initial HTML payload, so no Chromium is launched. Default memory drops from 4 GB to 1 GB and runs are substantially faster
- The browser path is kept and used automatically when a run includes video URLs (resolving a video to its uploader needs the watch page), or when forced with
YT_FORCE_BROWSER=1 - Contact parsing rewritten to collect every external-link view-model in the payload rather than traversing to a single node — the old depth-limited traversal reached an empty placeholder and fell back to DOM scraping more often than intended
- Emails are now extracted from the parsed description rather than raw HTML, eliminating a class of corrupted addresses caused by JSON escape sequences
v1.5
- Billing restructured: you now pay for leads you can act on. The single
creator-leadevent is replaced bylead-with-emailandlead-with-contact, priced differently because a verified email and a bare TikTok link are not worth the same - Leads with no contact route are now delivered free — you keep the full channel profile at no charge. Previously every saved row was billed regardless of whether it was usable
- Failure rows are never billed
- Added
email-validated, charged per address only when Validate Emails is enabled - Website and video-description scanning are bundled into the lead price — never charged separately, since they can legitimately find nothing
- Run log now reports what was actually billed and shouts
NOT BILLEDif any event fails to charge
v1.4
- Failures now appear in the dataset as rows with
statusanderrorMessage, instead of silently disappearing. Same columns as any other row, so CSV exports stay rectangular statusdistinguishessuccess(contact found) fromno_contact(extracted fine, nothing actionable) and from the five failure states- Failure rows are never charged — a failed extraction is our problem, not yours
- Run log now prints a breakdown of both skipped and failed channels with counts and reasons
v1.3
- Email discovery is now a 4-step cascade — About page → channel description → the creator's own website → recent video descriptions. Each step runs only when the cheaper ones found nothing
- Website scanning (
scanLinkedWebsites, on by default) checks the home,/contactand/aboutpages. Strictly bounded: 3 pages, 3s per request, 8s per channel, HTTP only - Video-description scanning (
scanVideoDescriptions, on by default) as a last resort on the 3 most recent uploads - Every email now reports its source via
emailSource, and the fullemails[]array carriessourceType,sourceUrl,validationStatus,isDisposableandisPrimary - Optional email validation (
validateEmails) — MX lookup plus disposable-provider detection, with per-domain caching so repeated domains cost one lookup. Documented honestly as domain-level, not mailbox-level - Added
emailCount;mailto:links are now filtered through the same blacklist as plain-text addresses
v1.2
- Added Creator Country (
channelCountry) — a real filter on the creator's declared country, distinct from Search Region. Accepts multiple codes for regional targeting like["DE","AT","CH"] - Added Joined After / Joined Before — target emerging or established creators by channel age
- Added Search Language — YouTube's search interface was hardcoded to English, making non-English targeting structurally impossible
- Run log now reports every skip reason with counts, so filtered-out channels are visible instead of looking like "there was no more data"
- Added Channel Inputs — enrich channels you already have. Accepts handles, channel URLs, channel IDs, video URLs, Shorts/Live links and legacy
/c//user/paths, up to 500 per run, mixed freely with keyword discovery - Direct inputs incur no
search-querycharge — no search runs - Duplicates across formats are collapsed; unrecognised entries are reported in the log rather than silently dropped
discoverySourcenow reportskeyword_search/direct_channel/video_to_channel, andinputUrlrecords exactly what you supplied- Search Keywords is no longer strictly required — supply keywords, channel inputs, or both
v1.1
- Output expanded from 16 to 30 fields — added
thumbnailUrl,isVerified,joinedDate,channelDescription,avgViewsPerVideo,hasEmail,hasHiddenEmail,hasContact,searchKeyword,discoverySource,statusand more - LinkedIn and Facebook promoted to first-class columns (previously inside
contactLinks) - Added
maxTotalChannels— a hard spend cap across the whole run maxChannelsceiling raised 100 → 500; keywords capped at 20 per runSearch Regionclarified — documented as ranking/localization only, and now accepts any ISO 3166-1 country code instead of a 10-country list- Corrected the business-email documentation — the Actor detects gated emails via
hasHiddenEmailand does not attempt to reveal them - Removed
includeChannelStats, which reduced no cost and only blanked columns - Added three preset dataset views and a published output schema
v1.0
- Initial release — keyword discovery, subscriber filters, contact extraction, 16-field output
Support
- Issues: GitHub or Apify support
- Feature requests: open an issue with your use case
Built by Coregent Digital Studio — production-ready creator discovery and outreach