# TikTok Comments Scraper (`parseforge/tiktok-comments-scraper`) Actor

Every comment under a TikTok video with likes, reply count, date and the commenter profile. Replies optional. No login needed. Export CSV, Excel, JSON, XML.

- **URL**: https://apify.com/parseforge/tiktok-comments-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (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 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

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 💬 TikTok Comments Scraper

> 🚀 **Export every comment under a TikTok video in seconds.** Paste the video links and each comment comes back as a flat row: the text, its likes, how many replies it drew, when it was posted, whether the creator liked it, and who wrote it and whether their account is verified. Replies come too, on request.

No account, no cookie, no session token. The Actor opens the same page a viewer opens and asks TikTok for the comments the way the site asks for them itself.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Brand and social teams | Read what an audience actually says under a campaign video |
| Creators and agencies | Pull the comment thread of a post for reporting or moderation |
| Researchers | Collect public discussion around a topic, with timestamps |
| Lead and outreach teams | Find engaged accounts, with follower counts, under relevant videos |

### 📋 What the TikTok Comments Scraper does

> 💡 **Why it matters:** TikTok stopped answering comment requests made from outside its own pages. A plain HTTP call to the comment endpoint returns an empty body, and the mobile API refuses it outright. This Actor gets the full thread anyway, and at a fraction of a cent per hundred comments.

- 💬 **Top-level comments in bulk**, eight pages at a time: a measured run collected 2,183 rows from two videos in 139 seconds.
- ↩️ **Replies on request**, each returned as its own row and marked with the comment it answers.
- 👤 **The commenter, not just a name:** username, display name, user ID, profile link, verified flag and a link to their profile.
- 📌 **Signals that matter:** pinned comments and comments the video's creator liked are flagged.
- ↕️ **Order as you need it:** most liked, most replied, newest or oldest, with pinned comments kept on top.
- 🎞️ **Video details on every row:** caption, author, like count, comment count and upload date, so the export stands on its own.
- 🔗 **Any link shape works:** a share link, a browser link, a photo post, or just the numeric video ID.
- 💸 **Nothing is charged for a video that returns nothing.** A private, removed or comments-off video costs you nothing.
- 🔁 **Clean data:** one row per comment, the same 25 columns every time, `N/A` instead of blank cells, and `error` reserved for failures.

### 🎬 Full Demo (🚧 Coming soon)

A short walkthrough video is in production.

### 📊 Output

| Field | Type | Description |
|---|---|---|
| 🖼 `imageUrl` | string | The commenter's profile picture |
| 🆔 `commentId` | string | TikTok's own comment ID |
| 💬 `text` | string | The comment itself |
| ❤️ `likeCount` | integer | Likes on the comment |
| ↩️ `replyCount` | integer | Replies under the comment |
| 🕒 `createdAt` | string | When it was posted, ISO timestamp |
| ↪️ `isReply` | string | `Yes` when the row is a reply |
| 🔗 `parentCommentId` | string | The comment this one answers |
| 📌 `isPinned` | string | `Yes` when the creator pinned it |
| 💚 `likedByCreator` | string | `Yes` when the video's author liked it |
| 👤 `authorUniqueId` | string | The commenter's @username |
| 🏷 `authorNickname` | string | Their display name |
| 🆔 `authorId` | string | Their numeric user ID |
| 🔗 `authorUrl` | string | Link to their profile |
| ✅ `authorVerified` | string | `Yes` when the account is verified |
| 🔐 `authorSecUid` | string | TikTok's stable secure user ID, for matching across runs |
| 🎬 `videoId` | string | The video's numeric ID |
| 🔗 `videoUrl` | string | Link to the video |
| 🎥 `videoAuthor` | string | The video's creator |
| 📝 `videoTitle` | string | The video's caption |
| ❤️ `videoLikeCount` | integer | Likes on the video |
| 💬 `videoCommentCount` | integer | Comments TikTok reports on the video |
| 📅 `videoCreatedAt` | string | When the video was posted |
| 🕒 `scrapedAt` | string | ISO timestamp of the run |
| ⚠️ `error` | string | `null` on a normal row |

#### Example rows

```json
{
  "imageUrl": "https://p16-sign-va.tiktokcdn.com/example-avatar.jpeg",
  "commentId": "7259870000000000000",
  "text": "This shot of the nebula is unreal",
  "likeCount": 1840,
  "replyCount": 12,
  "createdAt": "2026-08-14T19:22:41.000Z",
  "isReply": "No",
  "parentCommentId": "N/A",
  "isPinned": "No",
  "likedByCreator": "Yes",
  "authorUniqueId": "stargazer",
  "authorNickname": "Stargazer",
  "authorId": "6800000000000000000",
  "authorUrl": "https://www.tiktok.com/@stargazer",
  "authorVerified": "No",
  "videoId": "7259860470834007342",
  "videoUrl": "https://www.tiktok.com/@nasa/video/7259860470834007342",
  "videoAuthor": "nasa",
  "videoTitle": "A look at the Ring Nebula",
  "videoLikeCount": 982000,
  "videoCommentCount": 5120,
  "videoCreatedAt": "2026-08-14T15:00:03.000Z",
  "scrapedAt": "2026-09-18T02:14:55.221Z",
  "error": null
}
```

```json
{
  "imageUrl": "https://p16-sign-va.tiktokcdn.com/example-avatar-2.jpeg",
  "commentId": "7259880000000000000",
  "text": "Agreed, the colours are wild",
  "likeCount": 43,
  "replyCount": 0,
  "createdAt": "2026-08-14T20:05:12.000Z",
  "isReply": "Yes",
  "parentCommentId": "7259870000000000000",
  "isPinned": "No",
  "likedByCreator": "No",
  "authorUniqueId": "nightsky",
  "authorNickname": "Night Sky",
  "authorId": "6800000000000000001",
  "authorUrl": "https://www.tiktok.com/@nightsky",
  "authorVerified": "No",
  "videoId": "7259860470834007342",
  "videoUrl": "https://www.tiktok.com/@nasa/video/7259860470834007342",
  "videoAuthor": "nasa",
  "videoTitle": "A look at the Ring Nebula",
  "videoLikeCount": 982000,
  "videoCommentCount": 5120,
  "videoCreatedAt": "2026-08-14T15:00:03.000Z",
  "scrapedAt": "2026-09-18T02:14:56.004Z",
  "error": null
}
```

```json
{
  "imageUrl": "https://p16-sign-va.tiktokcdn.com/example-avatar-3.jpeg",
  "commentId": "7259890000000000000",
  "text": "Pinned: full resolution image is on our site",
  "likeCount": 7600,
  "replyCount": 88,
  "createdAt": "2026-08-14T15:31:00.000Z",
  "isReply": "No",
  "parentCommentId": "N/A",
  "isPinned": "Yes",
  "likedByCreator": "Yes",
  "authorUniqueId": "nasa",
  "authorNickname": "NASA",
  "authorId": "6800000000000000002",
  "authorUrl": "https://www.tiktok.com/@nasa",
  "authorVerified": "Yes",
  "videoId": "7259860470834007342",
  "videoUrl": "https://www.tiktok.com/@nasa/video/7259860470834007342",
  "videoAuthor": "nasa",
  "videoTitle": "A look at the Ring Nebula",
  "videoLikeCount": 982000,
  "videoCommentCount": 5120,
  "videoCreatedAt": "2026-08-14T15:00:03.000Z",
  "scrapedAt": "2026-09-18T02:14:56.740Z",
  "error": null
}
```

### ✨ Why choose this Actor

- 🔓 **No login and no cookie.** You never hand over an account, and nothing in your run can get an account restricted.
- 👥 **Richer commenters.** Display name, user ID, verification and a profile link on every row, not just a username.
- ↩️ **Replies as first-class rows**, so a thread exports flat into a spreadsheet.
- 💸 **A video that returns nothing is not charged**, and there is no start fee.
- 🧾 **Charged per row, not per batch**, so what you are billed matches what you can count in the dataset.

### 📈 How it compares to alternatives

| | This Actor | Typical alternative |
|---|---|---|
| Login | Never | Some ask for a session cookie |
| Replies | Optional, as their own rows | Often missing or nested |
| Commenter detail | Display name, user ID, verified, profile link | Username only |
| Video context | On every row | Usually a separate run |
| Minimum charge | None | Up to $3.00 per query on some |

### 🚀 How to use

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp), then open the [TikTok Comments Scraper](https://apify.com/parseforge/tiktok-comments-scraper?fpr=vmoqkp) and paste your video links, one per line.
2. Choose how many comments to take per video, and the maximum for the run.
3. Turn on replies if you need whole threads.
4. Run it, then download CSV, Excel, JSON or XML, or pull the dataset over the API.

Free-plan runs return up to 10 comments as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to collect up to 1,000,000 rows per run.

### 💼 Business use cases

- Measure sentiment under a campaign video, with the exact wording customers used.
- Moderate or archive the thread of your own posts.
- Find engaged accounts under a competitor's video and see how large their following is.
- Track how a comment section grows by running the same video on a schedule.

### 🔌 Automating TikTok Comments Scraper

Schedule it from the Apify Console and it reruns on its own. Point a webhook at your warehouse and every finished run lands there. Comment IDs are stable, so repeated runs deduplicate cleanly.

### 🌟 Beyond business use cases

- Keep the comments on a video you care about before it disappears.
- Collect the replies to a public announcement for a class or a paper.
- Settle an argument about what people actually said under a viral clip.

### 🤖 Ask an AI assistant about this scraper

Paste this into ChatGPT, Claude or any assistant with web access:

> I want to export the comments of several TikTok videos. Look at https://apify.com/parseforge/tiktok-comments-scraper and tell me how to configure a run over 20 videos with replies included, what each of the 25 output fields means, and exactly when each event is charged.

### ❓ Frequently Asked Questions

#### 🔗 What can I paste as a video link?

A share link, the link in your browser's address bar, a photo post link, or the bare numeric video ID. All of them resolve to the same video.

#### 🔐 Do I need a TikTok account or cookie?

No. Nothing is logged in at any point, so no account of yours is exposed.

#### ↩️ How do replies come back?

As their own rows, with `isReply` set to `Yes` and `parentCommentId` pointing at the comment they answer. Turn them off to keep the export to top-level comments only.

#### 💬 How many comments can I get from one video?

You can ask for up to 5,000 per video. How many actually come back is TikTok's decision: measured on a video with 2,702 comments, it served 1,557 before it stopped answering. The Actor pages eight requests at a time and keeps going through refusals, so it takes what the platform will give.

#### 💸 When am I charged?

Per comment row delivered, per reply row when replies are on, and once per video for the video details when they come back. A video that returns no comments is never charged, and there is no start fee.

#### 🚫 Why did a video return nothing?

It is private, it was removed, or its owner turned comments off. The run logs which video it was and moves on without charging.

#### 👥 What do I get about the commenter?

Every row carries the commenter's profile link, display name and verification flag, so the account is one click away.

#### 🕒 Are the timestamps real?

Yes, they are TikTok's own creation times, converted to ISO format in UTC.

#### ⚠️ What do `N/A` values mean?

The field genuinely was not published. Blank cells are never used, so a spreadsheet column stays readable.

#### 📄 What output formats are supported?

CSV, Excel, JSON, XML, JSONL and RSS, from the dataset or the API.

#### ⏰ Can I run this on a schedule?

Yes. Schedule it in the Apify Console and compare runs by comment ID to see what is new.

### 🔌 Integrate with any app

The dataset is available through the Apify API the moment the run finishes. Use the `run-sync-get-dataset-items` endpoint for one-shot calls, webhooks to trigger downstream jobs, or the Make, Zapier, Airbyte and LangChain integrations listed on the Actor page.

### 🔗 Recommended Actors

- [TikTok Profile Scraper](https://apify.com/parseforge/tiktok-profile-scraper?fpr=vmoqkp)
- [TikTok Shop Scraper](https://apify.com/parseforge/tiktok-shop-scraper?fpr=vmoqkp)
- [Instagram Comments Scraper](https://apify.com/parseforge/instagram-comments-scraper?fpr=vmoqkp)
- [YouTube Comments Scraper](https://apify.com/parseforge/youtube-comments-scraper?fpr=vmoqkp)
- [Google Maps Contacts Scraper](https://apify.com/parseforge/google-maps-contacts-scraper?fpr=vmoqkp)

***

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp).

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA) with your run ID, your input and what you expected.

> **⚠️ Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by TikTok or ByteDance. It collects only publicly available data. You are responsible for using the collected data in compliance with applicable law, including GDPR and other privacy rules in your jurisdiction.

# Actor input Schema

## `videoUrls` (type: `array`):

One video per line. Paste the link from the share button, the link from your browser, or just the numeric video ID. Photo posts work too.

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

Stop after this many rows in total, counting replies. Free users get up to 10 results per run; paid users get up to 1,000,000.

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

How many top-level comments to take from each video before moving to the next one.

## `sortBy` (type: `string`):

How to order the comments of each video before they are written. Pinned comments always stay on top, the way TikTok shows them.

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

Off by default. Turn it on to open every comment thread and return the replies as their own rows, each one marked with the comment it answers.

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

Only used when replies are on. Caps how many replies are taken from each thread.

## `includeVideoInfo` (type: `boolean`):

On by default. Adds the video's author, caption, like count, comment count and upload date to every row, so the export needs no second lookup. Charged once per video, and only when the details come back.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@nasa/video/7259860470834007342"
  ],
  "maxItems": 10,
  "maxCommentsPerVideo": 100,
  "sortBy": "default",
  "includeReplies": false,
  "maxRepliesPerComment": 10,
  "includeVideoInfo": true
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields

## `fullData` (type: `string`):

Complete dataset with all 25 fields

# 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 = {
    "videoUrls": [
        "https://www.tiktok.com/@nasa/video/7259860470834007342"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/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 = {
    "videoUrls": ["https://www.tiktok.com/@nasa/video/7259860470834007342"],
    "maxItems": 10,
}

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

```

## MCP server setup

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