# TikTok Creator Email Finder (`maximedupre/tiktok-email-finder`) Actor

Find public emails shown on TikTok profiles and, when enabled, linked public pages from usernames, @handles, profile URLs, or one keyword. Get profile links, bios, audience counts, social links, and source URLs in a structured dataset.

- **URL**: https://apify.com/maximedupre/tiktok-email-finder.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Lead generation, Marketing
- **Stats:** 3 total users, 2 monthly users, 91.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 public emails

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

### 📧 Find public TikTok emails with profile context

For outreach teams, creator marketers, and researchers, this Actor turns public TikTok profile targets into structured contact data. Enter usernames, @handles, profile URLs, or one keyword. The dataset can include public emails, profile details, source URLs, and clear contact outcomes, so you can review each contact with its profile context before outreach.

**Use cases**

- Collect public emails from selected profiles with [**TikTok Email Grabber**](https://apify.com/maximedupre/tiktok-email-finder/examples/tiktok-email-grabber).
- Review public user IDs with [**TikTok User ID Information**](https://apify.com/maximedupre/tiktok-email-finder/examples/tiktok-user-id-information).
- Fetch structured account details with [**Fetch TikTok User Data**](https://apify.com/maximedupre/tiktok-email-finder/examples/fetch-tiktok-user-data).
- Start a public email search with [**TikTok Email Finder Free**](https://apify.com/maximedupre/tiktok-email-finder/examples/tiktok-email-finder-free).
- Look up public account details with [**TikTok Account Information Finder Free**](https://apify.com/maximedupre/tiktok-email-finder/examples/tiktok-account-information-finder-free).

#### 📋 Review each profile and its public contact evidence

Each dataset row describes one processed TikTok profile. It includes the public username, display name, profile URL, biography, avatar, TikTok user ID, follower, following, like, and video counts, plus verification, privacy, seller, website, social-link, and read-time fields when the source supplies them. When an email is found, the row also keeps the address, domain, source URL, source type, basic domain health, and a primary email when more than one is found. No private or inferred email is created.

The `outcome` field shows `email_found`, `no_public_email`, or `unavailable`. An unavailable profile can include a reason in `unavailableReason`.

#### ▶️ Run a TikTok profile or keyword search

Choose TikTok profiles to scan submitted usernames, @handles, or profile URLs, or choose Keyword search to find candidate profiles from one keyword. For profile mode, add one target per line. Turn on linked-page scanning when you want more public contact and social information from pages linked by a profile. You can also filter by follower count, verified status, and email domain.

The Actor saves one result for each processed profile. Leave **Maximum profiles to process** empty to return all available results until the source is exhausted. Set a limit when you want fewer profiles and less data to review.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `target` | string | Required. Use `profiles` to scan `profileTargets`, or `keyword` to find candidate profiles from `keyword`. The other target field is ignored for the run. |
| `profileTargets` | array of strings | Public TikTok usernames, @handles, or profile URLs to scan, with one value per line. Used with `target: profiles`. |
| `keyword` | string | One keyword used to find candidate TikTok profiles. Used with `target: keyword`. |
| `includeLinkedPages` | boolean | When `true`, inspect public pages linked from each TikTok profile for more public contact and social information. Private or login-gated pages are skipped. |
| `minimumFollowers` | integer | Only return contacts from profiles with at least this many followers. Leave blank to allow any follower count. |
| `verifiedOnly` | boolean | When `true`, return contacts only from profiles TikTok marks as verified. When `false`, include verified and unverified profiles. |
| `emailDomains` | array of strings | Exact public email domains to keep, such as `brand.com`. Leave blank to allow all public email domains. |
| `maxItems` | integer | Actor Work Limit. Stop after this many profiles are processed. Leave blank to return all available results until the source is exhausted. |

**Example input**

This JSON comes from a successful current-beta default-input run:

```json
{
  "target": "profiles",
  "profileTargets": [
    "@tiktok"
  ],
  "includeLinkedPages": false,
  "verifiedOnly": false
}
```

#### 🧾 Output

The Output panel links to an Apify dataset. Every row has `outcome` and `emails`. Optional fields appear when public TikTok data supplies them. The tables below list the complete fields for each documented outcome shape. Nested paths use dots in the tables, while the examples keep their real objects and arrays.

**Dataset link**

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | string | Link to the Apify dataset that contains the profile result rows. |

**Email found**

| Field | Type | What it does |
| --- | --- | --- |
| `outcome` | string | `email_found` when one or more public emails are found. |
| `username` | string | Public TikTok username for the profile. |
| `displayName` | string | Public display name shown on the profile. |
| `profileUrl` | string | Canonical public TikTok profile URL. |
| `bio` | string | Visible biography text from the profile. |
| `avatarUrl` | string | Public profile avatar URL when available. |
| `userId` | string | Public TikTok user identifier when available. |
| `followerCount` | integer | Public follower count shown for the profile. |
| `followingCount` | integer | Public number of accounts followed by the profile. |
| `likeCount` | integer | Public number of likes received by the profile. |
| `videoCount` | integer | Public number of videos on the profile. |
| `isVerified` | boolean | Whether TikTok marks the profile as verified. |
| `isPrivate` | boolean | Whether the profile is marked as private when this signal is available. |
| `isSeller` | boolean | Whether the profile is marked as a seller when this signal is available. |
| `websiteUrl` | string | Public website linked from the profile when available. |
| `emails` | array of objects | Distinct public email contacts found for the profile. |
| `emails[].address` | string | Public email address. |
| `emails[].domain` | string | Domain part of the public email address. |
| `emails[].sourceUrl` | string | Public page URL where the email was shown. |
| `emails[].sourceType` | string | Source kind: `tiktok_bio` or `linked_page`. |
| `emails[].domainHealth` | string | Basic public domain check: `healthy`, `unhealthy`, or `unknown`. It does not confirm mailbox delivery. |
| `primaryEmail` | string | Primary public email selected when more than one email is found. |
| `socialLinks` | array of objects | Other public social links found on the profile or its linked public pages. |
| `socialLinks[].platform` | string | Social platform named by the link when available. |
| `socialLinks[].url` | string | Public social profile URL. |
| `profileReadAt` | string | Time when the public profile was read. |
| `unavailableReason` | string | Reason used when the outcome is `unavailable`; normally absent here. |

**Genuine email-found row**

This complete row came from a successful current-beta run with follower, verification, and email-domain filters.

```json
{
  "outcome": "email_found",
  "emails": [
    {
      "address": "management@painted.co",
      "domain": "painted.co",
      "sourceUrl": "https://www.tiktok.com/@jamescharles",
      "sourceType": "tiktok_bio",
      "domainHealth": "healthy"
    }
  ],
  "socialLinks": [],
  "username": "jamescharles",
  "displayName": "James Charles",
  "profileUrl": "https://www.tiktok.com/@jamescharles",
  "bio": "✉️ management@painted.co\n🎨 @Painted @PaintedUK\n🎶 @James Charles Music \n\nNew Single Lonely out now!!",
  "avatarUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/56ac3316193300d4e8295c752415cced~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=772c61e9&x-expires=1787965200&x-signature=LE470W9jb0EXchU9tEokGGqJkvU%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5",
  "userId": "190068318278651904",
  "followerCount": 39300000,
  "followingCount": 369,
  "likeCount": 1600000000,
  "videoCount": 1223,
  "isVerified": true,
  "isPrivate": false,
  "isSeller": false,
  "websiteUrl": "http://jamescharles.lnk.to/Lonely",
  "primaryEmail": "management@painted.co",
  "profileReadAt": "2026-08-27T01:09:40.298Z"
}
```

**No public email**

| Field | Type | What it does |
| --- | --- | --- |
| `outcome` | string | `no_public_email` when no public email is found. |
| `username` | string | Public TikTok username for the profile. |
| `displayName` | string | Public display name shown on the profile. |
| `profileUrl` | string | Canonical public TikTok profile URL. |
| `bio` | string | Visible biography text from the profile. |
| `avatarUrl` | string | Public profile avatar URL when available. |
| `userId` | string | Public TikTok user identifier when available. |
| `followerCount` | integer | Public follower count shown for the profile. |
| `followingCount` | integer | Public number of accounts followed by the profile. |
| `likeCount` | integer | Public number of likes received by the profile. |
| `videoCount` | integer | Public number of videos on the profile. |
| `isVerified` | boolean | Whether TikTok marks the profile as verified. |
| `isPrivate` | boolean | Whether the profile is marked as private when this signal is available. |
| `isSeller` | boolean | Whether the profile is marked as a seller when this signal is available. |
| `websiteUrl` | string | Public website linked from the profile when available. |
| `emails` | array of objects | Empty when no public email is found. |
| `emails[].address` | string | Public email address when an email object is present. |
| `emails[].domain` | string | Domain part of a public email address. |
| `emails[].sourceUrl` | string | Public page URL where an email was shown. |
| `emails[].sourceType` | string | Source kind: `tiktok_bio` or `linked_page`. |
| `emails[].domainHealth` | string | Basic public domain check: `healthy`, `unhealthy`, or `unknown`. It does not confirm mailbox delivery. |
| `primaryEmail` | string | Primary public email when one is found; normally absent here. |
| `socialLinks` | array of objects | Other public social links found on the profile or its linked public pages. |
| `socialLinks[].platform` | string | Social platform named by the link when available. |
| `socialLinks[].url` | string | Public social profile URL. |
| `profileReadAt` | string | Time when the public profile was read. |
| `unavailableReason` | string | Reason used when the outcome is `unavailable`; normally absent here. |

**Genuine no-public-email row**

This complete row came from a successful current-beta run with a direct profile target.

```json
{
  "outcome": "no_public_email",
  "emails": [],
  "socialLinks": [],
  "username": "tiktok",
  "displayName": "TikTok",
  "profileUrl": "https://www.tiktok.com/@tiktok",
  "bio": "One TikTok can make a big impact",
  "avatarUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/ba67b11de451691939223e9d978e613a~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=2e648c3b&x-expires=1787965200&x-signature=xnm9wobJVc9gXL39lKW9YzpCSvc%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast8",
  "userId": "107955",
  "followerCount": 95400000,
  "followingCount": 2,
  "likeCount": 462900000,
  "videoCount": 1495,
  "isVerified": true,
  "isPrivate": false,
  "isSeller": false,
  "websiteUrl": "https://linktr.ee/tiktok",
  "profileReadAt": "2026-08-27T01:08:12.933Z"
}
```

**Unavailable profile**

| Field | Type | What it does |
| --- | --- | --- |
| `outcome` | string | `unavailable` when a requested profile could not be fetched. |
| `username` | string | Public TikTok username when available. |
| `displayName` | string | Public display name when available. |
| `profileUrl` | string | Canonical public TikTok profile URL when available. |
| `bio` | string | Visible biography text when available. |
| `avatarUrl` | string | Public profile avatar URL when available. |
| `userId` | string | Public TikTok user identifier when available. |
| `followerCount` | integer | Public follower count when available. |
| `followingCount` | integer | Public number of accounts followed when available. |
| `likeCount` | integer | Public number of likes received when available. |
| `videoCount` | integer | Public number of videos when available. |
| `isVerified` | boolean | Whether TikTok marks the profile as verified when available. |
| `isPrivate` | boolean | Whether the profile is marked as private when available. |
| `isSeller` | boolean | Whether the profile is marked as a seller when available. |
| `websiteUrl` | string | Public website linked from the profile when available. |
| `emails` | array of objects | Empty when no public email is available. |
| `emails[].address` | string | Public email address when an email object is present. |
| `emails[].domain` | string | Domain part of a public email address. |
| `emails[].sourceUrl` | string | Public page URL where an email was shown. |
| `emails[].sourceType` | string | Source kind: `tiktok_bio` or `linked_page`. |
| `emails[].domainHealth` | string | Basic public domain check: `healthy`, `unhealthy`, or `unknown`. It does not confirm mailbox delivery. |
| `primaryEmail` | string | Primary public email when one is found. |
| `socialLinks` | array of objects | Other public social links found on the profile or its linked public pages. |
| `socialLinks[].platform` | string | Social platform named by the link when available. |
| `socialLinks[].url` | string | Public social profile URL. |
| `profileReadAt` | string | Time when the public profile was read, when available. |
| `unavailableReason` | string | Reason the requested public profile could not be fetched. |

#### 💳 Pricing

This Actor uses pay-per-event pricing. The primary `public-tiktok-creator-lead` event is charged for each saved public email lead. Its price is tiered by Apify plan. See the [Pricing tab](https://apify.com/maximedupre/tiktok-email-finder/pricing) for current rates.

#### 🔌 Integrations

After the run, read or export the dataset in Apify. You can also use the Apify API to start a run and read its dataset, then pass public profile and source URLs to your own review or outreach workflow. This Actor does not send outreach messages.

For a short guide to Apify workflows:

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### What counts as a public email?

Only an address shown on a public TikTok profile bio or a public linked page inspected by the run is returned. The Actor does not infer, generate, guess, or buy private addresses.

##### Why is the emails list empty?

Some profiles do not show a public email. The row uses `outcome: no_public_email` and keeps `emails` as an empty array. It does not invent an address.

##### Can I inspect a linked website?

Yes. Turn on `includeLinkedPages`. The Actor checks public pages linked from each profile for more contact and social information. Private or login-gated pages are skipped.

##### Can I limit results to certain profiles?

Yes. Use `minimumFollowers`, `verifiedOnly`, and `emailDomains` to restrict returned contacts. Use `maxItems` to stop processing after a chosen number of profiles.

##### What does domainHealth tell me?

It is a basic public check of the email domain. It can be `healthy`, `unhealthy`, or `unknown`, but it does not confirm mailbox delivery.

##### What happens when the same profile appears again?

The Actor saves the first eligible occurrence of a source profile and ignores later matches in the same discovery run. The saved row describes the first match.

##### Can I scan known usernames and profile URLs?

Yes. Choose `profiles` and add public usernames, @handles, or TikTok profile URLs to `profileTargets`, with one value per line.

##### Does it need TikTok credentials?

No. The Actor works with publicly accessible TikTok profiles and linked public pages without customer-provided source credentials.

##### Does it send outreach messages?

No. It collects structured public data. You decide how to review or use the saved contacts.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~tiktok-email-finder/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [TikTok Search Scraper](https://apify.com/maximedupre/tiktok-search-results-scraper) finds candidate TikTok creator profiles by keyword before you scan their public contacts.
- [TikTok Creator Analytics Scraper](https://apify.com/maximedupre/tiktok-creator-analytics) compares public follower, content, and creator metrics after you find a profile.
- [Website Emails Scraper](https://apify.com/maximedupre/website-emails-scraper) checks linked public websites for additional contact emails after a profile points you there.
- [SMTP Email Verifier](https://apify.com/maximedupre/smtp-email-verifier) checks syntax, MX, and SMTP evidence for a public address before outreach.
- [Influencer Scraper](https://apify.com/maximedupre/influencer-scraper) builds a broader TikTok, Instagram, and YouTube profile list for cross-platform research.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `target` (type: `string`):

Choose whether to scan your TikTok profile list or find candidate profiles from one keyword.

## `profileTargets` (type: `array`):

Enter one or more public TikTok usernames, @handles, or profile URLs, one per line. This field is used when Search mode is TikTok profiles.

## `keyword` (type: `string`):

Enter one keyword to find candidate TikTok profiles. This field is used when Search mode is Keyword search.

## `includeLinkedPages` (type: `boolean`):

When enabled, inspect public pages linked from each TikTok profile for more public contact and social information. Skip private or login-gated pages.

## `minimumFollowers` (type: `integer`):

Only return contacts from profiles with at least this many followers. Leave blank to allow any follower count.

## `verifiedOnly` (type: `boolean`):

When enabled, return contacts only from TikTok profiles marked as verified. When disabled, include both verified and unverified profiles.

## `emailDomains` (type: `array`):

Enter exact email domains to keep, such as brand.com. Add one or more domains. Leave blank to allow all public email domains.

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

Stop after this many TikTok profiles have been processed. Leave blank to return all available results until the source is exhausted.

## Actor input object example

```json
{
  "target": "profiles",
  "profileTargets": [
    "@tiktok"
  ],
  "includeLinkedPages": false,
  "verifiedOnly": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

Contains one final result for each processed TikTok profile.

# 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 = {
    "target": "profiles",
    "profileTargets": [
        "@tiktok"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/tiktok-email-finder").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 = {
    "target": "profiles",
    "profileTargets": ["@tiktok"],
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/tiktok-email-finder").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 '{
  "target": "profiles",
  "profileTargets": [
    "@tiktok"
  ]
}' |
apify call maximedupre/tiktok-email-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/tiktok-email-finder"
        }
    }
}

```

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/ACuHZBL6dPmOwpB41/builds/v72sIp9fRzvgfbhS1/openapi.json
