# YouTube Channel Email Scraper - Business Emails, Socials (`om_kh/youtube-channel-email-scraper`) Actor

Find the public business email of any YouTube channel: from the channel bio or the creator's own website, MX-checked. Input @handles, channel URLs or keywords. Adds socials, country, subscribers and a hidden-email flag. $4 per 1,000 emails. No login.

- **URL**: https://apify.com/om\_kh/youtube-channel-email-scraper.md
- **Developed by:** [Khandji Omar](https://apify.com/om_kh) (community)
- **Categories:** Lead generation, Social media, Videos
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## YouTube Channel Email Scraper — Business Emails, Socials

> Get the **public business email** of any YouTube channel — from the channel bio or the
> creator's own website — **MX-checked**, with socials, country and subscribers. Paste
> @handles or channel URLs, or search by keyword. **$4 per 1,000 emails found.** No login,
> no cookies, no API key.

### What does this YouTube channel email scraper do?

For every channel you give it (or every channel YouTube's search returns for your
keywords), it opens the channel's About panel and:

1. reads the **business email written in the channel description**,
2. if there is none, opens the **creator's own website links** (home page and `/contact`)
   and picks up the public email shown there,
3. checks that the email's domain has a **working mail server** (`mx_valid`),
4. adds **social links** (Instagram, TikTok, X, Reddit, Discord...), website links,
   **country**, exact **subscribers**, total views, video count and join date,
5. tells you whether the channel also has an email **hidden behind YouTube's "View email
   address" button** (`hasHiddenEmail`) — so you know where a manual check is worth it.

Emails are never guessed and YouTube's protected button is never bypassed.

### Why use it

1. **More emails than bio-only tools.** The website fallback finds emails that are not in
   the bio (in our test, Veritasium's contact address came from their website).
2. **Pay for results.** $0.004 per email found + $0.0005 per channel checked. No start fee,
   no per-search fee. Up to 10 channels of every run are free (at most half of the run).
3. **Keywords or a list.** Build a list from a niche ("home workout", "personal finance")
   with subscriber filters, or enrich a list of channels you already have.
4. **Verification you can filter on.** `emailVerification` = `mx_valid` (domain receives
   mail) or `published`.
5. **API, n8n, Make, Zapier and MCP ready.**

### How to use it in 3 steps

1. Click **Try for free** — two channels and one keyword are prefilled.
2. Add your channels (URLs, @handles or UC IDs) and/or keywords. Optional: subscriber range,
   country, "Only output channels with an email".
3. Click **Start** and download JSON, CSV or Excel.

### Input

| Field | What it does |
|---|---|
| `channels` | Channel URLs, @handles or channel IDs. |
| `searchTerms` | Optional keywords — runs YouTube's channel search (up to 20 keywords). |
| `maxChannelsPerSearch` | 1 to 500 channels per keyword. Default 50. |
| `minSubscribers` / `maxSubscribers` | Optional size filter for keyword search. |
| `country` | Optional: keep only channels from this country. |
| `followWebsites` | Look on the creator's website when the bio has no email. Default on. |
| `onlyWithEmail` | Only write channels that have an email. Default off. |
| `maxTotalChargeUsd` | Optional hard cost cap for the run. |

```json
{
  "searchTerms": ["personal finance"],
  "maxChannelsPerSearch": 200,
  "minSubscribers": 10000,
  "maxSubscribers": 500000,
  "country": "United States",
  "onlyWithEmail": true
}
```

### Output

One row per channel. Real example (email masked):

```json
{
  "channelId": "UCBJycsmduvYEL83R_U4JriQ",
  "title": "Marques Brownlee",
  "handle": "@mkbhd",
  "channelUrl": "https://www.youtube.com/@mkbhd",
  "email": "bxxxxxxx@mkbhd.com",
  "emailFoundIn": "channel_bio",
  "emailSource": "https://www.youtube.com/@mkbhd",
  "emailVerification": "mx_valid",
  "hasHiddenEmail": true,
  "subscribers": 21300000,
  "country": "United States",
  "totalViews": 5710211857,
  "videoCount": 1854,
  "joinedAt": "2008-03-21",
  "socialLinks": ["https://twitter.com/MKBHD", "https://instagram.com/MKBHD", "https://reddit.com/r/MKBHD", "https://discord.gg/MKBHD"],
  "websiteLinks": [],
  "status": "ok"
}
```

`emailFoundIn` is `channel_bio` or `website`. Channels without a public email have
`email: null` — check `hasHiddenEmail` to see if YouTube holds one behind its button.

In a live test on 17 channels (2 named channels + the keyword "home workout"), the Actor
returned in 16 seconds: 4 public emails (all `mx_valid`), the country for 14 channels and
the hidden-email flag for 11.

### How much does it cost?

| Event | Price |
|---|---|
| Channel checked | **$0.0005** ($0.50 per 1,000) |
| Email found | **+$0.004** ($4 per 1,000) |
| Start fee / search fee | none |

Example: 1,000 channels checked with 250 emails found = $0.50 + $1.00 = **$1.50**.
Up to 10 channels of every run are free (at most half of the run). Paid Apify plans get lower tier prices.

### Use cases

- **Influencer marketing and sponsorships** — contact list of creators in your niche.
- **Agencies and brand deals** — enrich the channels you already track with emails and socials.
- **B2B prospecting** — creators and media companies publishing a business contact.
- **Partnerships and PR** — reach channels in a country or size range.

### Use it from code (API)

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("om_kh/youtube-channel-email-scraper").call(run_input={
    "channels": ["@mkbhd", "@veritasium"],
    "searchTerms": ["home workout"],
    "onlyWithEmail": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["email"], item["emailVerification"])
```

**cURL**

```bash
curl -X POST "https://api.apify.com/v2/acts/om_kh~youtube-channel-email-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"channels": ["@mkbhd"], "followWebsites": true}'
```

### Integrations: n8n, Make, Zapier, Google Sheets, CRM

Use the Apify app in n8n, Make or Zapier to push new emails to HubSpot, Pipedrive, Airtable
or Google Sheets.

### Use it from an AI agent (MCP)

Connect Claude, Cursor or any MCP client to `https://mcp.apify.com` and add
`om_kh/youtube-channel-email-scraper` as a tool: "find the business emails of the top
fitness channels in Canada".

### Tips and limits

- Hit rate depends on the niche: business-oriented niches publish more emails.
- The website fallback reads at most 2 of the creator's sites (home + `/contact`) and skips
  link hubs (Linktree, Beacons) and marketplaces.
- Emails hidden behind YouTube's "View email address" button require a signed-in human and a
  CAPTCHA; this Actor does not bypass it and flags those channels with `hasHiddenEmail`.

### FAQ

**Is it legal?**
It reads public information that creators publish for business contact. You are responsible
for how you contact them — follow the anti-spam law that applies to you (CAN-SPAM, GDPR...).

**Do I need a YouTube account or API key?**
No.

**Why is `email` empty while `hasHiddenEmail` is true?**
The creator only shares the email through YouTube's protected button, not publicly.

**Can I get channels from one country only?**
Yes, set `country`.

### Related Actors

- [YouTube Channel Search Scraper - Subscribers, Emails](https://apify.com/om_kh/youtube-channel-search-scraper) — the full channel list for a keyword, $0.50 per 1,000.
- [YouTube Creator Lead Finder - Views, Niche, Email](https://apify.com/om_kh/youtube-creator-lead-finder) — only active, qualified creators with median views.
- [Business Email Finder API - Verify, Score, Confidence](https://apify.com/om_kh/vigia-lead-quality-api) — public emails from any company website.

# Actor input Schema

## `channels` (type: `array`):

YouTube channel URLs, @handles or channel IDs (UC...), one per line.

## `searchTerms` (type: `array`):

Optional keywords: the Actor runs YouTube's channel search and checks every channel found (up to 20 keywords).

## `maxChannelsPerSearch` (type: `integer`):

1 to 500. Default 50.

## `minSubscribers` (type: `integer`):

Optional, keyword search only: skip channels below this size.

## `maxSubscribers` (type: `integer`):

Optional, keyword search only: skip channels above this size (micro-influencers).

## `country` (type: `string`):

Optional: keep only channels whose About page shows this country (e.g. United States, France).

## `followWebsites` (type: `boolean`):

When the bio has no email, open the creator's own website links (home and /contact page) to find a public email. Default on.

## `onlyWithEmail` (type: `boolean`):

Hide checked channels without a public email from the results. They are still counted as checked.

## `maxTotalChargeUsd` (type: `number`):

Optional hard cost cap for this run.

## Actor input object example

```json
{
  "channels": [
    "https://www.youtube.com/@mkbhd",
    "@veritasium"
  ],
  "searchTerms": [
    "home workout"
  ],
  "maxChannelsPerSearch": 15,
  "followWebsites": true,
  "onlyWithEmail": false
}
```

# Actor output Schema

## `report` (type: `string`):

A visual summary of delivery, charges, and source issues.

## `results` (type: `string`):

Channels and emails in a sortable table. No JSON knowledge required.

## `csv` (type: `string`):

Results ready for spreadsheets, CRMs, and analytics tools.

## `excel` (type: `string`):

Results as an Excel workbook for non-technical teams.

## `runSummary` (type: `string`):

Machine-readable delivery, billing, and source diagnostics.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "channels": [
        "https://www.youtube.com/@mkbhd",
        "@veritasium"
    ],
    "searchTerms": [
        "home workout"
    ],
    "maxChannelsPerSearch": 15
};

// Run the Actor and wait for it to finish
const run = await client.actor("om_kh/youtube-channel-email-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "channels": [
        "https://www.youtube.com/@mkbhd",
        "@veritasium",
    ],
    "searchTerms": ["home workout"],
    "maxChannelsPerSearch": 15,
}

# Run the Actor and wait for it to finish
run = client.actor("om_kh/youtube-channel-email-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "channels": [
    "https://www.youtube.com/@mkbhd",
    "@veritasium"
  ],
  "searchTerms": [
    "home workout"
  ],
  "maxChannelsPerSearch": 15
}' |
apify call om_kh/youtube-channel-email-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,om_kh/youtube-channel-email-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ve022rFtcqoajH1f1/builds/bFzk5ABfraCO3Jgzf/openapi.json
