# TikTok Comments Scraper: With Replies (`luzivanlt/tiktok-comments-scraper`) Actor

TikTok video comments with their replies, threaded: who replied to whom, likes, creator pins. $0.50 per 1,000 comments. Creator likes, stickers, images and mentions.

- **URL**: https://apify.com/luzivanlt/tiktok-comments-scraper.md
- **Developed by:** [Luzi](https://apify.com/luzivanlt) (community)
- **Categories:** Social media, Marketing, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 1,000 comments

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 Comments Scraper: With Replies

Get the comments of TikTok videos with their replies, threaded: each reply
names the comment it answers and the person it replies to. Every row carries
the text, the time it was posted, likes, the reply count, whether the creator
pinned or liked it, stickers, images and mentions, and the commenter's id,
username, name and picture. No TikTok account, login or cookies needed.

Tested daily. Latest checks: one video read to its end twice, 146 comments
and 51 replies each time; 992 comments and replies from two videos
in about 2 minutes.

### What does this Actor do?

You give it links to TikTok videos (or just video ids). For each video it
reads the comment list, and the replies under each comment, and saves one row
per comment or reply until it reaches your limit or the end of the list.

Each row comes with:

- the comment's text, the time it was posted (UTC), its likes and its number
  of replies
- for a reply: the comment it answers, and the reply and person it replies to
- whether the video's creator pinned it or liked it
- stickers, attached images and mentioned users
- the commenter's numeric id, username, display name and profile picture
- the video's own comment count, as TikTok shows it

### Why use it?

- **Replies included, threaded.** Replies are read by default, and each one
  links back to its comment, so you can rebuild every conversation.
- **Find what the creator noticed.** See which comments the creator pinned
  or liked.
- **Measure reactions to a video.** Collect every comment of your own or a
  competitor's video for sentiment, questions and feedback.
- **Find leads and fans.** Every commenter comes with a username and id you
  can look up.
- **Use the data anywhere.** Download as JSON, CSV or Excel, or send it to
  your own tools through Apify's API and integrations.

### How to use it

1. Paste one or more video links into **Video links**.
2. Optionally, set **Max comments per video** and turn **Include replies**
   off.
3. Click **Start**. When the run ends, open the **Output** tab to view the
   comments or download them.

#### Links that work

A video or photo post link, as in your browser's address bar:
`https://www.tiktok.com/@nasa/video/7691066504380452110`. A video id on its
own (`7691066504380452110`) works too. Short share links
(`vm.tiktok.com/…`) are not accepted: open one in a browser and paste the
full link. Profile, hashtag, sound and search pages are not supported: this
Actor reads the comments of the videos you name.

### Input

| Field                                              | What it does                                          | Default |
| -------------------------------------------------- | ----------------------------------------------------- | ------- |
| **Video links** (`startUrls`)                      | The videos to read. Required.                         | —       |
| **Max comments per video** (`maxCommentsPerVideo`) | Stop after this many rows per video, replies included | `100`   |
| **Include replies** (`includeReplies`)             | Also save the replies to each comment                 | `true`  |

Example input:

```json
{
  "startUrls": [{ "url": "https://www.tiktok.com/@nasa/video/7691066504380452110" }],
  "maxCommentsPerVideo": 1000,
  "includeReplies": true
}
```

### Output

One row per comment or reply. An example, with made-up values:

```json
{
  "comment_id": "7691134760559231000",
  "video_id": "7691066504380452110",
  "source_url": "https://www.tiktok.com/@nasa/video/7691066504380452110",
  "text": "This is incredible!",
  "created_at": "2026-10-01T14:31:20.000Z",
  "like_count": 38,
  "reply_count": 2,
  "is_reply": false,
  "parent_comment_id": null,
  "reply_to_comment_id": null,
  "reply_to_user_id": null,
  "reply_to_username": null,
  "reply_to_nickname": null,
  "author_id": "6800000000000000000",
  "author_username": "jane.doe",
  "author_nickname": "Jane Doe",
  "author_sec_uid": "MS4wLjABAAAA…",
  "author_avatar_url": "https://p16-sign.tiktokcdn-us.com/…",
  "author_verified_label": null,
  "language": "en",
  "liked_by_creator": false,
  "pinned_by_creator": false,
  "high_purchase_intent": false,
  "translatable": true,
  "mentions": [],
  "image_urls": [],
  "sticker_id": null,
  "sticker_name": null,
  "sticker_url": null,
  "sticker_animated_url": null,
  "comment_url": "https://www.tiktok.com/@nasa/video/7691066504380452110?…",
  "video_comment_total": 228
}
```

| Field                   | What it holds                                                    |
| ----------------------- | ---------------------------------------------------------------- |
| `comment_id`            | TikTok's id for the comment or reply                             |
| `video_id`              | The video's id                                                   |
| `source_url`            | The video link or id you gave                                    |
| `text`                  | The text (empty for a sticker-only comment)                      |
| `created_at`            | When it was posted, in UTC                                       |
| `like_count`            | Likes                                                            |
| `reply_count`           | Replies to the comment, as TikTok counts them (empty on a reply) |
| `is_reply`              | Whether the row is a reply                                       |
| `parent_comment_id`     | For a reply: the comment it sits under                           |
| `reply_to_comment_id`   | For a reply to a reply: the reply it answers                     |
| `reply_to_user_id`      | For a reply to a reply: the id of the person it answers          |
| `reply_to_username`     | … their username                                                 |
| `reply_to_nickname`     | … their display name                                             |
| `author_id`             | The commenter's numeric id                                       |
| `author_username`       | The commenter's username (the `@` handle)                        |
| `author_nickname`       | The commenter's display name                                     |
| `author_sec_uid`        | The commenter's secure id, used in profile links                 |
| `author_avatar_url`     | The commenter's profile picture (the link expires after a while) |
| `author_verified_label` | The commenter's verification label, if any                       |
| `language`              | The comment's language, as TikTok detects it                     |
| `liked_by_creator`      | Whether the video's creator liked it                             |
| `pinned_by_creator`     | Whether the creator pinned it (empty on a reply)                 |
| `high_purchase_intent`  | Whether TikTok marks the comment as showing interest in buying   |
| `translatable`          | Whether TikTok offers a translation                              |
| `mentions`              | Users and hashtags mentioned, with their position in the text    |
| `image_urls`            | Images attached to the comment (the links expire after a while)  |
| `sticker_id`            | The sticker's id, for a sticker comment                          |
| `sticker_name`          | The sticker's name, when it has one                              |
| `sticker_url`           | The sticker image                                                |
| `sticker_animated_url`  | The animated sticker                                             |
| `comment_url`           | A link to the comment                                            |
| `video_comment_total`   | The video's comment count as TikTok shows it, replies included   |

Not included: the video's own details (caption, views, likes), the
commenter's follower counts, and profile video lists.

### How much does it cost?

You pay for what you get:

- **$0.50 per 1,000 comments** ($0.0005 a comment). A reply counts as a comment. Each is charged once per run.
- No start fee, and nothing per video.

So 1,000 comments and replies from each of 4 videos cost $2. If you set a maximum cost for a run, the Actor stops when it reaches it and keeps every comment saved so far.

### How long does a run take?

Expect about 450 comments and replies a minute. In testing, 992 rows from two
videos took about 2 minutes, and 200 rows from two videos about 25 seconds.

### Good to know

- **You may get fewer comments than the video's count.** TikTok's count
  includes replies and comments it no longer shows (hidden, filtered or
  deleted), and some replies are not shown to visitors at all. So the rows
  you get are usually below `video_comment_total`.
- **The order is TikTok's own.** Comments come in the order TikTok ranks them,
  not by date. Sort by `created_at` after the run if you need time order.
- **Picture links expire.** Profile pictures, images and stickers are signed
  links that stop working after some time. Download them soon after the run
  if you need them.
- **Check your links first.** A link that is not a TikTok video link stops the
  run before anything is read, and the message names it.
- **One video that cannot be read does not stop the run.** The other videos
  carry on, and the run's status lists the videos that could not be read. The
  run fails only when no video could be read.
- **No comments is not an error.** A video with no comments, or with
  comments turned off, saves nothing.

### FAQ

**Do I need a TikTok account or cookies?**
No. The Actor reads the comments anyone can see on the video's page.

**Can I get the videos of a profile?**
Not with this Actor: it reads the comments of the videos you give it.

**Can I run it from my own code, on a schedule, or with other apps?**
Yes. Like any Apify Actor, you can start it through the Apify API, run it on a
schedule, and connect it to other apps with Apify's integrations and webhooks.

### Is it legal to scrape TikTok?

This Actor reads only comments that anyone can see without logging in. The
results include commenters' usernames, names, ids and pictures, which are
personal data protected by laws such as the GDPR. Only collect personal data
when you have a legitimate reason to, and check TikTok's terms and the laws
that apply to you. If you are unsure, ask a lawyer.

### Support

Found a problem or missing a feature? Open an issue on the **Issues** tab and
include the run's link.

***

This Actor is not affiliated with, endorsed by or sponsored by TikTok.

# Actor input Schema

## `startUrls` (type: `array`):

Links to TikTok videos or photo posts (https://www.tiktok.com/@user/video/…), or video ids such as 7691066504380452110. Short share links (vm.tiktok.com) are not accepted: open one and paste the full link.

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

Stop reading a video after this many comments, replies included.

## `includeReplies` (type: `boolean`):

Also save the replies to each comment, each marked with the comment it answers.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.tiktok.com/@nasa/video/7691066504380452110"
    },
    {
      "url": "https://www.tiktok.com/@scout2015/video/6718335390845095173"
    }
  ],
  "maxCommentsPerVideo": 100,
  "includeReplies": true
}
```

# Actor output Schema

## `comments` (type: `string`):

Every comment and reply the run saved, one row each.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.tiktok.com/@nasa/video/7691066504380452110"
        },
        {
            "url": "https://www.tiktok.com/@scout2015/video/6718335390845095173"
        }
    ],
    "maxCommentsPerVideo": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("luzivanlt/tiktok-comments-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 = {
    "startUrls": [
        { "url": "https://www.tiktok.com/@nasa/video/7691066504380452110" },
        { "url": "https://www.tiktok.com/@scout2015/video/6718335390845095173" },
    ],
    "maxCommentsPerVideo": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("luzivanlt/tiktok-comments-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 '{
  "startUrls": [
    {
      "url": "https://www.tiktok.com/@nasa/video/7691066504380452110"
    },
    {
      "url": "https://www.tiktok.com/@scout2015/video/6718335390845095173"
    }
  ],
  "maxCommentsPerVideo": 100
}' |
apify call luzivanlt/tiktok-comments-scraper --silent --output-dataset

```

## MCP server setup

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