# TikTok Comments Scraper - Comments & Replies from Any Video (`clearfetch/tiktok-comments-scraper`) Actor

Paste TikTok video links, get every comment and reply as clean rows: text, likes, reply threads, author, language, pinned and creator-liked flags, mentions, hashtags, tagged shop products and image comments. No login, no proxy, no cookies.

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

## Pricing

from $0.28 / 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 - Comments & Replies from Any Video

Paste TikTok video links and get every comment as a clean row: the text, likes, when it was posted, who wrote it,
the language, whether the creator pinned or liked it, and, if you want them, the full reply threads.
**$0.40 per 1,000 comments.** No login, no cookies, no proxy.

### What data you get

Per comment or reply:

- `text`, `likes`, `replyCount`, `createdAt`, and TikTok's detected `language`
- **Reply threads**: every reply is its own row with `parentCommentId`, so a flat CSV still rebuilds the
  conversation
- **Creator signals**: `pinnedByAuthor` and `likedByAuthor`, the comments the creator chose to pin or like
- **Commerce signals**: `taggedProducts` (TikTok Shop products tagged in the comment) and `purchaseIntent`,
  TikTok's own flag for a comment that reads like someone wanting to buy
- `mentions`, `hashtags`, and `imageUrls` for comments posted as pictures
- Author: `authorUsername`, `authorNickname`, `authorId`, `authorProfileUrl`, `authorAvatarUrl`
- The video: `videoId`, `videoUrl`, and the comment count TikTok shows for it

Every row has the same columns, so exports to CSV, Excel or Google Sheets stay tidy.

### How to use

1. Paste video links into **TikTok video links**, one per line. Share links (`vm.tiktok.com/...`,
   `tiktok.com/t/...`), photo posts and bare video ids work too.
2. Choose how many comments per video, and whether to include replies.
3. Run it, then download the rows as JSON, CSV or Excel, or pull them through the API.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `urls` | array | — | TikTok video links or ids. Also accepts `postURLs`, `videoUrls`, `url` and `startUrls`. |
| `maxCommentsPerVideo` | integer | `100` | Top-level comments per video. `0` means all of them. |
| `includeReplies` | boolean | `false` | Also collect replies, each as its own row. |
| `maxRepliesPerComment` | integer | `20` | Replies per comment when replies are on. `0` means all. |
| `includeRaw` | boolean | `false` | Add TikTok's untouched comment object as `raw`. |
| `maxConcurrency` | integer | `3` | Videos worked on in parallel. |
| `timeoutSecs` | integer | `30` | Per-request timeout. Slow requests are retried. |
| `proxyConfiguration` | object | off | Not needed. Available for very large volumes. |

### Output example

One row from a real run, with the commenter's identity replaced by placeholders:

```json
{
  "ok": true,
  "commentId": "7680437555809010439",
  "videoId": "7680396878776700174",
  "videoUrl": "https://www.tiktok.com/@seansvv/video/7680396878776700174",
  "text": "whatever, they never tell us what rule we're breaking anyways",
  "createdAt": "2026-09-01T05:40:35.000Z",
  "likes": 519,
  "replyCount": 6,
  "isReply": false,
  "parentCommentId": null,
  "replyToCommentId": null,
  "language": "en",
  "pinnedByAuthor": false,
  "likedByAuthor": true,
  "purchaseIntent": false,
  "mentions": [],
  "hashtags": [],
  "taggedProducts": [],
  "imageUrls": [],
  "authorUsername": "example_user",
  "authorNickname": "Example User",
  "authorId": "6820000000000000000",
  "authorSecUid": "MS4wLjABAAAA...",
  "authorProfileUrl": "https://www.tiktok.com/@example_user",
  "authorAvatarUrl": "https://p16-common-sign.tiktokcdn-eu.com/...",
  "videoCommentCount": 1215,
  "inputUrl": "https://www.tiktok.com/@seansvv/video/7680396878776700174",
  "scrapedAt": "2026-09-19T13:52:56.157Z"
}
```

A video that cannot be read comes back as one row with `ok: false` and a plain reason, such as
`video not found or not public` or `the creator has turned comments off for this video`. Those rows are free.

### Pricing

- **$0.0004 per comment or reply**, which is $0.40 per 1,000. The 50 comments in the example input cost two
  cents.
- You pay only for comments written to your dataset. Videos that fail, links that are not TikTok videos, and
  duplicates are never charged (see the FAQ).
- Set a maximum cost on the run and it stops cleanly when it gets there.

Paid Apify plans pay less: 10% off on Bronze, 20% on Silver and 30% on Gold and higher tiers.

### Use cases

- **Brand and campaign monitoring**: what people say under your videos, your competitors' and your creators'.
- **Influencer vetting**: whether an audience is real people talking or bots, and whether the creator engages.
- **Product research for TikTok Shop**: comments with tagged products and purchase intent show demand in the
  audience's own words.
- **Sentiment and topic analysis**: clean text with a language code, ready for an LLM or a classifier.
- **Giveaways and contests**: every entry in the comments, with timestamps and profile links.
- **Community management**: find the questions under a viral video that still have no reply.

### Integrations

```bash
curl -X POST "https://api.apify.com/v2/acts/clearfetch~tiktok-comments-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://www.tiktok.com/@tiktok/video/7106594312292453675"], "maxCommentsPerVideo": 200}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("clearfetch/tiktok-comments-scraper").call(
    run_input={"urls": ["https://www.tiktok.com/@tiktok/video/7106594312292453675"], "includeReplies": True}
)

for c in client.dataset(run["defaultDatasetId"]).iterate_items():
    if c["ok"]:
        print(c["likes"], c["authorUsername"], c["text"][:80])
```

Works with the Apify integrations for n8n, Make, Zapier, Google Sheets, Slack and webhooks, with scheduled runs,
and with AI agents through the Apify MCP server.

### FAQ

**Why do I get fewer comments than TikTok shows?** The number under a video counts replies too, and it includes
comments TikTok hides from everyone: filtered, deleted, or restricted. On a video showing 1,215, this Actor
collected 673 comments and 310 replies, which is everything TikTok would serve.

**What does "duplicates are never charged" mean?** TikTok's comment pages overlap: its ranking shifts while you
page through, so the same comment can come back again later. On that same video, 109 of the first 782 comments
TikTok returned were repeats. This Actor drops them before they reach your dataset, so you do not pay for them.

**Do I need a proxy?** No. TikTok serves comments to Apify's own servers. The proxy option is there for very large
volumes, if you start seeing rate-limit errors.

**Can it find videos by hashtag, keyword or profile?** No. It takes video links. If you already have a list of
videos from another tool or a spreadsheet, paste it in.

**Do image links keep working?** For a few weeks. TikTok signs comment image links with an expiry date, so download
the images you need to keep.

**Is this legal?** It reads public comments that anyone can see without an account, and it does not log in or use
cookies. Comments contain usernames, which are personal data under laws such as the GDPR, so you are responsible
for having a lawful reason to process them and for storing them appropriately.

### More tools from clearfetch

- [TikTok Scraper](https://apify.com/clearfetch/tiktok-scraper): hashtags, profiles, sounds and video stats in one Actor
- [TikTok Profile Scraper](https://apify.com/clearfetch/tiktok-profile-scraper): followers, likes and the latest videos of any account
- [TikTok Video Scraper](https://apify.com/clearfetch/tiktok-video-scraper): full stats for any video link
- [Google Trends Scraper](https://apify.com/clearfetch/google-trends-scraper): interest over time, by region and related queries, plus today's trending searches

### Changelog

- **1.0.0** (2026-09) — first release: comments and replies by video link or id, share-link resolution, reply
  threading, creator pin and like flags, tagged products, purchase intent, image comments, duplicate removal,
  plain-language reasons for videos that cannot be read.

# Actor input Schema

## `urls` (type: `array`):

One video per line. Full links, share links (vm.tiktok.com/..., tiktok.com/t/...), photo posts and bare video ids all work. Also accepts "postURLs", "videoUrls", "url" and "startUrls".

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

Top-level comments to collect from each video. 0 means all of them. Replies are counted separately, below.

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

Also collect the replies under each comment. Each reply is its own row with parentCommentId pointing at the comment it answers, so threads can be rebuilt from a flat export.

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

Used only when replies are included. 0 means all of them.

## `includeRaw` (type: `boolean`):

Adds the untouched comment object TikTok returned as "raw", for fields this Actor does not map. Makes each row several times larger.

## `maxConcurrency` (type: `integer`):

How many videos to work on at once. Comments within one video are always read in order.

## `timeoutSecs` (type: `integer`):

Per request. Slow pages are retried before a video is reported as failed.

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

Not needed: TikTok serves comments to Apify's own servers. Turn it on only if you run very large volumes and start seeing rate-limit errors.

## Actor input object example

```json
{
  "urls": [
    "https://www.tiktok.com/@tiktok/video/7106594312292453675"
  ],
  "maxCommentsPerVideo": 50,
  "includeReplies": false,
  "maxRepliesPerComment": 20,
  "includeRaw": false,
  "maxConcurrency": 3,
  "timeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per comment or reply: text, likes, reply count, when it was posted, its author, detected language, whether the creator pinned or liked it, mentions, hashtags, tagged shop products, image URLs, and parentCommentId for replies. Videos that could not be read appear with ok=false and a reason, and are not charged.

# 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 = {
    "urls": [
        "https://www.tiktok.com/@tiktok/video/7106594312292453675"
    ],
    "maxCommentsPerVideo": 50,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("clearfetch/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 = {
    "urls": ["https://www.tiktok.com/@tiktok/video/7106594312292453675"],
    "maxCommentsPerVideo": 50,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("clearfetch/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 '{
  "urls": [
    "https://www.tiktok.com/@tiktok/video/7106594312292453675"
  ],
  "maxCommentsPerVideo": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call clearfetch/tiktok-comments-scraper --silent --output-dataset

```

## MCP server setup

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