# TikTok Profile Scraper – Bio, Stats & Playlists (`datascraperes/tiktok-profile-scraper`) Actor

Collect public TikTok profile snapshots in bulk from usernames or public profile URLs, including bio, avatars, verification, follower and video stats, public playlists, and contact hints from the visible profile.

- **URL**: https://apify.com/datascraperes/tiktok-profile-scraper.md
- **Developed by:** [DataScraperES](https://apify.com/datascraperes) (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

$1.00 / 1,000 tiktok profile snapshots

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/platform/actors/running/actors-in-store#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

## TikTok Profile Scraper – Bio, Stats & Playlists

Get structured snapshots of public TikTok profiles from usernames or profile URLs. The Actor is designed for single profiles as well as large lists, and saves one clear result per profile in your Apify Dataset.

### Price

**$0.001 per successfully saved profile — $1 for 1,000 successful profiles.**

The price includes the platform usage for this Actor. Unsuccessful profiles are kept in the results for review and are not charged.

### What this Actor does

Use it to collect the public information shown on TikTok profile pages in a consistent, exportable format.

Typical uses include:

- Creator and influencer research.
- Lead qualification and public business-contact discovery.
- Competitor and audience benchmarking.
- Enriching creator, agency or marketing databases.
- Finding profiles by username or by a list of public profile URLs.
- Periodic snapshots for monitoring changes in public profile information.

This Actor collects profile information only. It does not collect a user's complete video library, followers, following list, comments, likes, reposts or private content.

### Information returned

Each successful result contains the following groups of information when TikTok makes the value available publicly:

| Group | Main fields | What they mean |
| --- | --- | --- |
| Identity | `username`, `nickname`, `profileUrl`, `userId`, `secUid`, `shortId` | Public identifiers and the canonical profile URL. |
| Biography | `signature`, `bioLink` | The public bio and the normalized link shown in the profile. |
| Images | `avatars.larger`, `avatars.medium`, `avatars.thumb` | Public avatar URLs in the available sizes. |
| Verification | `verified` | Whether the profile is publicly marked as verified. |
| Location and language | `region`, `language` | Public values when exposed by TikTok. |
| Audience metrics | `stats.followers`, `stats.following`, `stats.friends`, `stats.likes`, `stats.videos` | Public profile counters. TikTok may return rounded or empty values. |
| Derived metric | `stats.likesPerFollower` | Likes divided by followers when both counters are available. |
| Account information | `account.*` | Public account and visibility flags, including private-account, organization and profile-change information. |
| Profile permissions | `permissions.*` | Public comment, download, duet, stitch and profile-tab settings when available. |
| Business and commerce | `commerce.*` | Public seller, commerce and playlist-related flags when available. |
| Live profile | `live.*` | Public live-room information when available. |
| Playlists | `playlists[]` | Public playlists exposed by the profile, including name, description, video count, cover and identifier. |
| Public contact hints | `contact.*` | Email, phone, Instagram, YouTube and public-link hints found only in the bio or bio link. |
| Processing result | `success`, `status`, `retrievedAt`, `errorCode`, `errorMessage` | Whether the profile was collected and, if not, the reason shown for that profile. |

Contact hints are not external enrichment and are not verified. They are simple signals extracted from the public bio and the public bio link, so treat them as leads to review rather than confirmed business contacts.

### How to use it in Apify

1. Open the Actor and go to the **Input** tab.
2. Add one or more TikTok usernames or public profile URLs in **TikTok profiles**.
3. Choose the optional fields you want to include.
4. Click **Start**.
5. Open the **Dataset** tab to review, filter or export the results as JSON, CSV, Excel or other available formats.

The input accepts:

- `@username`, for example `@tiktok`.
- `username`, for example `tiktok`.
- A public profile URL, for example `https://www.tiktok.com/@tiktok`.

Video URLs, empty values and URLs from other websites are not valid profile inputs. Duplicate usernames are removed without charging a second time for the duplicate.

#### Example input

```json
{
  "profiles": [
    "@tiktok",
    "https://www.tiktok.com/@scout2015"
  ],
  "includePlaylists": true,
  "extractPublicContactHints": true
}
```

### Input options

| Option | Default | Description |
| --- | ---: | --- |
| `profiles` | Required | List of TikTok usernames or public profile URLs. At least one value is required. |
| `startIndex` | `0` | Position at which to continue in a large, deduplicated list. Use the `nextStartIndex` shown in the previous run's status message. |
| `maxProfilesPerRun` | `1000` | Maximum profiles processed in one run. The Actor has no 100-profile limit. For lists larger than 1,000, continue with `startIndex` in additional runs. |
| `includePlaylists` | `true` | Includes public playlists when TikTok exposes them. A missing playlist does not invalidate the profile result. |
| `extractPublicContactHints` | `true` | Includes public-only email, phone, Instagram, YouTube and link hints from the bio and bio link. |

#### Processing large lists

There is no artificial 100-profile limit. A single run can process up to 1,000 profiles. To process a larger list:

1. Run the first batch with the full list and `maxProfilesPerRun: 1000`.
2. Check the run status for `nextStartIndex`.
3. Run the same list again with that value in `startIndex`.
4. Repeat until the status no longer reports a next index.

Already saved results remain available if a run stops early because of a temporary TikTok restriction, a timeout or the configured spending limit.

### Example successful result

```json
{
  "success": true,
  "status": "ok",
  "retrievedAt": "2026-08-17T12:00:00Z",
  "input": "@example_creator",
  "sourceType": "username",
  "profileUrl": "https://www.tiktok.com/@example_creator",
  "username": "example_creator",
  "userId": "123456789",
  "nickname": "Example Creator",
  "signature": "Travel, food and daily ideas | hola@example.com",
  "bioLink": "https://example.com/contact",
  "avatars": {
    "larger": "https://example.com/avatar-large.jpg",
    "medium": "https://example.com/avatar-medium.jpg",
    "thumb": "https://example.com/avatar-thumb.jpg"
  },
  "verified": false,
  "stats": {
    "followers": 100000,
    "following": 250,
    "friends": 80,
    "likes": 2500000,
    "diggCount": 0,
    "videos": 120,
    "likesPerFollower": 25.0
  },
  "contact": {
    "emails": ["hola@example.com"],
    "phones": [],
    "instagramHandle": "example_creator",
    "youtubeChannel": null,
    "normalizedBioLink": "https://example.com/contact",
    "bioLinkDomain": "example.com",
    "bioLinkType": "contact",
    "contactChannel": "email",
    "hasPublicContactHint": true,
    "isBusinessLike": true
  },
  "playlists": [
    {
      "id": "12345",
      "name": "Travel ideas",
      "description": "Public travel videos",
      "videoCount": 12,
      "cover": "https://example.com/playlist-cover.jpg"
    }
  ]
}
```

The exact values and optional fields depend on what TikTok exposes for the profile at the time of the run. Empty values are normal and do not necessarily indicate a problem.

### Errors and incomplete profiles

The Actor writes a result row for every profile that it starts processing. A failed row has `success: false`, `status: "error"`, an `errorCode` and an `errorMessage`.

Common situations include:

- `PROFILE_NOT_FOUND`: the profile does not exist or is no longer available.
- `PROFILE_PAYLOAD_MISSING`: the page did not expose usable public profile data.
- `CHALLENGE_OR_BLOCK` or `RATE_LIMITED`: TikTok temporarily asked the Actor to stop.
- `REQUEST_TIMEOUT`: the profile took longer than the selected timeout.
- `HTTP_ERROR` or `REQUEST_FAILED`: the profile could not be retrieved at that moment.

Error rows are useful for auditing and are not charged. A playlist-specific problem appears in `playlistFetch` while the main profile can still be a successful result.

### Data limitations

- Only information visible through public profile pages is returned.
- Private videos, private contact details and restricted account data are not collected.
- TikTok counters can be rounded, delayed, region-dependent or unavailable.
- Playlists are returned only when they are public and exposed for that profile.
- Contact hints come only from the visible bio and bio link; the Actor does not verify ownership or enrich contacts from external sources.
- The result is a snapshot taken at run time, not a historical guarantee of how the profile looked previously.

### Frequently asked questions

#### Can I use a username instead of a URL?

Yes. Both `@username` and `username` are supported, as well as a public TikTok profile URL.

#### Can I process more than 100 profiles?

Yes. The per-run limit is 1,000 profiles, and larger lists can be continued in batches using `startIndex` and `nextStartIndex`.

#### Does it scrape TikTok videos?

No. It captures profile-level information and public playlist summaries. Use a video-focused Actor when you need individual videos or post-level data.

#### Why is a playlist empty even though the profile exists?

The profile may not have public playlists, or TikTok may not have exposed them at the time of the run. The profile result can still be valid.

#### Are the email and phone values guaranteed to work?

No. They are public hints found in the bio, not verified contacts. Review them and use them in accordance with applicable law and platform rules.

#### Do I need to provide a TikTok login?

No. The Actor is intended for publicly available profile information and does not require you to provide a TikTok account.

### Responsible use

Use the Actor only with public information and for lawful purposes. Respect TikTok's terms, applicable privacy and marketing laws, and the rights of the people represented in the data. Do not use public contact hints for unsolicited messages or campaigns without the required permission.

# Actor input Schema

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

Examples: @tiktok, tiktok, or https://www.tiktok.com/@tiktok. Video URLs and private profiles are not accepted as profile inputs. There is no artificial 100-profile limit; use startIndex and maxProfilesPerRun for large lists.

## `startIndex` (type: `integer`):

Zero-based index in the deduplicated profiles list. Use the nextStartIndex reported by a previous run to resume a larger input.

## `maxProfilesPerRun` (type: `integer`):

Maximum profiles processed by this run. The default and safe maximum are 1000; repeat the run with startIndex for larger collections.

## `includePlaylists` (type: `boolean`):

Attempts to read the public playlist summary exposed by the profile web application. An unavailable playlist endpoint does not invalidate the profile snapshot.

## `extractPublicContactHints` (type: `boolean`):

Derives public-only hints from the profile bio and bio link, such as email, phone, Instagram, YouTube, link type, and domain. No external contact lookup is performed.

## Actor input object example

```json
{
  "profiles": [
    "@tiktok",
    "https://www.tiktok.com/@scout2015"
  ],
  "startIndex": 0,
  "maxProfilesPerRun": 10,
  "includePlaylists": true,
  "extractPublicContactHints": true
}
```

# Actor output Schema

## `profiles` (type: `string`):

One Dataset item per requested profile, including structured success or error information.

# 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": [
        "@tiktok"
    ],
    "startIndex": 0,
    "maxProfilesPerRun": 10,
    "includePlaylists": true,
    "extractPublicContactHints": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascraperes/tiktok-profile-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": ["@tiktok"],
    "startIndex": 0,
    "maxProfilesPerRun": 10,
    "includePlaylists": True,
    "extractPublicContactHints": True,
}

# Run the Actor and wait for it to finish
run = client.actor("datascraperes/tiktok-profile-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": [
    "@tiktok"
  ],
  "startIndex": 0,
  "maxProfilesPerRun": 10,
  "includePlaylists": true,
  "extractPublicContactHints": true
}' |
apify call datascraperes/tiktok-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datascraperes/tiktok-profile-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/kijdoGlidgCvjVoLI/builds/558CbISDfrv7c2OZz/openapi.json
