# YouTube Influencer Scraper (`lightmoon/youtube-influencer-scraper`) Actor

Find YouTube influencers by niche and export creator contact links: website, Instagram, TikTok, X, Discord, subscribers, views, country. 25 columns to CSV or Excel. Filter by subscriber range to find small channels to sponsor for brand deals and influencer outreach.

- **URL**: https://apify.com/lightmoon/youtube-influencer-scraper.md
- **Developed by:** [Stable](https://apify.com/lightmoon) (community)
- **Categories:** Lead generation, Social media, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.90 / 1,000 channel contacts

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/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

Find YouTube creators by niche and get the contact details they publish —
website, Instagram, TikTok, X, Facebook, Discord — alongside subscribers,
views, country and join date. One row per channel, 25 columns, straight to CSV,
Excel, JSON or your CRM.

Search by phrase, paste channels you already know, or both:

```json
{ "searchQueries": ["home coffee roasting"], "maxChannels": 50 }
```

### What one row looks like

A real row from a real run, unedited except for the description, which is cut
here for length:

```json
{
  "recordType": "channel",
  "channelUrl": "http://www.youtube.com/@VirtualCoffeeLab",
  "handle": "@VirtualCoffeeLab",
  "title": "Virtual Coffee Lab - Home Coffee Roaster",
  "subscribers": 24600,
  "videoCount": 146,
  "viewCount": 1475914,
  "country": "United States",
  "joinedDate": "2020-06-15",
  "description": "I am a home coffee roaster and all around coffee enthusiast …",
  "email": "",
  "hasBusinessEmail": false,
  "websiteUrl": "https://www.virtualcoffeelab.com",
  "instagramUrl": "https://www.instagram.com/thevirtualcoffeelab/",
  "tiktokUrl": "",
  "twitterUrl": "",
  "facebookUrl": "https://www.facebook.com/TheVirtualCoffeeLab/",
  "discordUrl": "",
  "otherLinks": "https://www.buymeacoffee.com/virtualcoffeelab,https://www.amazon.com/shop/virtualcoffeelab-homecoffeeroaster",
  "linkCount": 5,
  "thumbnailUrl": "https://yt3.googleusercontent.com/ytc/AIdro_…",
  "channelId": "UCN82dHiZsPXk80URpDVsbsg",
  "enriched": true,
  "query": "home coffee roasting",
  "queryType": "search"
}
```

Every link is the creator's actual address. YouTube publishes them wrapped in a
`youtube.com/redirect?…` URL; those are unwrapped for you, so what lands in your
spreadsheet is something you can click, mail-merge or import.

### About e-mail addresses — read this before you buy

YouTube keeps a creator's **business e-mail behind a sign-in**. It is not in the
page, and no amount of scraping the public channel will produce it. Any tool
that hands you those addresses is signing in to Google accounts and solving a
CAPTCHA to do it.

This actor does neither, so here is exactly what you get, measured on a sample
of 39 real channels:

| | how often |
|---|---|
| At least one public contact link | **84–93%** |
| An e-mail the creator typed into their own description | **4–7%** |
| `hasBusinessEmail` — YouTube says one exists, behind the sign-in | **57–72%** |

That third row is the useful part of the bad news: you get a **flag telling you
which channels have a business e-mail at all**, so a shortlist worth taking to a
sign-in-based tool is one filter away, and the rest of your outreach goes
through the website and socials you already have.

If your campaign lives or dies on the gated address, this is not the tool for
that job, and it says so here rather than after your first invoice.

### Fields

25 columns on every row, whether it came from a search or from a channel you
named.

| Field | What it is |
|---|---|
| `recordType` | Always `channel` — one row per channel |
| `channelUrl` | Canonical channel address |
| `handle` | `@handle` |
| `title` | Channel name |
| `subscribers` | Subscriber count as a number, e.g. `24600` |
| `videoCount` | Public videos |
| `viewCount` | Lifetime views |
| `country` | Country the creator declares |
| `joinedDate` | On YouTube since, as `YYYY-MM-DD` and sortable |
| `description` | The full About text |
| `email` | An address written into the description, when there is one |
| `hasBusinessEmail` | `true` when YouTube holds a business e-mail behind its sign-in |
| `websiteUrl` | First link that is not a social platform — usually the creator's own site or link hub |
| `instagramUrl` · `tiktokUrl` · `twitterUrl` · `facebookUrl` · `discordUrl` | One column each, so you can filter |
| `otherLinks` | Everything else they published — Patreon, Linktree, Steam, itch.io, a booking form |
| `linkCount` | How many links this channel published |
| `thumbnailUrl` | Channel avatar |
| `channelId` | YouTube's own id, `UC…` |
| `enriched` | `true` when the About tab was read, `false` for a search-only row |
| `query` · `queryType` | Which phrase or channel this row came from |

Fields YouTube did not publish come back empty. Nothing is guessed, inferred or
filled in from a third-party database.

### Filters

- **`minSubscribers` / `maxSubscribers`** — a size band. Applied *before* the
  contact lookup, so the channels you filter out cost you nothing. Set
  `minSubscribers: 5000` and `maxSubscribers: 50000` to get the sponsorship band
  instead of the household names.
- **`withContacts`** — turn the contact lookup off to scan a niche wide and
  cheaply, then run again with the shortlist. The contact lookup reads about
  270 times more data per channel than the search does, and this is the switch
  that decides whether you pay for it.
- **`onlyWithContacts`** — keep only rows with a way to reach the creator.
- **`maxChannels`** — a ceiling for the whole run.

### Recipes

- **Build a sponsorship shortlist.** `searchQueries: ["home coffee roasting"]`,
  `minSubscribers: 5000`, `maxSubscribers: 100000`, `onlyWithContacts: true` —
  mid-sized creators in one niche, each with a website or socials.
- **Enrich a list you already have.** Paste handles or URLs into `channelUrls`
  and leave `searchQueries` empty. One request per channel, no search step.
- **Map a niche cheaply first.** `withContacts: false`, `maxChannels: 500` —
  names, handles, sizes and descriptions for a few cents, then re-run the
  interesting ones with contacts on.
- **Find who to pitch on other platforms.** Sort the export by `instagramUrl`
  or `tiktokUrl` — many creators answer there faster than by e-mail.

### What it costs

Pay per result, and the rate depends on what actually came back:

| | per 1,000 rows |
|---|---|
| A channel with at least one public contact | **$2.90** |
| A channel with no contact found | **$0.90** |
| Actor start | $0.00005 per GB of memory |

You are never charged the contact rate for a row without a contact. Across a
measured run of 25 channels, 21 came back with contacts and 4 did not — those
four were stored, exported and billed at the lower rate.

Free-plan users: Apify gives $5 of platform credit a month, and this actor's own
usage is a fraction of a cent per channel, so the practical limit on a free plan
is the $5 of credit rather than anything here. A 50-channel run with contacts on
takes about a minute.

**A worked example.** Scanning a niche without contacts (`withContacts: false`),
500 channels: about $0.45. Then enriching the best 100 of them: about $0.27.
**Under 75 cents for a working shortlist.**

### Limits

- **The gated business e-mail is not available.** See the section above. This is
  a YouTube restriction, not a setting.
- **Search results are YouTube's own ranking.** Ask for a phrase and you get the
  channels YouTube considers relevant to it, in its order, paged until the
  ceiling you set. There is no way to sort by subscribers before the fact — use
  the size band instead.
- **Descriptions are what creators wrote.** They can be empty, marketing copy,
  or in any language.
- **A country is only as good as what the creator declared**, and many declare
  nothing.
- **`enriched: false` rows** — if the contact lookup fails for one channel, the
  row still arrives with everything the search knew, and it is billed at the
  lower rate.
- No API key, no login and no cookies are needed from you.

### Output

Every row carries every column, so the CSV has no ragged edges. Export from the
Storage tab as CSV, Excel, JSON, XML or HTML, pull it through the Apify API, or
send it onward with an integration. Five ready-made views are included:
**Contacts**, **Audience**, **Social links**, **Profiles** and **All fields**.

### FAQ

#### How much does it cost to build a list of 1,000 creators?

With contacts on, about **$2.60** if the usual 84% of them publish a link — the
rest are billed at the lower rate. Scanning 1,000 channels without contacts is
**$0.90**.

#### Can I get creators' e-mail addresses?

Only the ones creators typed into their own channel description, which is 4–7%
of channels. The business e-mail YouTube shows behind a sign-in is not
obtainable here, and the `hasBusinessEmail` column tells you which channels have
one so you can decide what to do about it.

#### How many channels can one search phrase return?

It pages until it runs out or until your `maxChannels` ceiling, whichever comes
first. Twenty channels arrive per page. Broad phrases run into the thousands;
narrow ones dry up after a few pages, and the run says so.

#### Can I use my own list of channels instead of searching?

Yes. `channelUrls` accepts `@handles`, full channel URLs, `/channel/UC…`
addresses and bare channel ids, mixed freely. Those cost one request each and
skip the search entirely.

#### What happens if a channel has no contact details at all?

The row is stored and exported like any other, with the contact columns empty,
and billed at the lower rate. Set `onlyWithContacts: true` to leave them out of
the export as well.

#### Does it work on a free Apify plan?

Yes. Nothing here needs a paid plan, a proxy or an API key.

### Other scrapers we maintain

Same engine, same pricing model, same promise: flat rows, stated limits,
and no charge for a row that came back empty.

| | |
|---|---|
| **[Google Maps Contact Scraper](https://apify.com/lightmoon/google-maps-contact-scraper)** | Local businesses by category and city — phone, website, split address and opening hours. |
| **[Local Business Phone Scraper](https://apify.com/lightmoon/local-business-phone-scraper)** | The same job from directory sources, with Better Business Bureau accreditation on the row. |
| **[Telegram Channel Messages Scraper](https://apify.com/lightmoon/telegram-messages-scraper)** | Posts from public channels — text, views, reactions and media links, no account needed. |
| **[Threads Hashtag Scraper](https://apify.com/lightmoon/threads-hashtag-scraper)** | Threads posts by hashtag or keyword, with author, engagement and links. |
| **[RedNote Xiaohongshu Profile Scraper](https://apify.com/lightmoon/rednote-profile-scraper)** | Public RedNote creator profiles in bulk — followers, bio, IP location and their notes. |
| **[ATS Jobs Scraper](https://apify.com/lightmoon/ats-jobs-scraper)** | Open roles straight from company career pages on Greenhouse, Lever, Ashby and Workday. |

# Actor input Schema

## `searchQueries` (type: `array`):

One niche or topic per line, searched against YouTube's own channel search. Each phrase returns 20 channels per page and pages onward until it runs out or your limit is reached, so a single phrase can fill a whole run. Use the words a creator would put in their own channel name or description — `home coffee roasting` finds more than `coffee`.

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

One channel per line, if you have a list already. A handle like `@mkbhd`, a full `https://www.youtube.com/@mkbhd` URL, a `/channel/UC...` address or a bare channel id all work. These are fetched directly — no search step — and cost one request each.

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

A ceiling for the whole run, across every phrase and channel. Set 0 for as many as the searches can produce, up to 2000.

## `withContacts` (type: `boolean`):

On: each channel's About tab is read for its public links — website, Instagram, TikTok, X, Facebook, Discord — plus country, join date, view count and video count. Off: you get the search result only — name, handle, URL, subscribers and description — which is far cheaper and far faster. Turn it off to scan a niche wide, then run again with a shortlist.

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

Skip channels smaller than this. Applied before the contact lookup, so filtered-out channels cost nothing.

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

Skip channels larger than this. Leave 0 for no upper limit. Use it with the minimum above to find channels in a sponsorship band — say 5000 to 50000 — instead of the household names.

## `onlyWithContacts` (type: `boolean`):

Keeps rows where at least one public link or address was found. Channels without one are never charged at contact rates whichever way this is set; turn it on to keep them out of the export as well. Needs the contact lookup above to be on.

## Actor input object example

```json
{
  "searchQueries": [
    "home coffee roasting",
    "indie game dev"
  ],
  "channelUrls": [],
  "maxChannels": 50,
  "withContacts": true,
  "minSubscribers": 0,
  "maxSubscribers": 0,
  "onlyWithContacts": false
}
```

# Actor output Schema

## `contacts` (type: `string`):

No description

## `audience` (type: `string`):

No description

## `social` (type: `string`):

No description

## `profiles` (type: `string`):

No description

## `all` (type: `string`):

No description

# 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 = {
    "searchQueries": [
        "home coffee roasting",
        "indie game dev"
    ],
    "channelUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("lightmoon/youtube-influencer-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 = {
    "searchQueries": [
        "home coffee roasting",
        "indie game dev",
    ],
    "channelUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("lightmoon/youtube-influencer-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 '{
  "searchQueries": [
    "home coffee roasting",
    "indie game dev"
  ],
  "channelUrls": []
}' |
apify call lightmoon/youtube-influencer-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lightmoon/youtube-influencer-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/LG79GIVtgdRdxOjCo/builds/OEEvnwIgWwgrtkBU0/openapi.json
