# YouTube Creator Leads - Emails & Brand Deals (`gganbukim/youtube-creator-leads`) Actor

Turn a channel list into qualified creator leads. Returns the business email a channel publishes, its socials, subscriber and upload bands, and - the part contact scrapers cannot give you - which brands already sponsor it, from the descriptions and spoken reads of its recent videos.

- **URL**: https://apify.com/gganbukim/youtube-creator-leads.md
- **Developed by:** [DONGMIN KIM](https://apify.com/gganbukim) (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

from $6.00 / 1,000 creator leads

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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Leads — The Email, and Whether They Take Brand Deals

Paste a channel list. Get back **one row per creator**: who to email, how big they are,
whether they still upload, and **which brands already pay them**.

That last column is the one a contact scraper cannot give you, and it is usually the one
that decides the outreach. A creator who has never taken a deal is not a lead. A creator
already running your competitor is the best lead on the list.

No API key, no login, no Data API quota.

### What it does well

- **The address they actually publish** — and business addresses rank first, because a creator who writes `partnerships@` is telling you which inbox handles this.
- **Brand deals from their recent videos** — read out of descriptions and spoken captions by the same engine behind our Sponsorship Finder.
- **Two bands, not a score** — `audienceBand` and `uploadBand`, so a thousand-row list sorts itself without you writing rules.
- **The denominator always ships** — `sponsorshipRate` is over `scannedVideos`, and both are in the row. A rate whose base is hidden is not a number.
- **Filters run before billing** — require an email, require sponsorships, set a subscriber floor or an upload recency. **Dropped channels cost nothing.**

### What you should expect to find

Measured across seven channels while this was built: **three published an email in their
description, four did not.** Every one of the three was a partnership address —
`business@mkbhd.com`, `partnerships@newpress.com`, `partnerships@linusmediagroup.com`.

That ratio is the honest expectation. This finds addresses a channel **publishes**; it
does not guess `firstname@`, buy from a database, or open the "View email address"
captcha. When no email is found the row still ships with everything else, because a large
creator who takes deals and lists only an Instagram is still a lead — just a different
first move.

### Input

```jsonc
{
  "channelUrls": ["@creator-one", "@creator-two", "@creator-three"],
  "videosScannedPerChannel": 10,
  "requireSponsorships": true,
  "minSubscribers": 50000,
  "activeWithinDays": 60
}
```

#### Every option

The same wording you see in the Apify console, with the JSON key for API and MCP callers.

| Option | What it does | Default |
|---|---|---|
| **Channels** — `channelUrls` *(required)* | @handles, /channel/UC… URLs, or legacy /c/ and /user/ URLs. Each channel becomes one row. | — |
| **Check which brands sponsor them** — `checkSponsorships` | Read recent videos for brand deals. This is what costs requests — two per video scanned. | `true` |
| **Videos scanned per channel** — `videosScannedPerChannel` | How many recent videos to read. Ten usually separates a creator who takes deals from one who does not. | `10` |
| **Only keep channels with an email** — `requireEmail` | Drop channels publishing no address. Dropped channels are not billed. | `false` |
| **Only keep channels that take sponsorships** — `requireSponsorships` | Drop channels where no brand deal was found. Needs sponsorship checking on. | `false` |
| **Minimum subscribers** — `minSubscribers` | Drop channels below this. 0 disables. | `0` |
| **Uploaded within (days)** — `activeWithinDays` | Drop channels whose newest video is older than this. 0 disables. | `0` |
| **Concurrency** — `concurrency` | Channels processed in parallel. | `3` |
| **Proxy** — `proxyConfiguration` | Leave the default. Starts on cheap datacenter proxies and escalates only if YouTube throttles. | `{"useApifyProxy":true}` |

### Output

One row per channel.

```json
{
  "channelId": "UCBJycsmduvYEL83R_U4JriQ",
  "channelName": "Marques Brownlee",
  "channelUrl": "https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ",
  "handle": "@mkbhd",
  "subscriberCount": 21100000,
  "subscriberCountText": "21.1M subscribers",
  "videoCount": 1800,
  "audienceBand": "mega",
  "email": "business@mkbhd.com",
  "emails": ["business@mkbhd.com"],
  "hasBusinessEmail": true,
  "instagram": "mkbhd",
  "scannedVideos": 10,
  "sponsoredVideos": 6,
  "sponsorshipRate": 60,
  "sponsorCount": 4,
  "sponsorBrands": ["ridge.com", "dbrand.com", "incogni.com", "brilliant.org"],
  "trackedCampaignCount": 3,
  "takesSponsorships": true,
  "uploadBand": "active",
  "daysSinceNewestVideo": 2.1,
  "uploadsLast30Days": 7,
  "uploadsLast90Days": 21,
  "scrapedAt": "2026-08-20T09:14:02.113Z"
}
```

#### Every field

You are billed per lead delivered, so here is everything a row can contain.

**How to reach them**

| Field | What it is |
|---|---|
| `email` | The best address found. Business and partnership addresses rank above generic ones. |
| `emails` | Every address in the description, in that order. |
| `hasBusinessEmail` | `true` when one of them is a `business@`, `partnerships@`, `press@`-style address — the difference between a creator who wants pitches and one who left a personal address up. |
| `instagram`, `twitter`, `tiktok`, `facebook`, `discord`, `patreon` | Handles linked from the description, when present. |

**Whether they are worth reaching**

| Field | What it is |
|---|---|
| `takesSponsorships` | Whether any brand deal was found in the scanned videos. The single most useful filter here. |
| `sponsorBrands` | The distinct brands found, by domain — which is where you see a competitor already on the roster. |
| `sponsorCount` | How many distinct brands. |
| `sponsoredVideos` / `scannedVideos` | How many of the videos read carried a deal, and how many were read. |
| `sponsorshipRate` | The first over the second, as a percent. **Over scanned videos, not the whole channel** — we only know about the ones we read. |
| `trackedCampaignCount` | Deals where the brand handed over a creator-specific campaign link. The strongest proof a deal is real rather than an affiliate placement. |

**How big and how alive**

| Field | What it is |
|---|---|
| `subscriberCount` | Parsed from the display text, so it is rounded the way YouTube rounds it. |
| `subscriberCountText` | The unparsed original. |
| `videoCount` | Total uploads the channel reports. |
| `audienceBand` | `nano` (<10k) · `micro` (<100k) · `mid` (<1M) · `large` (<10M) · `mega`. |
| `uploadBand` | `active` (14 days) · `slowing` (60) · `dormant` (a year) · `stale` · `unknown`. |
| `daysSinceNewestVideo` | From the listing's relative text, so accurate to about a day. |
| `uploadsLast30Days` / `uploadsLast90Days` | Cadence, which separates a growing channel from a parked one. |

**Identity**

| Field | What it is |
|---|---|
| `channelId` / `channelName` / `channelUrl` / `handle` / `handleUrl` | The channel, for joining back to your list. |
| `avatarUrl` / `rssUrl` | Avatar, and the RSS feed for cheap polling between runs. |
| `description` / `keywords` | The About text and the channel's own keyword string. |
| `scrapedAt` | When this run read the channel. |

### Who this is for

- **Influencer agencies** building a shortlist that already runs deals in a category.
- **Brand and growth teams** finding creators who take sponsorships, and seeing who is on a competitor's roster.
- **Creator managers** benchmarking a client against comparable channels.
- **Anyone who bought a creator list** and needs to know how much of it is live and reachable.

### Common uses

- **Qualify a bought list** — run 500 handles, keep the ones with an email that uploaded in the last 60 days and take deals, discard the rest for free.
- **Competitor roster mapping** — filter `sponsorBrands` for a rival and see who already carries them.
- **Category sizing** — audience bands and sponsorship rates across a niche before pitching it.
- **Trigger outreach** — schedule it and approach a creator the month their sponsorship rate starts climbing.

### Pricing

Pay per **lead delivered** — $6.00 per 1,000. Channels removed by your filters and channels
that fail **cost nothing**, which is what makes it safe to point at a list you have not
cleaned.

Starting a run costs $0.00002 — the platform's $0.00001 minimum, charged once per GB of
memory, and these Actors run on 2 GB. That is two thousandths of a cent per run.

Scanning is the expensive part and you are not charged for it: a channel read across
twenty-one requests that then fails your email filter costs you nothing at all.

### Other Actors in this family

Same engines, same billing, no account or API key on any of them.

**YouTube & video**

- [Download YouTube Subtitles in Bulk — SRT, VTT & Text](https://apify.com/gganbukim/youtube-transcript-scraper) — Bulk subtitles from videos, channels or playlists — text, SRT, VTT or RAG chunks.
- [Export YouTube Comments to CSV — Replies and Likes](https://apify.com/gganbukim/youtube-comments-scraper) — Every comment and reply thread, with likes, authors and creator flags.
- [List Every Video on a YouTube Channel — Export to CSV](https://apify.com/gganbukim/youtube-channel-scraper) — A channel's whole back catalogue plus a subscriber and RSS summary row.
- [Find YouTube Sponsors — Brand Deals, Codes & Links](https://apify.com/gganbukim/youtube-sponsorship-finder) — Which brands pay which creators, with the campaign link, the code and the timestamp.
- [YouTube Search API — Bulk Results, No Quota](https://apify.com/gganbukim/youtube-search-scraper) — Many search terms at once, every result as a row, filtered before you are billed.
- [Track Deleted YouTube Videos & Title Changes](https://apify.com/gganbukim/youtube-channel-monitor) — What a channel quietly changed: deleted videos, rewritten titles, view velocity.
- [Export a YouTube Playlist to CSV — Every Video](https://apify.com/gganbukim/youtube-playlist-scraper) — Any playlist as a table, with each video position in it.

**Search demand**

- [AnswerThePublic Alternative — Autocomplete Keyword API](https://apify.com/gganbukim/long-tail-keyword-scraper) — One seed into hundreds of real keywords from Google, YouTube and Amazon autocomplete.
- [Google Trends API — Today's Trending Searches, No Key](https://apify.com/gganbukim/google-trends-scraper) — Today's trending searches by country, with traffic bands and the news behind them.

**E-commerce**

- [Export Any Shopify Store's Products to CSV or JSON](https://apify.com/gganbukim/shopify-product-scraper) — Any Shopify catalogue: variants, SKUs, live prices, stock, images, collections.
- [New Shopify Product Alerts — Competitor Drop Tracker](https://apify.com/gganbukim/shopify-new-arrivals-monitor) — Only what a store launched since the last run. Scanning is free.

**Hiring**

- [Greenhouse, Lever & Ashby Job Scraper — No API Key](https://apify.com/gganbukim/ats-job-scraper) — Paste a company domain, get its open roles from Greenhouse, Ashby, Lever or SmartRecruiters.
- [Ghost Job Detector — Track Reposts, Closures & Edits](https://apify.com/gganbukim/job-lifecycle-monitor) — What changed on a careers page: opened, closed, quietly reposted, or a ghost job.

### FAQ

**Will I get blocked, or my account banned?** There is no account to ban — no login, no cookies. It reads public channel pages, on datacenter proxies, escalating only if YouTube throttles. YouTube signals throttling with an HTTP 200 and an error body rather than an error code, which is the trap that silently halves most scrapers' results; this one detects it by reason and rotates.

**Is it legal to collect this?** It reads the public channel page and the public
description and caption track of public videos, with no login and nothing bypassed. A
creator who puts `partnerships@` in their About text is asking to be contacted there.
Business contact details are treated differently from personal data in most regimes, but
**how you use them is regulated** — GDPR, CAN-SPAM, PECR and their equivalents govern
marketing email regardless of how the address was obtained. YouTube's Terms of Service are
a separate contract question. Not legal advice.

**Why do some rows have no email?** Because the channel publishes none. Four of the seven
channels measured while building this did not. The row still ships with the socials, the
bands and the sponsor list.

**Can it read the "View email address" button?** No. That is behind a captcha, and working
around one is not something this Actor does.

**How accurate is the sponsorship column?** It finds deals that are **disclosed** — a link
in the description or a read in the audio. Measured on 27 videos while building the
sponsorship engine: description found 22, captions 19, together 24, no false positives in
that sample. Recall on a larger labelled sample is unmeasured, so read
`takesSponsorships: false` as "nothing disclosed in the videos we read", not as proof.

**How much does 1,000 leads cost?** $6.00, plus $0.00002 for the run.

**Can I export the results to Excel or Google Sheets?** Yes. Every run's dataset downloads
as CSV, Excel, JSON, XML or RSS from the Storage tab, or straight from the API.

**Can I connect it to Zapier, Make or n8n?** Yes — Apify publishes integrations for all
three, plus webhooks that fire when a run finishes.

**Do I need to write code?** No. Fill the form in the console and press Start. It is also
available over MCP so an AI agent can call it directly.

**Can I run it on a schedule?** Yes, via Apify Schedules, webhooks, or the API.

# Actor input Schema

## `channelUrls` (type: `array`):

@handles, /channel/UC… URLs, or legacy /c/ and /user/ URLs. Paste a whole prospect list; each channel becomes one row.

## `checkSponsorships` (type: `boolean`):

Read recent videos for brand deals. This is the part a contact scraper cannot give you, and it is what costs requests - two per video scanned.

## `videosScannedPerChannel` (type: `integer`):

How many recent videos to read for sponsorships. Ten is usually enough to tell a creator who takes deals from one who does not. The sponsorship rate is reported over this number, never hidden.

## `requireEmail` (type: `boolean`):

Drop channels that publish no address in their description. Dropped channels are not billed.

## `requireSponsorships` (type: `boolean`):

Drop channels where no brand deal was found in the scanned videos. Needs sponsorship checking on.

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

Drop channels below this. 0 disables.

## `activeWithinDays` (type: `integer`):

Drop channels whose newest video is older than this. 0 disables. A dormant channel with a million subscribers is a dead end.

## `concurrency` (type: `integer`):

Channels processed in parallel.

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

Leave the default. The actor starts on cheap datacenter proxies and escalates to residential only if YouTube throttles it.

## Actor input object example

```json
{
  "channelUrls": [
    "@mkbhd",
    "@LinusTechTips"
  ],
  "checkSponsorships": true,
  "videosScannedPerChannel": 10,
  "requireEmail": false,
  "requireSponsorships": false,
  "minSubscribers": 0,
  "activeWithinDays": 0,
  "concurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per channel: contact routes, audience and upload bands, and the brands already sponsoring it.

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

Counts for this run: leads delivered, how many carried an email, how many take sponsorships, videos scanned, channels filtered out, and failures.

# 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 = {
    "channelUrls": [
        "@mkbhd",
        "@LinusTechTips"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gganbukim/youtube-creator-leads").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 = { "channelUrls": [
        "@mkbhd",
        "@LinusTechTips",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("gganbukim/youtube-creator-leads").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 '{
  "channelUrls": [
    "@mkbhd",
    "@LinusTechTips"
  ]
}' |
apify call gganbukim/youtube-creator-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gganbukim/youtube-creator-leads"
        }
    }
}

```

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/bi7bGvCsfZclbIoem/builds/MOnQLm1erAJ8rkY4k/openapi.json
