# TikTok Profile Scraper - Bio, Counts & Videos (`parseforge/tiktok-profile-scraper`) Actor

Reads TikTok profiles by username or URL. 28 fields per profile: follower, following, like, video and friend counts, bio and bio link, verification, private, organization and seller flags, comment, duet, stitch and download settings, language and creation date. Videos and comments are optional.

- **URL**: https://apify.com/parseforge/tiktok-profile-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Social media, Lead generation
- **Features:** Limited permissions
- **Stats:** 62 total users, 4 monthly users, 89.4% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $13.99 / 1,000 result items

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

[![ParseForge](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner-v4.webp)](https://apify.com/parseforge?fpr=vmoqkp)

### TikTok Profile Scraper

**Scrape TikTok profile data and recent videos for any list of usernames or profile URLs, up to a million profiles per run.** Every profile returns follower counts, bio, verified status, and optional video feeds with play counts, likes, comments, music metadata, and hashtags. No login or API key. Export to CSV, JSON, Excel, or XML.

**Low minimum charge:** $0.02 to start a run, then you only pay for the results you get.

TikTok's official API requires a developer account, app review, and strict rate limits that throttle large-scale profile research. This Actor reads public profile pages directly, so you can feed it a list of usernames or profile URLs and get structured data back without any authentication. It handles millions of profiles per run and optionally dives into each profile's recent videos and their comments, all in one fixed schema.

| Who uses it | What they scrape TikTok for |
|---|---|
| Influencer marketing agencies | Build a database of creator profiles with follower counts, engagement rates, and recent content for campaign vetting. |
| Brand safety analysts | Audit a list of TikTok profiles for bio links, verification status, and content history before partnership decisions. |
| Social media researchers | Track profile growth, posting frequency, and content themes across a cohort of TikTok creators over time. |
| Recruitment teams | Identify niche creators by scraping profiles from a target list and filtering by follower range or content category. |

### What it does

This Actor collects TikTok profile metadata and optional video feeds by username or profile URL, and returns each profile as a flat row with nested video and comment objects when enabled.

- 👤 **Profile metadata:** username, display name, bio, follower count, following count, likes total, verified badge, and avatar URL.
- 🎬 **Video scraping:** enable to pull recent videos with play count, hearts, shares, comments count, music track, hashtags, and publish date.
- 💬 **Comment scraping:** nested inside each video, collect comment text, author, and timestamp for deeper engagement analysis.
- 📅 **Date filters:** restrict videos to a custom date range with publishedAfter and publishedBefore so you only get fresh or historical content.
- 🔢 **Engagement filters:** set minimum and maximum hearts per video to isolate top performers or low-engagement outliers.
- 📌 **Pinned post control:** exclude pinned videos from results to focus on organic, chronological content.

Results export to CSV, JSON, Excel, or XML, or straight from the API.

### What you can do with TikTok data

**📊 Vet influencer rosters at scale.**

An agency feeds a list of 500 TikTok usernames, enables video scraping with a 30-video limit, and exports follower counts, average hearts, and recent hashtags to score each creator for a beauty brand campaign.

**🔍 Audit brand safety across profiles.**

A compliance team scrapes 200 profiles with video comments enabled, filters videos from the last 90 days, and reviews bio links and comment sentiment before approving a sponsorship deal.

**📈 Track creator growth week over week.**

A researcher runs the Actor weekly on the same 50 usernames, collects follower counts and video publish dates, and plots growth curves to identify rising TikTok personalities in the fitness niche.

**🎵 Map music trends by creator.**

A music label scrapes 100 dance-creator profiles with video scraping on, extracts music track names from the last 60 days, and spots which songs are gaining traction organically.

### Why choose this scraper

|  | What you get |
|---|---|
| **No API key needed** | Scrapes public profile pages directly, bypassing TikTok's developer registration and rate limits. |
| **Bulk profile lists** | Feed in up to a million usernames or URLs per run from a prefill or your own CSV. |
| **Nested video data** | Optionally collect recent videos per profile with play counts, likes, shares, and music metadata. |
| **Comment depth** | Enable comment scraping to pull text and author details nested inside each video object. |
| **Fixed output schema** | Every profile, video, and comment returns in a consistent structure ready for CSV, JSON, Excel, or XML export. |

### How it compares

This Actor focuses on profile-list scraping with nested video and comment depth, while other TikTok scrapers emphasize hashtag or search-based discovery.

| Feature | ParseForge | TikTok Scraper | TikTok Data Extractor |
|---|---|---|---|
| Scrape by username list | Yes | Not listed | Yes |
| Nested video data per profile | Yes | Not listed | Not listed |
| Nested comment data per video | Yes | Not listed | Not listed |
| Video date range filters | Yes | Not listed | Not listed |
| Video engagement filters (min/max hearts) | Yes | Not listed | Not listed |
| Exclude pinned videos | Yes | Not listed | Not listed |

### Configure the run

Drive the Actor from a list of TikTok usernames or profile URLs, and filters run as each video is read so only matches reach your dataset. The Input tab lists every parameter.

A first run with the defaults:

```json
{
  "profiles": [
    "charlidamelio",
    "addisonre",
    "bellapoarch",
    "zachking",
    "khaby.lame",
    "willsmith",
    "kyliejenner",
    "therock",
    "selenagomez",
    "arianagrande",
    "billieeilish",
    "mrbeast",
    "doja.cat",
    "mileycyrus",
    "jasonderulo",
    "jlo",
    "shakira",
    "taylorswift",
    "kimkardashian",
    "rihanna",
    "nickiminaj",
    "cardib",
    "badbunnypr",
    "dualipa",
    "edsheeran",
    "brunomars",
    "kendalljenner",
    "mariahcarey",
    "justinbieber",
    "ninaagdal"
  ],
  "maxItems": 10
}
```

A larger pull:

```json
{
  "profiles": [
    "charlidamelio",
    "addisonre",
    "bellapoarch",
    "zachking",
    "khaby.lame",
    "willsmith",
    "kyliejenner",
    "therock",
    "selenagomez",
    "arianagrande",
    "billieeilish",
    "mrbeast",
    "doja.cat",
    "mileycyrus",
    "jasonderulo",
    "jlo",
    "shakira",
    "taylorswift",
    "kimkardashian",
    "rihanna",
    "nickiminaj",
    "cardib",
    "badbunnypr",
    "dualipa",
    "edsheeran",
    "brunomars",
    "kendalljenner",
    "mariahcarey",
    "justinbieber",
    "ninaagdal"
  ],
  "maxItems": 200
}
```

### Pricing

Pay-per-result: **$0.01866 per result** collected. You pay only for the results written to your dataset.

| Results collected | Approximate cost |
|---|---|
| 100 results | $1.87 |
| 1,000 results | $18.66 |
| 10,000 results | $186.60 |

**Optional videos:** with `includeVideos` on, each profile that comes back with videos adds a `profile-videos` event at **$0.005** ($5 per 1,000). Leave it off and you pay only the per-result price above.

**Optional comments:** with `includeComments` on, each profile whose videos come back with comments adds a `video-comments` event at **$0.005** ($5 per 1,000). Leave it off and you pay only the per-result price above.

New Apify accounts start with $5 in free credit.

### Free users

Free-plan runs return up to 10 results as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to collect up to 1,000,000 results per run.

### Run it

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [TikTok Profile Scraper](https://apify.com/parseforge/tiktok-profile-scraper?fpr=vmoqkp).
3. Set your inputs and any filters, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the **Dataset** tab.

Run it programmatically through the [Apify API](https://docs.apify.com/api/v2) (`run-sync-get-dataset-items`) or the [ApifyClient](https://docs.apify.com/api/client/js) for JavaScript and Python.

### Use with AI agents (MCP)

Give an AI agent live access to TikTok through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

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

Then prompt it in plain language to run the scraper and read back the results.

### Troubleshooting

**Why am I getting no results for some profiles?**

Check that the profiles are public and the usernames are spelled correctly. Private or deleted accounts will be skipped. Review the run log for per-profile warnings.

**Why are my video counts lower than expected?**

The maxVideosPerProfile setting caps how many videos are collected per profile. Also, date filters and minHearts/maxHearts will further reduce the count. Try raising the cap or widening the filters.

**The run is taking a long time with many profiles.**

Scraping videos and comments adds significant time per profile. For large lists, start with includeVideos disabled to get profile metadata quickly, then re-run with video scraping on a smaller subset.

**I enabled comments but don't see them in the output.**

Comments are nested inside each video object, not at the profile level. Expand a video row in your dataset to find the comments array. Also verify maxCommentsPerVideo is set above zero.

**Why do I get a 'cannot read properties' error in my integration?**

Some profiles may have missing fields if TikTok's page structure changes. Use optional chaining in your code when accessing nested fields like videos or comments, and check the raw JSON output for the exact structure.

### FAQ

| Question | Answer |
|---|---|
| Do I need a TikTok account or API key to use this? | No. The Actor reads public profile pages directly, so no login, API key, or developer registration is required. |
| Can I scrape private TikTok profiles? | No. Only public profiles are accessible. If a profile is set to private, the Actor will skip it and log a warning. |
| How many profiles can I scrape in one run? | You can set maxItems up to 1,000,000 profiles per run. The Actor processes them sequentially and respects platform rate limits automatically. |
| What video data do I get when I enable includeVideos? | Each video returns play count, hearts, shares, comments count, music track name and artist, hashtags, publish date, and a direct video URL. |
| Can I filter videos by publish date? | Yes. Use publishedAfter and publishedBefore in YYYY-MM-DD format to restrict videos to a specific date window. |
| How do comments work in the output? | When includeComments is enabled, each video object contains a nested comments array with comment text, author name, and timestamp. You control the depth with maxCommentsPerVideo. |
| What format does the data export to? | The Actor outputs to CSV, JSON, Excel, or XML. Nested video and comment data is stored as arrays within each profile row. |
| Can I scrape only profiles without videos? | Yes. Keep includeVideos set to false, and the Actor returns only profile-level metadata: username, bio, follower count, following count, likes total, and verified status. |
| How do I input a list of profiles? | Paste TikTok usernames (with or without '@') or full profile URLs into the profiles field. The Actor normalizes them automatically. |
| Does this Actor handle TikTok rate limiting? | Yes. It includes built-in delays and retry logic to stay within TikTok's acceptable request patterns and avoid blocks. |

### Related actors

Browse the full [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp) for more scrapers.

🆘 **Need help?** Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ **Disclaimer.** This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by TikTok Inc. It collects only publicly available data. You are responsible for using the collected data in compliance with the source's terms of service and applicable data-protection laws, including GDPR, CCPA, and PIPL. Do not use it to collect personal data unlawfully.

# Actor input Schema

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

List of TikTok usernames or profile URLs to scrape (e.g. 'charlidamelio', '@khaby.lame', 'https://www.tiktok.com/@bellapoarch')

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

Maximum number of profiles to collect per run.

## `includeVideos` (type: `boolean`):

Scrape recent videos for each profile. Videos are nested inside each profile's output.

## `maxVideosPerProfile` (type: `integer`):

Maximum number of videos to scrape per profile

## `publishedAfter` (type: `string`):

Only include videos published after this date (YYYY-MM-DD format)

## `publishedBefore` (type: `string`):

Only include videos published before this date (YYYY-MM-DD format)

## `minHearts` (type: `integer`):

Only include videos with at least this many hearts/likes

## `maxHearts` (type: `integer`):

Only include videos with at most this many hearts/likes

## `excludePinned` (type: `boolean`):

Exclude pinned videos from the results

## `includeComments` (type: `boolean`):

Scrape comments for each video. Comments are nested inside each video.

## `maxCommentsPerVideo` (type: `integer`):

Maximum number of comments to scrape per video

## Actor input object example

```json
{
  "profiles": [
    "charlidamelio",
    "addisonre",
    "bellapoarch",
    "zachking",
    "khaby.lame",
    "willsmith",
    "kyliejenner",
    "therock",
    "selenagomez",
    "arianagrande",
    "billieeilish",
    "mrbeast",
    "doja.cat",
    "mileycyrus",
    "jasonderulo",
    "jlo",
    "shakira",
    "taylorswift",
    "kimkardashian",
    "rihanna",
    "nickiminaj",
    "cardib",
    "badbunnypr",
    "dualipa",
    "edsheeran",
    "brunomars",
    "kendalljenner",
    "mariahcarey",
    "justinbieber",
    "ninaagdal"
  ],
  "maxItems": 10,
  "includeVideos": false,
  "maxVideosPerProfile": 30,
  "excludePinned": false,
  "includeComments": false,
  "maxCommentsPerVideo": 20
}
```

# Actor output Schema

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

Dataset with all scraped TikTok profiles

# 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": [
        "charlidamelio",
        "addisonre",
        "bellapoarch",
        "zachking",
        "khaby.lame",
        "willsmith",
        "kyliejenner",
        "therock",
        "selenagomez",
        "arianagrande",
        "billieeilish",
        "mrbeast",
        "doja.cat",
        "mileycyrus",
        "jasonderulo",
        "jlo",
        "shakira",
        "taylorswift",
        "kimkardashian",
        "rihanna",
        "nickiminaj",
        "cardib",
        "badbunnypr",
        "dualipa",
        "edsheeran",
        "brunomars",
        "kendalljenner",
        "mariahcarey",
        "justinbieber",
        "ninaagdal"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/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": [
        "charlidamelio",
        "addisonre",
        "bellapoarch",
        "zachking",
        "khaby.lame",
        "willsmith",
        "kyliejenner",
        "therock",
        "selenagomez",
        "arianagrande",
        "billieeilish",
        "mrbeast",
        "doja.cat",
        "mileycyrus",
        "jasonderulo",
        "jlo",
        "shakira",
        "taylorswift",
        "kimkardashian",
        "rihanna",
        "nickiminaj",
        "cardib",
        "badbunnypr",
        "dualipa",
        "edsheeran",
        "brunomars",
        "kendalljenner",
        "mariahcarey",
        "justinbieber",
        "ninaagdal",
    ],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/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": [
    "charlidamelio",
    "addisonre",
    "bellapoarch",
    "zachking",
    "khaby.lame",
    "willsmith",
    "kyliejenner",
    "therock",
    "selenagomez",
    "arianagrande",
    "billieeilish",
    "mrbeast",
    "doja.cat",
    "mileycyrus",
    "jasonderulo",
    "jlo",
    "shakira",
    "taylorswift",
    "kimkardashian",
    "rihanna",
    "nickiminaj",
    "cardib",
    "badbunnypr",
    "dualipa",
    "edsheeran",
    "brunomars",
    "kendalljenner",
    "mariahcarey",
    "justinbieber",
    "ninaagdal"
  ],
  "maxItems": 10
}' |
apify call parseforge/tiktok-profile-scraper --silent --output-dataset

```

## MCP server setup

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