# Creator & Influencer Leads - TikTok, Instagram & YouTube Emails (`flash_scraper/creator-leads-scraper`) Actor

Find creators on TikTok, Instagram and YouTube in one run. One clean row per creator: bio, followers, links, verified and business flags, an email from the bio or their linked site, and a 0-100 lead score. YouTube keyword search discovers new creators. Export CSV, JSON, Excel.

- **URL**: https://apify.com/flash\_scraper/creator-leads-scraper.md
- **Developed by:** [Flash Scrape](https://apify.com/flash_scraper) (community)
- **Categories:** Lead generation, Social media
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## 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.

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

## Creator & Influencer Leads — TikTok, Instagram & YouTube in one export

**Find creators on TikTok, Instagram and YouTube in a single run, enrich them with a contact email from the site they link to, score them, and get one clean row per creator.** Every row has the **same 48 columns** whichever platform it came from, so a mixed list opens as one spreadsheet instead of three.

No login, no API key, no cookie, and no dependency on any other Actor. YouTube keyword search discovers new creators; TikTok and Instagram enrich the handles you supply.

***

### Why one Actor instead of three

An influencer-marketing agency buys an outcome — *creator leads with emails* — not a source. Running three single-platform scrapers gives you three exports with three different column sets, three separate crawls over the same websites, and no way to see that a brand's TikTok row and its YouTube row are the same business. This Actor does the website crawl **once** for all three platforms and cross-links the result in `also_on_platforms`.

***

### What it does, step by step

1. **Pick platforms and targets** — a YouTube keyword, YouTube channels, TikTok usernames, Instagram usernames, or any mix.
2. **YouTube discovery first** — each keyword returns roughly 30 channels, and every channel's About page is parsed for its description, links, counts, country, join date and verified badge.
3. **Optional cross-platform hop** — the Instagram and TikTok profiles linked from those About pages are scraped too (off by default, because each one is an extra billed row).
4. **TikTok and Instagram profiles** — fetched over HTTP/2 through a rotating residential proxy.
5. **One shared email pass** — every creator's linked site is visited (home, `/contact`, `/about`, resolving Linktree-style pages) for emails and social profiles. A link-shortener (`bit.ly`, `geni.us`, …) is followed to its destination and only that destination's own site is crawled; if it does not resolve to a real site the creator is left with **no** email rather than somebody else's.
6. **Filter, score, cross-link** — your quality filters run **before** billing, every lead is scored 0–100 and graded A–F, and rows that resolve to the same creator on another platform are cross-linked.
7. **Export** — a sortable table with five saved views, downloadable as CSV, JSON or Excel.

***

### What each platform can and cannot deliver

**None of these three platforms publishes a contact email field.** Every email in your export was either typed into a bio by the creator or found on the website they link to. Read the fill rates below before you buy.

#### TikTok

- **CAN**: full public profile — nickname, bio, bio-link, exact follower / following / likes / video counts (from TikTok's precise `statsV2`, not the rounded display numbers), verified badge, business-account flag and category, TikTok Shop seller flag, account creation date.
- **CANNOT DISCOVER.** TikTok serves no creator data to a logged-out client on `/tag/<hashtag>`, `/search?q=` or `/search/user?q=` — probed 2026-08-09: those pages render a rehydration blob containing zero usernames, and the search API answers 200 with an empty body without TikTok's signed parameters. **You must supply the handles.**
- **NO ENGAGEMENT RATE.** The profile payload's `itemList` was empty on 28 of 28 profiles probed and no play count appears anywhere in it, so a per-video engagement rate cannot be computed. Those columns are null on every TikTok row rather than fabricated.
- **NO PHONE.** TikTok publishes none.
- **Email fill**: the standalone TikTok Actor measured an email in the bio itself on 1 of 28 profiles (3.6%) and a bio link present on 15 of 28 (54%). In this Actor's own verification runs on 2026-08-09, 3 of 9 distinct TikTok creators ended up with an email after enrichment (an earlier build-test pass measured 2 of 7). A creator who links their own domain usually yields an address; a Linktree or a link-shortener usually does not.
- **Needs a residential proxy in practice**: the standalone TikTok Actor measured 34 of 34 handles returning data through Apify Proxy RESIDENTIAL with a fresh session per attempt (1.4 attempts average), against 3 of 15 from one un-proxied IP once it went hot. TikTok answers a hot IP with an empty JavaScript shell and HTTP 200, not an error — which is why every retry rotates the exit IP instead of just trying again. (In this Actor's own verification runs from a *fresh* un-proxied laptop IP, 15 of 16 handles still came back, most of them on the second to fourth attempt, and 1 was refused on all six. An earlier build-test pass measured 8 of 9. The un-proxied path works until the IP goes hot — which is exactly why the default is residential.)

#### Instagram

- **CAN**: the public profile record — bio, follower / following / post counts, verified, private and business flags, every link in bio with Instagram's `l.instagram.com` wrapper resolved, and the **only engagement metrics in this Actor**: average likes, average comments, engagement rate and posting cadence computed from the ~12 recent posts the public endpoint returns. `posts_sampled` reports that denominator on every row.
- **CANNOT DISCOVER** by keyword or hashtag. The only expansion is Instagram's own related-accounts list (`discoverRelated`), which starts from a handle you already have.
- **NO BUSINESS EMAIL.** `business_email`, `business_phone_number` and `category` came back None even on large verified business accounts (checked on `@gymshark`). The only email sources on Instagram are the bio text and the linked website — the same two sources as the other platforms. There is no phone column in this Actor for the same reason.
- **PARTIAL DELIVERY AT VOLUME IS NORMAL**, not a fault. Instagram rate-limits shared residential pools hard: the standalone Instagram Actor measured two consecutive 5-handle runs on 2026-08-09 delivering 2 of 5 profiles each, and this Actor's verification runs delivered 11 of 16 handles (the other 5 split between Instagram-side HTTP 400s and handles that do not exist). Ask for a handful of handles per run, expect some to be refused, and know that **a refused handle is never billed**.
- Instagram also answers **HTTP 429 to every HTTP/1.1 request**; this Actor speaks HTTP/2 (0/6 versus 5/6 through the same proxy in the same minute).
- Instagram occasionally answers **HTTP 400** for one specific account (a broken business-category asset on their side, reproducible per account). Those handles are reported by name and skipped, not retried forever — 3 of the 16 handles in this Actor's verification runs hit it.
- **Email fill**: in this Actor's own verification runs on 2026-08-09, 1 of 5 distinct Instagram creators ended up with an email after enrichment (an earlier build-test pass measured 2 of 5). Both are tiny samples; treat them as an order of magnitude, not a guarantee.

#### YouTube

- **The only platform here that discovers.** A keyword search returns about 30 unique channels — measured 28, 27 and 36 for three keywords on 2026-08-09, combining YouTube's plain results page with its channel-filtered one. More volume comes from **more keywords**, not from a bigger number in the box; `maxResults` is capped at 40 for that reason.
- **CAN**: About-page description, the channel's published links (website plus socials), subscriber count, exact total views, exact video count, country, join date, channel id, verified badge.
- **SUBSCRIBER COUNTS ARE ROUNDED by YouTube itself** ("91.6K", "4.37M"). Every YouTube row carries `followers_estimated: true` so you can see which numbers are exact. Total views and video counts **are** exact.
- **NO CATEGORY and NO BUSINESS FLAG.** YouTube publishes neither, so `category`, `is_business` and `is_shop_seller` are null on YouTube rows — and the lead score is normalised per platform so YouTube leads are not structurally ranked below TikTok ones for a signal YouTube does not emit.
- **Link and email fill** varies a lot by keyword, so here are two independent samples taken on 2026-08-09, one from the build pass and one from the verification pass that followed it. Sample A (9 channels, keyword `home barista` plus one named channel): 5 of 9 had an email in the About text, rising to **6 of 9 after website enrichment**; 4 of 9 published a non-social website; 7 of 9 an Instagram link; 3 of 9 a TikTok link. Sample B, re-measured independently (8 channels, keyword `vegan meal prep` plus two named channels): 3 of 8 in the About text, **4 of 8 after enrichment**; 5 of 8 published a website; 6 of 8 an Instagram link; 3 of 8 a TikTok link. A broad keyword returns small channels that publish nothing — expect the low end. Reading the About page rather than just the channel description is what makes those link rates possible, and it is what makes cross-platform discovery work at all.
- YouTube answered **every** About-page request it made un-proxied from a laptop — 30 of 30 across five build-test runs and 78 of 78 across eight verification runs on 2026-08-09. The Actor still routes it through Apify Proxy on-platform because container egress is not the same network — but it deliberately does **not** use the residential group for YouTube, so a YouTube-heavy run does not spend residential traffic.

#### Across all three

- **One row per creator ACCOUNT.** A brand that runs TikTok, Instagram and YouTube comes back as three rows and is billed as three leads, because the follower counts, the bios and often the emails differ per platform and collapsing them would destroy data you paid for. Rows that resolve to the same email or the same domain are cross-linked with `also_on_platforms` so you can group them yourself in one spreadsheet step.
- Every row carries `discovered_via`, so you can always see whether a lead came from your input, from a YouTube keyword, from a link on a YouTube channel, or from Instagram's related accounts.
- **Filters run before billing.** Rows removed by your filters, handles that do not exist and handles that were blocked are never charged, and a run that delivers zero rows charges nothing.
- **No phone column exists anywhere in the output**, because none of the three platforms publishes one.
- The AI cold-opener is optional, runs on your own OpenAI or Anthropic key, is used once per run and is never stored.

***

### What data you get

One row per creator, best leads first, with the **same 48 columns on every row**. A column a platform cannot supply is `null` — never missing, never an empty string — so your CSV has stable headers whichever platforms you ran.

| Column | What it is | Platforms |
|---|---|---|
| `platform` | `tiktok`, `instagram` or `youtube` | all |
| `handle`, `name`, `profile_url` | Username, display name, direct profile link | all |
| `user_id`, `avatar_url` | Platform user/channel id and profile picture | all |
| `bio` | Bio text (TikTok signature, Instagram biography, YouTube About text) | all |
| `category` | The platform's own business category | TikTok, Instagram |
| `country` | Channel country | YouTube |
| `account_created_at` | Account creation / channel join date | TikTok, YouTube |
| `followers` | Followers or subscribers — the column every follower filter uses | all |
| `followers_estimated` | `true` when the platform rounds the number (YouTube always does) | all |
| `following`, `posts_count` | Following count; posts on Instagram, videos on TikTok/YouTube | see note |
| `total_likes` | Lifetime likes | TikTok |
| `total_views` | Lifetime channel views (exact) | YouTube |
| `avg_likes`, `avg_comments`, `engagement_rate_pct`, `posts_per_week`, `posts_sampled`, `last_post_at` | Engagement over the ~12 recent posts, with the sample size | Instagram |
| `verified`, `is_private`, `is_business`, `is_shop_seller` | Account-type flags; `is_shop_seller` means a TikTok Shop seller | see note |
| `email`, `email_source`, `extra_emails`, `email_status`, `has_email` | Best address, whether it came from `bio` or `website`, extras, found/missing | all |
| `website`, `domain`, `has_website` | The first non-social link the creator published, and its bare domain | all |
| `other_links` | Every other published link (Patreon, Reddit, a second site) | all |
| `instagram_url`, `tiktok_url`, `youtube_url`, `facebook_url`, `twitter_url`, `linkedin_url` | A complete social card, merged from the profile's own links, the crawled website, and the link-in-bio page behind it | all |
| `lead_score`, `lead_grade`, `lead_tier` | 0–100 score, A–F grade, hot/warm/cold | all |
| `also_on_platforms` | The other platforms this same creator was found on in this run | all |
| `discovered_via` | `input`, `youtube_search`, `youtube_link` or `instagram_related` | all |
| `icebreaker` | The AI cold-opener, when `writeOpeners` is on | all |
| `scraped_at` | Timestamp of the scrape | all |

`following` is TikTok + Instagram. `posts_count` is all three (videos on TikTok/YouTube, posts on Instagram). `is_private` and `is_business` are TikTok + Instagram; `is_shop_seller` is TikTok only.

**Five saved views** on the Output tab: *Overview*, *Email-ready*, *By platform*, *Social card*, *All columns*.

***

### How the lead score works

Raw points, identical on every platform:

| Signal | Points |
|---|---|
| Email found | 45 |
| Website / link found | 20 |
| Business or commerce account | 10 |
| TikTok Shop seller | 5 |
| Verified | 5 |
| Follower band: 5k–500k | 15 |
| Follower band: 1k–5k or 500k–2M | 10 |
| Follower band: any other non-zero | 5 |

The three platforms cannot earn the same maximum, because YouTube publishes no business flag and no shop flag and Instagram no shop flag:

| Platform | Maximum earnable |
|---|---|
| TikTok | 100 |
| Instagram | 95 |
| YouTube | 85 |

`lead_score = round(earned / platform_maximum * 100)`. Without that normalisation a YouTube row could never exceed 85, and anyone sorting a mixed sheet by score would see every YouTube lead below every comparable TikTok lead **for a signal YouTube simply does not publish**. Grades: A ≥ 80, B ≥ 65, C ≥ 50, D ≥ 35, else F. Tiers: hot ≥ 75, warm ≥ 50, else cold.

***

### Input

| Field | Type | Description |
|---|---|---|
| `platforms` | array | Which platforms to pull from. Default all three. A platform left out is skipped even if its handle list is filled, and the log names the ignored input. |
| `searchKeywords` | array | YouTube keyword search — the only discovery path. One per line. |
| `channels` | array | Specific YouTube channels: `@handles` or channel URLs. |
| `profiles` | array | TikTok creators: usernames, `@handles` or profile URLs. |
| `usernames` | array | Instagram creators: usernames, `@handles` or profile URLs. |
| `crossPlatformDiscovery` | boolean | Also scrape the Instagram/TikTok profiles linked on the YouTube channels found. Default `false` — it adds billed rows. |
| `discoverRelated` | boolean | Follow Instagram's related-accounts list. Default `false`. |
| `maxRelatedPerProfile` | integer | Related accounts queued per Instagram profile. Default `10`. |
| `maxCreators` | integer | Hard cap across all platforms. Default `30`, max `300`. Handles you supply are reserved first, so discovery can never starve them. |
| `maxResults` | integer | YouTube channels per keyword. Default `20`, max `40`. |
| `delaySeconds` | integer | Pause between TikTok/Instagram profiles. Default `1`. |
| `minFollowers` / `maxFollowers` | integer | Follower (or subscriber) range. `0` = no filter. |
| `onlyVerified` | boolean | Verified accounts only. Works on all three platforms. |
| `onlyBusiness` | boolean | Business/commerce accounts only. YouTube rows are kept unfiltered — YouTube publishes no such flag — and the log says how many. |
| `skipPrivate` | boolean | Drop private accounts (TikTok, Instagram). |
| `onlyWithWebsite` | boolean | Drop creators with no external link. |
| `onlyWithEmail` | boolean | Drop creators with no email found. Read the fill rates above first. |
| `minScore` | integer | Keep only leads at or above this score. |
| `enrichEmails` | boolean | Visit each linked site for emails and socials. Default `true` — the main email source on all three platforms. |
| `writeOpeners` | boolean | Write an AI cold-opener per lead. Default `false`. |
| `llmProvider`, `llmApiKey`, `llmModel` | string | Your own OpenAI/Anthropic key, used once per run and never stored. |
| `proxyConfiguration` | object | Defaults to Apify Proxy `RESIDENTIAL` for TikTok and Instagram. YouTube uses the standard pool so a YouTube-heavy run does not spend residential traffic. |

**Saved tasks from the three single-platform Actors keep working.** `maxProfiles`, `minSubscribers`, `maxSubscribers`, `onlyWithContact`, `onlyWithLink`, `onlyCommerce`, `onlyBusinessAccounts` and `keywords` are all accepted as aliases, and the run log names each one it used. A legacy name **wins** over the modern one whenever the modern one is absent or still on its default, so pasting an old input never silently drops your cap or your filters and never bills you for the rows they should have removed. `alsoEmitPosts`, `maxPostsPerProfile`, `hashtags` and `searchQueries` are retired: this Actor delivers exactly one row per creator, and TikTok hashtag/keyword discovery does not exist.

**Example input:**

```json
{
  "platforms": ["tiktok", "instagram", "youtube"],
  "searchKeywords": ["home barista"],
  "profiles": ["gymshark"],
  "usernames": ["gymshark"],
  "crossPlatformDiscovery": true,
  "maxResults": 20,
  "maxCreators": 30,
  "enrichEmails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

#### JSON output sample

A real row from a run on 2026-08-09, trimmed to the filled columns (the other columns are present and `null`):

```json
{
  "platform": "youtube",
  "handle": "SevenMilesCoffeeRoasters",
  "name": "Seven Miles Coffee Roasters",
  "profile_url": "https://www.youtube.com/@SevenMilesCoffeeRoasters",
  "user_id": "UCZQQDp_XZL1AkZ36ToAU_mw",
  "bio": "Comes from a Good Place, Takes you to a Better one. Roasted in Sydney and brewed in cafés and homes across Australia.",
  "country": "Australia",
  "account_created_at": "2016-12-13",
  "followers": 207000,
  "followers_estimated": true,
  "posts_count": 68,
  "total_views": 21965248,
  "verified": false,
  "email": "grow@sevenmiles.com.au",
  "email_source": "website",
  "extra_emails": "hello@sevenmiles.com.au, ramona.taxis@sevenmiles.com.au, training@sevenmiles.com.au",
  "email_status": "found",
  "has_email": true,
  "website": "https://www.sevenmiles.com.au",
  "domain": "sevenmiles.com.au",
  "instagram_url": "https://www.instagram.com/sevenmilescoffeeroasters/",
  "facebook_url": "https://www.facebook.com/sevenmilescoffeeroasters",
  "linkedin_url": "https://www.linkedin.com/company/sevenmilescoffeeroasters",
  "lead_score": 94,
  "lead_grade": "A",
  "lead_tier": "hot",
  "discovered_via": "youtube_search",
  "scraped_at": "2026-08-09T16:42:10.380780+00:00"
}
```

***

### When a platform comes back empty

A merged run must never hide a failure behind a short list.

- If **one** platform is blocked and another delivered rows, the run **succeeds** and the status message names the blocked platform and how many handles never made it into the dataset.
- If **zero** rows were delivered **and** a platform was blocked or throttled, the run **fails loudly** rather than handing you an empty spreadsheet that reads as "there was nothing to find".
- If zero rows came from your filters or from handles that do not exist, that is a legitimate empty result: the run succeeds, says exactly which filter removed how many, and charges nothing.
- Every run writes a `RUN_SUMMARY` record to the key-value store with per-platform requested / returned / blocked / not-found counts, the filters that ran, the per-platform email fill, and the number of rows billed.

***

### Use with AI agents & automation

Plugs straight into your stack. Use the Apify **MCP** server to let AI agents (Claude, ChatGPT, Cursor) run the scraper and read creator leads as a tool call. Trigger runs and pipe results into **Make**, **n8n** or **Zapier** to push new leads into your CRM. Or sync the dataset to **Google Sheets** so your team works from a live list.

***

### Pricing

You are charged per creator lead **delivered after filtering**. Rows removed by your filters cost nothing, handles that were blocked or do not exist cost nothing, and a run that delivers zero rows charges nothing. Keep costs down by capping `maxCreators`, leaving `crossPlatformDiscovery` off, and filtering before you buy. See the Apify Store page for the current per-result price.

***

### Other Flash Scrape scrapers

- [TikTok Creator Leads Scraper](https://apify.com/flash_scraper/tiktok-leads-scraper) — TikTok only
- [Instagram Profile Scraper](https://apify.com/flash_scraper/instagram-profile-scraper) — Instagram profiles, posts and related-account discovery
- [YouTube Leads Scraper](https://apify.com/flash_scraper/youtube-leads-scraper) — YouTube only
- [Google Maps Leads Scraper](https://apify.com/flash_scraper/google-maps-leads-opener) — Google Maps business leads
- [Multi Job Board Scraper](https://apify.com/flash_scraper/multi-jobboard-scraper) — jobs across many boards in one run
- [Smart Scraper by Example](https://apify.com/flash_scraper/smart-scraper-by-example) — no-code web scraper

***

### FAQ

**Can I search TikTok or Instagram by keyword or hashtag?**
No, and no Actor can without an account. TikTok serves no creator data on hashtag or search pages to a logged-out client, and Instagram's search endpoints answer 302/401. **YouTube keyword search is the discovery path** — and with `crossPlatformDiscovery` on, the Instagram and TikTok profiles those channels link to become leads too.

**Will every creator have an email?**
No. See the per-platform fill rates above. Email is on a minority of rows and mostly comes from the linked website, not the bio. `onlyWithEmail` will remove most rows on most lists — which is the point if you only want contactable leads, but do not expect a full sheet.

**Why is `engagement_rate_pct` empty on my TikTok and YouTube rows?**
Because neither platform publishes the data it needs. TikTok's profile payload carries an empty video list (28 of 28 profiles probed) and no play counts; YouTube's About page has no per-video stats. The column is null rather than fabricated, and `posts_sampled` tells you the sample size behind the Instagram numbers.

**Why is a YouTube follower count rounded?**
YouTube itself rounds subscriber counts to three significant figures. Those rows carry `followers_estimated: true`. Total views and video counts are exact, and TikTok and Instagram follower counts are exact.

**Do I need a proxy?**
For TikTok and Instagram, yes in practice — both refuse datacenter IPs, so the default is Apify Proxy `RESIDENTIAL` with a fresh proxy session on every retry. YouTube does not need one and is routed through the standard pool so it does not spend your residential traffic.

**Do I need an API key?**
No. Profile scraping and email finding work without any key. You only supply your own OpenAI or Anthropic key if you turn on AI cold-openers.

**Is the same creator billed twice if they are on two platforms?**
Yes — as two rows, because the follower counts, bios and often the emails differ per platform, and collapsing them would destroy data you paid for. The two rows are cross-linked with `also_on_platforms` so you can group them in one spreadsheet step.

**Is it legal to scrape this data?**
This Actor only collects **public** profile data that anyone can see without logging in. Use it for legitimate outreach and follow each platform's terms and anti-spam law (CAN-SPAM, GDPR) in how you message the leads you collect.

**Can I export to CSV or Google Sheets?**
Yes. Every run exports to CSV, JSON or Excel from the Output tab, and the dataset can sync to Google Sheets or flow through Make, n8n or Zapier.

# Actor input Schema

## `platforms` (type: `array`):

Which platforms to pull creators from. Only YouTube can discover creators from a keyword; TikTok and Instagram need the handles supplied below. A platform left out of this list is skipped entirely even if its handle list is filled, and the run log names the input it ignored.

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

YouTube keyword search - the only discovery path in this Actor. One keyword per line. Each keyword returns about 30 unique channels (measured 28, 27 and 36 for three keywords on 2026-08-09); add keywords for volume rather than raising the limit below.

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

Specific YouTube channels: @handles or channel URLs, one per line. Scraped in addition to anything the keywords find.

## `profiles` (type: `array`):

TikTok creators: usernames, @handles or profile URLs, one per line. TikTok serves no creator data on its hashtag or search pages to a logged-out client, so this list is the only way in.

## `usernames` (type: `array`):

Instagram creators: usernames, @handles or profile URLs, one per line. Instagram cannot be searched by keyword or hashtag without an account either, so this list is the only way in.

## `crossPlatformDiscovery` (type: `boolean`):

Scrape the Instagram and TikTok profiles linked from the About page of every YouTube channel found above. Measured on 9 channels discovered on 2026-08-09: 7 published an Instagram link and 3 a TikTok link. Each followed handle becomes an extra billed row, which is why this is off by default.

## `discoverRelated` (type: `boolean`):

Follow Instagram's own related-accounts list (up to ~49 per profile) to find more creators. Instagram-only, and it starts from a handle you already supplied.

## `maxRelatedPerProfile` (type: `integer`):

How many related accounts to queue from each Instagram profile when the option above is on.

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

Hard cap on creators scraped across all platforms in one run - the stop condition for discovery and the main cost lever. The handles you supply yourself are reserved first, so YouTube discovery can never starve them.

## `maxResults` (type: `integer`):

YouTube channels to collect per keyword. One YouTube search returns about 30 unique channels (measured 28, 27 and 36 for three keywords on 2026-08-09, combining the plain results page with the channel-filtered one); ask for more and you get what exists, not an error. Add keywords for volume.

## `delaySeconds` (type: `integer`):

Pause between profiles on TikTok and Instagram. Both throttle bursts from one IP, so a small delay improves the success rate on long lists.

## `minFollowers` (type: `integer`):

Keep only creators with at least this many followers (0 = no filter). Applies to every platform - on YouTube this is the subscriber count, which YouTube itself rounds.

## `maxFollowers` (type: `integer`):

Keep only creators with at most this many followers (0 = no cap). Use with the minimum to target nano, micro or macro tiers.

## `onlyVerified` (type: `boolean`):

Keep only verified accounts. Works on all three platforms - the YouTube badge is read from the channel page, not assumed.

## `onlyBusiness` (type: `boolean`):

Keeps only accounts flagged as business or commerce. TikTok and Instagram publish that flag; YouTube does not, so YouTube rows are kept unfiltered and the run log says how many.

## `skipPrivate` (type: `boolean`):

Drop private accounts. Applies to TikTok and Instagram; YouTube channels have no private flag.

## `onlyWithWebsite` (type: `boolean`):

Drop creators who published no external link. Measured link rates: TikTok 15 of 28 profiles had a bio link; 4 of 9 YouTube channels published a non-social website.

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

Drop creators where no email was found in the bio or on the linked site. Expect it to remove most rows - see the measured fill rates in the README before you rely on it.

## `minScore` (type: `integer`):

Keep only leads scoring at or above this value, 0-100 (0 = no filter). The score is normalised per platform, so a YouTube lead is comparable to a TikTok one.

## `enrichEmails` (type: `boolean`):

Visit each creator's linked site (home, /contact, /about, resolving Linktree-style pages) for emails and social profiles. This is the main email source on all three platforms - no key needed.

## `writeOpeners` (type: `boolean`):

Generate a personalized one-sentence outreach opener for each lead, aware of which platform the creator is on. Requires your own OpenAI/Anthropic key below.

## `llmProvider` (type: `string`):

AI provider used to write the cold openers - OpenAI (GPT) or Anthropic (Claude). Use the provider that matches the API key you supply.

## `llmApiKey` (type: `string`):

Your own OpenAI or Anthropic API key. Used once per run to write the openers; never logged and never stored.

## `llmModel` (type: `string`):

Override the default model (gpt-4o-mini for OpenAI, claude-haiku-4-5-20251001 for Anthropic).

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

TikTok and Instagram refuse datacenter IPs, so the RESIDENTIAL group is the default and every retry mints a fresh proxy session (a sticky session would retry one burned exit IP forever). YouTube does not need residential and is routed through the standard Apify Proxy pool instead, so a YouTube-only run does not spend residential traffic.

## Actor input object example

```json
{
  "platforms": [
    "tiktok",
    "instagram",
    "youtube"
  ],
  "searchKeywords": [
    "home barista"
  ],
  "channels": [
    "@mkbhd"
  ],
  "profiles": [
    "gymshark"
  ],
  "usernames": [
    "gymshark"
  ],
  "crossPlatformDiscovery": false,
  "discoverRelated": false,
  "maxRelatedPerProfile": 10,
  "maxCreators": 10,
  "maxResults": 20,
  "delaySeconds": 1,
  "minFollowers": 0,
  "maxFollowers": 0,
  "onlyVerified": false,
  "onlyBusiness": false,
  "skipPrivate": false,
  "onlyWithWebsite": false,
  "onlyWithEmail": false,
  "minScore": 0,
  "enrichEmails": true,
  "writeOpeners": false,
  "llmProvider": "openai",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchKeywords": [
        "home barista"
    ],
    "profiles": [
        "gymshark"
    ],
    "usernames": [
        "gymshark"
    ],
    "maxCreators": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("flash_scraper/creator-leads-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 = {
    "searchKeywords": ["home barista"],
    "profiles": ["gymshark"],
    "usernames": ["gymshark"],
    "maxCreators": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("flash_scraper/creator-leads-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 '{
  "searchKeywords": [
    "home barista"
  ],
  "profiles": [
    "gymshark"
  ],
  "usernames": [
    "gymshark"
  ],
  "maxCreators": 10
}' |
apify call flash_scraper/creator-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,flash_scraper/creator-leads-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/9Y46iDe52mQSpJLyE/builds/6I2VMHcKzHbMQcBMQ/openapi.json
