# TikTok Profile Stats Scraper (Followers, Likes, Bio) (`juliob.rangel/tiktok-profile-stats`) Actor

Get public TikTok profile stats in bulk: followers, following, total likes, video count, bio, bio link, verified status, region and avatar. Fast and cheap for influencer research and tracking.

- **URL**: https://apify.com/juliob.rangel/tiktok-profile-stats.md
- **Developed by:** [Julio Barcellos Rangel](https://apify.com/juliob.rangel) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 profile scrapeds

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 Profile Stats Scraper (Followers, Likes, Bio)

TikTok Profile Stats Scraper gets public stats for any list of TikTok accounts in bulk: followers, following, total likes, video count, bio, bio link, verified status, region and avatar. It is a fast and cheap TikTok profile scraper for agencies, brands and analysts who vet influencers or track creator growth. Use it as a TikTok follower count checker or to export TikTok profile data to Excel, CSV or JSON, with no login.

### What does TikTok Profile Stats Scraper do?

You give it a list of TikTok accounts. For each one, the scraper opens the public profile page on tiktok.com, reads the profile data that TikTok embeds in the page and saves one clean row per profile in a dataset.

It accepts any of these forms, mixed in the same list:

| Input form | Example |
|---|---|
| Username with @ | `@khaby.lame` |
| Username without @ | `nasa` |
| Profile URL | `https://www.tiktok.com/@nasa` |

Every line is cleaned to a plain username and duplicates are removed, so `@nasa`, `nasa` and `https://www.tiktok.com/@nasa` count as one profile.

Each row holds the account's numbers (followers, following, total likes, videos, friends), its identity (username, nickname, user ID and secUid), the bio and bio link, and flags such as verified, private and business (commerce) account. You do not need a TikTok account, cookies or an API key.

### What data can you extract?

| Field | What it means | Example |
|---|---|---|
| `input` | The username the scraper read from your line | `khaby.lame` |
| `username` | TikTok handle | `khaby.lame` |
| `nickname` | Display name on the profile | `Khabane lame` |
| `userId` | TikTok's numeric user ID | `127905465618821121` |
| `secUid` | TikTok's secure user ID (used by other TikTok tools) | `MS4wLjABAAAAwAg0rSzO…` |
| `url` | Profile link | `https://www.tiktok.com/@khaby.lame` |
| `followers` | Number of followers | `162984916` |
| `following` | Number of accounts the profile follows | `81` |
| `likes` | Total likes received on all the profile's videos | `2685553172` |
| `videos` | Number of videos on the profile | `1357` |
| `friends` | TikTok's friend count (accounts that follow each other) | `77` |
| `bio` | Bio text | `If u wanna laugh u r in the right place😎` |
| `bioLink` | Link shown in the bio, if any | `null` |
| `verified` | Has the verified badge | `true` |
| `privateAccount` | The account is private | `false` |
| `region` | Region code, when TikTok includes it in the page | `null` |
| `language` | Language set on the account | `en` |
| `avatar` | Large profile picture URL | `https://p16-common-sign.tiktokcdn-us.com/…` |
| `createdAt` | Account creation time as TikTok reports it (ISO 8601) | `2016-08-10T22:02:34.000Z` |
| `commerceUser` | TikTok marks it as a business (commerce) account | `false` |
| `category` | Business category of a commerce account | `null` |
| `scrapedAt` | When the row was collected | `2026-10-07T19:36:51.311Z` |
| `error` | Only on error rows: why the profile was not returned | `Profile not found` |

All counts are real numbers (for example `162984916`, not "162.9M"), so you can sort, filter and compute ratios directly in Excel or Google Sheets. Empty values come as `null`.

### How to use TikTok Profile Stats Scraper

1. Open TikTok Profile Stats Scraper in Apify Console (sign in or create an Apify account).
2. In **Profiles**, paste usernames or profile URLs, one per line. Hundreds of lines are fine.
3. Leave **Proxy** on the default Apify Proxy unless you have a reason to change it.
4. Click **Start** and wait for the run to finish. The log shows how many profiles were returned.
5. Open the **Output** tab to see the table, then click **Export** to download the data as JSON, CSV, Excel or HTML.
6. Optional: save the input as a task and add a schedule (for example daily) to track how the same profiles grow.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `profiles` | array of strings | `["@khaby.lame", "https://www.tiktok.com/@nasa"]` | TikTok usernames (with or without @) or profile URLs such as `https://www.tiktok.com/@nasa`. |
| `proxy` | object | `{"useApifyProxy": true}` | Apify Proxy settings. |

There is no "max results" setting: each profile in the list returns exactly one row (the profile, or an error row). A plain username must be 2 to 24 characters of letters, numbers, underscores or dots. Lines that are neither a valid username nor a `tiktok.com/@` link are skipped.

Example input:

```json
{
  "profiles": [
    "@khaby.lame",
    "nasa",
    "https://www.tiktok.com/@tiktok"
  ],
  "proxy": {
    "useApifyProxy": true
  }
}
```

### Output example

A real row from the latest run (the avatar link is shortened):

```json
{
  "input": "khaby.lame",
  "username": "khaby.lame",
  "nickname": "Khabane lame",
  "userId": "127905465618821121",
  "secUid": "MS4wLjABAAAAwAg0rSzO65WQfz4RzQgGv2Xdv108BgPXhRrrmNVIHQZ9PO8-flwwRtEppYTS0OjA",
  "url": "https://www.tiktok.com/@khaby.lame",
  "followers": 162984916,
  "following": 81,
  "likes": 2685553172,
  "videos": 1357,
  "friends": 77,
  "bio": "Se vuoi ridere sei nel posto giusto😎 If u wanna laugh u r in the right place😎",
  "bioLink": null,
  "verified": true,
  "privateAccount": false,
  "region": null,
  "language": "en",
  "avatar": "https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?…",
  "createdAt": "2016-08-10T22:02:34.000Z",
  "commerceUser": false,
  "category": null,
  "scrapedAt": "2026-10-07T19:36:51.311Z"
}
```

A real error row from an earlier run (a username that does not exist). Error rows are not charged:

```json
{
  "input": "zzz_no_user_xx_991",
  "error": "Profile not found",
  "scrapedAt": "2026-10-07T19:10:13.542Z"
}
```

### How much does it cost?

TikTok Profile Stats Scraper uses pay per event pricing. You pay **$2.00 per 1,000 profiles** returned ($0.002 per profile) on the Free plan. Platform usage (compute and proxy) is included in that price, so there is nothing else to add.

| Apify plan | Price per 1,000 profiles |
|---|---|
| Free | $2.00 |
| Bronze (10% off) | $1.80 |
| Silver (20% off) | $1.60 |
| Gold and higher (30% off) | $1.40 |

Worked examples on the Free plan:

- 100 influencer profiles to vet for a campaign = **$0.20**
- 5,000 profiles from a creator database = **$10.00**
- 1,000 profiles tracked every day for 30 days = 30,000 profiles = **$60.00** ($42.00 on Gold)

What you are **not** charged for:

- Error rows ("Profile not found" or "Could not load profile").
- Retries. A profile that needs several tries is charged once, only if it is returned.
- Duplicate lines and lines that are not valid usernames or profile URLs.

### Use cases

- **Influencer vetting.** Check followers, total likes, video count and the verified badge before you contact a creator, and compute likes per follower or likes per video.
- **Growth tracking.** Run the same list on a schedule and chart followers and likes over time using `scrapedAt`.
- **Competitor benchmarking.** Compare brand accounts in your niche by audience size and posting volume.
- **Creator outreach lists.** Collect bios and bio links of creators you found elsewhere, to see where they send their audience.
- **CRM enrichment.** Add TikTok user ID, secUid, follower count and avatar to existing creator or customer records.
- **Business account checks.** See which accounts TikTok marks as commerce accounts and their category.
- **List cleaning.** Find usernames that no longer exist; they come back as "Profile not found".

### Tips and limits

- **One row per profile.** The scraper returns profile stats only. It does not list a profile's videos, comments or followers. For video stats use TikTok Video Scraper with video links, and for comments use TikTok Comments Scraper.
- **Public data only.** Only what TikTok shows on the public profile page is collected. The `privateAccount` field tells you when an account is private.
- **Profiles are processed one at a time.** Each profile gets up to 5 tries with a growing pause between them and a 30-second timeout per try. A long list simply takes longer; you can split a very large list into several runs.
- **Error rows.** "Profile not found" means TikTok reported that the account does not exist or is not available (deleted, banned or misspelled). "Could not load profile" means TikTok returned no profile data after 5 tries; run those usernames again later.
- **Skipped lines.** Lines that are not a valid username or `tiktok.com/@` link produce no row at all, so compare the row count with your list if something seems missing.
- **Duplicates.** Duplicates are removed after cleaning, but the comparison is case-sensitive, so `NASA` and `nasa` are looked up twice. Lowercase your list to avoid paying twice.
- **Image links expire.** The `avatar` URL is a signed TikTok CDN link with an `x-expires` parameter. Download the picture soon if you need to keep it.
- **Empty fields.** `bioLink`, `region` and `category` are often `null` because TikTok does not include them for every account.

### Use it from the API, Python or JavaScript

JavaScript (Node.js) with the official `apify-client` package:

```javascript
const { ApifyClient } = require('apify-client');

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const input = { profiles: ['@khaby.lame', 'https://www.tiktok.com/@nasa'] };

(async () => {
    const run = await client.actor('juliob.rangel/tiktok-profile-stats').call(input);
    const { items } = await client.dataset(run.defaultDatasetId).listItems();
    console.log(items);
})();
```

Python with the official `apify-client` package:

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_TOKEN')
run_input = {'profiles': ['@khaby.lame', 'https://www.tiktok.com/@nasa']}

run = client.actor('juliob.rangel/tiktok-profile-stats').call(run_input=run_input)
items = client.dataset(run['defaultDatasetId']).list_items().items
for item in items:
    print(item.get('username'), item.get('followers'))
```

Plain HTTP, running the scraper and getting the rows in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/juliob.rangel~tiktok-profile-stats/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"profiles": ["@khaby.lame"]}'
```

The scraper also works with Make, Zapier and n8n, can export results to Google Sheets, can call your webhook when a run finishes, and can be used by AI agents through the Apify MCP server.

### FAQ

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

No. The scraper reads public profile pages without logging in. You only need an Apify account to run it.

#### Can I export TikTok profile stats to Excel or CSV?

Yes. After the run, open the Output tab and export the dataset as Excel, CSV, JSON or HTML, or read it through the API.

#### How many profiles can I scrape in one run?

There is no fixed cap in the scraper. Each line in `profiles` returns one row, and profiles are fetched one after another, so bigger lists take longer.

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

The scraper only collects publicly available data. You are responsible for complying with TikTok's terms and with privacy laws such as GDPR and LGPD. Personal data needs a legitimate reason to be collected and processed.

#### Why did I get a row with an `error` field?

Either TikTok said the account does not exist ("Profile not found") or the page gave no profile data after 5 tries ("Could not load profile"). Error rows are not charged. Check the spelling, then run the missing usernames again.

#### Does it return emails or the profile's videos?

There is no email field. If a creator wrote an email or link in the bio, you will see it in `bio` or `bioLink`. The profile's videos are not listed; use TikTok Video Scraper for video stats.

#### How do I track follower growth?

Save your input as a task, add a daily schedule and compare `followers` and `likes` between runs. Every row has `scrapedAt` so you can build a time series.

### Related scrapers

- [TikTok Video Scraper (Views, Likes, Comments, Shares)](https://apify.com/juliob.rangel/tiktok-video-scraper-fast)
- [TikTok Comments Scraper (Text, Likes, Replies, Users)](https://apify.com/juliob.rangel/tiktok-comments-scraper-fast)
- [Instagram Profile Stats Scraper (Followers, Bio, Posts)](https://apify.com/juliob.rangel/instagram-profile-stats)
- [YouTube Channel Info Scraper (Subscribers, Views, Links)](https://apify.com/juliob.rangel/youtube-channel-info)
- [Snapchat Profile Scraper (Subscribers, Spotlight Views, Bio)](https://apify.com/juliob.rangel/snapchat-profile-scraper-fast)
- [Twitch Channel Scraper (Followers, Viewers, Emails)](https://apify.com/juliob.rangel/twitch-channel-scraper-fast)

***

## Estatísticas de Perfis do TikTok

Seguidores, curtidas, número de vídeos, bio e link de perfis públicos do TikTok em massa. Para agências e marcas avaliarem influenciadores e acompanharem crescimento. Sem login; você paga só por perfil retornado.

# Actor input Schema

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

TikTok usernames (with or without @) or profile URLs.

## `proxy` (type: `object`):

Apify Proxy settings.

## Actor input object example

```json
{
  "profiles": [
    "@khaby.lame",
    "https://www.tiktok.com/@nasa"
  ],
  "proxy": {
    "useApifyProxy": true
  }
}
```

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

// Run the Actor and wait for it to finish
const run = await client.actor("juliob.rangel/tiktok-profile-stats").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": [
        "@khaby.lame",
        "https://www.tiktok.com/@nasa",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("juliob.rangel/tiktok-profile-stats").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": [
    "@khaby.lame",
    "https://www.tiktok.com/@nasa"
  ]
}' |
apify call juliob.rangel/tiktok-profile-stats --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,juliob.rangel/tiktok-profile-stats"
        }
    }
}
```

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/ipu6X3rImAS5zjvCd/builds/ZMvZDlnoxmDxL2W83/openapi.json
