# TikTok Comments Scraper: TikTok Comment Replies (`xmolodtsov/tiktok-comments-scraper`) Actor

Scrape TikTok comments and comment replies (full reply threads) from any video URL. Get comment text, likes, reply counts, timestamps, mentions and commenter profiles (handle, nickname, avatar, verified). No login or cookies. Export JSON, CSV or Excel, or use the API. Pay only per result.

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

## Pricing

from $0.40 / 1,000 tiktok comment results

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: TikTok Comment Replies logo](https://api.apify.com/v2/key-value-stores/2DxCOvbMjhvK3S1qP/records/tiktok-comments-scraper-avatar-128)

### What does TikTok Comments Scraper do?

TikTok Comments Scraper collects the comments and comment replies (full reply threads) from any public TikTok video. Paste one or more video URLs and get each comment TikTok serves as a clean row: the text, like count, reply count, timestamps, mentions, and the commenter's handle, nickname, avatar and verified badge. It is built for brand and social media teams tracking audience reactions, marketers running sentiment analysis, researchers building comment datasets, and developers who need TikTok comments in their own pipeline. No TikTok account, login or cookies are needed.

- **Comments and replies**: choose how many replies to fetch per comment. Each reply is its own row, linked to its parent comment by `repliesToId`.
- **Commenter profiles**: handle, nickname, user ID, secUid, avatar, profile URL and verified badge on every row.
- **Creator signals**: see which comments the video's creator liked or pinned.
- **Fast and light**: plain HTTP requests, no browser. About 1,500 comments in a minute.
- **Any TikTok URL form**: full video and photo URLs, plus the app's short links.
- **Clear errors**: a deleted, private or mistyped video produces an error row instead of disappearing silently.
- **Familiar output**: field names follow the most common TikTok comment dataset format, so existing integrations keep working.
- **Pay per result**: no monthly rental and no separate compute bill.

### Use cases

- **Brand and social media teams** re-scrape a campaign video's comments and replies every day on a schedule, run sentiment analysis on `text`, and flag complaints by `diggCount`.
- **Product and market researchers** find the top videos in a niche with [TikTok Search Scraper](https://apify.com/xmolodtsov/tiktok-search-scraper), pass each `postPage` here, and mine the comments for questions, objections and feature requests.
- **Researchers** build comment datasets with `commentLanguage`, `createTimeISO` and reply threads (`repliesToId`) for discourse and community analysis.
- **Creators and community managers** see which comments the creator liked or pinned (`likedByAuthor`, `pinnedByAuthor`) and collect the most-liked questions for FAQ videos.

### What data can you scrape from TikTok comments?

Every comment or reply is one dataset row with these fields:

| Field | Description |
|---|---|
| `cid` | Comment ID (string) |
| `text` | Comment text |
| `createTime` / `createTimeISO` | When the comment was posted (Unix seconds / ISO 8601) |
| `diggCount` | Likes on the comment |
| `replyCommentTotal` | TikTok's reply counter (top-level comments only, `null` on replies) |
| `repliesToId` | Parent comment ID on replies, `null` on top-level comments |
| `uid` / `uniqueId` / `nickName` / `secUid` | Commenter's user ID, handle, nickname and secUid |
| `avatarThumbnail` / `profileUrl` / `verified` | Commenter's avatar, profile URL and verified badge |
| `likedByAuthor` / `pinnedByAuthor` | Whether the video's creator liked or pinned the comment |
| `mentions` / `detailedMentions` | Users mentioned in the comment |
| `videoWebUrl` / `videoId` | The video the comment belongs to |
| `submittedVideoUrl` / `input` | The URL exactly as you entered it |
| `commentLanguage` | Language TikTok detected for the comment |

### How to scrape TikTok comments

#### In Apify Console

1. Open the Actor in Apify Console and paste one or more TikTok video URLs into **TikTok video URLs**.
2. Set **Maximum comments per video** (replies count toward it) and, if you want replies, **Maximum replies per comment**.
3. Click **Start**. When the run finishes, download the results as JSON, CSV, Excel or HTML, or read them from the dataset.

#### Via the API

Run the Actor and get the comments back in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/xmolodtsov~tiktok-comments-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"postURLs": ["https://www.tiktok.com/@duolingo/video/7514320905909194030"], "commentsPerPost": 50}'
```

JavaScript, Python and MCP examples are under "Integrations, API and MCP" below. You can also schedule recurring runs and send the results to other tools with Apify integrations.

### How much does it cost to scrape TikTok comments?

You pay per result: each comment, reply or error row in the dataset is one result. The price depends on your Apify subscription plan:

| Apify plan (pricing tier) | Price per 1,000 results |
|---|---|
| Free (FREE) | $1.00 |
| Starter (BRONZE) | $0.80 |
| Scale (SILVER) | $0.60 |
| Business (GOLD), PLATINUM and DIAMOND | $0.40 |

Platform usage is included in the price. This Actor uses pay-per-event pricing, so there are no extra compute or proxy charges on top of the per-result price. For example, 10,000 comments cost $8.00 on Starter and $4.00 on Business. Set a maximum charge for the run in Console or the API and the Actor stops cleanly when it reaches it, keeping everything scraped so far.

#### Is it free?

You can try the Actor on the Apify free plan. On the free plan it returns up to **10 results per run** and allows **5 runs per calendar month**. These limits are set by the developer of this Actor, not by Apify. A free-plan run that hits the cap still ends as Succeeded, with a status message explaining the limit, and the monthly run count resets on the 1st. Any paid Apify plan removes the limits.

### Input

| Field | Type | Description |
|---|---|---|
| `postURLs` | array of strings | TikTok video URLs, required. Accepts `https://www.tiktok.com/@user/video/<id>`, `/photo/<id>` posts and short links (`vm.tiktok.com/…`, `vt.tiktok.com/…`, `www.tiktok.com/t/…`). |
| `commentsPerPost` | integer | Maximum rows per video, replies included. Default `100`. |
| `maxRepliesPerComment` | integer | Replies fetched for each top-level comment that has any. `0` (default) = no replies. |
| `proxyConfiguration` | object | Apify Proxy is used by default. Change it only to route through your own proxies. |

Example input:

```json
{
    "postURLs": ["https://www.tiktok.com/@duolingo/video/7514320905909194030"],
    "commentsPerPost": 100,
    "maxRepliesPerComment": 5
}
```

### Output

Results land in the run's dataset. The **Overview** view shows the most useful columns at a glance; this preview comes from a real run on a Duolingo video:

![TikTok Comments Scraper output table with comment text, likes, reply counts, dates and commenter handles](https://api.apify.com/v2/key-value-stores/2DxCOvbMjhvK3S1qP/records/tiktok-comments-scraper-output-table.png)

Each comment or reply is one dataset item. Example:

```json
{
    "cid": "7514900488613020462",
    "text": "oh my god",
    "createTime": 1749699140,
    "createTimeISO": "2025-06-12T03:32:20.000Z",
    "diggCount": 60,
    "replyCommentTotal": 3,
    "uid": "6846647293535536133",
    "uniqueId": "ducarebeauty",
    "repliesToId": null,
    "avatarThumbnail": "https://p16-common-sign.tiktokcdn-eu.com/tos-maliva-avt-0068/3aab3da1...jpg",
    "likedByAuthor": false,
    "pinnedByAuthor": false,
    "mentions": [],
    "detailedMentions": [],
    "videoWebUrl": "https://www.tiktok.com/@duolingo/video/7514320905909194030",
    "submittedVideoUrl": "https://www.tiktok.com/@duolingo/video/7514320905909194030",
    "input": "https://www.tiktok.com/@duolingo/video/7514320905909194030",
    "videoId": "7514320905909194030",
    "nickName": "DUcare beauty",
    "secUid": "MS4wLjABAAAAIN0eDLdy4oXJ-7MrWvp3zUCJIcBseE2Rn6uqBbl7gBLSgqY_8bpoCaMB6OKZDOJm",
    "profileUrl": "https://www.tiktok.com/@ducarebeauty",
    "verified": true,
    "commentLanguage": "en"
}
```

A video that is deleted, private or region-blocked produces one error row instead:

```json
{
    "url": "https://www.tiktok.com/@duolingo/video/7000000000000000001",
    "input": "https://www.tiktok.com/@duolingo/video/7000000000000000001",
    "error": "Video not found, private, region-blocked or has comments disabled",
    "errorCode": "POST_NOT_FOUND_OR_PRIVATE"
}
```

### Guarantees and run status

#### When does a run fail?

A run that TikTok blocks is marked **Failed** instead of succeeding with an empty or partial dataset, so your retry logic can catch it. A video counts as hard-failed when TikTok refused it (HTTP 403, 429 or an API error), when it ended with an error or throttling before any comment was collected, or when replies were requested and every reply thread for it was refused. The run fails when:

- no comments were collected and at least one video hard-failed, or
- more videos hard-failed than the larger of 2 and 20% of the videos in the run.

The status message of a failed run starts with the reason code (for example `blocked: 3/10 videos failed - …`), so you can read it from the API. Input without a single video URL fails immediately.

These cases are your data, not a block, and never fail the run:

- deleted, private or region-blocked videos (`POST_NOT_FOUND_OR_PRIVATE` row) and URLs that are not TikTok videos (`INVALID_URL` row);
- the same video submitted twice, for example as a full URL and a short link: it is scraped once;
- reaching your maximum charge: the run ends as Succeeded with "Stopped at your max charge after N comments";
- the free-plan caps described under "Is it free?".

#### Limits and tips

- **Speed**: about 1,500 top-level comments in a minute. Replies need one extra request per thread, so a run with replies is slower (about 900 rows in two minutes). Up to five videos are scraped in parallel.
- **Depth**: we found no hard ceiling. Videos with tens of thousands of comments page through fine.
- **Replies count toward the limit**: `commentsPerPost` counts top-level comments and replies together. Raise it if you want many replies per comment.
- **Order**: TikTok returns comments in its own order, not by date or likes, so two capped runs on the same video can return different sets. Sort or filter the dataset afterwards.
- **Error rows are billed**: error rows are dataset items and cost the same as results, so double-check your URL list.
- **Run summary**: the `STATISTICS` record in the run's key-value store shows each video's outcome, such as `COMPLETE`, `LIMIT_REACHED` (hit your limit) or `THROTTLED` (TikTok stopped serving pages), plus the reason of a failed run.

### Integrations, API and MCP

#### JavaScript

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

const run = await client.actor('xmolodtsov/tiktok-comments-scraper').call({
    postURLs: ['https://www.tiktok.com/@duolingo/video/7514320905909194030'],
    commentsPerPost: 200,
    maxRepliesPerComment: 3,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(token=os.environ["APIFY_TOKEN"])

run = client.actor("xmolodtsov/tiktok-comments-scraper").call(run_input={
    "postURLs": ["https://www.tiktok.com/@duolingo/video/7514320905909194030"],
    "commentsPerPost": 200,
})

items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

#### Use with AI agents (MCP)

The Actor is available through Apify's MCP server at <https://mcp.apify.com> under the name `xmolodtsov/tiktok-comments-scraper`. Connect an MCP-capable agent (Claude, Cursor or any other MCP client) to `https://mcp.apify.com?tools=xmolodtsov/tiktok-comments-scraper` and it can call the Actor as a tool with the input and output described on this page, for example "collect 200 comments of this TikTok video and summarise what viewers complain about".

#### Exports, schedules and webhooks

Datasets export to JSON, CSV, Excel, XML, JSONL, RSS and HTML from Console or the API. Use [Apify Schedules](https://docs.apify.com/platform/schedules) to re-scrape the same videos daily, and [webhooks](https://docs.apify.com/platform/integrations/webhooks) to push finished runs into your pipeline. Make, Zapier, n8n and other tools connect through Apify integrations.

### More scrapers from this developer

**TikTok:** [TikTok Search Scraper](https://apify.com/xmolodtsov/tiktok-search-scraper): videos and creators for any keyword, pay per result · [TikTok Profile Scraper (Pay Per Result)](https://apify.com/xmolodtsov/tiktok-profile-scraper): profiles, followers and latest posts by username · [TikTok Hashtag Scraper](https://apify.com/xmolodtsov/tiktok-hashtag-scraper): videos for any hashtag, with views, likes and music · [TikTok Sound & Music Scraper](https://apify.com/xmolodtsov/tiktok-sound-scraper): videos that use a sound or song

**Social & news:** [Reddit Search Scraper](https://apify.com/xmolodtsov/reddit-scraper): posts by keyword, subreddit or author · [Google News Scraper](https://apify.com/xmolodtsov/google-news-scraper): Google News results as clean full-text articles

**E-commerce:** [Prom.ua Product Search Scraper](https://apify.com/xmolodtsov/prom-ua): Prom.ua product search results, no browser needed · [Amazon Product Search & Bestsellers Scraper](https://apify.com/xmolodtsov/amazon-search-scraper): search results, Best Sellers and product details from Amazon

**Maps & leads:** [Google Maps Scraper](https://apify.com/xmolodtsov/google-maps-scraper): places, leads and emails from Google Maps

**Ads:** [Facebook Ad Library Scraper (Meta Ads Library)](https://apify.com/xmolodtsov/facebook-ads-library-scraper): ads from the Meta Ad Library, with EU reach and payers

**Video:** [YouTube Transcript Scraper](https://apify.com/xmolodtsov/youtube-transcript-scraper): transcripts, subtitles and captions from YouTube videos

### FAQ

#### How can I export TikTok comments to Excel or CSV?

Every run stores its results in an Apify dataset, which you can download as JSON, CSV, Excel, XML or HTML from Console, or read page by page through the API.

#### Can I use it with the API, Make, Zapier or n8n?

Yes. Start runs and fetch results through the Apify API or its JavaScript and Python clients, or connect the Actor to Make, Zapier, n8n and other tools through Apify integrations.

#### How many comments can I get per video?

As many as TikTok serves. Set **Maximum comments per video** to the number you need; we found no hard depth limit, even on videos with tens of thousands of comments.

#### Why did I get fewer comments than the video shows?

TikTok's comment count includes comments it no longer serves (deleted, filtered or hidden), so the visible counter can be higher than what can be collected. `replyCommentTotal` is TikTok's own counter too and can differ by region. Check the `STATISTICS` record to see whether each video finished or was throttled.

#### What happens with private or deleted videos?

You get one error row with `errorCode: "POST_NOT_FOUND_OR_PRIVATE"` for that video, and the rest of the run continues.

#### Do I need a TikTok account or my own proxies?

No. The Actor never logs in and uses Apify Proxy by default, which is included in the price.

#### How long does a run take?

About a minute per 1,500 comments without replies, and roughly two minutes per 900 rows with replies. Up to five videos are scraped in parallel.

#### Can I scrape comments from a user's profile?

The Actor takes video URLs. Collect a creator's latest video URLs with [TikTok Profile Scraper](https://apify.com/xmolodtsov/tiktok-profile-scraper) first, then pass them here.

#### How do I find videos to scrape comments from?

Search by keyword with [TikTok Search Scraper](https://apify.com/xmolodtsov/tiktok-search-scraper) and pass each item's `postPage` here, or take `webVideoUrl` from [TikTok Hashtag Scraper](https://apify.com/xmolodtsov/tiktok-hashtag-scraper) for a hashtag's videos.

#### Is it legal to scrape TikTok comments?

This Actor collects only data that TikTok shows publicly to any visitor, without logging in, and never accesses private content. Comments and commenter profiles can still contain personal data, which is protected by regulations such as the GDPR in the EU and the CCPA in California. Only collect personal data when you have a legitimate reason, keep only what you need, and if you are unsure whether your use case is lawful, consult a lawyer. This is not legal advice.

### Support

Report bugs or request features through the **Issues** tab on this Actor's page. Include the run ID when you report a problem, so the run's log and `STATISTICS` record can be checked.

# Changelog

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

# Actor input Schema

## `postURLs` (type: `array`):

Video URLs to scrape comments from, one per line: <code>https://www.tiktok.com/@user/video/\<id></code>, <code>/photo/\<id></code> posts, or short links (<code>vm.tiktok.com/…</code>, <code>vt.tiktok.com/…</code>, <code>www.tiktok.com/t/…</code>).

## `commentsPerPost` (type: `integer`):

Maximum number of items per video, replies included. TikTok returns comments in its own order (not by date or likes), so a capped run is a sample, not the top comments. TikTok may return fewer than requested when some comments are deleted or hidden. <strong>Free Apify plan:</strong> at most 10 results per run in total and 5 runs per month.

## `maxRepliesPerComment` (type: `integer`):

Replies fetched for each top-level comment that has any. 0 = no replies (fastest). Every reply is its own dataset item with <code>repliesToId</code> set to the parent comment id.

## `proxyConfiguration` (type: `object`):

Apify Proxy is used by default. Change it only if you want to route through your own proxies.

## Actor input object example

```json
{
  "postURLs": [
    "https://www.tiktok.com/@duolingo/video/7514320905909194030"
  ],
  "commentsPerPost": 20,
  "maxRepliesPerComment": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One item per TikTok comment or reply: text, likes, reply count, timestamps, mentions, commenter profile and the video URL.

# 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 = {
    "postURLs": [
        "https://www.tiktok.com/@duolingo/video/7514320905909194030"
    ],
    "commentsPerPost": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("xmolodtsov/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 = {
    "postURLs": ["https://www.tiktok.com/@duolingo/video/7514320905909194030"],
    "commentsPerPost": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("xmolodtsov/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 '{
  "postURLs": [
    "https://www.tiktok.com/@duolingo/video/7514320905909194030"
  ],
  "commentsPerPost": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call xmolodtsov/tiktok-comments-scraper --silent --output-dataset

```

## MCP server setup

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