{
  "data": {
    "id": "UaThvrincu7zNKHUy",
    "actId": "iUDQnZLC66Ye2jePm",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-10-26T16:19:18.401Z",
    "finishedAt": "2026-10-26T16:19:30.635Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 12125,
      "runTimeSecs": 12.125,
      "computeUnits": 0.013472222222222222,
      "imageSizeBytes": 371033088
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"YouTube Email Scraper Input\",\n  \"description\": \"Find publicly listed contact emails for YouTube channels and creators.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"Choose whether to scrape the channels you provide or discover channels from search queries.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"channels\",\n        \"search\"\n      ],\n      \"enumTitles\": [\n        \"Paste channels\",\n        \"Search YouTube\"\n      ],\n      \"default\": \"channels\",\n      \"prefill\": \"channels\"\n    },\n    \"channels\": {\n      \"title\": \"Channels\",\n      \"type\": \"array\",\n      \"description\": \"YouTube channel URLs, @handles, UC... channel IDs, or video URLs (mode=channels). Video URLs resolve to their channel.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"@mkbhd\",\n        \"@LinusTechTips\"\n      ]\n    },\n    \"searchQueries\": {\n      \"title\": \"Search queries\",\n      \"type\": \"array\",\n      \"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.\",\n      \"editor\": \"stringList\"\n    },\n    \"maxChannels\": {\n      \"title\": \"Max channels\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of unique channels processed per run, across both modes.\",\n      \"default\": 100,\n      \"prefill\": 2,\n      \"minimum\": 1,\n      \"maximum\": 500\n    },\n    \"includeWebsite\": {\n      \"title\": \"Scan linked websites and link hubs\",\n      \"type\": \"boolean\",\n      \"description\": \"Visit up to two linked websites (home, contact/about pages and common paths) and one link-in-bio hub per channel.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"includeVideoDescriptions\": {\n      \"title\": \"Scan recent video descriptions\",\n      \"type\": \"boolean\",\n      \"description\": \"Read the descriptions of the latest five videos on each channel.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"onlyWithEmail\": {\n      \"title\": \"Only channels with a public email\",\n      \"type\": \"boolean\",\n      \"description\": \"When enabled, channels with no public email are left out of the dataset. Error records are still reported.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"emailDomains\": {\n      \"title\": \"Email domain allowlist\",\n      \"type\": \"array\",\n      \"description\": \"Optional list of domains to keep, for example brand.com or gmail.com. Leave empty to keep every discovered email.\",\n      \"editor\": \"stringList\"\n    },\n    \"maxEmailsPerChannel\": {\n      \"title\": \"Max emails per channel\",\n      \"type\": \"integer\",\n      \"description\": \"Upper bound on the emails returned for each channel. The highest-value public contact is chosen as primaryEmail.\",\n      \"default\": 5,\n      \"prefill\": 5,\n      \"minimum\": 1,\n      \"maximum\": 20\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy configuration\",\n      \"type\": \"object\",\n      \"description\": \"Optional. The actor works without a proxy; set this only when your runs need a specific Apify Proxy connection.\",\n      \"editor\": \"proxy\"\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# YouTube Channel Contact Email Finder\n\nBuild 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.\n\nNo login, cookies, API key, or CAPTCHA solving required.\n\n## What this actor does\n\n- Accepts channel URLs, `@handles`, `UC...` channel IDs, and video URLs (the channel is resolved from the video).\n- Discovers channels from one or more keyword searches (about 20 channels per query).\n- Reads the About page through `ytInitialData.aboutChannelViewModel`: name, handle, channel ID, subscriber count, country, description, and links.\n- Unwraps YouTube's `/redirect?q=...` link wrapper, so you get the real website and social URLs.\n- Runs a bounded email cascade:\n  1. channel About description;\n  2. up to two linked websites (home, contact/about pages, and common paths such as `/contact` and `/about`);\n  3. the latest five video descriptions;\n  4. one linked link-in-bio hub (Linktree, Beacons, and similar).\n- Deduplicates emails, filters placeholder/asset/no-reply noise, ranks role mailboxes, and returns the best address as `primaryEmail`.\n- 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.\n- Omits empty fields from every record.\n\n## Input\n\n| Field | Type | Default | Description |\n| --- | --- | --- | --- |\n| `mode` | select | `channels` | `channels` scrapes the list you provide; `search` discovers channels from `searchQueries`. |\n| `channels` | array | – | Channel URLs, `@handles`, `UC...` IDs, or video URLs (mode=channels). |\n| `searchQueries` | array | – | Keywords for channel discovery (mode=search). Each query yields about 20 channels. |\n| `maxChannels` | integer | `100` | Maximum unique channels per run, 1–500. |\n| `includeWebsite` | boolean | `true` | Scan up to two linked websites and one link-in-bio hub per channel. |\n| `includeVideoDescriptions` | boolean | `true` | Read descriptions of the latest five videos per channel. |\n| `onlyWithEmail` | boolean | `false` | Drop channel records that have no public email. Error records are still reported. |\n| `emailDomains` | array | – | Optional allowlist such as `[\"brand.com\", \"gmail.com\"]`. Matching is case-insensitive and includes subdomains. |\n| `maxEmailsPerChannel` | integer | `5` | Cap after ranking, 1–20. |\n| `proxyConfiguration` | object | – | Optional Apify Proxy override. The actor works without a proxy. |\n\n### Example: channels\n\n```json\n{\n  \"mode\": \"channels\",\n  \"channels\": [\n    \"@mkbhd\",\n    \"@LinusTechTips\",\n    \"https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ\",\n    \"https://www.youtube.com/watch?v=DN953UW8iJ8\"\n  ],\n  \"maxChannels\": 10,\n  \"includeWebsite\": true,\n  \"includeVideoDescriptions\": true,\n  \"onlyWithEmail\": false,\n  \"maxEmailsPerChannel\": 5\n}\n```\n\n### Example: keyword search\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"home espresso\", \"personal finance\"],\n  \"maxChannels\": 30,\n  \"includeWebsite\": true,\n  \"includeVideoDescriptions\": true,\n  \"onlyWithEmail\": true,\n  \"emailDomains\": [\"gmail.com\", \"outlook.com\"]\n}\n```\n\n## Output\n\nOne record per channel. Fields with no value are omitted.\n\n```json\n{\n  \"recordType\": \"channel\",\n  \"channelId\": \"UCBJycsmduvYEL83R_U4JriQ\",\n  \"handle\": \"@mkbhd\",\n  \"name\": \"Marques Brownlee\",\n  \"url\": \"https://www.youtube.com/@mkbhd\",\n  \"subscriberCount\": 21400000,\n  \"country\": \"United States\",\n  \"description\": \"MKBHD: Quality Tech Videos... business@MKBHD.com\",\n  \"links\": [\n    {\"title\": \"Twitter\", \"url\": \"https://twitter.com/MKBHD\", \"type\": \"social\"},\n    {\"title\": \"Instagram\", \"url\": \"https://instagram.com/MKBHD\", \"type\": \"social\"}\n  ],\n  \"socials\": {\n    \"x\": \"https://twitter.com/MKBHD\",\n    \"instagram\": \"https://instagram.com/MKBHD\"\n  },\n  \"emails\": [\n    {\n      \"email\": \"business@mkbhd.com\",\n      \"source\": \"channel_description\",\n      \"sourceUrl\": \"https://www.youtube.com/@mkbhd/about\"\n    }\n  ],\n  \"primaryEmail\": \"business@mkbhd.com\",\n  \"emailSource\": \"channel_description\",\n  \"hasHiddenEmail\": true,\n  \"sourceUrl\": \"https://www.youtube.com/@mkbhd/about\",\n  \"scrapedAt\": \"2026-10-26T12:00:00+00:00\"\n}\n```\n\n**Field notes**\n\n- `recordType` – `channel` for a contact record, `error` for a failed input/search.\n- `channelId` / `handle` / `name` / `url` – stable channel identity. `url` is the canonical channel URL.\n- `subscriberCount` – expanded from YouTube's displayed label (`21.4M` becomes `21400000`; approximate for large channels).\n- `country` – the country shown in the About panel.\n- `description` – the full About description.\n- `links` – every external link with a title, absolute URL, and `type` (`website`, `social`, or `link_hub`).\n- `socials` – one URL per recognised platform (`x`, `instagram`, `tiktok`, `facebook`, `linkedin`, `discord`, `twitch`, `patreon`, `telegram`, `threads`, `spotify`, `github`, and more).\n- `websiteCandidate` – the first non-social, non-hub linked website.\n- `emails` – deduplicated and ranked email objects. `source` tells you where the address came from; `sourceUrl` points at the exact page.\n- `primaryEmail` / `emailSource` – the highest-value public address and its source.\n- `hasHiddenEmail` – `true` when the About page shows YouTube's `Sign in to see email address` gate. The actor cannot read that address without login, so it does not pretend to.\n- `sourceUrl` / `scrapedAt` – canonical About page and UTC timestamp.\n\n**Email sources**\n\n| `source` | Where the address was found |\n| --- | --- |\n| `channel_description` | The channel's About description. |\n| `website` | A linked website page (home, contact/about page, or common path). |\n| `video_description` | One of the latest five video descriptions. |\n| `link_hub` | A Linktree/Beacons-style link-in-bio page. |\n\n### Error record\n\n```json\n{\n  \"recordType\": \"error\",\n  \"reason\": \"not_found\",\n  \"message\": \"Channel page returned 404.\",\n  \"input\": \"https://www.youtube.com/@missing-handle\",\n  \"sourceUrl\": \"https://www.youtube.com/@missing-handle/about\",\n  \"scrapedAt\": \"2026-10-26T12:00:00+00:00\"\n}\n```\n\n`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.\n\n## How the email cascade works\n\n1. **Channel description first.** This is the creator-authored text on the About page and the highest-signal source.\n2. **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.\n3. **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.\n4. **One link hub.** Linktree, Beacons, and similar pages are read for public addresses.\n\nAll 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.\n\n## Limits and honest limitations\n\n- **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 `hasHiddenEmail` and never claims the gated value. Treat `hasHiddenEmail: true` plus no `emails` as a real lead that needs manual or logged-in follow-up.\n- **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.\n- **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.\n- **Search returns about 20 channels per query.** Add more queries to widen discovery; `maxChannels` is the hard ceiling.\n- **TikTok bios are not a core source.** Anonymous TikTok pages are frequently replaced by a challenge page. Instagram/TikTok links are still returned in `links` and `socials`, but the email cascade focuses on sources that are reliably public.\n- **Subscriber counts are rounded** to YouTube's public display value.\n- **Countries can be missing** for some brand or very small channels; the field is omitted rather than guessed.\n- **Websites that expose contact only through a form** cannot yield an email.\n\n## FAQ\n\n**Does this actor bypass CAPTCHAs or log in to YouTube?**\nNo. It reads public pages anonymously. When a page is blocked or challenged, that channel gets a clear error record and the run continues.\n\n**Why is `hasHiddenEmail` true but `primaryEmail` missing?**\nYouTube 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.\n\n**Are emails validated or checked for deliverability?**\nNo. The actor reports addresses exactly as published, with provenance. Validate with your own email-verification step before outreach.\n\n**What happens to duplicate channels or emails?**\nDuplicate channels (by ID/URL) are processed once. Duplicate emails are merged, keeping the first/highest-priority source.\n\n**Can I restrict results to one domain?**\nYes. Use `emailDomains`, for example `[\"gmail.com\"]` or `[\"brand.com\"]`. Subdomains are included.\n\n**What if a channel has no email?**\nThe channel record is still returned with metadata (unless `onlyWithEmail` is on). This is useful for spotting channels that have a hidden gate.\n\n**Is this affiliated with YouTube?**\nNo. 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.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "youtube-channel-contact-email-finder",
      "title": "YouTube Channel Contact Email Finder",
      "description": "Find publicly listed contact emails for YouTube channels by scanning About pages, linked websites, recent video descriptions, and link hubs. Supports channel URLs, @handles, channel IDs, video URLs, and keyword search. No login or API key needed.",
      "version": "2.0",
      "buildTag": "latest",
      "input": {
        "title": "YouTube Email Scraper Input",
        "description": "Find publicly listed contact emails for YouTube channels and creators.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "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"
            ],
            "default": "channels",
            "prefill": "channels"
          },
          "channels": {
            "title": "Channels",
            "type": "array",
            "description": "YouTube channel URLs, @handles, UC... channel IDs, or video URLs (mode=channels). Video URLs resolve to their channel.",
            "editor": "stringList",
            "prefill": [
              "@mkbhd",
              "@LinusTechTips"
            ]
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "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"
          },
          "maxChannels": {
            "title": "Max channels",
            "type": "integer",
            "description": "Maximum number of unique channels processed per run, across both modes.",
            "default": 100,
            "prefill": 2,
            "minimum": 1,
            "maximum": 500
          },
          "includeWebsite": {
            "title": "Scan linked websites and link hubs",
            "type": "boolean",
            "description": "Visit up to two linked websites (home, contact/about pages and common paths) and one link-in-bio hub per channel.",
            "default": true,
            "prefill": true
          },
          "includeVideoDescriptions": {
            "title": "Scan recent video descriptions",
            "type": "boolean",
            "description": "Read the descriptions of the latest five videos on each channel.",
            "default": true,
            "prefill": true
          },
          "onlyWithEmail": {
            "title": "Only channels with a public email",
            "type": "boolean",
            "description": "When enabled, channels with no public email are left out of the dataset. Error records are still reported.",
            "default": false,
            "prefill": false
          },
          "emailDomains": {
            "title": "Email domain allowlist",
            "type": "array",
            "description": "Optional list of domains to keep, for example brand.com or gmail.com. Leave empty to keep every discovered email.",
            "editor": "stringList"
          },
          "maxEmailsPerChannel": {
            "title": "Max emails per channel",
            "type": "integer",
            "description": "Upper bound on the emails returned for each channel. The highest-value public contact is chosen as primaryEmail.",
            "default": 5,
            "prefill": 5,
            "minimum": 1,
            "maximum": 20
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. The actor works without a proxy; set this only when your runs need a specific Apify Proxy connection.",
            "editor": "proxy"
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "YouTube Channel Contact Email Finder Output",
        "description": "Dataset of YouTube channel contact records with channel metadata, public emails and their sources, links, socials, and hidden-email flags.",
        "properties": {
          "channels": {
            "type": "string",
            "title": "YouTube channel contacts",
            "description": "Dataset containing all scraped YouTube channel contact records.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Overview",
              "description": "Channel metadata and public contact emails, with provenance.",
              "transformation": {
                "fields": [
                  "channelId",
                  "handle",
                  "name",
                  "url",
                  "subscriberCount",
                  "country",
                  "primaryEmail",
                  "emailSource",
                  "emails",
                  "hasHiddenEmail",
                  "websiteCandidate",
                  "links",
                  "socials",
                  "sourceUrl",
                  "scrapedAt",
                  "recordType"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "channelId": {
                    "label": "Channel ID"
                  },
                  "handle": {
                    "label": "Handle"
                  },
                  "name": {
                    "label": "Channel name"
                  },
                  "url": {
                    "label": "Channel URL",
                    "format": "link"
                  },
                  "subscriberCount": {
                    "label": "Subscribers",
                    "format": "number"
                  },
                  "country": {
                    "label": "Country"
                  },
                  "primaryEmail": {
                    "label": "Primary email"
                  },
                  "emailSource": {
                    "label": "Email source"
                  },
                  "emails": {
                    "label": "All emails",
                    "format": "array"
                  },
                  "hasHiddenEmail": {
                    "label": "Hidden email gate",
                    "format": "boolean"
                  },
                  "websiteCandidate": {
                    "label": "Website",
                    "format": "link"
                  },
                  "links": {
                    "label": "Links",
                    "format": "array"
                  },
                  "socials": {
                    "label": "Socials",
                    "format": "object"
                  },
                  "sourceUrl": {
                    "label": "About page",
                    "format": "link"
                  },
                  "scrapedAt": {
                    "label": "Scraped at",
                    "format": "date"
                  },
                  "recordType": {
                    "label": "Record type"
                  }
                }
              }
            }
          }
        }
      },
      "readme": "# YouTube Channel Contact Email Finder\n\nBuild 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.\n\nNo login, cookies, API key, or CAPTCHA solving required.\n\n## What this actor does\n\n- Accepts channel URLs, `@handles`, `UC...` channel IDs, and video URLs (the channel is resolved from the video).\n- Discovers channels from one or more keyword searches (about 20 channels per query).\n- Reads the About page through `ytInitialData.aboutChannelViewModel`: name, handle, channel ID, subscriber count, country, description, and links.\n- Unwraps YouTube's `/redirect?q=...` link wrapper, so you get the real website and social URLs.\n- Runs a bounded email cascade:\n  1. channel About description;\n  2. up to two linked websites (home, contact/about pages, and common paths such as `/contact` and `/about`);\n  3. the latest five video descriptions;\n  4. one linked link-in-bio hub (Linktree, Beacons, and similar).\n- Deduplicates emails, filters placeholder/asset/no-reply noise, ranks role mailboxes, and returns the best address as `primaryEmail`.\n- 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.\n- Omits empty fields from every record.\n\n## Input\n\n| Field | Type | Default | Description |\n| --- | --- | --- | --- |\n| `mode` | select | `channels` | `channels` scrapes the list you provide; `search` discovers channels from `searchQueries`. |\n| `channels` | array | – | Channel URLs, `@handles`, `UC...` IDs, or video URLs (mode=channels). |\n| `searchQueries` | array | – | Keywords for channel discovery (mode=search). Each query yields about 20 channels. |\n| `maxChannels` | integer | `100` | Maximum unique channels per run, 1–500. |\n| `includeWebsite` | boolean | `true` | Scan up to two linked websites and one link-in-bio hub per channel. |\n| `includeVideoDescriptions` | boolean | `true` | Read descriptions of the latest five videos per channel. |\n| `onlyWithEmail` | boolean | `false` | Drop channel records that have no public email. Error records are still reported. |\n| `emailDomains` | array | – | Optional allowlist such as `[\"brand.com\", \"gmail.com\"]`. Matching is case-insensitive and includes subdomains. |\n| `maxEmailsPerChannel` | integer | `5` | Cap after ranking, 1–20. |\n| `proxyConfiguration` | object | – | Optional Apify Proxy override. The actor works without a proxy. |\n\n### Example: channels\n\n```json\n{\n  \"mode\": \"channels\",\n  \"channels\": [\n    \"@mkbhd\",\n    \"@LinusTechTips\",\n    \"https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ\",\n    \"https://www.youtube.com/watch?v=DN953UW8iJ8\"\n  ],\n  \"maxChannels\": 10,\n  \"includeWebsite\": true,\n  \"includeVideoDescriptions\": true,\n  \"onlyWithEmail\": false,\n  \"maxEmailsPerChannel\": 5\n}\n```\n\n### Example: keyword search\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"home espresso\", \"personal finance\"],\n  \"maxChannels\": 30,\n  \"includeWebsite\": true,\n  \"includeVideoDescriptions\": true,\n  \"onlyWithEmail\": true,\n  \"emailDomains\": [\"gmail.com\", \"outlook.com\"]\n}\n```\n\n## Output\n\nOne record per channel. Fields with no value are omitted.\n\n```json\n{\n  \"recordType\": \"channel\",\n  \"channelId\": \"UCBJycsmduvYEL83R_U4JriQ\",\n  \"handle\": \"@mkbhd\",\n  \"name\": \"Marques Brownlee\",\n  \"url\": \"https://www.youtube.com/@mkbhd\",\n  \"subscriberCount\": 21400000,\n  \"country\": \"United States\",\n  \"description\": \"MKBHD: Quality Tech Videos... business@MKBHD.com\",\n  \"links\": [\n    {\"title\": \"Twitter\", \"url\": \"https://twitter.com/MKBHD\", \"type\": \"social\"},\n    {\"title\": \"Instagram\", \"url\": \"https://instagram.com/MKBHD\", \"type\": \"social\"}\n  ],\n  \"socials\": {\n    \"x\": \"https://twitter.com/MKBHD\",\n    \"instagram\": \"https://instagram.com/MKBHD\"\n  },\n  \"emails\": [\n    {\n      \"email\": \"business@mkbhd.com\",\n      \"source\": \"channel_description\",\n      \"sourceUrl\": \"https://www.youtube.com/@mkbhd/about\"\n    }\n  ],\n  \"primaryEmail\": \"business@mkbhd.com\",\n  \"emailSource\": \"channel_description\",\n  \"hasHiddenEmail\": true,\n  \"sourceUrl\": \"https://www.youtube.com/@mkbhd/about\",\n  \"scrapedAt\": \"2026-10-26T12:00:00+00:00\"\n}\n```\n\n**Field notes**\n\n- `recordType` – `channel` for a contact record, `error` for a failed input/search.\n- `channelId` / `handle` / `name` / `url` – stable channel identity. `url` is the canonical channel URL.\n- `subscriberCount` – expanded from YouTube's displayed label (`21.4M` becomes `21400000`; approximate for large channels).\n- `country` – the country shown in the About panel.\n- `description` – the full About description.\n- `links` – every external link with a title, absolute URL, and `type` (`website`, `social`, or `link_hub`).\n- `socials` – one URL per recognised platform (`x`, `instagram`, `tiktok`, `facebook`, `linkedin`, `discord`, `twitch`, `patreon`, `telegram`, `threads`, `spotify`, `github`, and more).\n- `websiteCandidate` – the first non-social, non-hub linked website.\n- `emails` – deduplicated and ranked email objects. `source` tells you where the address came from; `sourceUrl` points at the exact page.\n- `primaryEmail` / `emailSource` – the highest-value public address and its source.\n- `hasHiddenEmail` – `true` when the About page shows YouTube's `Sign in to see email address` gate. The actor cannot read that address without login, so it does not pretend to.\n- `sourceUrl` / `scrapedAt` – canonical About page and UTC timestamp.\n\n**Email sources**\n\n| `source` | Where the address was found |\n| --- | --- |\n| `channel_description` | The channel's About description. |\n| `website` | A linked website page (home, contact/about page, or common path). |\n| `video_description` | One of the latest five video descriptions. |\n| `link_hub` | A Linktree/Beacons-style link-in-bio page. |\n\n### Error record\n\n```json\n{\n  \"recordType\": \"error\",\n  \"reason\": \"not_found\",\n  \"message\": \"Channel page returned 404.\",\n  \"input\": \"https://www.youtube.com/@missing-handle\",\n  \"sourceUrl\": \"https://www.youtube.com/@missing-handle/about\",\n  \"scrapedAt\": \"2026-10-26T12:00:00+00:00\"\n}\n```\n\n`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.\n\n## How the email cascade works\n\n1. **Channel description first.** This is the creator-authored text on the About page and the highest-signal source.\n2. **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.\n3. **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.\n4. **One link hub.** Linktree, Beacons, and similar pages are read for public addresses.\n\nAll 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.\n\n## Limits and honest limitations\n\n- **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 `hasHiddenEmail` and never claims the gated value. Treat `hasHiddenEmail: true` plus no `emails` as a real lead that needs manual or logged-in follow-up.\n- **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.\n- **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.\n- **Search returns about 20 channels per query.** Add more queries to widen discovery; `maxChannels` is the hard ceiling.\n- **TikTok bios are not a core source.** Anonymous TikTok pages are frequently replaced by a challenge page. Instagram/TikTok links are still returned in `links` and `socials`, but the email cascade focuses on sources that are reliably public.\n- **Subscriber counts are rounded** to YouTube's public display value.\n- **Countries can be missing** for some brand or very small channels; the field is omitted rather than guessed.\n- **Websites that expose contact only through a form** cannot yield an email.\n\n## FAQ\n\n**Does this actor bypass CAPTCHAs or log in to YouTube?**\nNo. It reads public pages anonymously. When a page is blocked or challenged, that channel gets a clear error record and the run continues.\n\n**Why is `hasHiddenEmail` true but `primaryEmail` missing?**\nYouTube 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.\n\n**Are emails validated or checked for deliverability?**\nNo. The actor reports addresses exactly as published, with provenance. Validate with your own email-verification step before outreach.\n\n**What happens to duplicate channels or emails?**\nDuplicate channels (by ID/URL) are processed once. Duplicate emails are merged, keeping the first/highest-priority source.\n\n**Can I restrict results to one domain?**\nYes. Use `emailDomains`, for example `[\"gmail.com\"]` or `[\"brand.com\"]`. Subdomains are included.\n\n**What if a channel has no email?**\nThe channel record is still returned with metadata (unless `onlyWithEmail` is on). This is useful for spotting channels that have a hidden gate.\n\n**Is this affiliated with YouTube?**\nNo. 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.\n"
    },
    "buildNumber": "2.0.1",
    "imageDigest": "34cff38f402ada8bb39a1becc3f1672c6a99f69601119810eb88bb892712099f",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "2.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.013472222222222222
    }
  }
}