# TikTok Comments Scraper - Replies, Likes & Commenters (`eiv/tiktok-comments-scraper`) Actor

Scrape TikTok comments and replies from video URLs, short links or profiles: text, likes, reply count, date, language, liked-by-creator and pinned flags, mentions, and the commenter's username and IDs. No login, no browser. Pay per comment; failed videos are free.

- **URL**: https://apify.com/eiv/tiktok-comments-scraper.md
- **Developed by:** [Eimantas V](https://apify.com/eiv) (community)
- **Features:** Limited permissions
- **Stats:** 30 total users, 5 monthly users, 97.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.20 / 1,000 comment scrapeds

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** extracts comments and replies from **TikTok** videos: the comment text, likes, reply count, date, language, whether the creator liked or pinned it, mentions, hashtags, images, and the commenter's username, name and IDs. Paste video URLs, short links, video IDs or profiles, and get one row per comment. No login, no API key, no browser, from **$0.20 per 1,000 comments**.

```json
{
  "text": "no but seriously, where the hell have you been, loca?!?",
  "likeCount": 238445,
  "replyCount": 910,
  "createdAt": "2022-01-07T21:24:00.000Z",
  "authorUsername": "lionsgate",
  "authorVerified": true,
  "language": "en",
  "videoUrl": "https://www.tiktok.com/@billieeilish/video/7050551461734042926",
  "videoCommentCount": 196967
}
```

**Measured on Apify: 100 comments from one video in 2.6 seconds; 20,371 comments and replies from 8 videos in under 3 minutes.**

### What does TikTok Comments Scraper do?

It reads TikTok's public comment lists the way TikTok's own web player does, one page of 50 comments at a time, and turns every comment into a clean row. Turn on replies and each comment's thread follows it, with the parent's ID on every reply, so whole conversations can be rebuilt from one flat table.

- **Every input you have.** Video URLs (`/video/` and `/photo/` posts), `vm.tiktok.com` and `vt.tiktok.com` short links, bare video IDs, and profiles (`@username` or the profile URL) for comments on their latest videos.
- **Comments and replies.** Up to the number you choose per video and per comment; replies carry `parentCommentId`, and a reply to a reply also names the reply it answers.
- **Creator signals.** `likedByCreator`, `pinned` and `isByCreator` show which comments the creator engaged with or wrote.
- **Commenter identity.** Username, display name, numeric user ID, secUid, profile link, avatar and verified badge on every row.
- **Only pay for results.** Videos that are deleted or private, profiles that do not exist, duplicates and comments your date filter leaves out are never charged.
- **Built for automation.** Run it on a schedule, call it from the API, or connect it to Make, Zapier, n8n, Google Sheets or an AI agent through Apify's MCP server.

### Why it is fast and cheap

There is no browser and no login. Each request is one small JSON call to TikTok's public comment endpoint that returns 50 comments, so 1,000 comments take about 20 requests and a few seconds. That is why the price can sit well below browser-based scrapers. If TikTok rate-limits the run's own address, the request is repeated from an Apify datacenter address at no extra cost to you.

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

| Field | Example | What it is |
|---|---|---|
| `text` | `no but seriously, where the hell have you been` | The comment as written, with emoji |
| `likeCount` | `238445` | Likes on the comment |
| `replyCount` | `910` | Replies under it (null on replies) |
| `createdAt` | `2022-01-07T21:24:00.000Z` | When it was posted, ISO 8601 UTC |
| `language` | `en` | The language TikTok detected |
| `authorUsername` / `authorNickname` | `lionsgate` / `Lionsgate` | The commenter's handle and display name |
| `authorId` / `authorSecUid` | `106956873395757056` | The commenter's stable TikTok IDs |
| `authorProfileUrl` / `authorAvatarUrl` | `https://www.tiktok.com/@lionsgate` | Profile link and picture |
| `authorVerified` | `true` | TikTok's verified badge |
| `isReply` / `parentCommentId` / `replyToCommentId` | `true` / `7050578069283963694` | Thread structure |
| `position` | `41` | Rank in TikTok's order of the video's comments |
| `likedByCreator` / `pinned` / `isByCreator` | `true` / `false` / `false` | What the creator did with it |
| `labels` | `["Liked by creator"]` | Badges TikTok shows on the comment |
| `mentions` / `mentionedUserIds` / `hashtags` | `["@nasa"]` | Mentions with user IDs, and hashtags |
| `imageUrls` | `["https://p16-comment-sign..."]` | Images posted in the comment |
| `videoId` / `videoUrl` / `videoAuthorUsername` / `videoCaption` | `7050551461734042926` | The video the comment is on |
| `videoCommentCount` | `196967` | All comments TikTok counts on the video |
| `input` | `https://www.tiktok.com/@billieeilish/video/7050551461734042926` | What you entered, so rows join back to your list |

### How to scrape TikTok comments

1. Click **Try for free** and paste video URLs, short links, video IDs or profiles into **Videos or profiles**, one per line.
2. Set **Comments per video**, and **Replies per comment** if you want threads. **Max comments in total** is your cost cap.
3. Click **Start**. A video's top 100 comments take about 2 seconds.
4. Open the **Output** tab, or download the results as JSON, CSV, Excel or HTML.

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

You pay per comment or reply returned, and the price drops on higher Apify plans:

| Apify plan | Per 1,000 comments |
|---|---|
| Free | $0.40 |
| Starter | $0.30 |
| Scale | $0.25 |
| Business | $0.20 |

- The top 100 comments of 10 videos (1,000 comments) cost **$0.30** on Starter.
- 20 popular videos with every comment TikTok shows (about 360 each) and up to 10 replies per comment came to about 23,000 rows in our tests: about **$6.90** on Starter and **$4.60** on Business.
- A run also costs **$0.00005** to start. A video or profile that fails costs nothing more.
- The Free plan's $5 monthly credit covers about **12,500 comments**.

### Input

```json
{
    "targets": [
        "https://www.tiktok.com/@billieeilish/video/7050551461734042926",
        "https://vm.tiktok.com/ZMhvqjqjq/",
        "@nasa"
    ],
    "maxCommentsPerVideo": 100,
    "maxRepliesPerComment": 10,
    "videosPerProfile": 3,
    "maxItems": 5000
}
```

| Field | Default | Notes |
|---|---|---|
| Videos or profiles | (example video) | Video URLs, short links, video IDs, `@username` or profile URLs, one per line |
| Start URLs | empty | The same, in the URL-list shape other Actors output |
| Max comments in total | 1,000 | Comments and replies across the run: your cost cap |
| Comments per video | 100 | Top-level comments per video, top comments first |
| Replies per comment | 0 | 0 = no replies |
| Only comments posted after | empty | A date (2026-01-31) or a period ("7 days"); older comments are skipped and not charged |
| Videos per profile | 3 | Latest videos per profile, newest first (at most ~12) |
| Profile videos posted after / before | empty | Date range for the videos picked from profiles |
| Proxy | off | Not needed; turn on Apify Proxy only if a run reports BLOCKED |

### Output

Each comment or reply is one row. The **Overview** view shows the key columns; **Threads** shows the reply structure; **Commenters** lists who commented; every export includes all fields.

```json
{
  "recordType": "comment",
  "input": "https://www.tiktok.com/@billieeilish/video/7050551461734042926",
  "commentId": "7050578069283963694",
  "text": "no but seriously, where the hell have you been, loca?!?",
  "likeCount": 238445,
  "replyCount": 910,
  "createdAt": "2022-01-07T21:24:00.000Z",
  "authorUsername": "lionsgate",
  "authorNickname": "Lionsgate",
  "authorId": "106956873395757056",
  "authorSecUid": "MS4wLjABAAAAw08PMPDgEvNH0P4Sncmei7N46SQY9ZqUP7kVxFJXoyWNcpC-peauxtjk0dfYQcfd",
  "authorProfileUrl": "https://www.tiktok.com/@lionsgate",
  "authorAvatarUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/7311142789058674693~tplv-tiktokx-cropcenter:100:100.jpg",
  "authorVerified": true,
  "isReply": false,
  "parentCommentId": null,
  "replyToCommentId": null,
  "position": 41,
  "language": "en",
  "likedByCreator": false,
  "pinned": false,
  "isByCreator": false,
  "labels": [],
  "mentions": [],
  "mentionedUserIds": [],
  "hashtags": [],
  "imageUrls": [],
  "videoId": "7050551461734042926",
  "videoUrl": "https://www.tiktok.com/@billieeilish/video/7050551461734042926",
  "videoAuthorUsername": "billieeilish",
  "videoCaption": "can’t be good at everything",
  "videoCommentCount": 196967,
  "scrapedAt": "2026-10-29T06:30:56.593Z"
}
```

A video or profile that cannot be read becomes a row with `"recordType": "error"` and an `errorCode` instead of failing the whole run:

| `errorCode` | Meaning |
|---|---|
| `NOT_FOUND` | The video was deleted, is private, has comments turned off, or the link is wrong; or the profile does not exist |
| `NO_VIDEOS` | The profile has no public videos, or none in your date range |
| `BLOCKED` / `RATE_LIMITED` | TikTok refused the request; run again later, or enable the proxy |

Error rows are never charged.

### Tips and limits

- **About 400 comments per video.** TikTok shows logged-out visitors roughly the top 330-470 comments of a video, however many it has. The Actor returns all of those, and the log says how many videos had more. Replies are not affected: a popular comment's thread pages normally.
- **Profiles give their latest ~12 videos.** A profile's public video list is short; for older videos, paste their URLs.
- **Comment order is TikTok's.** Comments come top-first, the way TikTok ranks them, not by date. "Only comments posted after" still reads every page of a video, so use it to keep only fresh comments, not to save time.
- **Need commenter bios, followers or emails?** Feed this dataset's `authorUsername` column into [TikTok Creator & Profile Scraper](https://apify.com/eiv/tiktok-creator-scraper).
- **Hit your spending limit?** The run stops cleanly at your maximum cost per run and keeps everything it collected. Raise the limit in the run options to get more.

### FAQ

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

This Actor collects only data that TikTok shows publicly, without logging in. Comments and usernames are personal data, which laws such as the GDPR protect. Scrape personal data only for a legitimate purpose, and ask a lawyer if you are unsure. TikTok is a trademark of its owner; this Actor is not affiliated with or endorsed by TikTok.

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

Yes. Every run can be started through the [Apify API](https://docs.apify.com/api/v2) and returns the dataset as JSON, CSV or Excel. Schedules, webhooks and integrations for Make, Zapier, n8n and Google Sheets are on the **Integrations** tab.

#### Can AI agents use it?

Yes. Agents connected to [Apify's MCP server](https://mcp.apify.com) can find and run this Actor as a tool, with the same per-comment pricing.

#### Why did I get fewer comments than I asked for?

The video has fewer comments than your limit, TikTok stopped showing comments (about 400 per video for logged-out visitors), TikTok hides some comments it filters, or the run reached your maximum cost per run. The log says which, and nothing collected before that is lost.

#### Can I monitor new comments on my videos?

Yes. Schedule a run with "Only comments posted after" set to "1 day" (or the gap between runs), and deduplicate on `commentId`.

### Related scrapers

- [TikTok Video Scraper](https://apify.com/eiv/tiktok-video-scraper): views, likes, shares and saves of the same videos.
- [TikTok Creator & Profile Scraper](https://apify.com/eiv/tiktok-creator-scraper): followers, bio, links and emails of the commenters or creators.
- [YouTube Comments Scraper](https://apify.com/eiv/youtube-comments-scraper): the same for YouTube, with every reply.

### Support

Missing a field, or found a video that does not work? Open an issue on the **Issues** tab with the input you used, and it will be looked at quickly.

# Actor input Schema

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

One per line. Videos: tiktok.com/@user/video/123... or /photo/ URLs, vm.tiktok.com or vt.tiktok.com short links, or bare video ids. Profiles: tiktok.com/@user, @user or user, for comments on that profile's latest videos (see "Videos per profile").

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

The same videos or profiles in the URL-list shape other Actors output, so a previous Actor's results can be fed straight in. Use this or the field above.

## `maxItems` (type: `integer`):

Stop after this many comments and replies across all videos. You pay per comment, so this is also your cost cap for the run.

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

Top-level comments to collect from each video, in TikTok's own order (top comments first). TikTok shows logged-out visitors about 400 comments per video, so higher values return what TikTok shows and no more.

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

Replies to collect under each comment. 0 = no replies. Replies are charged as comments and carry their parent's ID; each comment with replies takes one more request, so runs with replies are slower.

## `commentsAfter` (type: `string`):

Optional. Keep only comments (and replies) posted on or after this date, e.g. 2026-01-31 or "7 days" for the last week. Older comments are skipped and not charged. TikTok orders comments by relevance, not date, so every page of a video is still read.

## `videosPerProfile` (type: `integer`):

For each profile, how many of its latest videos to take comments from, newest first. TikTok's public profile embed lists the latest ~12 videos, so profiles give at most that many.

## `postedAfter` (type: `string`):

Optional. Only take profile videos posted on or after this date, e.g. 2026-01-31 or "30 days".

## `postedBefore` (type: `string`):

Optional. Only take profile videos posted on or before this date, e.g. 2026-06-30.

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

Not needed: TikTok's comment pages answer Apify's own addresses. Turn on Apify Proxy (datacenter) only if a run reports BLOCKED errors. Residential proxy is never needed and only adds cost.

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

How many videos or profiles are processed at the same time.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for one response before giving up on it.

## `maxRetries` (type: `integer`):

Retries for blocked, rate-limited or failed connections. Timeouts are not retried.

## Actor input object example

```json
{
  "targets": [
    "https://www.tiktok.com/@scout2015/video/6718335390845095173"
  ],
  "maxItems": 1000,
  "maxCommentsPerVideo": 100,
  "maxRepliesPerComment": 0,
  "videosPerProfile": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxConcurrency": 5,
  "requestTimeoutSecs": 30,
  "maxRetries": 2
}
```

# Actor output Schema

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

One row per comment or reply (recordType "comment"), plus one uncharged row per video or profile that could not be read (recordType "error").

## `summary` (type: `string`):

Totals for the run: comments, replies, videos, failures, why the run stopped, requests and megabytes.

# 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": [
        "https://www.tiktok.com/@scout2015/video/6718335390845095173"
    ]
};

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

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

```

## MCP server setup

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