YouTube Channel Contact Email Finder
Find publicly listed contact emails for YouTube channels by scanning each About page and the Instagram, TikTok, and Linktree profiles it links to. No login or API key needed.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | Choose whether to scrape the channels you provide or discover channels from search queries. |
channels | array | optional | YouTube channel URLs, @handles, UC... channel IDs, or video URLs (mode=channels). Video URLs resolve to their channel. |
searchQueries | array | optional | Keywords used to discover channels through YouTube search (mode=search). Each query returns up to about 20 channels; duplicates and maxChannels are applied across queries. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | Choose whether to scrape the channels you provide or discover channels from search queries. |
channels | array | optional | YouTube channel URLs, @handles, UC... channel IDs, or video URLs (mode=channels). Video URLs resolve to their channel. |
searchQueries | array | optional | Keywords used to discover channels through YouTube search (mode=search). Each query returns up to about 20 channels; duplicates and maxChannels are applied across queries. |
maxChannels | integer | optional | Maximum number of unique channels processed per run, across both modes. |
includeWebsite | boolean | optional | Visit up to two linked websites (home, contact/about pages and common paths) and one link-in-bio hub per channel. |
includeVideoDescriptions | boolean | optional | Read the descriptions of the latest five videos on each channel. |
onlyWithEmail | boolean | optional | When enabled, channels with no public email are left out of the dataset. Error records are still reported. |
emailDomains | array | optional | Optional list of domains to keep, for example brand.com or gmail.com. Leave empty to keep every discovered email. |
maxEmailsPerChannel | integer | optional | Upper bound on the emails returned for each channel. The highest-value public contact is chosen as primaryEmail. |
proxyConfiguration | object | optional | Optional. The actor works without a proxy; set this only when your runs need a specific Apify Proxy connection. |
Download the published input schema
View complete JSON
{
"description": "Find publicly listed contact emails for YouTube channels and creators.",
"properties": {
"channels": {
"description": "YouTube channel URLs, @handles, UC... channel IDs, or video URLs (mode=channels). Video URLs resolve to their channel.",
"editor": "stringList",
"prefill": [
"@mkbhd",
"@LinusTechTips"
],
"title": "Channels",
"type": "array"
},
"emailDomains": {
"description": "Optional list of domains to keep, for example brand.com or gmail.com. Leave empty to keep every discovered email.",
"editor": "stringList",
"title": "Email domain allowlist",
"type": "array"
},
"includeVideoDescriptions": {
"default": true,
"description": "Read the descriptions of the latest five videos on each channel.",
"prefill": true,
"title": "Scan recent video descriptions",
"type": "boolean"
},
"includeWebsite": {
"default": true,
"description": "Visit up to two linked websites (home, contact/about pages and common paths) and one link-in-bio hub per channel.",
"prefill": true,
"title": "Scan linked websites and link hubs",
"type": "boolean"
},
"maxChannels": {
"default": 100,
"description": "Maximum number of unique channels processed per run, across both modes.",
"maximum": 500,
"minimum": 1,
"prefill": 2,
"title": "Max channels",
"type": "integer"
},
"maxEmailsPerChannel": {
"default": 5,
"description": "Upper bound on the emails returned for each channel. The highest-value public contact is chosen as primaryEmail.",
"maximum": 20,
"minimum": 1,
"prefill": 5,
"title": "Max emails per channel",
"type": "integer"
},
"mode": {
"default": "channels",
"description": "Choose whether to scrape the channels you provide or discover channels from search queries.",
"editor": "select",
"enum": [
"channels",
"search"
],
"enumTitles": [
"Paste channels",
"Search YouTube"
],
"prefill": "channels",
"title": "Mode",
"type": "string"
},
"onlyWithEmail": {
"default": false,
"description": "When enabled, channels with no public email are left out of the dataset. Error records are still reported.",
"prefill": false,
"title": "Only channels with a public email",
"type": "boolean"
},
"proxyConfiguration": {
"description": "Optional. The actor works without a proxy; set this only when your runs need a specific Apify Proxy connection.",
"editor": "proxy",
"title": "Proxy configuration",
"type": "object"
},
"searchQueries": {
"description": "Keywords used to discover channels through YouTube search (mode=search). Each query returns up to about 20 channels; duplicates and maxChannels are applied across queries.",
"editor": "stringList",
"title": "Search queries",
"type": "array"
}
},
"required": [
"mode"
],
"schemaVersion": 1,
"title": "YouTube Email Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
channels | string | optional | Dataset containing all scraped YouTube channel contact records. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "Dataset of YouTube channel contact records with channel metadata, public emails and their sources, links, socials, and hidden-email flags.",
"properties": {
"channels": {
"description": "Dataset containing all scraped YouTube channel contact records.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "YouTube channel contacts",
"type": "string"
}
},
"title": "YouTube Channel Contact Email Finder Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"description": "Channel metadata and public contact emails, with provenance.",
"display": {
"component": "table",
"properties": {
"channelId": {
"label": "Channel ID"
},
"country": {
"label": "Country"
},
"emailSource": {
"label": "Email source"
},
"emails": {
"format": "array",
"label": "All emails"
},
"handle": {
"label": "Handle"
},
"hasHiddenEmail": {
"format": "boolean",
"label": "Hidden email gate"
},
"links": {
"format": "array",
"label": "Links"
},
"name": {
"label": "Channel name"
},
"primaryEmail": {
"label": "Primary email"
},
"recordType": {
"label": "Record type"
},
"scrapedAt": {
"format": "date",
"label": "Scraped at"
},
"socials": {
"format": "object",
"label": "Socials"
},
"sourceUrl": {
"format": "link",
"label": "About page"
},
"subscriberCount": {
"format": "number",
"label": "Subscribers"
},
"url": {
"format": "link",
"label": "Channel URL"
},
"websiteCandidate": {
"format": "link",
"label": "Website"
}
}
},
"title": "Overview",
"transformation": {
"fields": [
"channelId",
"handle",
"name",
"url",
"subscriberCount",
"country",
"primaryEmail",
"emailSource",
"emails",
"hasHiddenEmail",
"websiteCandidate",
"links",
"socials",
"sourceUrl",
"scrapedAt",
"recordType"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
YouTube Channel Contact Email Finder
Build a public contact list from YouTube channels: channel metadata, linked websites and socials, and every public email address found across the channel description, linked site, recent videos, and link-in-bio pages. Start from channel URLs or let keyword search discover creators.
No login, cookies, API key, or CAPTCHA solving required.
What this actor does
- Accepts channel URLs,
@handles,UC...channel IDs, and video URLs (the channel is resolved from the video). - Discovers channels from one or more keyword searches (about 20 channels per query).
- Reads the About page through
ytInitialData.aboutChannelViewModel: name, handle, channel ID, subscriber count, country, description, and links. - Unwraps YouTube's
/redirect?q=...link wrapper, so you get the real website and social URLs. - Runs a bounded email cascade:
- channel About description;
- up to two linked websites (home, contact/about pages, and common paths such as
/contactand/about); - the latest five video descriptions;
- one linked link-in-bio hub (Linktree, Beacons, and similar).
- Deduplicates emails, filters placeholder/asset/no-reply noise, ranks role mailboxes, and returns the best address as
primaryEmail. - Flags channels that have a native YouTube business email behind the sign-in wall with
hasHiddenEmail: true. The gated address itself is never claimed or guessed. - Omits empty fields from every record.
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
select | channels |
channels scrapes the list you provide; search discovers channels from searchQueries. |
channels |
array | – | Channel URLs, @handles, UC... IDs, or video URLs (mode=channels). |
searchQueries |
array | – | Keywords for channel discovery (mode=search). Each query yields about 20 channels. |
maxChannels |
integer | 100 |
Maximum unique channels per run, 1–500. |
includeWebsite |
boolean | true |
Scan up to two linked websites and one link-in-bio hub per channel. |
includeVideoDescriptions |
boolean | true |
Read descriptions of the latest five videos per channel. |
onlyWithEmail |
boolean | false |
Drop channel records that have no public email. Error records are still reported. |
emailDomains |
array | – | Optional allowlist such as ["brand.com", "gmail.com"]. Matching is case-insensitive and includes subdomains. |
maxEmailsPerChannel |
integer | 5 |
Cap after ranking, 1–20. |
proxyConfiguration |
object | – | Optional Apify Proxy override. The actor works without a proxy. |
Example: channels
{
"mode": "channels",
"channels": [
"@mkbhd",
"@LinusTechTips",
"https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ",
"https://www.youtube.com/watch?v=DN953UW8iJ8"
],
"maxChannels": 10,
"includeWebsite": true,
"includeVideoDescriptions": true,
"onlyWithEmail": false,
"maxEmailsPerChannel": 5
}
Example: keyword search
{
"mode": "search",
"searchQueries": ["home espresso", "personal finance"],
"maxChannels": 30,
"includeWebsite": true,
"includeVideoDescriptions": true,
"onlyWithEmail": true,
"emailDomains": ["gmail.com", "outlook.com"]
}
Output
One record per channel. Fields with no value are omitted.
{
"recordType": "channel",
"channelId": "UCBJycsmduvYEL83R_U4JriQ",
"handle": "@mkbhd",
"name": "Marques Brownlee",
"url": "https://www.youtube.com/@mkbhd",
"subscriberCount": 21400000,
"country": "United States",
"description": "MKBHD: Quality Tech Videos... business@MKBHD.com",
"links": [
{"title": "Twitter", "url": "https://twitter.com/MKBHD", "type": "social"},
{"title": "Instagram", "url": "https://instagram.com/MKBHD", "type": "social"}
],
"socials": {
"x": "https://twitter.com/MKBHD",
"instagram": "https://instagram.com/MKBHD"
},
"emails": [
{
"email": "business@mkbhd.com",
"source": "channel_description",
"sourceUrl": "https://www.youtube.com/@mkbhd/about"
}
],
"primaryEmail": "business@mkbhd.com",
"emailSource": "channel_description",
"hasHiddenEmail": true,
"sourceUrl": "https://www.youtube.com/@mkbhd/about",
"scrapedAt": "2026-10-26T12:00:00+00:00"
}
Field notes
recordType–channelfor a contact record,errorfor a failed input/search.channelId/handle/name/url– stable channel identity.urlis the canonical channel URL.subscriberCount– expanded from YouTube's displayed label (21.4Mbecomes21400000; approximate for large channels).country– the country shown in the About panel.description– the full About description.links– every external link with a title, absolute URL, andtype(website,social, orlink_hub).socials– one URL per recognised platform (x,instagram,tiktok,facebook,linkedin,discord,twitch,patreon,telegram,threads,spotify,github, and more).websiteCandidate– the first non-social, non-hub linked website.emails– deduplicated and ranked email objects.sourcetells you where the address came from;sourceUrlpoints at the exact page.primaryEmail/emailSource– the highest-value public address and its source.hasHiddenEmail–truewhen the About page shows YouTube'sSign in to see email addressgate. The actor cannot read that address without login, so it does not pretend to.sourceUrl/scrapedAt– canonical About page and UTC timestamp.
Email sources
source |
Where the address was found |
|---|---|
channel_description |
The channel's About description. |
website |
A linked website page (home, contact/about page, or common path). |
video_description |
One of the latest five video descriptions. |
link_hub |
A Linktree/Beacons-style link-in-bio page. |
Error record
{
"recordType": "error",
"reason": "not_found",
"message": "Channel page returned 404.",
"input": "https://www.youtube.com/@missing-handle",
"sourceUrl": "https://www.youtube.com/@missing-handle/about",
"scrapedAt": "2026-10-26T12:00:00+00:00"
}
reason is one of: invalid_input, invalid_url, not_found, fetch_failed, blocked, rate_limited, parse_failed, channel_unavailable, video_resolve_failed, or scrape_error. If every channel fails, the run fails loudly instead of silently returning an empty dataset.
How the email cascade works
- Channel description first. This is the creator-authored text on the About page and the highest-signal source.
- Linked websites next. For up to two non-social websites, the actor reads the home page, selected contact/about links, and common paths (
/contact,/contact-us,/about,/about-us,/impressum,/support,/press). Website emails must share the site's registrable domain, which removes support addresses from embedded vendors and analytics scripts. - Recent video descriptions. The latest five videos are read from the channel's Videos tab. This catches creators who put business contacts in every upload description.
- One link hub. Linktree, Beacons, and similar pages are read for public addresses.
All hits are deduplicated. The primary email favours role mailboxes such as business@, partnerships@, contact@, and press@, with the source order above as the next tie-breaker. maxEmailsPerChannel caps the ranked list.
Limits and honest limitations
- The native YouTube business email is login-gated. The About page exposes only a sign-in prompt; the address is not in the HTML. This actor reports
hasHiddenEmailand never claims the gated value. TreathasHiddenEmail: trueplus noemailsas a real lead that needs manual or logged-in follow-up. - Public coverage is not 100%. Many creators publish no public address anywhere the actor can read. Coverage is higher for large brands and creators who link a website.
- Website crawling is bounded. Two sites × up to five pages, plus one link hub and five videos per channel. This keeps runs affordable and predictable.
- Search returns about 20 channels per query. Add more queries to widen discovery;
maxChannelsis the hard ceiling. - TikTok bios are not a core source. Anonymous TikTok pages are frequently replaced by a challenge page. Instagram/TikTok links are still returned in
linksandsocials, but the email cascade focuses on sources that are reliably public. - Subscriber counts are rounded to YouTube's public display value.
- Countries can be missing for some brand or very small channels; the field is omitted rather than guessed.
- Websites that expose contact only through a form cannot yield an email.
FAQ
Does this actor bypass CAPTCHAs or log in to YouTube? No. It reads public pages anonymously. When a page is blocked or challenged, that channel gets a clear error record and the run continues.
Why is hasHiddenEmail true but primaryEmail missing?
YouTube only shows the native business address to signed-in users. The flag means the address exists, but it is not public. The actor does not invent or scrape it.
Are emails validated or checked for deliverability? No. The actor reports addresses exactly as published, with provenance. Validate with your own email-verification step before outreach.
What happens to duplicate channels or emails? Duplicate channels (by ID/URL) are processed once. Duplicate emails are merged, keeping the first/highest-priority source.
Can I restrict results to one domain?
Yes. Use emailDomains, for example ["gmail.com"] or ["brand.com"]. Subdomains are included.
What if a channel has no email?
The channel record is still returned with metadata (unless onlyWithEmail is on). This is useful for spotting channels that have a hidden gate.
Is this affiliated with YouTube? No. This is an independent third-party tool that reads publicly available pages. You are responsible for complying with YouTube's terms and applicable outreach/privacy laws.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build UaThvrincu7zNKHUy. Documentation is regenerated from the default published build; private drafts are not included.