# TikTok Creator Contact Scraper — Email, Socials & Bio Link (`haketa/tiktok-contact-scraper`) Actor

Scrape TikTok creator contact data for influencer marketing & lead-gen: email, bio-link website, other socials (Instagram/YouTube), category, verification and follower/likes stats. Enter usernames or profile URLs.

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

## Pricing

from $3.50 / 1,000 results

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## TikTok Creator Contact Scraper — Email, Socials & Bio Link

> **Extract TikTok creator contact data for influencer marketing & lead generation: email, bio-link website, other socials (Instagram / YouTube / Twitter / Snapchat), category, verification and follower/likes/video stats.** Paste usernames or profile URLs and get clean, structured JSON/CSV/Excel in seconds.

[![Creators](https://img.shields.io/badge/TikTok-Creator%20Contacts-000000)]()
[![Email & Socials](https://img.shields.io/badge/Email%20%2B%20Bio%20Link%20%2B%20Socials-25F4EE)]()
[![Influencer Leads](https://img.shields.io/badge/Influencer-Lead%20Gen-FE2C55)]()
[![Export](https://img.shields.io/badge/Export-JSON%20%2F%20CSV%20%2F%20Excel-fb8500)]()

***

### What This Actor Does

This Actor turns a list of TikTok creators into a contact & outreach dataset — the TikTok counterpart of a YouTube channel contact scraper. For each creator it returns:

- **Contact** — email *(when the creator publishes one — see note below)*, bio-link website
- **Other socials** — Instagram, YouTube, Twitter/X, Snapchat handles pulled from the bio & links
- **Profile** — username, display name, bio, category, verification, region, private flag
- **Reach** — follower count, following, total likes (hearts), video count
- **Media** — avatar and profile URL

Give it usernames or profile URLs and it returns one clean row per creator — ready for influencer outreach, CRM import or lead scoring.

> ### ⚠️ Please read: about the `email` field
>
> **TikTok has no dedicated "email" field** (unlike YouTube's channel "email" button), and **most creators do not put an email in their bio.** So the `email` field is **populated for only a minority of creators** — usually **business / brand / larger creator accounts**. For everyone else, `email` comes back **empty by design** — this is a limit of what TikTok makes public, not a bug, and no scraper can change it.
>
> **What you always get** for (almost) every creator: **bio-link website**, **socials** (Instagram / YouTube / etc.), **category**, and full **reach stats** (followers, likes, videos). Most users reach creators via the **bio-link website or DMs/socials** and treat email as a bonus.
>
> **To get more emails:** turn on **`Include email enrichment`** — it opens each creator's bio-link website and extracts an email from there when the bio has none. This meaningfully raises the hit-rate but adds one request per creator.

***

### Why Use This

- **Reach creators directly.** Email and bio-link website turn a TikTok handle into an actionable contact — exactly what you need for influencer outreach and partnerships.
- **Cross-platform footprint.** Instagram / YouTube / Twitter / Snapchat handles let you find and verify a creator across every platform.
- **Score & segment.** Follower count, likes, category and verification make it easy to rank creators by reach and fit.
- **Bio-link email enrichment.** Optionally follow the creator's bio-link website to find an email that isn't in the bio.

***

### Quick Start

#### Run it in the console (no code)

1. Paste one or more TikTok **usernames** (e.g. `gordonramsayofficial`) or profile URLs.
2. Toggle **Enrich email from bio-link website** to find more emails.
3. Click **Start**, then export as **JSON, CSV, Excel or HTML**, or push to Google Sheets, a webhook or a database.

> The proxy is preconfigured (US residential) since TikTok requires it — just paste handles and run.

#### Run it via API (Python)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run_input = {
    "usernames": ["gordonramsayofficial", "mrbeast", "khaby.lame"],
    "includeEmailEnrich": True,
}

run = client.actor("YOUR_USERNAME/tiktok-contact-scraper").call(run_input=run_input)

for c in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(c["username"], "·", c["followers"], "·", c["email"] or c["website"])
```

#### Build an influencer outreach list (Python)

```python
run = client.actor("YOUR_USERNAME/tiktok-contact-scraper").call(run_input={
    "usernames": [ ... your creator handles ... ],
    "includeEmailEnrich": True,
})

leads = []
for c in client.dataset(run["defaultDatasetId"]).iterate_items():
    if (c.get("followers") or 0) >= 100000 and (c.get("email") or c.get("website")):
        leads.append({
            "handle": c["username"], "name": c["nickname"], "email": c["email"],
            "website": c["website"], "instagram": c["instagram"], "followers": c["followers"],
        })
print(len(leads), "contactable creators")
```

***

### Input Parameters

| Field | Type | Description |
|---|---|---|
| `usernames` | array | TikTok @handles or profile URLs (one creator per entry). |
| `includeEmailEnrich` | boolean | If no email in bio, fetch the bio-link website and try to extract one. Default `false`. |
| `maxItems` | integer | Optional hard cap on total creators. `0` = no limit. |
| `proxyConfiguration` | object | Preconfigured to US residential (required by TikTok). |

**Getting handles:** a creator's handle is the `@name` in their profile URL — `tiktok.com/@gordonramsayofficial` → `gordonramsayofficial`. Paste either form.

***

### Output

Each creator is one record:

```json
{
  "username": "gordonramsayofficial",
  "nickname": "Gordon Ramsay",
  "bio": "I cook sometimes too.....",
  "email": "",
  "emails": [],
  "website": "https://GordonRamsay.com/",
  "instagram": "", "youtube": "", "twitter": "", "snapchat": "",
  "category": "",
  "verified": true, "privateAccount": false, "region": "GB",
  "followers": 40700000, "following": 0, "hearts": 729900000, "videos": 712,
  "avatar": "https://...",
  "profileUrl": "https://www.tiktok.com/@gordonramsayofficial"
}
```

***

### Use Cases

#### 1. Influencer marketing & outreach

Build contactable creator lists — email, bio-link and cross-platform socials — for campaign outreach and partnerships, segmented by follower reach and category.

#### 2. Creator lead generation

Turn creator handles into leads with contact details and reach stats for agencies, brands and creator-economy tools.

#### 3. Cross-platform creator mapping

Link a TikTok creator to their Instagram, YouTube, Twitter and website to build a full profile and verify identity.

#### 4. Influencer discovery & scoring

Rank and filter creators by followers, likes, verification and category to shortlist the best fit for a campaign.

#### 5. CRM & data enrichment

Enrich existing creator/influencer records with fresh emails, websites, socials and reach metrics.

***

### Tips

- **`includeEmailEnrich`** meaningfully increases email hit-rate by following the bio-link website — enable it for outreach lists.
- **Reach filtering:** use `followers` and `hearts` to focus on tiers (nano/micro/macro) that fit your budget.
- **Private accounts** return limited data; verified/business creators tend to expose the most contact info.
- **Schedule it** with Apify Schedules to keep creator contacts and reach up to date.

***

### Frequently Asked Questions

**Do I need a TikTok account?**
No. The Actor reads publicly visible profile data — no login or cookies required.

**Will every creator have an email?**
No — and this is expected. TikTok has no public "email" field and most creators don't put an email in their bio, so the `email` field is filled for only a **minority** of creators (usually business/brand accounts) and is **empty for the rest by design**. You still get their bio-link website, socials and reach stats. Turn on **Include email enrichment** to scan each bio-link website and find more emails.

**How does email extraction work?**
Emails are read from the public bio, and — with enrichment on — from the creator's bio-link website. No email is invented or guessed; an empty `email` simply means the creator didn't publish one where it's publicly readable.

**Why is a proxy required?**
TikTok is protected by anti-bot; a US residential proxy is preconfigured so it works out of the box.

**Can I look up many creators at once?**
Yes — paste as many usernames as you like; each returns one row.

**What export formats are supported?**
JSON, CSV, Excel, HTML, or via API — plus Google Sheets, webhooks, Make and Zapier.

***

### Legal & Responsible Use

This Actor collects only publicly available profile information for research, marketing and business use. You are responsible for how you use the data. Please:

- Respect TikTok's Terms of Service and robots directives.
- Comply with applicable data-protection laws (GDPR/CCPA) and anti-spam laws (e.g. CAN-SPAM) when contacting creators.
- Do not use the data for spam, harassment, or any unlawful purpose.
- Use reasonable request volumes and scheduling.

This project is an independent tool and is not affiliated with, endorsed by, or sponsored by TikTok.

# Actor input Schema

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

TikTok @handles or profile URLs (e.g. gordonramsayofficial or https://www.tiktok.com/@gordonramsayofficial). One creator per entry.

## `includeEmailEnrich` (type: `boolean`):

If no email is found in the bio, fetch the creator's bio-link website and try to extract an email from it. Slower (one extra request per creator) but finds more emails.

## `maxItems` (type: `integer`):

Optional hard cap on total creators. 0 = no limit.

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

TikTok requires a US residential proxy (datacenter IPs are blocked by anti-bot) — residential is enabled by default.

## Actor input object example

```json
{
  "usernames": [
    "gordonramsayofficial",
    "mrbeast"
  ],
  "includeEmailEnrich": true,
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `username` (type: `string`):

TikTok @handle

## `nickname` (type: `string`):

Display name

## `bio` (type: `string`):

Profile bio (signature)

## `email` (type: `string`):

Primary email found

## `emails` (type: `string`):

All emails found

## `website` (type: `string`):

Bio-link website

## `instagram` (type: `string`):

Instagram handle

## `youtube` (type: `string`):

YouTube handle/channel

## `twitter` (type: `string`):

Twitter/X handle

## `snapchat` (type: `string`):

Snapchat handle

## `category` (type: `string`):

Creator/business category

## `verified` (type: `string`):

Verified account

## `privateAccount` (type: `string`):

Private account

## `region` (type: `string`):

Country/region

## `followers` (type: `string`):

Follower count

## `following` (type: `string`):

Following count

## `hearts` (type: `string`):

Total likes (hearts)

## `videos` (type: `string`):

Video count

## `avatar` (type: `string`):

Profile picture URL

## `profileUrl` (type: `string`):

TikTok profile URL

## `scrapedAt` (type: `string`):

ISO timestamp

# 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 = {
    "usernames": [
        "gordonramsayofficial",
        "mrbeast"
    ],
    "includeEmailEnrich": true,
    "maxItems": 0,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/tiktok-contact-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 = {
    "usernames": [
        "gordonramsayofficial",
        "mrbeast",
    ],
    "includeEmailEnrich": True,
    "maxItems": 0,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/tiktok-contact-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 '{
  "usernames": [
    "gordonramsayofficial",
    "mrbeast"
  ],
  "includeEmailEnrich": true,
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call haketa/tiktok-contact-scraper --silent --output-dataset

```

## MCP server setup

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