# TikTok Scraper: Profiles, Videos, Transcripts, Comments and +++ (`socialhz/tiktok-scraper`) Actor

Scrape TikTok creators and videos — follower and like totals, full video history with pagination, sponsored-post flags, transcripts and comments. No login. Pricing: videos $1.49/1K, video details with transcript $1.49/1K, comments $1.49/1K.

- **URL**: https://apify.com/socialhz/tiktok-scraper.md
- **Developed by:** [Socialhz](https://apify.com/socialhz) (community)
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.49 / 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.

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 Scraper: Profiles, Videos, Transcripts & Comments

Give it a list of TikTok creators and video links. Get back each creator's follower and like totals with their full video history, each video's engagement and **whether it was a paid promotion**, transcripts for the videos you name, and comments with their authors.

Mix creators and videos in the same list. Each entry is routed automatically.

Built for influencer vetting, sponsorship research, competitor tracking and audience analysis.

***

### What it does

- **Creators** — followers, following, **lifetime likes across the account**, video count, bio, verification, region and account age
- **Video history with real pagination** — roughly 30 videos per page and it keeps going, so you can pull a creator's back catalogue rather than just their latest posts
- **Paid-promotion flags** — every video carries whether TikTok marks it as sponsored, and each creator record totals them up. Gordon Ramsay's last 45 posts included **11 sponsored**; Charli D'Amelio's included **1**
- **Full engagement** — views, likes, comments, shares, **saves** and downloads
- **Transcripts** — spoken content as plain text for the videos you name
- **Comments** — author, handle, likes, reply count, and whether the creator wrote it
- **Sounds, products and collaborators** — the music behind each post, any TikTok Shop products attached, tagged users and co-authors
- **On-screen text** — the words burned into the video, returned even in the feed
- **No duplicates** — paginated pages overlap, and repeats are dropped before they are ever charged

***

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `targets` | array | — | **Required.** Creators and videos, mixed freely. Max `200` per run |
| `maxVideosPerProfile` | integer | `30` | How far back to go per creator. About 30 is one page |
| `includeTranscript` | boolean | `true` | Transcribe the videos you supply directly |
| `includeComments` | boolean | `false` | Return comments on videos you supply |
| `maxCommentsPerVideo` | integer | `20` | The first page arrives free with the video |

**Accepted entries**

```
Creators   @khaby.lame
           khaby.lame
           tiktok.com/@khaby.lame

Videos     tiktok.com/@tiktok/video/7646496890783010078
           tiktok.com/@creator/photo/7646496890783010078
```

#### Example input

```json
{
  "targets": [
    "@gordonramsayofficial",
    "https://www.tiktok.com/@tiktok/video/7646496890783010078"
  ],
  "maxVideosPerProfile": 45,
  "includeTranscript": true,
  "includeComments": false
}
```

***

### Output

One record per entry, carrying `type` (`profile` or `video`), `label` and `status`.

#### Creator records

| Field | Type | Description |
|---|---|---|
| `username`, `displayName`, `bio` | string | null | Identity |
| `followerCount`, `followingCount` | number | null | Audience |
| `totalLikes` | number | null | **Lifetime likes across the account** |
| `videoCount` | number | null | How many videos the creator has posted |
| `isVerified`, `privacyStatus`, `location`, `createdAt` | | Status and origin |
| `profileImageUrl`, `externalLinks` | | Avatar and listed links |
| `videos` | array | Each with engagement, hashtags, music and the sponsored flag |
| `videosReturned`, `sponsoredVideos` | integer | How many videos, and how many were paid posts |
| `morePagesAvailable` | boolean | Whether the creator has more than you asked for |

`totalLikes` against `videoCount` gives average likes per video — the quickest read on whether an audience is real, and it needs no extra call.

#### Video records

| Field | Type | Description |
|---|---|---|
| `videoId`, `url`, `caption`, `publishedAt` | | Identity and text |
| `viewCount`, `likeCount`, `commentCount`, `shareCount`, `saveCount`, `downloadCount` | number | null | Full engagement |
| `isSponsored`, `isAdvertisement`, `isPinned`, `isSlideshow` | boolean | null | What kind of post it is |
| `hashtags`, `mentions`, `taggedUsers`, `collaborators`, `categories` | array | Metadata and co-authors |
| `shopProducts` | array | TikTok Shop products attached to the post |
| `music` | object | null | Sound id, title, author, whether original, duration |
| `durationSeconds`, `mediaWidth`, `mediaHeight` | | Video shape |
| `thumbnailUrl`, `videoUrl`, `images` | | Media |
| `extractedText` | string | null | Text burned into the video |
| **`transcript`** | string | null | **Spoken content as plain text** |
| `comments` | array | Author, text, likes, reply count, creator flag |
| `commentsReturned`, `moreCommentsAvailable` | | How many you got, and whether more exist |

Every record also carries `status`: `ok`, `not_found` for an account or video that is private or does not exist, or `unavailable` if the source could not be reached.

***

### Pricing

| Event | Price |
|---|---|
| Video from a creator's feed | $1.49 per 1,000 |
| Creator looked up | $1.49 per 1,000 |
| Video looked up directly, **transcript included** | $1.49 per 1,000 |
| Extra comment beyond the first page | $1.49 per 1,000 |
| Run start | $0.005 per run |

Every lookup costs the same — **$1.49 per 1,000** — on every Apify plan. There is no ladder where the headline rate only applies to the largest accounts.

An entry that is not a TikTok creator or video is rejected before any lookup and costs nothing, as are duplicates. Repeated videos and comments across paginated pages are dropped before they are charged.

#### Worked examples

Totals are rounded to the nearest cent.

**Creator shortlist — 20 creators, 30 videos each**
620 × $0.00149 + $0.005 = **≈$0.93**

**Sponsorship audit — one creator, 300 videos**
301 × $0.00149 + $0.005 = **≈$0.45**

**Transcript pull — 400 videos with transcripts**
400 × $0.00149 + $0.005 = **≈$0.60**

Set **Maximum cost per run** in the run options to cap spend. The Actor stops cleanly at that ceiling and returns everything it charged for.

***

### Good to know

**Transcripts come from videos, not from feeds.** TikTok does not serve spoken-word transcripts in a creator's post list — measured across 128 posts from five accounts, none carried one. So point the Actor at the specific videos you want transcribed. The on-screen text (`extractedText`) *does* come through in the feed.

**The sponsored flag is TikTok's own.** It reflects how the post is declared on the platform, so an undeclared paid post will not appear as sponsored. It is a floor on a creator's commercial activity, not a ceiling.

**Private and deleted accounts look the same.** TikTok reports both the same way, so those records come back as `not_found` without distinguishing which.

**You supply the creators and videos.** There is no keyword or hashtag search — this Actor reads what you point it at.

***

### Tips

- **Audit sponsorship before you negotiate.** Pull 100+ videos from a creator and `sponsoredVideos` tells you how often they take paid work — and whose.
- **Sort by saves, not likes.** Saves and shares separate content people wanted to keep from content they merely scrolled past.
- **Track a sound, not just a creator.** The `music` object carries the sound's id and author, so you can spot which posts ride the same audio.
- **Start shallow.** One page per creator is enough to rank a shortlist; go deep only on the ones worth the spend.
- **Check `videoCount` against what you pulled.** It tells you how much of a catalogue you actually have.

***

### Support

Report a problem through the **Issues** tab on this Actor's page. Issues are reviewed regularly.

When reporting, please include the run ID, the input you used, and what you expected.

For volume enquiries, custom requirements, or anything not specific to a single run, email **socialhtz@gmail.com**.

# Changelog

This Actor's version history is a separate document: https://apify.com/socialhz/tiktok-scraper/changelog.md

# Actor input Schema

## `targets` (type: `array`):

Mix creators and videos freely, one per line. A creator can be a username like @khaby.lame or a profile link. A video is its full tiktok.com link. Anything else is skipped and costs you nothing. Up to 200 entries per run.

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

How far back to go through each creator's posts. TikTok returns roughly 30 per page, so 30 is one page and 300 is about ten. Videos are the priced unit — you are charged for what you receive.

## `includeTranscript` (type: `boolean`):

Applies only to video links you supply. TikTok does not serve spoken-word transcripts in a creator's feed, so this cannot be filled in from a profile — point the Actor at the specific videos you want transcribed. Included in the video price.

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

Applies to video links you supply. The first comments arrive with the video at no extra charge; ask for more and the extra pages are charged per comment.

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

Only used when comments are switched on. TikTok returns about 20 per page, and the first page comes free with the video.

## Actor input object example

```json
{
  "targets": [
    "@khaby.lame",
    "https://www.tiktok.com/@tiktok/video/7646496890783010078"
  ],
  "maxVideosPerProfile": 30,
  "includeTranscript": true,
  "includeComments": false,
  "maxCommentsPerVideo": 20
}
```

# Actor output Schema

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

One record per entry — a creator with their videos, or a single video with its transcript and comments.

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

// Run the Actor and wait for it to finish
const run = await client.actor("socialhz/tiktok-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 = { "targets": [
        "@khaby.lame",
        "https://www.tiktok.com/@tiktok/video/7646496890783010078",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("socialhz/tiktok-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 '{
  "targets": [
    "@khaby.lame",
    "https://www.tiktok.com/@tiktok/video/7646496890783010078"
  ]
}' |
apify call socialhz/tiktok-scraper --silent --output-dataset

```

## MCP server setup

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