# TikTok Comments Scraper: Comments, Replies & Threads (No Login) (`stanvanrooy6/tiktok-comments-scraper`) Actor

Scrape TikTok comments and full reply threads from any video URL. No login, no cookies, no API key. Deep pulls on viral videos with replies linked to parents. Export JSON, CSV or Excel.

- **URL**: https://apify.com/stanvanrooy6/tiktok-comments-scraper.md
- **Developed by:** [Stan Van Rooy](https://apify.com/stanvanrooy6) (community)
- **Categories:** Social media, Marketing, AI
- **Stats:** 2 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.32 / 1,000 comments

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

## TikTok Comments Scraper: Comments, Replies & Full Threads (No Login) 💬

The TikTok Comments Scraper extracts **comments and complete reply threads** from any TikTok video URL, with **no login, no cookies and no third-party API key**. Paste video links, click Start, and export TikTok comments as JSON, CSV or Excel, or call it as a TikTok comments API from your own code.

It is a TikTok comment scraper built for depth: it keeps reading where other tools stop, and it returns every reply linked to the comment it answers.

Built for audience research, sentiment analysis, influencer vetting, social listening and training data for AI models.

### 🚀 How to scrape TikTok comments

1. Paste one or more TikTok video URLs (regular links, short `vm.tiktok.com` / `vt.tiktok.com` links, photo posts or bare video IDs).
2. Set how many comments you want per video, and whether to include replies.
3. Click **Start**.

That is it. No TikTok account, no browser extension, no proxy setup on your side. The scraper creates its own anonymous session inside the Actor.

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

**Per comment (and per reply)**

- Comment ID, video ID and text
- Posted time (ISO 8601 and Unix timestamp)
- Like count and reply count
- Author: user ID, sec UID, handle, display name, avatar URL, verified flag
- Whether the comment was written by the video creator, liked by the creator, or pinned
- Detected language
- Attached images, stickers and GIFs
- Mentions and hashtags used in the text

**Threads**

Replies are separate rows with `parent_comment_id` pointing at the top level comment and `reply_to_comment_id` pointing at the exact comment they answer, so you can rebuild every thread as it appears in the app.

Every row also carries the region, platform and the source URL you passed in, so you can join comments back to videos in your own pipeline.

### 📥 Input

| Field | Type | Notes |
|---|---|---|
| `urls` | array | TikTok video URLs in any form, or bare numeric video IDs. **Required.** |
| `maxCommentsPerVideo` | integer | Cap on rows per video, replies included. `0` reads as deep as TikTok allows. Default `200`. |
| `includeReplies` | boolean | Collect reply threads as separate rows. Default `true`. |
| `maxRepliesPerComment` | integer | Cap on replies under each top level comment. `0` for complete threads. Default `5`. |
| `region` | string | Country the anonymous session is created in. Comments are global, so `US` works for any video. Default `US`. |
| `maxGuestsPerVideo` | integer | Advanced. How many anonymous sessions may be rotated on one video for deep pulls. Default `6`. |

Minimal input:

```json
{
  "urls": ["https://www.tiktok.com/@meqs/video/7011530809463033093"],
  "maxCommentsPerVideo": 500,
  "includeReplies": true,
  "maxRepliesPerComment": 5
}
```

### 📤 Output

One row per comment. Replies are rows too, linked to their thread.

```json
{
  "comment_id": "7671411455250514710",
  "video_id": "7669681716176456980",
  "parent_comment_id": null,
  "reply_to_comment_id": null,
  "text": "unnie is my skincare good for 13 years old ?",
  "create_time": "2026-08-07T21:54:56Z",
  "create_timestamp": 1786139696,
  "digg_count": 161,
  "reply_count": 14,
  "author": {
    "id": "7484966388814267414",
    "sec_uid": "MS4wLjABAAAAgpfHvoJKBoAYsiVN1r4aYFWcd-hlMduVkyREalgmGgj0PxwEeK2izpvT5JAQFc8t",
    "unique_id": "changbinnnnnn",
    "nickname": "changbinnnnnn",
    "avatar": "https://p19-common-sign.tiktokcdn-us.com/...",
    "verified": false
  },
  "is_author_reply": false,
  "liked_by_creator": false,
  "pinned": false,
  "language": "en",
  "images": [],
  "sticker": null,
  "mentions": [],
  "hashtags": [],
  "region": "US",
  "platform": "tiktok",
  "source_url": "https://www.tiktok.com/@sasainseoul/video/7669681716176456980"
}
```

A reply looks the same, with `parent_comment_id` set to the top level comment and `reply_to_comment_id` set to the comment it answers (the top level comment or another reply in the thread).

#### Field descriptions

- `comment_id`: Unique TikTok comment ID.
- `video_id`: The TikTok video the comment belongs to.
- `parent_comment_id`: Top level comment of the thread for replies, `null` for top level comments.
- `reply_to_comment_id`: The comment this reply answers.
- `text`: Comment text.
- `create_time` and `create_timestamp`: When the comment was posted (UTC ISO 8601 and Unix seconds).
- `digg_count`: Likes on the comment.
- `reply_count`: Number of replies under a top level comment.
- `author`: Commenter profile (`id`, `sec_uid`, `unique_id`, `nickname`, `avatar`, `verified`).
- `is_author_reply`: True when the video creator wrote the comment.
- `liked_by_creator`: True when the video creator liked the comment.
- `pinned`: True when the creator pinned the comment.
- `language`: Detected language code of the comment.
- `images`, `sticker`: Media attached to the comment.
- `mentions`, `hashtags`: Users and hashtags referenced in the text.
- `region`, `platform`, `source_url`: Join keys back to your input.

#### Status rows

A video that returns no comments (deleted, private, region locked, or comments turned off) produces one row with `status` and `status_reason` instead of failing the whole run. Status rows have `comment_id` set to `null` and are free. A run that collects zero comments overall ends with a clear failure message.

### ✨ Why this TikTok comments scraper

- **No login, no cookies, no API key.** The Actor creates its own anonymous session for every run. You never hand over a TikTok account and there is no separate paid API to subscribe to.
- **Complete reply threads.** Replies come back as rows linked to their parent, with the exact comment they answer, instead of a flat list or a truncated preview.
- **Depth on viral videos.** Reads the comment feed page by page and rotates anonymous sessions automatically when TikTok stops serving one, so large videos return thousands of comments, not a few hundred.
- **Creator signals.** Creator replies, creator likes and pinned comments are flagged on every row.
- **Every URL form.** Regular links, short `vm.tiktok.com` and `vt.tiktok.com` links, `tiktok.com/t/...` links, photo posts and bare IDs.
- **Clean exports.** JSON, CSV or Excel from the Apify Console, or fetch results from the Apify API.
- **Pay per result.** $0.40 per 1,000 comments, no monthly plan.

### 💡 Use cases

- **Sentiment and audience research:** What viewers really think about a product, launch, creator or campaign.
- **Influencer vetting:** Check engagement quality and creator responsiveness before you sign a deal.
- **Social listening:** Track how conversations around a brand, competitor or topic evolve video by video.
- **Content and ad angles:** Mine comment language for hooks, objections and questions people actually ask.
- **AI training data and NLP:** Feed thousands of labelled, threaded comments into your own models.
- **Community management:** Export threads to review moderation, replies and pinned comments.

### 🔌 TikTok comments API alternative: run it from code

Every Apify Actor is also an API. If you need TikTok comment data inside your own app or notebook, call this scraper with the Apify client:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("stanvanrooy6/tiktok-comments-scraper").call(run_input={
    "urls": ["https://www.tiktok.com/@meqs/video/7011530809463033093"],
    "maxCommentsPerVideo": 1000,
    "includeReplies": True,
    "maxRepliesPerComment": 0,
})
for comment in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(comment["parent_comment_id"], comment["author"]["unique_id"], comment["text"])
```

The same works from JavaScript, cURL or any HTTP client. See the **API** tab above for ready-made snippets and the dataset endpoints.

### ⚠️ Limits and good to know

- TikTok limits how deep an anonymous session can read one video's comment feed. The scraper rotates sessions automatically (up to `maxGuestsPerVideo`) so deep pulls keep going; with `maxCommentsPerVideo: 0` it collects whatever TikTok serves and then stops cleanly with everything it collected. See the measured numbers in the FAQ.
- Comment counts shown in the app include deleted and hidden comments, so the number of rows is usually a little below the displayed count even on small videos.
- Reply threads multiply request volume. `maxRepliesPerComment` defaults to 5 so runs stay fast and cheap; set it to `0` when you need complete threads.
- Transient network errors are retried automatically, so long runs keep going.
- Comments are ordered the way TikTok serves them to a new viewer (roughly by engagement, pinned first).

### 💰 Pricing

This Actor uses **pay per event**, so there is no monthly subscription and you only pay for what you scrape.

- **Comments:** $0.40 per 1,000 comments ($0.0004 each). Replies count as comments.
- **Run start:** $0.002 per GB of memory, under one cent for a default run.

Pulling 10,000 comments costs about $4.00. The most used TikTok comments scraper on the Apify Store charges $0.50 per 1,000, and this one returns deeper comment sets and complete threads for less. Status rows are free. New Apify accounts include monthly free usage credit, which is enough to try the scraper at no cost.

### 🎯 Example inputs

**As many comments as possible from one viral video, no replies:**

```json
{
  "urls": ["https://www.tiktok.com/@meqs/video/7011530809463033093"],
  "maxCommentsPerVideo": 0,
  "includeReplies": false
}
```

**Complete threads for a batch of videos, 500 rows each:**

```json
{
  "urls": [
    "https://www.tiktok.com/@sasainseoul/video/7669681716176456980",
    "https://vm.tiktok.com/ZMabcdefg/",
    "7011530809463033093"
  ],
  "maxCommentsPerVideo": 500,
  "includeReplies": true,
  "maxRepliesPerComment": 0
}
```

### ❓ FAQ

#### Is there a free TikTok comment scraper?

You can run this one for free within the monthly free usage credit that comes with every new Apify account. After that it is $0.40 per 1,000 comments with no subscription.

#### Do I need a TikTok account or login?

No. The scraper runs fully anonymous and cookie free. You never share credentials.

#### Do I need a third-party API key?

No. Everything runs inside the Actor.

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

Set `maxCommentsPerVideo` to any number, or `0` for as many as TikTok serves. TikTok caps how deep one anonymous session can read; the scraper measures that wall and rotates sessions to keep reading. In my September 2026 tests one run collected 25,133 unique comments from an 11 million comment video in under 30 minutes using two anonymous sessions, and a single session paced more slowly read past 37,000 comments without being stopped. Small and medium videos return everything.

#### Are replies included?

Yes, by default up to 5 per comment. Set `maxRepliesPerComment` to `0` for complete threads. Each reply is its own row with `parent_comment_id` and `reply_to_comment_id`.

#### Does it work on photo posts and short links?

Yes. Photo posts, `vm.tiktok.com`, `vt.tiktok.com` and `tiktok.com/t/...` links are all resolved to the video ID automatically.

#### What happens if a video is private or deleted?

You get one status row for that video explaining why, and the rest of the run continues.

#### How do I download or export TikTok comments?

Run the scraper, then download the dataset as JSON, CSV or Excel from the Apify Console, or read it straight from the Apify API and dataset endpoints. Every export includes the reply links, so threads survive the round trip into a spreadsheet.

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

The scraper only collects publicly visible data that any anonymous viewer can see, and it does not log in or bypass access controls. Comments contain user handles and display names, so handle the data in line with GDPR, CCPA and your own use case. If you are unsure, consult a lawyer.

#### Can you add a field or a filter I need?

Yes. Open an issue on the Issues tab and describe what you need. I actively maintain this Actor and add requested fields and options.

### 🤝 Feedback and feature requests

I actively maintain this Actor. Found a bug or need a field? Open an issue on the Issues tab.

### 🔗 Related TikTok scrapers

All four share the same no-login engine and output conventions.

- **[TikTok Shop Scraper](https://apify.com/stanvanrooy6/tiktok-shop-scraper)**: TikTok Shop reviews, star ratings and product data from any product URL, up to 25,000 reviews per product.
- **[TikTok Search Scraper](https://apify.com/stanvanrooy6/tiktok-search-scraper)**: search TikTok videos by keyword in any region, with views, likes, hashtags and author data.
- **[TikTok Profile Scraper](https://apify.com/stanvanrooy6/tiktok-profile-scraper)**: follower counts, bio, links and the full post history of any TikTok user.
- **[Universal Shopify Review Scraper](https://apify.com/stanvanrooy6/shopify-review-scraper)**: auto detects the review app (Judge.me, Loox, Yotpo, Okendo, Stamped and more) and extracts all reviews.

Typical workflow: find videos with the TikTok Search Scraper, pull the audience conversation with the TikTok Comments Scraper, profile the creators behind them with the TikTok Profile Scraper, and check what their TikTok Shop products are really rated with the TikTok Shop Scraper.

***

Built with ❤️ for the Apify community

# Actor input Schema

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

TikTok video URLs in any form (tiktok.com/@user/video/<id>, photo posts, vm.tiktok.com or vt.tiktok.com short links, tiktok.com/t/... links) or bare numeric video IDs.

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

Cap on rows per video, replies included. Set to 0 to read as deep as TikTok allows (the scraper rotates anonymous guests automatically).

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

Also collect the reply threads under each comment. Replies are separate rows linked through parent\_comment\_id.

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

Cap on replies collected under each top level comment. Set to 0 for complete threads.

## `region` (type: `string`):

Country the anonymous guest and its residential proxy are created in. Comments are global, so US works for any video; pick another region only if you need that locale.

## `maxGuestsPerVideo` (type: `integer`):

How many anonymous guests may be rotated on one video when TikTok stops serving the current one. Each guest is a fresh identity on a fresh residential IP.

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

Alternative Apify request list input. Merged with the URLs field above.

## Actor input object example

```json
{
  "urls": [
    "https://www.tiktok.com/@meqs/video/7011530809463033093"
  ],
  "maxCommentsPerVideo": 200,
  "includeReplies": true,
  "maxRepliesPerComment": 5,
  "region": "US",
  "maxGuestsPerVideo": 6
}
```

# Actor output Schema

## `comments` (type: `string`):

All scraped comment rows as JSON. Append ?format=csv or ?format=xlsx for other formats.

## `commentsCsv` (type: `string`):

The same rows as a CSV download.

## `dataset` (type: `string`):

The default dataset of this run.

# 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/@meqs/video/7011530809463033093"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("stanvanrooy6/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/@meqs/video/7011530809463033093"] }

# Run the Actor and wait for it to finish
run = client.actor("stanvanrooy6/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/@meqs/video/7011530809463033093"
  ]
}' |
apify call stanvanrooy6/tiktok-comments-scraper --silent --output-dataset

```

## MCP server setup

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