# TikTok Comments & Replies Scraper (`insights_data/tiktok-comments-replies-scraper`) Actor

Extract TikTok comments and replies from videos, photo posts and whole profiles. Get text, likes, reply counts, dates, mentions and commenter details (bio, verified badge) as structured JSON. Bulk URLs, live output, no account or cookies needed.

- **URL**: https://apify.com/insights_data/tiktok-comments-replies-scraper.md
- **Developed by:** [Insights Data](https://apify.com/insights_data) (community)
- **Stats:** 8 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

### What is TikTok Comments & Replies Scraper?

**TikTok Comments & Replies Scraper** is a TikTok comments scraper that lets you extract TikTok comments and their replies from public videos, photo posts and whole profiles, one row per comment or reply. It's made for marketers, social media managers, researchers and developers: paste video links or usernames, click **Start**, and get comment text, likes, dates, mentions and commenter details with no TikTok account, cookies or coding. On the Apify Free plan, a run saves at most **10 rows in total** (comments and replies together, across all links and profiles); paid plans have no run-wide row cap, and you decide how much you get with the per-post and per-profile limits and an optional maximum cost per run.

What you can use it for:

- **Social listening:** see what people say under your videos, your competitors' videos or the creators in your niche.
- **Brand monitoring:** collect the comments that mention your brand or product on campaign videos and check the reactions.
- **Sentiment research:** send the rows to a spreadsheet, BI tool or LLM for TikTok comment sentiment analysis. The Actor collects the data; it doesn't score sentiment itself.
- **Influencer research:** check how engaged a creator's audience is, which comments get the most likes and whether the creator replies to, likes or pins comments.
- **Audience research:** learn who comments (usernames, bios, verified badges, languages) and what questions or product feedback they leave.
- **AI and data pipelines:** build a TikTok comments dataset in structured JSON for LLMs, AI agents or analytics pipelines.

#### What can TikTok Comments & Replies Scraper do?

It's a TikTok video comments scraper that also covers photo posts and whole profiles. It reads the public comments of every post you add and saves them to your dataset while the run is still working.

- 💬 **Comments from videos and photo posts:** video URLs, photo URLs, short share links and video IDs in one list, so you get TikTok photo comments as well as video comments.
- 🧵 **Collect TikTok comment replies:** each reply is its own row, linked to its parent comment with `repliesToId`, and saved right after that comment.
- 👤 **Profile mode:** add usernames or profile URLs and get the comments of each profile's videos. You choose which videos are picked: the latest, the most popular or the oldest, within a date range, with or without pinned videos.
- 🔢 **Your own limits:** set the maximum rows per post, the maximum top-level comments per post and the maximum replies per comment.
- 🪪 **Commenter and creator details:** each commenter's bio, verified badge and language (optional, on by default), plus the video creator's profile on every row.
- ⚡ **Live output:** rows are saved page by page, so the **Output** tab fills during the run and saved rows stay if the run stops early.
- 📦 **Export and automate:** download JSON, CSV, Excel, XML or HTML, call it through the Apify API, schedule runs, and connect Make, Zapier, Google Sheets and more.
- 🛡️ **Proxy handled for you:** the run starts without a proxy and switches to Apify Proxy automatically when TikTok blocks or limits requests; you can also choose your own proxy settings. Apify Proxy traffic is part of your platform usage (see the pricing section).

***

### What data can TikTok Comments & Replies Scraper extract?

Every row is structured TikTok comments data about one comment or one reply. Field names below are the exact names in the dataset. Pairs marked "same as" hold the same value under two names (see [Spreadsheet tips](#spreadsheet-tips-csv-and-excel)).

| | |
|---|---|
| 🧵 Row type: comment or reply `type` | 📝 Comment text `text` |
| 🆔 Comment ID `cid` (same as `id`) | 🔗 Link that opens the video at this comment `commentUrl` |
| 📅 Created at `createTimeISO` (same as `createdAt`), Unix time `createTime` | 🌐 Comment language `commentLanguage` |
| ⭐ TikTok comment likes `diggCount` (same as `likeCount`) | 💬 Reply count shown by TikTok `replyCommentTotal` (same as `replyCount`) |
| ❤️ Liked by the creator `isAuthorLiked` (same as `likedByAuthor`) | 📌 Pinned by the creator `pinnedByAuthor` |
| 🧵 Is a reply `isReply` | 🧵 Parent comment ID `repliesToId` |
| 🧵 Reply it answers `replyToReplyId`, thread marker `threadId` | 👤 Commenter ID, username, name, avatar `uid`, `uniqueId`, `nickname`, `avatarThumbnail` |
| 👤 Commenter profile `user`: id, secUid, username, displayName, nickname, url, bio, avatarUrl, verified, region, language, hasEmail, hasPhone, coverImage | 🎥 Video creator `videoAuthor`: id, secUid, username, nickname, url, bio, bioLink, avatarUrl, verified, privateAccount, isOrganization, isSeller, language, region, accountCreatedAt, followerCount, followingCount, likeCount, videoCount, friendCount |
| 🏷️ Mentioned users `mentions`, `detailedMentions` | 📸 Attached images or stickers `images` |
| 🎬 Video reply `videoReply` | 🔗 Video URL, video ID, post ID (same as video ID), creator username `videoWebUrl`, `videoId`, `awemeId`, `videoAuthorUniqueId` |
| 🔗 Input that led to this row `input`, `inputSource`, `submittedVideoUrl` | |

> **Note:** Every row has all of these keys, but some values can be empty. `text` is `null` for sticker, image or video-only comments. `repliesToId` is `null` for top-level comments. `user.verified` is `null` when commenter profile details are off or a commenter's profile couldn't be loaded in time. `user.region`, `user.hasEmail`, `user.hasPhone` and `user.coverImage` are usually `null` because TikTok doesn't show them for commenters. `videoAuthor` is `null` when the creator's profile couldn't be loaded. For videos found through a profile, `input` is the username and `submittedVideoUrl` is the profile URL. A custom map function changes the row shape.

#### What data can't TikTok Comments & Replies Scraper extract?

- Comments that a user wrote on other people's videos (the Actor collects the comments **on** videos)
- Comments of private, deleted or region-blocked videos
- Replies that TikTok hides, deletes or filters, so a thread can return fewer replies than `replyCommentTotal`
- TikTok LIVE comments
- Video statistics such as views, shares or the video description (you get the creator's profile stats in `videoAuthor`)
- Video files, transcripts or media downloads
- Commenter emails or phone numbers
- A choice of comment order: comments come in the order TikTok returns them (**Profile video sorting** only decides which profile videos are picked)
- Reposts of profiles that keep their reposts hidden from visitors
- Other platforms: it isn't a general social media comments scraper and works with TikTok only

For video statistics, transcripts and media downloads, see [TikTok Profile Scraper](https://apify.com/insights_data/tiktok-profile-scraper).

***

### How to scrape TikTok comments and replies

You don't need to write code: the TikTok comment scraper runs in Apify Console, and the input form has a field for every setting. To get TikTok comments from your own videos or from a creator's profile:

1. [Create a free Apify account](https://console.apify.com/sign-up) using your email.
2. Open [TikTok Comments & Replies Scraper](https://apify.com/insights_data/tiktok-comments-replies-scraper).
3. In **TikTok URLs**, replace the prefilled example link with your own video links, or keep it for a first test. If you keep it, it's scraped like any other link and its rows count toward your limits. To add a creator, open **Profile options** and type the username in **TikTok usernames**. You can use video links and usernames in the same run.
4. Check **Maximum comments per post** (default 10 rows per post, replies included) and, for profiles, **Videos per profile** (default 1). Then click **Start**. On the Free plan, the run stops at 10 rows in total, across all links and profiles.
5. Watch the rows appear in the **Output** tab while the run is working, then download them as JSON, CSV, Excel, XML or HTML.

**Recommended first run:** keep the prefilled input and click **Start**. It reads one public Gordon Ramsay video with **Maximum comments per post** set to 10 and **Maximum replies per comment** set to 2, so it saves at most 10 rows and the results cost at most $0.01, plus the start fee and platform usage (see the next section). Then switch to your own links.

#### Recipe: your videos plus one creator's profile

This input reads the comments of the video links you paste plus the 3 videos picked from one creator's profile. Replace the link and the username with your own, and add more links one per line:

```json
{
  "urls": [
    "https://www.tiktok.com/@gordonramsayofficial/video/7229884545150061851"
  ],
  "profiles": ["gordonramsayofficial"],
  "resultsPerPage": 3,
  "commentsPerPost": 100,
  "maxRepliesPerComment": 2
}
```

Two defaults decide how much you get here:

- **Maximum comments per post** (`commentsPerPost`) is 10 by default and counts replies too. Left at the default, you get at most 10 rows per video, so it's raised to 100 above.
- **Videos per profile** (`resultsPerPage`) is 1 by default. Left at the default, you get the comments of only one video from the profile, so it's raised to 3 above. **Profile video sorting** (Latest by default) decides which videos are picked.

With this input, a paid-plan run saves at most 400 rows (1 linked video plus 3 profile videos, up to 100 rows each), so the results cost at most $0.36 on Starter, $0.32 on Scale or $0.28 on Business. On the Free plan, the same run stops at 10 rows. To cap your spend, set a maximum cost per run before you click **Start** (see the next section).

To extract TikTok video comments from a longer list of posts, add one link per line or use **Bulk edit** to paste a whole list. Each post is read once per run, even if it's in your list twice or also shows up in a profile.

***

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

TikTok Comments & Replies Scraper uses **pay-per-event** pricing: a fixed price for each saved row and for each run start, plus Apify's platform usage. Your bill for a run has three parts:

| Part | Price |
|---|---|
| 💲 Results: every comment or reply row saved to the dataset | **$1.00 per 1,000 results** ($0.001 per row) on the Free plan (lower on paid plans, see below) |
| 🚀 Actor start | **$0.00005 per run** with the default settings. The fee is $0.00005 per GB of run memory (the amount of computer memory the run gets), and runs use 1 GB by default. |
| ⚙️ Apify platform usage | Apify's charge for the resources your run uses: compute time, data storage and, if the run switches to Apify Proxy, proxy traffic. It isn't fixed in advance; after a test run, you see it on the run's page in Apify Console. |

| Apify plan | Price per row (comment or reply) | Price per 1,000 rows |
|---|---|---|
| Free | $0.001 | $1.00 |
| Starter | $0.0009 | $0.90 |
| Scale | $0.0008 | $0.80 |
| Business and higher | $0.0007 | $0.70 |

Paid Apify plans get a lower result price. The plan discount applies to that price only. The start fee is the same on every plan, and platform usage is billed at your Apify plan's own rates.

If you raise the memory in **Run options**, the start fee grows with it, for example $0.0002 per run at 4 GB.

What is and isn't charged as a result:

- A top-level comment and a reply are each one result. Replies count like comments.
- Rows are charged even when some fields are empty.
- Videos whose comments can't be loaded at all, and videos with no comments, produce no rows and add no result charges. If loading stops partway through a video, the rows saved before that are charged.
- Rows removed by your custom map function and rows that fail to save are not charged.

Example result costs at Free plan prices (the start fee and platform usage come on top):

| Rows saved (comments + replies) | Result cost |
|---|---|
| 10 (the prefilled input) | $0.01 |
| 100 | $0.10 |
| 1,000 | $1.00 |
| 10,000 | $10.00 |

Start with a small test run, check the real total (including platform usage) on the run's page, then scale up. To cap your spend, set a **maximum cost per run** in **Run options** under the input form: when it's reached, the run stops cleanly, keeps the rows already saved, and the status message says the spend limit was reached. See the [pricing tab](https://apify.com/insights_data/tiktok-comments-replies-scraper/pricing) for the current events.

#### Is scraping TikTok comments free?

You can try it for free. The [Apify Free plan](https://apify.com/pricing) includes $5 of monthly platform credit, which pays for both the result and start charges and the platform usage of your runs.

Separately, the Actor limits Free plan runs: each run saves at most **10 rows**, comments and replies together, across all the links and profiles in that run. Rows removed by a custom map function count toward the 10. When a run reaches the cap, it stops early and still finishes as succeeded, and the status message shows the rows saved and the Free plan limit of 10 items per run. The cap is per run, not per month. Paid plans don't have this run-wide cap: a paid run stops only at your own per-post, per-comment and per-profile limits, when TikTok has no more data, at a built-in page safety limit, or at your maximum cost per run.

***

### TikTok comments scraper input

To run TikTok Comments & Replies Scraper, you need **at least one link in TikTok URLs or one username in TikTok usernames**. You can fill in both. If both are empty, the run fails with a message asking you to add one. All other fields are optional.

Here's the prefilled example: it reads one public video, saves up to 10 rows from it and up to 2 replies under each comment, with no proxy at the start:

```json
{
  "urls": [
    "https://www.tiktok.com/@gordonramsayofficial/video/7229884545150061851"
  ],
  "commentsPerPost": 10,
  "maxRepliesPerComment": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

See the [input tab](https://apify.com/insights_data/tiktok-comments-replies-scraper/input-schema) for a full description of all fields. The first column is the label you see in the form; the second is the name used in JSON and the API.

| Field in the form | API name | What it does | Default |
|---|---|---|---|
| TikTok URLs | `urls` | Video URLs, photo URLs, short share links (vm.tiktok.com, vt.tiktok.com, tiktok.com/t/), video IDs, profile URLs or @usernames, one per line | none |
| Maximum comments per post (replies included) | `commentsPerPost` | Maximum rows per post, top-level comments and replies together | `10` |
| Maximum top-level comments per post | `topLevelCommentsPerPost` | Maximum top-level comments per post. Replies don't count toward this limit, but they do count toward Maximum comments per post | no limit |
| Include replies | `includeReplies` | Collect the replies under each comment | `true` |
| Maximum replies per comment | `maxRepliesPerComment` | Maximum replies per comment (`0` = none) | `2` |
| TikTok usernames (in Profile options) | `profiles` | Usernames (with or without @) or profile URLs | none |
| Videos per profile | `resultsPerPage` | How many videos to take from each profile, counted separately for each profile section | `1` |
| Profile sections | `profileScrapeSections` | Take videos from **Videos** and/or **Reposts** | Videos |
| Profile video sorting | `profileSorting` | Which videos are picked: Latest, Popular or Oldest (Videos section only) | Latest |
| Videos published on or after | `oldestPostDateUnified` | Profile videos published on or after a date or within a period | none |
| Videos published on or before | `newestPostDate` | Profile videos published before a date (see the note below) | none |
| Exclude pinned posts | `excludePinnedPosts` | Skip videos the creator pinned to the profile | off |
| Add commenter profile details | `scrapeUserProfiles` | Add each commenter's bio, verified badge and language | on |
| Custom map function (Python) | `customMapFunction` | Python expression or function that reshapes each row | none |
| Proxy configuration | `proxyConfiguration` | Optional proxy to start the run with | no proxy |

#### Maximum comments per post (`commentsPerPost`)

This limit counts **top-level comments and replies together**. It's `10` by default, and if you leave the field empty, the platform still fills in `10`. So a run with the defaults returns at most 10 rows per post, even when the video has thousands of comments. Set a higher number to get more.

How the limits work together for each post: comments are saved in the order TikTok returns them, each one followed by its replies (up to **Maximum replies per comment**). Collection for the post stops as soon as **Maximum top-level comments per post** (if set) or **Maximum comments per post** is reached, whichever comes first. If the row limit is reached in the middle of a thread, the rest of that thread is left out.

So to get a set number of top-level comments with their replies, set **Maximum top-level comments per post** and raise **Maximum comments per post** high enough to hold the replies too. For example, 20 top-level comments with up to 5 replies each need up to 120 rows.

- ✅ Good: `"topLevelCommentsPerPost": 20, "maxRepliesPerComment": 5, "commentsPerPost": 120`
- ✅ Good: `"commentsPerPost": 200, "maxRepliesPerComment": 5`
- ❌ Bad: leaving `commentsPerPost` empty and expecting more than 10 rows per post

> ⚠️ Every saved row is charged, replies included. Use these limits to control your spend.

#### Replies (Include replies, Maximum replies per comment)

Replies are only requested for comments whose reply counter is above 0. Each comment is saved first, followed by its replies. TikTok can return fewer replies than its counter shows, for example when replies were hidden, deleted or filtered.

- ✅ Good: `"maxRepliesPerComment": 0` or `"includeReplies": false` when you only want top-level comments
- ❌ Bad: expecting every comment to come with exactly `maxRepliesPerComment` replies

#### TikTok comment scraper by username (`profiles`, `resultsPerPage`)

For TikTok influencer research, add the creator's username to **TikTok usernames** (`profiles`), or paste profile URLs or @usernames into **TikTok URLs**. The Actor first picks the profile's videos and then reads their comments. Profiles that can't be opened (for example private, banned or not found) are skipped with a line in the log.

**Videos per profile** (`resultsPerPage`) is `1` by default, so you get the comments of only one video per profile unless you raise it. With both **Videos** and **Reposts** selected in **Profile sections**, you get up to this many videos from each section. Reposts only work when TikTok shows them to visitors; otherwise the reposts section gives 0 videos. **Profile video sorting** decides which videos are picked (Latest, Popular or Oldest) and applies to the Videos section only. It doesn't change the order of the comments.

- ✅ Good: `"profiles": ["gordonramsayofficial"], "resultsPerPage": 5`
- ❌ Bad: `"profiles": ["gordonramsayofficial"]` and expecting comments from many videos (you get 1 video)

> ⚠️ Videos per profile, Profile sections, Profile video sorting, the date filters and **Exclude pinned posts** only affect profile inputs, not direct video links.

#### Date filters (Videos published on or after / on or before)

Both filters (`oldestPostDateUnified`, `newestPostDate`) work on profile videos only, and dates are in UTC.

- **Videos published on or after** accepts a date (`YYYY-MM-DD`), a period such as `7 days`, `2 weeks`, `3 months` or `1 year` (a month counts as 30 days and a year as 365 days), or a plain number of days. `1 day` means today only, from 00:00 UTC, and `2 days` means yesterday and today.

- **Videos published on or before** is compared with 00:00 UTC of the date you pick, so videos posted later that same day are left out. To include a whole day, pick the next day.

- ✅ Good: to include all of 31 January 2026, set `"newestPostDate": "2026-02-01"`

- ❌ Bad: setting `"newestPostDate": "2026-01-31"` and expecting videos from the afternoon of 31 January

#### Commenter details and the custom map function

**Add commenter profile details** (`scrapeUserProfiles`) is useful for TikTok audience research. It looks up each unique commenter once per run and fills `bio`, `verified` and `language` in `user` (and `region` when TikTok shows it). Turn it off for faster runs; `user.verified` is then `null`.

**Custom map function (Python)** (`customMapFunction`) runs on every row before it's saved. Use a Python expression over `record`, such as `{'id': record['cid'], 'likes': record['diggCount']}`, or a full `def map_function(record): ...`. Return `None` to drop a row: dropped rows aren't saved or charged, but on the Free plan they count toward the 10-row cap. If the function fails on a row, the original row is kept. If it can't be compiled, it's ignored for the run.

#### Proxy configuration (`proxyConfiguration`)

You don't need a proxy to start. The run starts without a proxy and switches to Apify Proxy automatically when TikTok blocks or limits requests. You can also choose your own proxy settings, and the run then starts with them.

***

### TikTok comments scraper output

Results are stored in a dataset in the **Output** or **Storage** tab. You can view them as a table or JSON and download them in JSON, CSV, Excel, XML or HTML. In the JSON view or through the API, each row is a TikTok comments JSON object with the keys shown below. Seven ready-made views in the **Output** tab show different sets of columns: **💬 Overview**, **🧵 Comments & replies**, **👤 Commenters**, **📈 Engagement**, **🖼️ Mentions & media**, **🎥 Video creator** and **🎬 Video & source**. All rows of a run are also saved as one JSON file in the run's key-value store under the `OUTPUT` key.

#### Spreadsheet tips (CSV and Excel)

- **Pick your columns.** A full export has many columns. To export TikTok comments to Excel or save TikTok comments to CSV with only what you need, pick the fields in the export dialog. For TikTok comment analysis, a good set is `type`, `text`, `diggCount`, `createTimeISO`, `uniqueId`, `isReply`, `repliesToId` and `videoWebUrl`. To look before you export, the **🧵 Comments & replies** view shows the thread columns (`type`, `isReply`, `cid`, `repliesToId`, `text`, `diggCount`, `createTimeISO` and more), and **💬 Overview** shows text, likes, reply count, date, commenter and video link.
- **Pairs with the same value.** Some fields are aliases: `cid` = `id`, `diggCount` = `likeCount`, `createTimeISO` = `createdAt`, `replyCommentTotal` = `replyCount`, `isAuthorLiked` = `likedByAuthor` and `videoId` = `awemeId`. Each pair holds the same value under two names, so you only need one of each.
- **Nested fields.** `user` (the commenter's profile) and `videoAuthor` (the video creator) are groups of fields. In CSV and Excel they become separate columns named like `user/nickname`, `user/verified` or `videoAuthor/followerCount`, and lists such as `mentions` become numbered columns (`mentions/0`, `mentions/1`).
- **Threads.** Filter on `isReply` and group by `repliesToId` to rebuild each thread.

#### JSON example

Results for the input example above. This is a real top-level comment row from a test run (long URLs and IDs are shortened with "…"; follower numbers are a snapshot and change over time):

```json
{
  "type": "comment",
  "input": "https://www.tiktok.com/@gordonramsayofficial/video/7229884545150061851",
  "inputSource": "https://www.tiktok.com/@gordonramsayofficial/video/7229884545150061851",
  "submittedVideoUrl": "https://www.tiktok.com/@gordonramsayofficial/video/7229884545150061851",
  "videoWebUrl": "https://www.tiktok.com/@gordonramsayofficial/video/7229884545150061851",
  "videoId": "7229884545150061851",
  "awemeId": "7229884545150061851",
  "videoAuthorUniqueId": "gordonramsayofficial",
  "cid": "7230306662946161414",
  "id": "7230306662946161414",
  "commentUrl": "https://m.tiktok.com/…",
  "text": "Bro I think u forgot to add butter 💀",
  "createTime": 1683436964,
  "createTimeISO": "2023-05-07T05:22:44.000Z",
  "createdAt": "2023-05-07T05:22:44.000Z",
  "commentLanguage": "en",
  "diggCount": 28088,
  "likeCount": 28088,
  "replyCommentTotal": 74,
  "replyCount": 74,
  "isAuthorLiked": false,
  "likedByAuthor": false,
  "pinnedByAuthor": false,
  "isReply": false,
  "repliesToId": null,
  "replyToReplyId": null,
  "threadId": null,
  "uid": "317145745193930752",
  "uniqueId": "goldens_nine",
  "nickname": "SouSou 🖤",
  "avatarThumbnail": "https://p16-common-sign.tiktokcdn.com/…/e002d9231f2850b029bb1ea4cf05972e.jpg",
  "mentions": [],
  "detailedMentions": [],
  "images": [],
  "videoReply": null,
  "user": {
    "id": "317145745193930752",
    "secUid": "MS4wLjABAAAASx5KBuftdWwDBsVvR2cwFhFKobgFWhVQfz9tVqa9fN7JvntQ1JQSasy9S9qyDrqG",
    "username": "goldens_nine",
    "displayName": "SouSou 🖤",
    "nickname": "SouSou 🖤",
    "url": "https://www.tiktok.com/@goldens_nine",
    "bio": "",
    "avatarUrl": "https://p16-common-sign.tiktokcdn.com/…/e002d9231f2850b029bb1ea4cf05972e.jpg",
    "verified": false,
    "region": null,
    "language": "en",
    "hasEmail": null,
    "hasPhone": null,
    "coverImage": null
  },
  "videoAuthor": {
    "id": "6747935906352907269",
    "secUid": "…",
    "username": "gordonramsayofficial",
    "nickname": "Gordon Ramsay",
    "url": "https://www.tiktok.com/@gordonramsayofficial",
    "bio": "I cook sometimes too.....",
    "bioLink": "GordonRamsay.com/",
    "avatarUrl": "https://p16-common-sign.tiktokcdn.com/…/7310612651137040390.jpeg",
    "verified": true,
    "privateAccount": false,
    "isOrganization": false,
    "isSeller": false,
    "language": "en",
    "region": null,
    "accountCreatedAt": "2019-10-18T17:42:11.000Z",
    "followerCount": 40687561,
    "followingCount": 572,
    "likeCount": 729973028,
    "videoCount": 712,
    "friendCount": 302
  }
}
```

#### Reply row example (illustrative)

This comment shows 74 replies, so with `maxRepliesPerComment` set to 2, up to 2 of its replies follow it in the dataset. The example below is **illustrative, not real data**: the field names are exact, but the values are made up, and the row is trimmed to the reply-related fields. A real reply row has the same keys as the comment row above.

```json
{
  "type": "reply",
  "videoId": "7229884545150061851",
  "cid": "7230000000000000001",
  "text": "Example reply text",
  "createTimeISO": "2023-05-07T06:00:00.000Z",
  "diggCount": 120,
  "isReply": true,
  "repliesToId": "7230306662946161414",
  "replyToReplyId": null,
  "uniqueId": "example_user"
}
```

***

### TikTok comments scraper tips and advanced usage

#### How many comments can you scrape?

Paid plans have no run-wide row cap. Instead, every post, reply thread and profile has its own limits. Collection for a post stops at the first of these:

- **Maximum comments per post** is reached (default 10 rows, replies included)
- **Maximum top-level comments per post** is reached, if you set it
- TikTok has no more comments for the post
- a page of comments can't be loaded (rows already saved stay; if the first page fails, the video counts as failed in the run summary and has no rows)
- a built-in safety limit on the number of comment pages per post

Replies under a comment stop at **Maximum replies per comment** (default 2), when TikTok returns no more replies or a reply page can't be loaded, at a built-in page safety limit, or when the post reaches **Maximum comments per post**. Profile videos stop at **Videos per profile** for each section, when the profile has no more videos or its video list can't be loaded, or at a built-in page safety limit.

On top of that, the whole run stops at the Free plan cap of 10 rows (Free plan only) or at your maximum cost per run. The best way to know what you'll get for your videos is a quick test run.

#### How to get faster or cheaper results

- Start with the prefilled input, then raise **Maximum comments per post** step by step.
- Set **Maximum replies per comment** to `0` (or turn off **Include replies**) if you only need top-level comments.
- Turn off **Add commenter profile details** if you don't need commenter bios and verified badges; runs get faster.
- In profile mode, keep **Videos per profile** low and use the date filters so comments are read only from the videos you need.
- Set a maximum cost per run in **Run options** to cap your spend.

#### TikTok comment monitoring with schedules

The Actor has no built-in history: each run is a snapshot of the comments TikTok shows at that moment. For ongoing TikTok social listening, save your input as a task and [schedule it](https://docs.apify.com/platform/schedules) daily or weekly, then compare the datasets by `createTimeISO`. Profile mode with a relative date filter such as `7 days` keeps a weekly run focused on recent videos.

#### Known issues

- Reply threads can return fewer replies than `replyCommentTotal`, for example when TikTok hides deleted or filtered replies. The run summary in the log shows how many threads this affected.
- Top-level comments aren't de-duplicated across pages (replies are de-duplicated within each thread). If TikTok repeats a comment on a later page, it's saved and charged twice.
- If a commenter's profile can't be loaded in time, the row is saved without the extra details (`user.verified` is `null`).
- If the video creator's profile can't be loaded, `videoAuthor` is `null`.
- With a bare video ID as input, `videoWebUrl` contains the video ID where the creator's username would be. Paste the full video URL if you need the standard link.
- Lines in **TikTok URLs** that aren't a recognized TikTok link, ID or username are skipped with a line in the log.

***

### Integrations and API

#### Can I use TikTok Comments & Replies Scraper as a TikTok comments API?

Yes. The [Apify API](https://docs.apify.com/api/v2) gives you a TikTok comment data API without building your own: you send the input as JSON, start a run, and read the rows back from the dataset in JSON, CSV or Excel. Use the `apify-client` [NPM package](https://apify.com/insights_data/tiktok-comments-replies-scraper/api/javascript) for Node.js or the `apify-client` [PyPI package](https://apify.com/insights_data/tiktok-comments-replies-scraper/api/python) for Python, and see the [API tab](https://apify.com/insights_data/tiktok-comments-replies-scraper/api) for ready-to-use code. API callers can also send links in `postURLs` or `startUrls`; they're added to `urls`.

#### Get TikTok comments API example in Python

This short TikTok comment scraper Python script runs the input example above and prints a few fields of each row:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run_input = {
    "urls": ["https://www.tiktok.com/@gordonramsayofficial/video/7229884545150061851"],
    "commentsPerPost": 10,
    "maxRepliesPerComment": 2,
    "proxyConfiguration": {"useApifyProxy": False},
}
run = client.actor("insights_data/tiktok-comments-replies-scraper").call(run_input=run_input)

for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["type"], row["uniqueId"], row["diggCount"], row["text"])
```

#### Can I integrate TikTok Comments & Replies Scraper with other apps?

Yes. Connect it with other apps through [Apify integrations](https://apify.com/integrations): **Make, Zapier, Slack, Google Sheets, Google Drive, Airbyte, GitHub, LangChain** and more. Use [webhooks](https://docs.apify.com/integrations/webhooks) to trigger actions when a run finishes. For TikTok brand monitoring, for example, schedule a weekly run for your brand's latest videos and send the new rows to Google Sheets, where your team reads the feedback.

#### Can I use TikTok Comments & Replies Scraper with AI agents (MCP)?

Yes. Through the Apify MCP server, Claude and other AI assistants can call the Actor as a TikTok comments MCP tool: the agent fills in the input, runs the Actor and reads the comments back as JSON. Open the [MCP tab](https://apify.com/insights_data/tiktok-comments-replies-scraper/api/mcp) for setup steps.

***

### Other TikTok scrapers and more from the same developer

[TikTok Profile Scraper](https://apify.com/insights_data/tiktok-profile-scraper) is our TikTok scraper for profiles and video stats, and the best match if you also need views, shares or transcripts. The other two are more scrapers from the same developer, for opinion and review data on other sites.

| Actor | What it does |
|---|---|
| 🎵 [TikTok Profile Scraper](https://apify.com/insights_data/tiktok-profile-scraper) | A TikTok data scraper for profiles: videos, reposts, stories and playlists with views, likes, comments, shares, music, hashtags and author stats; optional followers, comments, transcripts and media downloads |
| 📈 [Stocktwits Scraper](https://apify.com/insights_data/stocktwits-scraper) | Scrapes Stocktwits stock and crypto messages, bullish/bearish sentiment, price targets and trending symbols |
| ⭐ [Flipkart Reviews Scraper](https://apify.com/insights_data/flipkart-reviews-scraper) | Scrapes Flipkart product reviews, star ratings, photos and rating summaries in bulk |

***

### TikTok comments scraper FAQ

#### Is it legal to scrape TikTok?

TikTok Comments & Replies Scraper only reads public comments that anyone can see without logging in. Comments contain personal data such as usernames and profile details, so you need a legitimate reason to collect them and should follow rules such as GDPR and CCPA. Also take [TikTok's Terms of Service](https://www.tiktok.com/legal/page/us/terms-of-service/en) into account. This is not legal advice; if you're unsure, ask a lawyer.

#### How does TikTok Comments & Replies Scraper work?

Think of it as a TikTok comments crawler for public pages: it doesn't log in and needs no cookies. You add links or usernames. For profile inputs, it first picks the profile's videos with your sorting and filters. Then it opens each public post, reads its comments page by page, and for comments that have replies it reads the replies up to your limit. It looks up each commenter's public profile once (optional) and each video creator's profile once, and saves every comment and reply as its own row as soon as a page is ready.

#### How is this TikTok comments extractor different from copying comments by hand?

| | TikTok Comments & Replies Scraper | Copying comments by hand |
|---|---|---|
| Many videos or whole profiles | ✅ One run for a list of links or usernames | ❌ One video at a time |
| Replies linked to their parent | ✅ `repliesToId` on every reply | ❌ Manual |
| Likes, dates, commenter details | ✅ Structured fields | ❌ Retyped by hand |
| Scheduling and API | ✅ Apify schedules, API, integrations | ❌ |
| Price | $1.00 per 1,000 rows on the Free plan, down to $0.70 on Business, + start fee + platform usage | Your time |

#### Is there a TikTok comment extractor for whole profiles?

Yes. Add usernames to **TikTok usernames** or paste profile URLs into **TikTok URLs**, then raise **Videos per profile** (default 1). You can choose the Videos and Reposts sections, pick videos by Latest, Popular or Oldest, filter by date and skip pinned videos.

#### Can I use it as a TikTok replies scraper only?

Not directly. Replies are collected under their parent comments, so each reply row comes after its comment row. If you only want the replies, filter on `isReply` = `true` after you export. If you only want top-level comments, set **Maximum replies per comment** to `0` or turn off **Include replies**.

#### Can I download TikTok comments?

Yes. Every comment and reply is saved to a dataset you can download in JSON, CSV, Excel, XML or HTML from the **Output** tab, during or after the run. Note that it isn't a TikTok comments downloader for media: it saves comment text and details, not video files.

#### How do I export TikTok comments?

Open the **Output** tab, click **Export**, pick a format and, if you like, only the fields you need (see [Spreadsheet tips](#spreadsheet-tips-csv-and-excel)). You can also read the dataset through the API. You don't need a separate TikTok comment exporter or browser extension.

#### Why am I getting fewer results than expected?

Check the most common causes first:

- On the Free plan, a run saves at most 10 rows in total, across all links and profiles.
- **Maximum comments per post** is 10 by default and counts replies too.
- In profile mode, **Videos per profile** is 1 by default. Also check the date filters and **Exclude pinned posts**, and remember that **Videos published on or before** leaves out videos posted later on the chosen day.
- Check **Maximum replies per comment** (default 2) and whether **Include replies** is on.
- Check whether the run hit your maximum cost per run.
- TikTok can return fewer replies than the reply counter shows.

If a run finishes with **"no TikTok videos found"**, no video could be taken from your input: the links weren't recognized, short links didn't lead to a video, profiles couldn't be opened (for example private, banned or not found), the profiles had no videos, no profile video matched your settings (date filters, pinned exclusion, hidden reposts), or the run stopped early because of an error (the log shows it). If it finishes with **"no comments found"**, videos were found but no rows were saved: the videos have no public comments, their comments couldn't be loaded (counted as failed in the run summary), your custom map function dropped every row, rows failed to save, or the run stopped early because of an error. Both runs still finish as succeeded with 0 rows. A run fails with a status message when the input is invalid or has no link or username.

***

### Support and feedback

Found a bug or have a feature request? Please create an issue on the [Issues tab](https://apify.com/insights_data/tiktok-comments-replies-scraper/issues/open) and include your run link.

Need a **custom solution**, another field or help with a social media data project? Contact us at hello.insights.data@gmail.com.

Built and maintained by [Insights Data](https://apify.com/insights_data).

# Actor input Schema

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

One URL per line, or use Bulk edit to paste a whole list. Accepted: video and photo URLs (https://www.tiktok.com/@user/video/123...), short share links (vm.tiktok.com / vt.tiktok.com), bare video IDs, and profile URLs or @usernames (comments are then taken from that profile's videos, see Profile options). Free plan users get up to 10 items per run; paid plans have no limit.

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

Maximum number of rows (top-level comments and replies together) taken from each post. Leave empty for no cap. To get N comments plus their replies, use the top-level limit below instead.

## `topLevelCommentsPerPost` (type: `integer`):

Maximum number of top-level (non-reply) comments taken from each post. Replies come on top of this number.

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

Also collect the replies under each comment. Each reply is its own row with type "reply" and a link to its parent comment.

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

Maximum number of replies collected under each comment (0 = none). TikTok sometimes hides deleted or filtered replies, so a thread can return fewer replies than its counter shows.

## `profiles` (type: `array`):

Alternatively, add one or more TikTok usernames (with or without @, or profile URLs) whose videos' comments you want to scrape. Enter them one by one or use Bulk edit. Important: don't forget to set Videos per profile below.

## `resultsPerPage` (type: `integer`):

How many videos to take from each username above (and from each profile URL in the TikTok URLs list).

## `profileScrapeSections` (type: `array`):

Which part of each profile to take videos from. Reposts are collected only when TikTok shows them to visitors; most profiles currently keep them hidden, and those are skipped with a note in the log.

## `profileSorting` (type: `string`):

Latest = newest videos first, Popular = most viewed first, Oldest = oldest first. Date filters work with Latest and Oldest.

## `oldestPostDateUnified` (type: `string`):

Optional. Pick a date, or a relative period such as 7 days, 2 weeks, 3 months or 1 year (1 day = today only, 2 days = yesterday and today).

## `newestPostDate` (type: `string`):

Optional. Only videos uploaded on or before this date (YYYY-MM-DD).

## `excludePinnedPosts` (type: `boolean`):

Skip the videos a creator pinned to the top of their profile.

## `scrapeUserProfiles` (type: `boolean`):

Fill each commenter's bio, verified badge and language. Adds a little time per unique commenter; turn off for the fastest runs.

## `customMapFunction` (type: `string`):

Optional. A Python expression over `record`, e.g. {'id': record\['cid'], 'likes': record\['diggCount']}, or a full `def map_function(record): ...`. Return None to drop a row. Not meant for filtering.

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

Default: no proxy. If TikTok blocks the run, it switches to a datacenter proxy and then to a residential proxy automatically. Pick your own proxy here to start with it instead.

## Actor input object example

```json
{
  "urls": [
    "https://www.tiktok.com/@gordonramsayofficial/video/7229884545150061851"
  ],
  "commentsPerPost": 10,
  "includeReplies": true,
  "maxRepliesPerComment": 2,
  "resultsPerPage": 1,
  "profileScrapeSections": [
    "videos"
  ],
  "profileSorting": "latest",
  "excludePinnedPosts": false,
  "scrapeUserProfiles": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Every comment and reply with its key numbers.

## `threads` (type: `string`):

How replies link to their parent comments.

## `authors` (type: `string`):

Who wrote each comment, with profile details.

## `engagement` (type: `string`):

Likes, replies and creator interactions.

## `media` (type: `string`):

Mentions, images, stickers and video replies.

## `creator` (type: `string`):

The creator of each video with profile stats.

## `videos` (type: `string`):

Which video and input each row came from.

## `outputJson` (type: `string`):

Every row from this run in one JSON array, saved to the run's key-value store under the 'OUTPUT' key.

# 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/@gordonramsayofficial/video/7229884545150061851"
    ],
    "commentsPerPost": 10,
    "maxRepliesPerComment": 2,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("insights_data/tiktok-comments-replies-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/@gordonramsayofficial/video/7229884545150061851"],
    "commentsPerPost": 10,
    "maxRepliesPerComment": 2,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("insights_data/tiktok-comments-replies-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/@gordonramsayofficial/video/7229884545150061851"
  ],
  "commentsPerPost": 10,
  "maxRepliesPerComment": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call insights_data/tiktok-comments-replies-scraper --silent --output-dataset

```

## MCP server setup

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