# YouTube Creator Contact Finder (`nexgendata/youtube-creator-contact-finder`) Actor

Extract YouTube creator/channel business contact info (public emails + links + channel metrics) for influencer/brand outreach.

- **URL**: https://apify.com/nexgendata/youtube-creator-contact-finder.md
- **Developed by:** [NexGenData](https://apify.com/nexgendata) (community)
- **Categories:** Lead generation, Social media
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $30.00 / 1,000 channel scanneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## 📧 YouTube Creator Contact Finder — MX-Verified Business Emails for Creator Outreach

Build YouTube creator-outreach lists in minutes. Give this actor a list of channel handles, URLs, or IDs and it returns one clean record per channel — channel name, subscriber count, total views, video count, country — plus the creator's **published business contact email**, pulled from both the **channel description** and the **creator's listed website**, and **MX-verified** before it lands in your dataset. No login, no YouTube Data API key, no manual channel-by-channel copy-paste. Optional one-run delivery straight to your **Notion CRM**.

It uses **only public channel data** and the contact details creators publish themselves. It deliberately does **not** touch YouTube's captcha-gated "View email address" button — no bot-gate bypass, no ToS gray area.

### 📊 Sample Output

[![YouTube Creator Contact Finder sample output — public YouTube channels enriched with MX-verified business contact emails, subscriber counts, country, and email source (channel description or creator-listed website) for creator outreach and B2B lead generation](https://api.apify.com/v2/key-value-stores/8gLgXMBveEI1tTz1z/records/youtube-creator-contact-sample)](https://apify.com/nexgendata/youtube-creator-contact-finder?fpr=2ayu9b)

Real channels returned by this actor — every email below was **MX-verified** in the same run:

| Channel | Subscribers | Country | Verified Business Email | Source |
|---|---|---|---|---|
| Marques Brownlee | 21.0M | United States | business@mkbhd.com | description |
| Linus Tech Tips | 16.8M | Canada | partnerships@linusmediagroup.com | description |
| Veritasium | 20.8M | United States | info@snatoms.com | channel link |
| Binging with Babish | 10.5M | United States | bingingwithbabish@gmail.com | channel link |
| Peter McKinnon | 6.01M | Canada | sales@petermckinnon.com | channel link |
| The Verge | 3.51M | United States | sales@voxmedia.com | channel link |

> Four of the six emails above were only reachable by **resolving the creator's listed website** — a description-only regex scraper would have missed them. The actor reads the inline-description email *and* follows the channel's listed links to find the address the creator actually publishes for business.

### ⚖️ vs the alternatives

| | NexGenData YouTube Creator Contact Finder | apizy (channel stats scraper) | jurassic_jove |
|---|---|---|---|
| Email source | **Description + creator-listed website** | Stats + basic contact | Description + website visit |
| Email validation | **MX-verified** (real mail server, not just regex) | Regex match | Regex match |
| Channel metrics | **Subs, views, videos, country** | Subs, views | Limited |
| One-run CRM delivery | **Built-in Notion connector** | No | No |
| Login / API key | **None** | None | None |
| Pricing model | Flat per-channel, emails included | ~$0.005 / channel | $0.04 per email found (pay-on-hit) |
| Output | Flat typed fields, ready for outreach | Channel stats | Profile + email |

Most teams pick this actor not because it's the cheapest per-channel line item, but because the emails are **MX-verified** (your outreach list isn't full of dead addresses), it resolves the **creator's listed website** (where a lot of creators actually park their business email), and it can drop the whole enriched list straight into your **Notion CRM** in one run. Pay-on-hit email tools can run up the bill on viral niches; here it's a **flat per-channel rate with emails included**, so your cost is predictable whether a channel has one email or none. It's a quality + workflow bundle, not a race to the bottom.

### What you get

Per channel, a flat, typed record:

- **Identity** — `channel_name`, `handle`, `channel_id`, `channel_url`
- **Audience** — `subscriber_count`, `view_count`, `video_count`
- **Classification** — `country`, `description`
- **Links** — `links[]` (every link the creator lists, with title + URL)
- **Contact** — `emails[]` (all addresses found), `primary_email`, `email_source` (`description` / `channel_link` / `none`), `email_verified` (MX check)
- **Status** — `status` (`ok` / `no_email` / `not_found` / error)

> Records produced by **keyword discovery** carry the exact same schema as records from an explicit channel list — discovery only changes *how the channel list is built*, not what you get back.

### Two ways to use it

You can either **hand it a channel list** (handles / URLs / IDs) or let it **discover creators by niche** — or both at once. Discovery is the list-builder: give it a topic and it searches YouTube for matching channels, then runs them through the same email-enrichment pipeline. Every discovered channel is deduped, and `maxCreators` is a hard cap so a broad search can never blow up your cost.

#### Input fields

| Field | Type | What it does |
|---|---|---|
| `channels` | array | Explicit channels to enrich — `@handles`, channel URLs, or `UC...` IDs. Optional. |
| `searchKeywords` | array | **Discovery mode.** Niche/topic phrases to search YouTube for (e.g. `"home barista"`). The actor collects matching channels and enriches them. Optional. |
| `maxCreators` | int | **Hard cap** on how many channels discovery collects + scans in total (1–500). Keeps discovery cost predictable. |
| `maxChannels` | int | Hard cap for the explicit-list path when you are *not* using discovery (1–500). |
| `followChannelLinks` | bool | Resolve creator-listed websites for emails (the main yield path). Default on. |
| `proxyConfiguration` | object | Apify proxy (datacenter default, residential auto-fallback). |
| `notionConnector` / `notionParentId` | string | Optional one-run delivery to your Notion workspace. |

Provide `channels`, `searchKeywords`, or both — at least one is required.

### Sample inputs

**1. Discover creators by niche (list-builder)**
```json
{ "searchKeywords": ["home barista", "specialty coffee roaster"], "maxCreators": 8 }
````

The actor searches YouTube for channels in each niche, collects up to 8 unique creators, and finds their business emails.

**2. Enrich a hand-picked channel list (handles)**

```json
{ "channels": ["mkbhd", "LinusTechTips", "veritasium"], "maxChannels": 50 }
```

**3. Combine discovery with explicit handles (deduped)**

```json
{ "searchKeywords": ["indie game dev"], "channels": ["mkbhd"], "maxCreators": 25 }
```

**4. Mix of full channel URLs and channel IDs**

```json
{ "channels": ["https://www.youtube.com/@PeterMcKinnon", "UCJHA_jMfCvEnv-3kRjTCQXw"], "maxChannels": 25 }
```

**5. Discover and deliver straight to your Notion CRM**

```json
{ "searchKeywords": ["vegan meal prep"], "maxCreators": 50, "notionConnector": "your-notion-mcp-connector" }
```

### 📄 Sample record (JSON)

One representative record straight from a live run:

```json
{
  "channel_name": "Marques Brownlee",
  "handle": "@mkbhd",
  "channel_id": "UCBJycsmduvYEL83R_U4JriQ",
  "subscriber_count": 21000000,
  "video_count": 1828,
  "view_count": 5445338889,
  "country": "United States",
  "description": "Quality Tech Videos | YouTuber | Geek | Consumer Electronics | Tech Head | Internet Personality!",
  "links": [
    { "title": "Twitter", "url": "twitter.com/MKBHD" },
    { "title": "Instagram", "url": "instagram.com/MKBHD" },
    { "title": "The Studio", "url": "youtube.com/c/TheStudio" }
  ],
  "emails": ["business@mkbhd.com"],
  "primary_email": "business@mkbhd.com",
  "email_source": "description",
  "email_verified": true,
  "status": "ok",
  "channel_url": "https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ"
}
```

### ⚙️ How it works

1. **`ytInitialData` parse** — each channel's public About/home page is fetched and the actor reads the channel fields straight from the page's embedded **`ytInitialData`** JSON — subscriber count, view count, video count, country, description, and every link the creator lists. No brittle DOM scraping, low compute.
2. **Description email regex + deobfuscation** — it scans the channel description for email addresses, including common obfuscations creators use to dodge bots (`name [at] domain [dot] com`, spaced/character-swapped variants), and normalizes them back to real addresses.
3. **Creator-listed website resolution** — when there's no inline-description email but the channel lists a website, the actor resolves that page and extracts emails from it. This is where a lot of creators actually publish their business contact, so it materially raises yield.
4. **MX verification** — every candidate email is checked against the domain's real mail servers (MX records) before it's marked `email_verified: true`, so your outreach list isn't full of typo'd or dead addresses. It does not send a test email.

> **Public data only.** This actor reads the same public channel page anyone can open in a browser, plus the contact email the creator chose to publish. It does **not** click YouTube's captcha-gated "View email address" button and does **not** attempt any bot-gate or login bypass.

### 📈 Yield — set the right expectation

Not every creator publishes a reachable business email — that's a property of YouTube, not the scraper. In practice roughly **40–67%** of scanned channels have a reachable, MX-verified business email (description or listed website), depending on the niche — tech, business, and media channels tend to publish one; gaming and personal vlogs less often. The rest come back with `status: no_email`. You pay the **flat per-channel rate** for every channel scanned, and the **emails are included at no extra charge** — you're never billed extra for a hit. Channels with no published email still return full audience + metrics + links data, which is useful on its own.

### 💰 Pricing example

- **Actor start:** $0.02
- **Per channel scanned:** $0.03 (flat — emails included, no per-email surcharge)

A **100-channel run = $0.02 + (100 × $0.03) = $3.02**. A quick 25-channel test = $0.77. No monthly minimum, no seats, no per-email upcharge. You pay for channels scanned, whether or not each one publishes an email.

### ⚖️ Legal & ToS

This actor reads **only public YouTube channel data** and the **business contact emails creators themselves publish** in their channel description or on the website they list — exactly so brands and agencies can reach them. It does not access private account data, comments behind authentication, or anything behind a login, and it does not attempt to bypass YouTube's captcha-gated business-email gate. The intended use case is **B2B creator / influencer outreach** — reaching creators who have invited business contact. You are responsible for using the output in line with YouTube's terms, anti-spam laws (e.g. CAN-SPAM, GDPR), and your local regulations.

### 🔗 Related Actors

Pair this with the rest of the NexGenData lead-gen & outreach stack:

- [📧 TikTok Creator Email Finder — MX-Verified Influencer Emails](https://apify.com/nexgendata/tiktok-creator-email-finder?fpr=2ayu9b) — same playbook for TikTok: bio + link-in-bio, MX-verified
- [📍 Google Maps Extractor — Local Business Data](https://apify.com/nexgendata/google-maps-extractor?fpr=2ayu9b) — pull business locations, ratings, and contact data at scale
- [🎯 B2B Leads Finder — Apollo / ZoomInfo Alternative](https://apify.com/nexgendata/b2b-leads-finder?fpr=2ayu9b) — build targeted prospect lists by industry, geo, and tech stack
- [✉️ Website Email Extractor — Crawl & Find Emails](https://apify.com/nexgendata/website-email-extractor?fpr=2ayu9b) — extract verified emails from any list of websites
- [🗂️ Leads to Notion CRM — Auto-Sync Pipeline](https://apify.com/nexgendata/leads-to-notion-crm?fpr=2ayu9b) — push scraped records straight into a Notion CRM
- 🏢 **About NexGenData** — we maintain 260+ production Apify actors for lead-gen, competitive intelligence, and web data. Browse the full catalog at [apify.com/nexgendata](https://apify.com/nexgendata?fpr=2ayu9b).

### ❓ FAQ

**Q: Do I need a YouTube login or API key?**
A: No. The actor works entirely off public channel pages — no login, no Google Cloud project, no YouTube Data API quota.

**Q: Where do the emails come from?**
A: Two places: the creator's **channel description** (inline text, including obfuscated forms like `name [at] domain`) and the **website the creator lists** on their channel. `email_source` tells you which one each email came from (`description` or `channel_link`).

**Q: Does this scrape YouTube's "View email address" business email?**
A: No. That field sits behind a captcha gate, and this actor does **not** click it or attempt any bot-gate bypass. It only reads the email a creator publishes in their public description or listed website — which is often the same business address, just published openly.

**Q: What does "MX-verified" actually mean?**
A: Before an email is marked `email_verified: true`, the actor checks that the domain has live mail-exchange (MX) records — i.e. a real mail server that can receive mail. This filters out typos and dead domains so your outreach bounces less. It does not send a test email.

**Q: Why did some channels come back with no email?**
A: They simply didn't publish a reachable business email in their description or listed website (`status: no_email`). Roughly 40–67% of channels publish one depending on niche; the rest don't. You still get their full audience, metrics, and links data.

**Q: Can I feed a keyword or topic instead of channels?**
A: Not yet — today you supply channel handles, URLs, or IDs and the actor does the enrichment. Keyword/topic **creator discovery** is coming in v2.

**Q: Can results go straight into Notion?**
A: Yes — authorize a Notion MCP connector in Apify Console → Settings → API & Integrations, select it in `notionConnector`, and the channels + emails are written into your Notion workspace in the same run. The actor never sees your Notion credentials.

### 🆘 Troubleshooting

- **`status: no_email`** — that channel didn't publish a reachable business email in its description or listed website. Expected for a chunk of any list; not an error.
- **Fewer emails than channels** — normal. Only ~40–67% of channels publish a business email depending on niche; you pay per channel scanned regardless.
- **A handle returned empty / placeholder data** — the channel may have been renamed, terminated, or is a near-empty account. Double-check the exact handle, URL, or channel ID on youtube.com.
- **No email but the channel lists a website** — the listed site may not publish an email on its landing page, or the email is on a contact page the resolver didn't reach. The channel still returns full metrics + links.
- **Email looks unverified** (`email_verified: false`) — the address was found but its domain has no live MX record; treat it as low-confidence.
- **Expecting the YouTube business email** — this actor doesn't read the captcha-gated business-email field by design. Use the description/website email it returns instead.

***

### ⭐ Found this useful?

If this actor saved you outreach-list time, a quick **[review on the Apify Store](https://apify.com/nexgendata/youtube-creator-contact-finder?fpr=2ayu9b)** helps other teams discover it. Feature request or bug? Open it from the **Issues** tab — we read every one.

# Actor input Schema

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

Optional. A list of YouTube channels to enrich directly. Accepts @handles (e.g. @mkbhd), full channel URLs (https://www.youtube.com/@mkbhd or /channel/UC...), or raw channel IDs (UC...). The actor reads each channel's public page + About tab for business contact info: emails in the public description, the creator's listed website/socials, and channel metrics. Provide this and/or searchKeywords.

## `searchKeywords` (type: `array`):

Optional discovery mode. Provide niche or topic phrases (e.g. "home barista", "indie game dev", "vegan meal prep") and the actor SEARCHES YouTube for channels matching each one, collects up to maxCreators unique channels, then runs them through the same email-enrichment pipeline. Combine with channels to mix discovered creators with explicit handles (deduped). Leave blank to only enrich the channels you list.

## `maxCreators` (type: `integer`):

Hard limit on how many channels keyword discovery will collect and scan in total (explicit channels count toward this cap when discovery is on). The actor stops the moment this is hit so a broad search can never explode cost. Server-clamped to 500.

## `maxChannels` (type: `integer`):

Hard limit on how many of the explicitly listed channels are fetched when you are NOT using keyword discovery. The actor stops the moment this is hit so compute stays predictable. Server-clamped to 500. (When searchKeywords is set, maxCreators is the governing cap instead.)

## `followChannelLinks` (type: `boolean`):

When a channel has no email in its public description but lists a website (not a pure social link), resolve that page and extract emails from it. This is the main yield path, since channels rarely put a raw email in the description. Leave on unless you only want description emails.

## `proxyConfiguration` (type: `object`):

Apify proxy used for searching YouTube, fetching channel pages and resolving website links. Datacenter is the default and cheapest — YouTube serves the embedded channel JSON to datacenter requests reliably; residential is used automatically only if a datacenter fetch is blocked.

## `notionConnector` (type: `string`):

Optional. Connect your Notion workspace and the channels + emails are also written as a Notion page in the same run — the Actor never sees your Notion credentials. Authorize a Notion MCP connector in Apify Console → Settings → API & Integrations, then select it here.

## `notionParentId` (type: `string`):

Optional. The Notion page ID to create the page under. If blank, Notion creates a private page at workspace root.

## Actor input object example

```json
{
  "channels": [
    "@mkbhd",
    "@LinusTechTips"
  ],
  "searchKeywords": [
    "home barista",
    "specialty coffee roaster"
  ],
  "maxCreators": 20,
  "maxChannels": 10,
  "followChannelLinks": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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": [
        "@mkbhd",
        "@LinusTechTips"
    ],
    "searchKeywords": [
        "home barista",
        "specialty coffee roaster"
    ],
    "maxCreators": 20,
    "maxChannels": 10,
    "followChannelLinks": true,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgendata/youtube-creator-contact-finder").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": [
        "@mkbhd",
        "@LinusTechTips",
    ],
    "searchKeywords": [
        "home barista",
        "specialty coffee roaster",
    ],
    "maxCreators": 20,
    "maxChannels": 10,
    "followChannelLinks": True,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("nexgendata/youtube-creator-contact-finder").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "@mkbhd",
    "@LinusTechTips"
  ],
  "searchKeywords": [
    "home barista",
    "specialty coffee roaster"
  ],
  "maxCreators": 20,
  "maxChannels": 10,
  "followChannelLinks": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call nexgendata/youtube-creator-contact-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=nexgendata/youtube-creator-contact-finder",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Creator Contact Finder",
        "description": "Extract YouTube creator/channel business contact info (public emails + links + channel metrics) for influencer/brand outreach.",
        "version": "0.0",
        "x-build-id": "J3j6Diw12p4e8nyXd"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/nexgendata~youtube-creator-contact-finder/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-nexgendata-youtube-creator-contact-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/nexgendata~youtube-creator-contact-finder/runs": {
            "post": {
                "operationId": "runs-sync-nexgendata-youtube-creator-contact-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/nexgendata~youtube-creator-contact-finder/run-sync": {
            "post": {
                "operationId": "run-sync-nexgendata-youtube-creator-contact-finder",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "channels": {
                        "title": "YouTube channels (handles, URLs, or channel IDs)",
                        "type": "array",
                        "description": "Optional. A list of YouTube channels to enrich directly. Accepts @handles (e.g. @mkbhd), full channel URLs (https://www.youtube.com/@mkbhd or /channel/UC...), or raw channel IDs (UC...). The actor reads each channel's public page + About tab for business contact info: emails in the public description, the creator's listed website/socials, and channel metrics. Provide this and/or searchKeywords.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchKeywords": {
                        "title": "Discover channels by niche / topic (keyword search)",
                        "type": "array",
                        "description": "Optional discovery mode. Provide niche or topic phrases (e.g. \"home barista\", \"indie game dev\", \"vegan meal prep\") and the actor SEARCHES YouTube for channels matching each one, collects up to maxCreators unique channels, then runs them through the same email-enrichment pipeline. Combine with channels to mix discovered creators with explicit handles (deduped). Leave blank to only enrich the channels you list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxCreators": {
                        "title": "Maximum creators to discover (hard cap)",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Hard limit on how many channels keyword discovery will collect and scan in total (explicit channels count toward this cap when discovery is on). The actor stops the moment this is hit so a broad search can never explode cost. Server-clamped to 500.",
                        "default": 20
                    },
                    "maxChannels": {
                        "title": "Maximum channels to scan (hard cap, explicit-list mode)",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Hard limit on how many of the explicitly listed channels are fetched when you are NOT using keyword discovery. The actor stops the moment this is hit so compute stays predictable. Server-clamped to 500. (When searchKeywords is set, maxCreators is the governing cap instead.)",
                        "default": 50
                    },
                    "followChannelLinks": {
                        "title": "Resolve channel website links for emails",
                        "type": "boolean",
                        "description": "When a channel has no email in its public description but lists a website (not a pure social link), resolve that page and extract emails from it. This is the main yield path, since channels rarely put a raw email in the description. Leave on unless you only want description emails.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify proxy used for searching YouTube, fetching channel pages and resolving website links. Datacenter is the default and cheapest — YouTube serves the embedded channel JSON to datacenter requests reliably; residential is used automatically only if a datacenter fetch is blocked.",
                        "default": {
                            "useApifyProxy": true
                        }
                    },
                    "notionConnector": {
                        "title": "Deliver to Notion (optional)",
                        "type": "string",
                        "description": "Optional. Connect your Notion workspace and the channels + emails are also written as a Notion page in the same run — the Actor never sees your Notion credentials. Authorize a Notion MCP connector in Apify Console → Settings → API & Integrations, then select it here."
                    },
                    "notionParentId": {
                        "title": "Notion parent page ID (optional)",
                        "type": "string",
                        "description": "Optional. The Notion page ID to create the page under. If blank, Notion creates a private page at workspace root."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
