# TikTok Creator Scraper: Influencer Profiles & Video Stats (`themineworks/tiktok-creator-scraper`) Actor

Scrape TikTok creator profiles by username or link: followers, total likes, bio, bio link and email, verified status and secUid, plus recent videos with plays, likes, shares, saves and comments, each scored against the creator's own median. Date filter included. No login. Pay per video or profile.

- **URL**: https://apify.com/themineworks/tiktok-creator-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 videos

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 Scraper: Influencer Profiles & Video Stats

### What does TikTok Creator Scraper do?

Give it TikTok usernames or profile links. Get back each creator's public profile (followers, following, total likes, video count, verified badge, bio, the link in their bio, any email written in the bio, avatar and secUid) together with their most recent videos: plays, likes, shares, saves, comments, caption, hashtags, sound, cover, duration and posting time.

Every video row also answers the question raw view counts cannot: was this video a hit for this creator? `playsVsCreatorMedian` divides the video's plays by the median plays of the creator's other recent videos. A video at `4.2` pulled more than four times the creator's usual audience; one at `0.3` underperformed. That comparison works across accounts of any size, which is what makes it useful for vetting influencers and spotting breakout content.

Prefer one row per creator? Turn on **One row per creator** and you get the profile plus median plays, median engagement rate, plays per follower, posts per week, days since the last post and the top recent video, which is the short list of numbers most influencer vetting starts with.

✅ Usernames, profile links, video links or secUids | ✅ Plays vs the creator's own median | ✅ Date filter included | ✅ No login or cookies | ✅ Pay only for rows delivered | ✅ MCP-ready for AI agents

### Who is it for?

Influencer marketing teams checking whether a creator's reach is real and recent before a deal. Agencies building shortlists and benchmarks across dozens or hundreds of creators. Brands tracking what their own and competing creators post and which videos break out. Researchers and analysts who need clean, flat creator and video data in a spreadsheet or pipeline.

### How much does it cost to scrape TikTok creators?

You pay per row delivered to your dataset: per video in the default mode, or per creator in One row per creator mode, plus $0.005 per run at the default memory.

| Apify plan | Per video | Per creator profile |
| --- | --- | --- |
| Free | $0.0027 | $0.0035 |
| Starter (Bronze) | $0.0019 | $0.0028 |
| Scale (Silver) | $0.0014 | $0.0022 |
| Business (Gold) and above | $0.0009 | $0.0015 |

The date filter, the median plays score, engagement rate and the bio email are all included. Compute and proxies are included.

| Job | Free | Starter | Scale | Business |
| --- | --- | --- | --- | --- |
| 1 creator, latest 30 videos | $0.09 | $0.06 | $0.05 | $0.03 |
| 50 creators, 30 videos each (1,500 rows) | $4.06 | $2.86 | $2.11 | $1.36 |
| 100 creator profiles with vetting numbers | $0.36 | $0.29 | $0.23 | $0.16 |
| 1,000 creator profiles with vetting numbers | $3.51 | $2.81 | $2.21 | $1.51 |

Each job above is one run, so the $0.005 run fee is included.

**Never charged:** creators that do not exist or are banned, private accounts in video mode, lookups TikTok refused, videos outside your date window, pinned videos you chose to skip, duplicates, and the run summary. Failed, empty and filtered rows are free. The Pricing tab always shows the rate for your own plan; if this table and the Pricing tab ever disagree, the Pricing tab is right.

### How does it get TikTok creator data without logging in?

It reads what TikTok shows a logged out visitor, from a US connection, in two steps.

First, the creator's public profile page. TikTok embeds the profile (secUid, follower and like counts, bio, bio link, verified status) in the page itself, so one request per creator returns the whole profile. A username that does not exist is answered right there and costs you nothing. If TikTok does not include the profile in the page for a request, the actor tries again from a real headless browser session, which is slower but only starts when needed; you can switch that off.

Second, the creator's recent videos, from the same feed TikTok's profile page uses, 15 videos per request, newest first, until it has as many as you asked for, the videos get older than your date window, or the feed ends. Pinned videos are marked `isPinned`. They are left out of the median, because they are usually old hits the creator chose to keep on top.

When TikTok refuses a request (it answers with an empty page), the actor switches to a new connection and tries again. Refused lookups are listed in the run summary and never charged.

### What input does it take?

```json
{
  "profiles": ["nasa", "https://www.tiktok.com/@espn", "@natgeo"],
  "maxVideosPerCreator": 30,
  "postedWithinDays": 60,
  "profileOnly": false,
  "excludePinnedPosts": false
}
```

| Input | Default | What it does |
| --- | --- | --- |
| `profiles` | none | One creator per line: `nasa`, `@nasa`, `https://www.tiktok.com/@nasa`, a link to one of their videos, a `vm.tiktok.com` short link, or a secUid. Up to 1,000 per run. `usernames`, `username` and `startUrls` are accepted too |
| `maxVideosPerCreator` | 30 | Most recent videos to read per creator (0 to 1,000). In One row per creator mode these feed the vetting numbers; 0 returns the profile alone |
| `postedWithinDays` | empty | Keep only videos posted in the last N days. Leave empty for no date filter |
| `profileOnly` | false | One row per creator instead of one row per video |
| `excludePinnedPosts` | false | Leave out videos pinned to the top of the profile |
| `allowBrowserFallback` | true | Retry a refused profile lookup from a headless browser session. Needs at least 1 GB of memory |

### What data do you get back?

One row per video, carrying the creator's profile and the median score. The values below are illustrative and shortened; the field names and types are exactly what the actor returns:

```json
{
  "id": "7612802409273806110",
  "webVideoUrl": "https://www.tiktok.com/@example_creator/video/7612802409273806110",
  "createTime": 1790348800,
  "createTimeISO": "2026-09-25T15:06:40.000Z",
  "text": "3 ways to style one ring #jewelry #styling",
  "hashtags": ["jewelry", "styling"],
  "playCount": 812000,
  "diggCount": 61400,
  "shareCount": 2210,
  "collectCount": 5930,
  "commentCount": 488,
  "engagementRate": 0.0862,
  "playsVsCreatorMedian": 6.47,
  "durationSec": 21,
  "isPinned": false,
  "musicTitle": "original sound",
  "musicOriginal": true,
  "creatorUsername": "example_creator",
  "creatorSecUid": "MS4wLjABAAAA...",
  "creatorFollowers": 94200,
  "creatorTotalLikes": 2310000,
  "creatorVideoCount": 318,
  "creatorVerified": false,
  "creatorBioLink": "linktr.ee/example_creator",
  "creatorBioEmail": "hello@example.com",
  "creatorMedianPlays": 125500,
  "creatorMedianSample": 29,
  "input": "@example_creator",
  "scrapedAt": "2026-09-27T12:00:00.000Z"
}
```

| Field | Description |
| --- | --- |
| `id`, `webVideoUrl` | Video id and public link |
| `createTime`, `createTimeISO` | When the video was posted |
| `text`, `hashtags`, `mentions`, `textLanguage` | Caption, its hashtags and mentioned usernames, caption language |
| `playCount`, `diggCount`, `shareCount`, `collectCount`, `commentCount`, `repostCount` | Plays, likes, shares, saves, comments, reposts |
| `engagementRate` | (likes + comments + shares + saves) divided by plays |
| `playsVsCreatorMedian` | This video's plays divided by `creatorMedianPlays` |
| `durationSec`, `coverUrl`, `isSlideshow`, `isPinned` | Length, cover image, photo post flag, pinned flag |
| `isAd`, `isSponsored`, `isECVideo` | Paid ad, branded content, TikTok Shop video |
| `musicId`, `musicTitle`, `musicAuthor`, `musicOriginal` | The sound, and whether it is the creator's own |
| `creatorUsername`, `creatorNickname`, `creatorId`, `creatorSecUid`, `creatorProfileUrl` | Who posted it |
| `creatorFollowers`, `creatorFollowing`, `creatorTotalLikes`, `creatorVideoCount`, `creatorVerified` | The creator's audience and output |
| `creatorBio`, `creatorBioLink`, `creatorBioEmail`, `creatorAvatarUrl`, `creatorRegion` | Bio, link in bio, email written in the bio, avatar, region when TikTok shows it |
| `creatorMedianPlays`, `creatorMedianSample` | Median plays over the creator's videos returned (pinned left out) and how many videos that is |
| `input`, `scrapedAt` | The input line the row came from, and when it was collected |

With **One row per creator** on, each row holds the profile fields (`username`, `followers`, `following`, `totalLikes`, `videoCount`, `verified`, `privateAccount`, `bio`, `bioLink`, `bioEmail`, `avatarUrl`, `secUid`, `isCommerceAccount`, `commerceCategory` and more) plus `videosAnalyzed`, `medianPlays`, `averagePlays`, `medianEngagementRate`, `medianPlaysToFollowers`, `videosOver3xMedian`, `postsPerWeek`, `lastPostAt`, `daysSinceLastPost`, `topVideoUrl`, `topVideoPlays` and `topVideoPlaysVsMedian`.

Empty fields are dropped rather than sent as `null`. Each run also writes a summary to the key-value store record `OUTPUT`: a status for every creator (`ok`, `not_found`, `banned`, `private`, `blocked`, `none_in_date_window`, `duplicate` and so on), how the profile was read, feed pages used, and what was charged. A final `_type: "info"` row in the dataset is informational and never billed.

### What are the limitations?

**US view only.** TikTok refuses its web feeds to logged out visitors outside the US (tested 26 Sep 2026), so the actor reads from the US. Creators from any country can be scraped.

**Private accounts.** A private account shows its profile numbers but not its videos. In video mode it returns no rows and costs nothing; in One row per creator mode you get its profile row with `privateAccount: true`.

**Region and email.** `region` appears only when TikTok shows it to logged out visitors. `bioEmail` is found only when the creator wrote an email address in their bio; the actor does not guess or look up emails.

**Small samples.** The median is taken over the videos returned. With a narrow date window or a creator who rarely posts, it rests on few videos, so check `creatorMedianSample`.

**Limits.** Up to 1,000 creators per run and 1,000 videos per creator. TikTok changes its site often; if it refuses a creator, the run summary says so and nothing is charged for it.

### What can you use it for?

**Influencer vetting.** Compare followers against median plays and engagement to see who still reaches their audience, and who posts often enough to be worth a deal.

**Campaign reporting.** Pull a creator's videos from the campaign window and see which posts beat their usual reach with `playsVsCreatorMedian`.

**Creator shortlists and outreach.** Collect bio links and bio emails across a list of creators in one table.

**Competitor and category benchmarks.** Track the creators in your niche over time and spot the formats and sounds that break out.

### How do I get started?

1. Paste creators into **TikTok creators**, one per line: usernames, profile links or video links all work.
2. Set **Videos per creator** (30 by default) and, if you only want recent posts, **Posted within the last N days**.
3. Turn on **One row per creator** if you want a vetting table rather than every video.
4. Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API or MCP.

### Can I run it on a schedule?

Yes. Run it once with the input you want, click **Save as a task**, then in Apify Console go to **Schedules**, create a schedule, pick how often (for example every Monday) and add the task. Each scheduled run is billed the same way as a manual one; the schedule itself costs nothing.

### FAQ

#### How much does it cost to scrape 1,000 TikTok videos from creators?

$2.70 on Apify's Free plan, $1.90 on Starter, $1.40 on Scale and $0.90 on Business and above, plus $0.005 per run, for 1,000 video rows with the creator profile, engagement rate and median score on every row. The date filter is included, and videos outside your window are not charged. Apify's free monthly credit of $5 covers about 1,800 videos.

#### Do I need a TikTok account, cookies or an API key?

No. The actor reads public data the way TikTok shows it to a visitor who is not logged in. There is nothing of yours to connect, and no account of yours can be blocked.

#### What does playsVsCreatorMedian mean?

It is the video's plays divided by the median plays of the creator's other recent videos in the same run. A value of 3 means the video reached three times the creator's usual audience, and 0.5 means half. Pinned videos are left out of the median, and `creatorMedianSample` tells you how many videos it was taken over.

#### Can I get only a creator's recent videos, for example the last 30 days?

Yes. Set **Posted within the last N days** to 30. The actor reads the feed newest first and stops as soon as videos get older than the window, so older videos are neither returned nor charged, and the median is taken over the videos inside the window.

#### Can I get one row per creator instead of one row per video?

Yes. Turn on **One row per creator**. Each row has the profile plus median plays, median engagement rate, plays per follower, posts per week, days since the last post and the top recent video, worked out over up to **Videos per creator** recent videos. Set that to 0 for the bare profile.

#### Am I charged for private, banned or non-existent accounts?

Not in the default video mode: those creators return no rows, so nothing is charged, and the run summary lists them as `private`, `banned` or `not_found`. In One row per creator mode a private account still returns its public profile numbers and is charged as one profile; banned and non-existent accounts are free in both modes.

#### Can I paste TikTok profile links or video links instead of usernames?

Yes. `https://www.tiktok.com/@name`, a link to any of the creator's videos, a `vm.tiktok.com` short link, `@name`, `name` and a secUid all work, and you can mix them. The same creator given twice is scraped once.

#### Does it get the creator's email address?

Only when the creator wrote an email in their bio: it is returned as `bioEmail` (or `creatorBioEmail` on video rows), next to the link in their bio. The actor does not guess, buy or look up emails from anywhere else.

#### Which countries does it work from?

The United States. On 26 Sep 2026 TikTok refused its web feeds to logged out visitors from the UK, Europe, Canada, Australia, Brazil, Japan and Mexico, and TikTok is not available in India. Creators based anywhere can still be scraped from the US.

#### Is it legal to scrape TikTok creator profiles?

The actor collects only publicly visible profile and video data and never logs in. In *hiQ Labs v. LinkedIn* a US federal appeals court found that accessing publicly available data is unlikely to breach the Computer Fraud and Abuse Act, but platform terms and privacy laws such as GDPR still apply to how you store and use personal data like usernames and bio emails. This is general information, not legal advice.

### Use in Claude, ChatGPT and any MCP agent

Add it to Claude Code in one line:

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=themineworks/tiktok-creator-scraper"
```

Or point any MCP client at:

```
https://mcp.apify.com/?tools=themineworks/tiktok-creator-scraper
```

Things an agent can ask once connected:

- "Vet these 20 TikTok creators: followers, median plays, engagement and how often they post."
- "Which of @nasa's videos from the last 60 days did more than three times their usual views?"
- "Build a table of bio links and bio emails for this list of creators."

Or call it from code with the Apify client:

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('themineworks/tiktok-creator-scraper').call({
  profiles: ['nasa', 'https://www.tiktok.com/@espn'],
  maxVideosPerCreator: 30,
  postedWithinDays: 60,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((v) => v.playsVsCreatorMedian >= 3));
```

### More from The Mine Works

Browse every tool at [themineworks.com](https://themineworks.com/). Related actors for social media data:

- **[TikTok Hashtag and Search Scraper](https://apify.com/themineworks/tiktok-hashtag-search-scraper)**: TikTok videos by hashtag, keyword search or the trending feed, to find the creators worth vetting here.
- **[Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper)**: follower counts, bio and profile stats for a list of Instagram accounts.
- **[YouTube Transcript Scraper](https://apify.com/themineworks/youtube-transcript-scraper)**: transcripts of YouTube videos for content and creator research.

Found this useful? A quick Store review helps other buyers find it. Found a bug or want a field added? Open an issue on the actor's Apify Console page.

***

**Disclaimer:** This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by TikTok or ByteDance Ltd. TikTok is a trademark of ByteDance Ltd. Use scraped public data in line with GDPR, CCPA and your local laws.

# Actor input Schema

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

One creator per line: a username with or without the @ (nasa or @nasa), a profile link (https://www.tiktok.com/@nasa), a link to one of their videos, a short vm.tiktok.com link, or a secUid. Up to 1,000 creators per run. Duplicates are removed.

## `maxVideosPerCreator` (type: `integer`):

How many of each creator's most recent videos to read. In the default mode each one is a row. With One row per creator on, these videos are used for the median plays, engagement and posting rate on the profile row; set 0 to skip them and get the profile alone.

## `postedWithinDays` (type: `integer`):

Keep only videos posted in the last N days. Older videos are never returned or charged, and the median is taken over the videos inside the window. Leave empty for no date filter. Included in the price.

## `profileOnly` (type: `boolean`):

Return one row per creator instead of one row per video: profile, followers, total likes, bio link and email, plus median plays, median engagement rate, posts per week and top video over the recent videos above. Charged per creator profile.

## `excludePinnedPosts` (type: `boolean`):

Leave out the videos a creator pinned to the top of their profile. Pinned videos are often old hits; they are always left out of the median, and with this on they are not returned either.

## `allowBrowserFallback` (type: `boolean`):

Profiles are read over plain HTTP first. If TikTok does not return a creator's profile that way, open a headless browser session and try again from there. Slower, and it only runs when needed. Needs at least 1 GB of memory. Turn off to report such creators as blocked instead.

## Actor input object example

```json
{
  "profiles": [
    "nasa",
    "https://www.tiktok.com/@espn"
  ],
  "maxVideosPerCreator": 30,
  "profileOnly": false,
  "excludePinnedPosts": false,
  "allowBrowserFallback": true
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (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": [
        "nasa",
        "https://www.tiktok.com/@espn"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/tiktok-creator-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": [
        "nasa",
        "https://www.tiktok.com/@espn",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("themineworks/tiktok-creator-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": [
    "nasa",
    "https://www.tiktok.com/@espn"
  ]
}' |
apify call themineworks/tiktok-creator-scraper --silent --output-dataset

```

## MCP server setup

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