# TikTok Profile Scraper - Engagement & Creator Report (`apinator/tiktok-profile-scraper`) Actor

TikTok profile scraper: every video of a creator with data and ready-made metrics, plus a profile report (engagement, views per follower, best time to post, viral outliers). Optional AI transcripts with SRT/VTT subtitles. Daily 'only new videos' feed. Pay only for what you get.

- **URL**: https://apify.com/apinator/tiktok-profile-scraper.md
- **Developed by:** [Apinator](https://apify.com/apinator) (community)
- **Categories:** Social media, Videos
- **Stats:** 1 total users, 0 monthly users, 87.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 profile reports

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 Scraper

Scrape **every video of a TikTok profile** with all the data and ready-made metrics, plus a **profile report**: engagement, views compared with followers, best time to post, posting consistency and the videos that blew up, with the hashtags and sounds behind them. Need the words too? Turn on **AI transcripts** for any profile and get clean text plus SRT and VTT subtitles.

Run it once for a full history, or schedule it daily with **Only new videos** for a feed of fresh content.

**You only pay for what you receive.** Missing or private profiles, blocked requests and failed transcriptions are free.

### Use cases

- **Influencer vetting**: check real engagement and how many followers actually watch before you pay a creator.
- **Competitor tracking**: follow rival brands and creators every day, and see which videos outperform and why.
- **Content research**: find the hashtags, sounds and posting hours behind a creator's best videos.
- **Lead lists**: collect bio, bio link, followers and verification for a list of creators.
- **AI analysis**: turn on transcripts and give a creator's whole history to ChatGPT, Claude or your own agent.
- **Reporting**: feed a dashboard or a Google Sheet with fresh numbers every morning, including how many views each video gained since yesterday.

### What you get

**One row per video**: views, likes, comments, shares, saves, duration, date, description, hashtags, mentions, music, cover, carousel photos, ad flag, language, location, author avatar, engagement rate, views per follower, views per day, posting hour and weekday in your timezone. With **AI transcripts** on, each video is opened and the row also gets the transcript with timestamps, SRT/VTT subtitles, the hook (opening line), TikTok's own categories and search keywords, author stats and the text of carousel photos: the same fields as [TikTok Transcript Scraper](https://apify.com/apinator/tiktok-transcript-scraper).

**One profile report per creator:**

| Field | What it tells you |
|---|---|
| `followers`, `following`, `totalLikes`, `videoCount`, `bio`, `bioLink`, `verified` | the profile card |
| `medianViews`, `avgViews` | typical reach (the median ignores one-off viral hits) |
| `avgEngagementRate`, `medianEngagementRate` | how much the audience interacts (TikTok average: about 3.3% of views) |
| `viewsToFollowers` | median views divided by followers: 10-30% is typical on TikTok |
| `medianLikesPerComment` | median likes for each comment: shows how much the audience talks back |
| `postsPerWeek`, `consistency` | how often and how regularly they post |
| `bestHour`, `bestWeekday` | when their videos get the most engagement, in your timezone |
| `outlierVideos`, `outlierHashtags`, `outlierSounds` | videos with more than 3x the median views, and what they have in common |
| `followerGrowth`, `followerGrowthRate`, `sinceLastReadDays` | follower change since your previous run |
| `videosDeclared`, `videosListed`, `smallSample` | how many videos TikTok declares, how many were read, and a warning under 10 videos |

The profile report is always computed on at least the latest 30 videos, even when you process fewer or when there are no new ones. All metrics use fixed, documented formulas (no AI guessing).

### How to scrape a TikTok profile

1. Add creators in **TikTok profiles**: `nasa`, `@nasa`, a profile link, or a link to any of their videos.
2. Set **Max videos per profile** (newest first; the full history is available) and optionally **Only videos after** a date.
3. Optionally turn on **AI transcripts** to get what is said in each video, with ready SRT and VTT subtitles.
4. For a daily feed: turn on **Only new videos since my last run** and add an Apify schedule. What you already received is remembered in your own Apify account.
5. To track how videos grow: leave **Only new videos** off and schedule the run daily. Each video then shows what changed since your previous run: `viewsGained`, `likesGained`, `commentsGained`, `sharesGained`, `savesGained`, `hoursSinceLastRun`, `viewsPerHourNow` and `velocityRatio` (above 1 = the video is speeding up compared with its lifetime average, below 1 = slowing down). `firstSeen` is true the first time a video appears.

#### Example input

```json
{
  "profiles": ["nasa", "@natgeo", "https://www.tiktok.com/@bbcnews"],
  "maxVideos": 50,
  "transcribe": false,
  "onlyNew": false,
  "since": "2026-01-01",
  "timezone": "America/New_York"
}
```

### Pricing (pay per event)

| Event | Price | When |
|---|---|---|
| Profile report | $0.01 (down to $0.007 on paid Apify plans) | per profile read |
| Video data | $0.003 (down to $0.001 on paid Apify plans) | per video: data and metrics |
| Run start | $0.005 per GB of memory | once per run: $0.01 with the default 2 GB (Apify counts the start per GB) |
| Missing or private profile, blocked by TikTok, spending limit reached | **free** | |

**Optional extras**

| Event | Price | When |
|---|---|---|
| Transcribed video | $0.025 | with **AI transcripts** on: video listened to and transcribed, first minute included; videos with no speech pay this too (no extra minutes) |
| Extra minute | $0.01 | each minute after the first, rounded to the nearest (1:29 = 1 minute, 1:30 = 2) |
| Photo text | $0.005 | per carousel photo read |
| Saved video file | $0.003 | optional |
| Transcription failed, unavailable video, saved thumbnail | **free** | |

**Free Apify plan:** demo mode, up to 5 runs a month with 10 results each (one profile, 10 videos; with AI transcripts on, 3 videos up to 3 minutes), enough to try it. Any paid Apify plan removes the limit.

Transcribed videos and extra minutes get cheaper on paid Apify plans (down to $0.011 per video).

Examples:

- 10 creators × 100 videos, data only: 10 × $0.01 + 1,000 × $0.003 = **about $3.10**.
- The same with AI transcripts on one-minute videos: **about $25**.
- Afterwards, a daily **Only new videos** run costs a few cents per profile.

### Example video row

One real row from a run on `nasa` (AI transcripts off). Image links are shortened here. The `...Gained` fields come from a second run a minute after the first, so they are zero; with a daily schedule they show the day's growth.

```json
{
  "url": "https://www.tiktok.com/@nasa/video/7689547576265149710",
  "videoId": "7689547576265149710",
  "author": "nasa",
  "createdAt": "2026-09-25T18:52:22Z",
  "durationSec": 121,
  "views": 75500,
  "likes": 3701,
  "comments": 192,
  "shares": 83,
  "saves": 234,
  "description": "There's plenty happening across NASA as September comes to a close!   🇺🇸 NASA’s Inspiration Tour heads to Arizona 🧑‍🚀 Crew-13 prepares to launch on 10/1 🔬 New discovery about life at the extremes ✈️ Studying the future of air mobility   Here's your NASA Minute!",
  "hashtags": "",
  "mentions": "",
  "musicTitle": "original sound - NASA",
  "musicAuthor": "NASA",
  "musicIsOriginal": false,
  "musicIsCopyrighted": false,
  "authorFollowers": 1853632,
  "authorVerified": true,
  "authorBio": "Making the seemingly impossible, possible.✨",
  "authorVideoCount": 48,
  "authorTotalLikes": 9700000,
  "authorAvatar": "https://p19-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/e5143…",
  "authorIsSeller": null,
  "isAd": false,
  "isAiGenerated": false,
  "language": "en",
  "locationCreated": null,
  "tiktokCategories": "",
  "tiktokSearchKeywords": "",
  "anchors": "",
  "width": 720,
  "height": 1280,
  "quality": "720p",
  "loudness": -25.8,
  "thumbnail": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/oQLtLFg…",
  "isSlideshow": false,
  "slideshowImages": "",
  "slideshowTitle": null,
  "engagementRate": 0.0527,
  "commentRate": 0.00254,
  "shareRate": 0.0011,
  "likeToCommentRatio": 19.3,
  "viewsPerFollower": 0.041,
  "viewsPerDay": 28320,
  "postHour": 18,
  "postWeekday": "Friday",
  "hashtagCount": 0,
  "hook": null,
  "wordsPerMinute": null,
  "talkRatio": null,
  "callToAction": "",
  "status": "data_only",
  "error": "",
  "viewsGained": 0,
  "likesGained": 0,
  "commentsGained": 0,
  "sharesGained": 0,
  "savesGained": 0,
  "hoursSinceLastRun": 0,
  "viewsPerHourNow": 0,
  "velocityRatio": 0,
  "firstSeen": false
}
```

### Example profile report

```json
{
  "type": "profile",
  "input": "nasa",
  "username": "nasa",
  "nickname": "NASA",
  "verified": true,
  "followers": 1807766,
  "following": 23,
  "totalLikes": 9542723,
  "videoCount": 47,
  "videosAnalyzed": 30,
  "videosDeclared": 47,
  "smallSample": false,
  "medianViews": 542850,
  "avgViews": 1113327,
  "avgEngagementRate": 0.0828,
  "medianEngagementRate": 0.0727,
  "viewsToFollowers": 0.3003,
  "medianLikesPerComment": 41.7,
  "postsPerWeek": 4.38,
  "consistency": 1,
  "bestHour": 16,
  "bestWeekday": "Wednesday",
  "outlierVideos": "https://www.tiktok.com/@nasa/video/7675478347278863629 (15.1x)",
  "outlierHashtags": "",
  "outlierSounds": "original sound - NASA, original sound, To the outer space",
  "followerGrowth": 305,
  "followerGrowthRate": 0.0002,
  "sinceLastReadDays": 0,
  "status": "ok",
  "error": ""
}
```

### Result statuses and errors

| Status | Meaning | Charged | What to do |
|---|---|---|---|
| `ok` | profile or video returned | yes | |
| `data_only` | video data and metrics, no transcript (AI transcripts off) | yes | |
| `silent` | no speech (music or silence); data and metrics returned | yes, as a transcribed video (first minute only) | turn on **Transcribe songs too** if you want lyrics |
| `profile_private` | the profile is private | no | nothing to read |
| `profile_not_found` | no profile with that name | no | check the spelling or paste the profile link |
| `blocked` | TikTok refused the request after 3 attempts from different addresses | no | run again later |
| `transcription_failed` | the speech-to-text service failed and TikTok had no captions | no | run again with **Only new videos** off |
| `limit_reached` | your spending limit was reached | no | raise the limit in the run options |
| `free_plan_limit` | free Apify plan: demo limit reached (runs, videos or video length) | no | subscribe to any paid Apify plan |

### Use with AI agents (Claude, ChatGPT, Cursor)

AI assistants can run this scraper through the [Apify MCP server](https://mcp.apify.com), the bridge that lets them use Apify Store tools. Add it to your assistant with this address:

```
https://mcp.apify.com?tools=apinator/tiktok-profile-scraper
```

Then paste a prompt like this one:

```
Use the TikTok Profile Scraper (apinator/tiktok-profile-scraper) on these creators:
<usernames>
Compare their median views, engagement rate and posting frequency,
compare engagement and views per follower, and tell me which one to work with.
```

Agents can also pay per run on their own with x402 or Skyfire, without an Apify account.

### Use with n8n, Make and Zapier

- **n8n**: use the Apify node, choose *Run an Actor and get dataset*, pick `apinator/tiktok-profile-scraper` and pass the profiles as JSON input.
- **Make** and **Zapier**: use the Apify app, action *Run an Actor*, then *Get dataset items*.
- **Daily feed**: an Apify schedule with **Only new videos** on, plus a webhook to your flow when the run finishes.

### FAQ

#### How far back can it go?

The full history of a profile is available: set **Max videos per profile** to a high number. On very old or large profiles a few videos may be missing (in our tests 93–100% of the declared videos were listed); the report shows both numbers.

#### What changes with AI transcripts off?

Data only mode reads everything from the profile list without opening each video: fast and cheap, but no transcript, no hook and no carousel detection (`isSlideshow` is empty).

#### Are pinned videos marked?

No: TikTok does not expose this without extra request signing.

#### How does "Only new videos" remember what I got?

It stores the list of videos already sent in a storage of your own Apify account. Nothing is kept on our side.

#### Is it legal to scrape TikTok?

This scraper reads only public profiles and videos, the same ones anyone can see without logging in. It does not collect private data such as emails or phone numbers. Profiles are personal data under laws like GDPR: if you store or use them, have a legitimate reason and follow the rules that apply to you. When in doubt, ask a lawyer.

This is an unofficial tool: it is not affiliated with, endorsed or sponsored by TikTok or ByteDance. To keep the scraper reliable, each run sends us anonymous counts only (videos processed, videos blocked); never your input, links or results.

### Single videos

To transcribe single TikTok videos or photo posts from a list of links, use [TikTok Transcript Scraper](https://apify.com/apinator/tiktok-transcript-scraper).

### Support and feedback

Something missing or not working? Open an issue on the **Issues** tab: we read every one. Feature requests are welcome too.

# Actor input Schema

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

Usernames (nasa or @nasa), profile links, or a link to any video of the profile.

## `maxVideos` (type: `integer`):

Newest first. Full history is available (set a high number).

## `transcribe` (type: `boolean`):

Paid extra. Adds transcript, subtitles, hook, TikTok categories and carousel photo text to each video. Off = data and metrics only.

## `onlyNew` (type: `boolean`):

Remembers what you already got (stored in your own account). Combine with an Apify schedule for a daily feed.

## `since` (type: `string`):

Optional. Only videos published after this date.

## `transcribeMusic` (type: `boolean`):

By default videos with only music are marked silent.

## `language` (type: `string`):

Optional ISO code. Empty = detected automatically.

## `timezone` (type: `string`):

IANA name, e.g. Europe/Rome. Used for posting hours.

## `downloadThumbnail` (type: `boolean`):

Paid extra.

## `downloadVideo` (type: `boolean`):

Paid extra.

## Actor input object example

```json
{
  "profiles": [
    "nasa"
  ],
  "maxVideos": 20,
  "transcribe": false,
  "onlyNew": false,
  "transcribeMusic": false,
  "timezone": "UTC",
  "downloadThumbnail": false,
  "downloadVideo": false
}
```

# Actor output Schema

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

Every row: one per video, plus one profile report per creator. Flat keys, same for every row.

## `overview` (type: `string`):

The main fields as a table view.

## `csv` (type: `string`):

Same rows as a spreadsheet.

## `files` (type: `string`):

Thumbnails and video files, when you turn them on.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("apinator/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": ["nasa"] }

# Run the Actor and wait for it to finish
run = client.actor("apinator/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": [
    "nasa"
  ]
}' |
apify call apinator/tiktok-profile-scraper --silent --output-dataset

```

## MCP server setup

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