# TikTok Email & Phone Scraper (`seemuapps/tiktok-contact-scraper`) Actor

Find emails, phone numbers and social links for TikTok creators - scans the bio and follows the bio link, including Linktree, Beacons, Stan and 40+ link-in-bio tools.

- **URL**: https://apify.com/seemuapps/tiktok-contact-scraper.md
- **Developed by:** [Seemu Scraping](https://apify.com/seemuapps) (community)
- **Stats:** 1 total users, 0 monthly users, 85.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00 / 1,000 profile processeds

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/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 Email & Phone Scraper

Find the email address, phone number, WhatsApp and other social accounts for any list of TikTok creators. The scraper reads the TikTok bio, then opens the bio link and follows it through **Linktree, Beacons, Stan Store, Komi, Carrd, lnk.bio, bio.link, Taplink, hoo.be and 40+ other link-in-bio tools** to the creator's own website, so every contact channel ends up in one clean dataset.

No TikTok login required. Works on any public profile.

### What you get

For each TikTok username:

- **Emails** from the bio, the link-in-bio page and the creator's own website (including its contact page)
- **Phone numbers** and **WhatsApp numbers**
- **Where each contact was found** (`bio` or the exact page URL), so you can check it before you reach out
- **Other social accounts**: Instagram, YouTube, X, Facebook, LinkedIn, Threads, Snapchat, Pinterest, Spotify, Twitch and more
- **Profile basics**: display name, follower, like and video counts, verified badge, business account flag, bio text and bio link

### Use cases

- **Influencer outreach**: turn a shortlist of TikTok creators into an emailable contact sheet
- **Lead generation**: collect business emails and phone numbers from realtors, coaches, shops and other small businesses on TikTok
- **Brand partnerships and UGC sourcing**: find the booking or management email for creators in your niche
- **Sales prospecting**: enrich a TikTok account list with phone, email and LinkedIn
- **PR and talent scouting**: get the direct contact for rising creators before your competitors do

### How to use

1. Enter TikTok usernames or profile URLs, one per line (with or without `@`)
2. Leave **Scan the bio link** on to follow the link in bio. Turn it off for a faster, bio-only run
3. Click **Start**. Results appear in the **Dataset** tab while the run is in progress
4. Export to CSV, Excel, JSON or Google Sheets from the **Export** button

### How contacts are found

1. **Bio text**: emails (including `name [at] domain [dot] com` spellings), phone numbers, and handles such as `IG: @name`
2. **Bio link**: the link on the profile, or a website typed into the bio
3. **Link-in-bio pages** such as Linktree and Stan: the page's own email and phone buttons, plus up to 5 of the creator's links. The creator's own website is checked first. Stores, streaming and ticketing links are skipped
4. **Contact page**: if no email has turned up yet, the scraper opens the contact or about page on the creator's website

Contacts that belong to someone else are filtered out. That includes a store's support address, a news site's editor inbox, other agents on a brokerage listing, and addresses taken from website boilerplate.

### Free plan limits

To keep the actor available to everyone, free runs are limited to:

- **5 profiles per run**
- **1 run every 30 minutes**
- **3 runs per day**

If you hit a limit, the run finishes with a message explaining what happened and nothing is charged. Upgrade to a paid Apify plan to remove these limits.

### Input

| Field | Type | Required | Description |
|---|---|---|---|
| `usernames` | `string[]` | Yes | TikTok usernames or profile URLs |
| `scrapeLinkInBio` | `boolean` | | Open and scan the bio link (default `true`) |

#### Example input

```json
{
  "usernames": ["thebudgetmom", "@melissaortarealtor", "https://www.tiktok.com/@sandyisyouragent"],
  "scrapeLinkInBio": true
}
```

### Output

Each profile becomes one dataset record:

```json
{
  "recordType": "profile",
  "username": "melissaortarealtor",
  "nickname": "Melissa Orta",
  "profileUrl": "https://www.tiktok.com/@melissaortarealtor",
  "followers": 37900,
  "verified": false,
  "isBusinessAccount": true,
  "bio": "Lehigh Acres • Naples • LaBelle 🏡 …",
  "bioLink": "https://linktr.ee/melissaortarealtor",
  "bioLinkPlatform": "linktree",
  "bioLinkStatus": "ok",
  "emails": ["melissaortarealtor@gmail.com"],
  "phones": ["7867593405", "+17866356365"],
  "whatsapp": ["+17867593405"],
  "emailSources": [
    { "value": "melissaortarealtor@gmail.com", "sources": ["https://linktr.ee/melissaortarealtor", "https://melissaortarealtor.com/"] }
  ],
  "phoneSources": [
    { "value": "7867593405", "sources": ["bio", "https://melissaortarealtor.com/"] }
  ],
  "instagram": "melissaortarealtor",
  "youtube": "UCoeAbW4I15FTeg9zzP8auUg",
  "x": null,
  "linkedin": null,
  "socialProfiles": [
    { "platform": "instagram", "handle": "melissaortarealtor", "url": "https://www.instagram.com/melissaortarealtor" }
  ],
  "childLinks": ["https://melissaortarealtor.com/", "…"],
  "pagesScanned": ["https://linktr.ee/melissaortarealtor", "https://melissaortarealtor.com/", "…"]
}
```

#### Output fields

| Field | Type | Description |
|---|---|---|
| `recordType` | `string` | `profile` for results, `notice` for skipped profiles |
| `username` | `string` | TikTok username |
| `nickname` | `string` | Display name |
| `profileUrl` | `string` | TikTok profile URL |
| `followers`, `following`, `likes`, `videos` | `number` | Profile counters |
| `verified` | `boolean` | Verified badge |
| `isBusinessAccount` | `boolean` | Whether the profile is a TikTok business account |
| `bio` | `string` | Bio text |
| `bioLink` | `string` | Link in bio (or the website typed into the bio) |
| `bioLinkPlatform` | `string` | `linktree`, `beacons`, `stan`, `komi`, … or `other` for a regular website |
| `bioLinkStatus` | `string` | `ok`, `not_found`, `blocked`, `error`, or `skipped` (bio link is a social profile, or scanning is off) |
| `emails` | `string[]` | All unique emails found |
| `phones` | `string[]` | All unique phone numbers found |
| `whatsapp` | `string[]` | WhatsApp numbers found |
| `emailSources` / `phoneSources` | `object[]` | Each contact with the list of places it was found (`bio` or a page URL) |
| `instagram`, `youtube`, `x`, `facebook`, `linkedin`, `threads`, `snapchat`, `pinterest`, `spotify`, `twitch` | `string` | Handle on each network, if linked |
| `socialProfiles` | `object[]` | Every social profile found, with platform, handle and URL |
| `childLinks` | `string[]` | Links followed from a link-in-bio page |
| `pagesScanned` | `string[]` | Every page that was opened |

#### Notice rows

A profile that can't be processed shows up as a `notice` row with a `message`, for example when the account doesn't exist, has been renamed, or is private. Notice rows are **never charged**.

### Pricing

You pay once for each profile record in the dataset, however many emails or phone numbers it contains. Notice rows (not found, private, invalid input) are free.

### Notes

- Only public profiles are processed. Private accounts return a free notice row.
- Phone numbers are taken from `tel:` links, labelled numbers (`Phone:`, `Call`, `WhatsApp`), international `+` numbers and, in the bio only, standard `(555) 555-5555` style numbers. This keeps false matches such as prices and dates out of your list.
- Pages protected by bot detection are retried automatically. If one still can't be loaded, its status is recorded and the rest of the profile is still returned.

# Actor input Schema

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

TikTok profiles to find contact details for - one per line. Accepts usernames (with or without @) or profile URLs such as https://www.tiktok.com/@name.

## `scrapeLinkInBio` (type: `boolean`):

Open the link in the profile's bio and scan it for emails, phone numbers and social profiles. Linktree, Beacons, Stan, Komi, Carrd and similar link-in-bio pages are unwrapped automatically (up to 5 of the creator's links are followed). Turn off for a faster bio-only run.

## Actor input object example

```json
{
  "usernames": [
    "thebudgetmom",
    "melissaortarealtor",
    "sandyisyouragent"
  ],
  "scrapeLinkInBio": true
}
```

# Actor output Schema

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

One record per profile (recordType "profile") with emails, phones, the page each contact was found on, and linked social accounts. Profiles that could not be processed (not found, private) appear as uncharged recordType "notice" rows.

# 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": [
        "thebudgetmom",
        "melissaortarealtor",
        "sandyisyouragent"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("seemuapps/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": [
        "thebudgetmom",
        "melissaortarealtor",
        "sandyisyouragent",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("seemuapps/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": [
    "thebudgetmom",
    "melissaortarealtor",
    "sandyisyouragent"
  ]
}' |
apify call seemuapps/tiktok-contact-scraper --silent --output-dataset

```

## MCP server setup

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