# TikTok Email Scraper - Creator Leads & Contacts (`flash_scraper/tiktok-leads-scraper`) Actor

TikTok email scraper that turns any niche into a creator lead list. Search by hashtag, keyword, or profile and extract emails from bios + linked sites, follower/engagement stats, business & verified flags, and a 0-100 lead score. Export CSV/JSON/Excel.

- **URL**: https://apify.com/flash\_scraper/tiktok-leads-scraper.md
- **Developed by:** [Flash Scrape](https://apify.com/flash_scraper) (community)
- **Categories:** Social media, Lead generation, E-commerce
- **Stats:** 2 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 leads

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

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

## What's an Apify Actor?

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

> # Superseded — use [Creator & Influencer Leads](https://apify.com/flash_scraper/creator-leads-scraper) instead
>
> This Actor still works, but it is no longer maintained and is hidden from Store search.
> Everything it does is now part of
> [**flash\_scraper/creator-leads-scraper**](https://apify.com/flash_scraper/creator-leads-scraper),
> which covers TikTok *plus* Instagram *plus* YouTube in one run and one schema, so you stop stitching
> three exports together.
>
> **What carries over exactly:** the same direct profile read (no login, no API key, no dependency on
> another Actor), the same follower/likes/video counts, bio link, business-account flag and lead score.
>
> **Worth knowing:** TikTok cannot be discovered by keyword when logged out, so handles must be supplied
> there too — that limit is TikTok's, not ours, and it applies to both Actors.

## TikTok Creator Leads Scraper — Profiles, Bio Links & Emails

**Give this scraper a list of TikTok creators and it turns them into a sales-ready lead table** — nickname, bio, bio-link website, follower/likes/video counts, business-account flag and category, TikTok Shop flag, verified badge, an email where one is findable, and a 0–100 lead score. Export to CSV, JSON, or Excel.

It reads TikTok's own public profile pages directly. No login, no API key, no cookie, and no dependency on any other Actor.

***

### What it does, step by step

1. **You supply the creators** — usernames, `@handles`, or profile URLs, one per line.
2. **Direct profile scrape** — each profile page is fetched over HTTP/2 through a rotating residential proxy and its server-rendered profile record is parsed.
3. **Email finding** — the bio is scanned for an address, and (on by default) the bio-link website is visited — home, `/contact`, `/about`, resolving Linktree-style pages — for emails and LinkedIn/Facebook/Instagram profiles.
4. **Score, filter, dedupe** — your quality filters run, duplicates are removed, and every lead is scored 0–100 and graded A–F.
5. **Optional AI opener** — one personalized outreach sentence per lead, using your own OpenAI/Anthropic key.
6. **Export** — a clean sortable table, downloadable as CSV, JSON, or Excel.

***

### What data you get

One row per creator, best leads first, with the **same columns on every row**:

| Column | What it is |
|---|---|
| `handle`, `name`, `profile_url` | Username, display name, direct profile link |
| `bio` | The creator's bio text (`signature`) |
| `category` | TikTok's own business category — present on business/commerce accounts |
| `email`, `email_source`, `email_status`, `extra_emails` | Best email, whether it came from `bio` or `website`, found/missing, and any additional addresses |
| `website`, `domain` | The bio link and its bare domain |
| `linkedin`, `facebook`, `instagram` | Social profiles found on the linked website |
| `followers`, `following`, `likes`, `videos`, `friends` | Exact counts (taken from TikTok's precise `statsV2`, not the rounded display numbers) |
| `verified`, `is_commerce`, `tt_seller`, `is_private`, `is_organization` | Account-type flags — `tt_seller` means a TikTok Shop seller |
| `user_id`, `account_created_at` | TikTok user id and account creation date |
| `lead_score`, `lead_grade`, `lead_tier`, `has_email`, `has_website` | 0–100 score, A–F grade, hot/warm/cold tier |
| `icebreaker` | The AI cold-opener, when `writeOpeners` is on |
| `scraped_at` | Timestamp of the scrape |

***

### What this Actor does NOT do — and why

Everything below was probed directly on 2026-08-09 rather than assumed. It is listed here so you know before you spend a credit.

- **No discovery by hashtag or keyword.** TikTok publishes no creator data on `/tag/<hashtag>`, `/search?q=` or `/search/user?q=` to a logged-out client: those pages render a data blob containing zero usernames, and TikTok's search API answers with an empty body without its signed request parameters. The old `hashtags` / `searchQueries` inputs were removed rather than left to return empty runs. **Bring your own list of creators.**
- **No engagement rate.** The profile page's video list (`itemList`) came back empty on all 28 profiles probed, and no view count appears anywhere in the payload, so a real engagement rate cannot be computed. The column was removed rather than shipped permanently blank.
- **No phone numbers.** TikTok publishes no phone field on a profile.
- **No follower lists, no video-by-video data, no comments.** Those need a signed API request this Actor does not make.

***

### Email fill-rate — the honest numbers

TikTok has no email field. An address only exists if the creator typed one into their bio, or published one on the site they link to. Measured on real profiles on 2026-08-09:

- **bio contained an email: 1 of 28 profiles (3.6%)**
- **profile had a bio link at all: 15 of 28 (54%)**
- **end-to-end email fill on a 10-creator run with `enrichEmails` on: 3 of 10 (30%)** — all three from the linked website, none from a bio
- a second run over 5 creators who link their own brand site rather than a Linktree returned **4 of 5** — the fill rate depends far more on *where the bio link points* than on follower count. A link straight to the creator's own domain usually yields an address; a Linktree/short-link often yields none.

So: leave `enrichEmails` on (it is the main email source), and expect email on a minority of rows. `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. Nano/micro creators put "📧 collabs@…" in their bio far more often than big brands do; large brands more often publish a press/support address on their website.

***

### Proxy: required in practice

TikTok answers a request from an IP it does not like with a ~12 KB JavaScript shell containing no data — HTTP 200, no error code. Measured the same day:

| Setup | Profiles that returned data |
|---|---|
| Apify Proxy **RESIDENTIAL**, fresh proxy session per attempt | **34 / 34** (1.4 attempts avg, 3 at worst) |
| One un-proxied IP, once it had been used for a while | 3 / 15 |

The default `proxyConfiguration` is therefore Apify Proxy with the `RESIDENTIAL` group, and every retry rotates to a fresh exit IP. You can supply your own proxies with `proxyUrls` instead.

***

### Filters & options

You are only charged for leads delivered **after** filtering, so filters lower your bill.

- **Minimum / maximum followers** — target nano, micro, or macro tiers precisely.
- **Only verified accounts** — verified creators only.
- **Only business / commerce accounts** — strong B2B signal, and the only accounts that carry a category.
- **Only creators with a bio link** — drop anyone with no external link.
- **Only creators with an email** — best for cold-email campaigns; see the fill-rate section above first.
- **Minimum lead score** — keep only your best A/B leads.
- **Find emails on the linked website** — on by default, no key needed.
- **Write an AI cold-opener per lead** — requires your own OpenAI/Anthropic key.

#### Input

| Field | Type | Description |
|---|---|---|
| `profiles` | array | The creators to scrape — usernames, `@handles`, or profile URLs, one per line. |
| `maxCreators` | integer | Cap on how many profiles from that list get scraped. Default `30`, max `200`. |
| `delaySeconds` | integer | Pause between profiles. Default `1`. |
| `proxyConfiguration` | object | Defaults to Apify Proxy `RESIDENTIAL`. See above — a residential proxy is required in practice. |
| `minFollowers` | integer | Keep only creators with at least this many followers (`0` = no filter). |
| `maxFollowers` | integer | Keep only creators with at most this many followers (`0` = no cap). |
| `onlyVerified` | boolean | Keep only verified creators. Default `false`. |
| `onlyCommerce` | boolean | Keep only business / commerce accounts. Default `false`. |
| `onlyWithWebsite` | boolean | Drop creators with no bio link. Default `false`. |
| `onlyWithEmail` | boolean | Drop creators where no email was found. Default `false`. |
| `minScore` | integer | Keep only leads scoring at or above this value (`0` = no filter). |
| `enrichEmails` | boolean | Visit each bio-link site to extract emails + socials. Default `true`. |
| `writeOpeners` | boolean | Write an AI cold-opener per lead. Default `false`. |
| `llmProvider` | string | AI provider for openers: `openai` or `anthropic`. |
| `llmApiKey` | string | Your own OpenAI/Anthropic key — used once per run, never stored. |
| `llmModel` | string | Optional model override. |

**Example input:**

```json
{
  "profiles": ["gymshark", "@semrush", "https://www.tiktok.com/@chipotle"],
  "maxCreators": 30,
  "minFollowers": 5000,
  "enrichEmails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

#### JSON output sample

A real row from a run on 2026-08-09 (trimmed to the main columns):

```json
{
  "lead_score": 90,
  "lead_grade": "A",
  "lead_tier": "hot",
  "handle": "garyvee",
  "name": "GaryVee",
  "category": "Shopping & Retail",
  "bio": "Creator and CEO of @veefriends\nI do not have any Telegram accounts",
  "email": "support@veefriends.com",
  "email_source": "website",
  "email_status": "found",
  "website": "http://veefriends.com/comics",
  "domain": "veefriends.com",
  "followers": 15442742,
  "following": 284,
  "likes": 369805481,
  "videos": 6450,
  "verified": true,
  "is_commerce": true,
  "tt_seller": true,
  "user_id": "17309235",
  "account_created_at": "2015-11-24T07:15:39+00:00",
  "profile_url": "https://www.tiktok.com/@garyvee"
}
```

Results render as a sortable table on the Output tab and export to CSV, JSON, or Excel.

***

### 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 lead **delivered after filtering** — rows removed by your filters cost nothing, and a run that delivers zero rows charges nothing. Keep costs down by capping `maxCreators` and filtering before you buy. See the Apify Store page for the current per-result price.

***

### Other Flash Scrape scrapers

- [Instagram Profile Scraper](https://apify.com/flash_scraper/instagram-profile-scraper) — Instagram profiles, posts, and related-account discovery
- [Google Maps Leads Scraper](https://apify.com/flash_scraper/google-maps-leads-opener) — Google Maps business leads
- [Yelp Leads Scraper](https://apify.com/flash_scraper/yelp-leads-scraper) — Yelp business leads
- [BBB + Yellow Pages Leads Scraper](https://apify.com/flash_scraper/bbb-yellowpages-leads-scraper) — BBB + Yellow Pages leads
- [YouTube Leads Scraper](https://apify.com/flash_scraper/youtube-leads-scraper) — YouTube creator leads
- [Smart Scraper by Example](https://apify.com/flash_scraper/smart-scraper-by-example) — no-code web scraper

***

### FAQ

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

**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 — used once per run, never stored.

**Can I search TikTok by hashtag or keyword?**
No, and no version of this Actor can: TikTok does not serve creator data on hashtag or search pages to a logged-out client. Supply the creators you want in `profiles`.

**Will every creator have an email?**
No. See the fill-rate section above for the measured numbers — email is on a minority of rows, and mostly comes from the linked website rather than the bio.

**Why did some handles come back missing?**
The run reports them explicitly: `does not exist` (TikTok status 10221 — check the spelling, usernames are exact), `unavailable` (10222 — restricted, renamed, or withheld in that region), or `refused on every proxy IP` (TikTok blocked every exit node tried — retry, or use a dedicated residential proxy). A run that delivers zero rows because it was blocked **fails loudly** instead of quietly handing you an empty spreadsheet.

**How many creators can I scrape per run?**
Up to 200, set by `maxCreators`.

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

***

### More from Flash Scrape

Same publisher, same rules: no API keys, pay per row, filters run before billing.

- [Multi Job Board Scraper](https://apify.com/flash_scraper/multi-jobboard-scraper) - LinkedIn, Indeed, Glassdoor and 9 more boards in one deduplicated table
- [Local Business Leads Scraper](https://apify.com/flash_scraper/local-business-leads) - local businesses in any category and city with MX-verified emails, phones and socials
- [Remote Jobs Aggregator](https://apify.com/flash_scraper/remote-job-aggregator) - 10 remote job boards in one feed, only-new-jobs monitoring
- [Creator Leads Scraper](https://apify.com/flash_scraper/creator-leads-scraper) - YouTube, TikTok and Instagram creator emails in one run

# Actor input Schema

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

The creators to scrape — usernames, @handles, or profile URLs, one per line (e.g. 'gymshark', '@nike', 'https://www.tiktok.com/@duolingo').

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

Cap on how many profiles from the list above are scraped (controls cost).

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

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

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

TikTok answers requests from a 'hot' IP with an empty page instead of profile data, so a RESIDENTIAL proxy is required in practice. Measured 2026-08-09: 34/34 profiles returned data through Apify Proxy RESIDENTIAL (a fresh proxy session per attempt), while an un-proxied IP degraded to 3/15 once it got hot.

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

Keep only creators with at least this many followers (0 = no filter).

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

Keep only creators with at most this many followers (0 = no cap). Use with min to target nano/micro/macro tiers.

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

Keep only verified (blue-badge) creators — usually larger, established accounts.

## `onlyCommerce` (type: `boolean`):

Keep only TikTok business/commerce accounts (a strong B2B signal, and the only accounts that carry a category).

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

Drop creators with no external link in bio. Measured on a 28-profile sample: 54% had one.

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

Drop creators where no email could be found in the bio or on the linked website. Best for cold-email campaigns — but expect it to remove most rows: only 3.6% of profiles in the measured sample had an email in the bio itself.

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

Visit each creator's bio-link site (home + /contact + /about, resolving Linktree-style pages) to extract emails and social links. This is the main email source — TikTok bios rarely contain one. No key needed.

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

Generate a personalized one-sentence outreach opener for each lead. Requires your 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 LLM API key you supply.

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

Your own OpenAI or Anthropic API key. Used only to write the openers; never stored.

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

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

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

Keep only leads scoring at or above this value, 0-100 (0 = no filter). Pay only for your best A/B leads.

## Actor input object example

```json
{
  "profiles": [
    "gymshark"
  ],
  "maxCreators": 30,
  "delaySeconds": 1,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "minFollowers": 0,
  "maxFollowers": 0,
  "onlyVerified": false,
  "onlyCommerce": false,
  "onlyWithWebsite": false,
  "onlyWithEmail": false,
  "enrichEmails": true,
  "writeOpeners": false,
  "llmProvider": "openai",
  "minScore": 0
}
```

# 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 = {
    "profiles": [
        "gymshark",
        "semrush",
        "chipotle"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("flash_scraper/tiktok-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 = { "profiles": [
        "gymshark",
        "semrush",
        "chipotle",
    ] }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,flash_scraper/tiktok-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/XnHFISupbUwLi3KRu/builds/C2dbvyr1h8RnNsJk1/openapi.json
