# TikTok Comments Scraper (Text, Likes, Replies, Users) (`juliob.rangel/tiktok-comments-scraper-fast`) Actor

Paste TikTok video URLs and get all their comments: text, likes, reply count, date, language, pinned or liked by the creator, and the commenter's username. Replies optional. No login. Export to Excel, CSV or JSON.

- **URL**: https://apify.com/juliob.rangel/tiktok-comments-scraper-fast.md
- **Developed by:** [Julio Barcellos Rangel](https://apify.com/juliob.rangel) (community)
- **Categories:** Social media, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 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 (Text, Likes, Replies, Users)

TikTok Comments Scraper takes TikTok video links and returns their comments in one table: text, likes, number of replies, date, language, whether the creator pinned or liked the comment, and who wrote it. Turn on replies to get the conversation under each comment too. It is made for marketers, brands, agencies and researchers who need a TikTok comments scraper to export TikTok comments to Excel, CSV or JSON for sentiment analysis, product feedback or giveaways. No login, no cookies and no browser are needed.

### What does TikTok Comments Scraper do?

You paste TikTok videos and the scraper reads their public comment sections, page by page, in TikTok's own order (most relevant first), until it reaches your limit or the end of the comments.

It accepts:

- Video links: `https://www.tiktok.com/@charlidamelio/video/7137423965982592302`
- Short links: `https://vm.tiktok.com/...` (the scraper follows the link to find the video)
- Video IDs: `7137423965982592302`

Every comment becomes one row with its text, like count, reply count, date, language, creator flags (pinned or liked by the creator), mentions and the commenter's username, nickname, IDs, profile link and avatar. With **Include replies** on, the scraper also loads the replies under each comment that has any, and returns each reply as its own row with `isReply: true` and the ID of the parent comment.

### What data can you extract?

| Field | What it means | Example |
|---|---|---|
| `input` | The video link or ID you entered | `https://www.tiktok.com/@charlidamelio/video/7137423965982592302` |
| `videoId` | TikTok video ID | `7137423965982592302` |
| `videoUrl` | Video link (your link without parameters, or a link built from the ID) | `https://www.tiktok.com/@charlidamelio/video/7137423965982592302` |
| `commentId` | Comment ID | `7137439588637852422` |
| `text` | Comment text | `alguien sabe el nombre de ese estilo de color en el labial?…` |
| `createdAt` | When the comment was posted (ISO 8601) | `2022-08-29T23:11:24.000Z` |
| `likes` | Number of likes on the comment | `2277` |
| `replyCount` | Number of replies TikTok reports for the comment | `29` |
| `language` | Language code TikTok gives the comment | `es` |
| `isReply` | `true` for replies, `false` for top-level comments | `false` |
| `parentCommentId` | For replies: the ID of the comment it answers | `7137510823549272878` |
| `pinnedByAuthor` | `true` when the video creator pinned the comment | `false` |
| `likedByAuthor` | `true` when the video creator liked the comment | `false` |
| `mentions` | Users tagged in the comment | `["example_user"]` |
| `username` | Commenter's username | `example_user` |
| `nickname` | Commenter's display name | `example_user` |
| `userId` | Commenter's numeric user ID | `7042472163…` |
| `secUid` | Commenter's secure user ID | `MS4wLjABAAAA…` |
| `profileUrl` | Commenter's profile link | `https://www.tiktok.com/@example_user` |
| `avatarUrl` | Commenter's avatar image URL | `https://p16-common-sign.tiktokcdn-us.com/…` |
| `videoCommentTotal` | Total comment count TikTok reports for the video | `19489` |
| `scrapedAt` | When the comment was scraped (ISO 8601) | `2026-10-12T20:23:32.168Z` |
| `error` | Only on error rows: why no comments came back | `Not a TikTok video URL or ID` |

### How to use TikTok Comments Scraper

1. Open TikTok Comments Scraper in Apify Console.
2. Paste video links, short links or video IDs into **Videos**, one per line.
3. Set **Max comments per video** (default 100).
4. Optional: turn on **Include replies** and set **Max replies per comment** (default 20).
5. Click **Start** and wait for the run to finish.
6. Open the **Output** tab and export the comments as JSON, CSV, Excel or HTML.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `videos` | list of text (required) | `["https://www.tiktok.com/@charlidamelio/video/7137423965982592302"]` | TikTok video URLs (`tiktok.com/@user/video/...`), short links (`vm.tiktok.com/...`) or video IDs. |
| `maxCommentsPerVideo` | integer | `100` | Top-level comments to return for each video, in TikTok's order (most relevant first). From 1 to 100,000. |
| `includeReplies` | true/false | `false` | Also returns the replies under each comment. Each reply is one result. |
| `maxRepliesPerComment` | integer | `20` | Maximum replies for each comment, from 1 to 10,000. Only used when replies are included. |
| `proxy` | object | `{ "useApifyProxy": true }` | Apify Proxy settings. The default works for most runs. |

`maxCommentsPerVideo` counts only top-level comments. Replies come on top of it, so with 100 comments and up to 20 replies each, one video can return up to 2,100 rows.

Example input:

```json
{
  "videos": [
    "https://www.tiktok.com/@charlidamelio/video/7137423965982592302"
  ],
  "maxCommentsPerVideo": 500,
  "includeReplies": true,
  "maxRepliesPerComment": 20,
  "proxy": { "useApifyProxy": true }
}
```

### Output example

One real comment from a recent run. The commenter is a private person, so the username, nickname and IDs are replaced or trimmed:

```json
{
  "input": "https://www.tiktok.com/@charlidamelio/video/7137423965982592302",
  "videoId": "7137423965982592302",
  "videoUrl": "https://www.tiktok.com/@charlidamelio/video/7137423965982592302",
  "commentId": "7137439588637852422",
  "text": "alguien sabe el nombre de ese estilo de color en el labial? es que quiero hacerlo pero no sé cómo 😓",
  "createdAt": "2022-08-29T23:11:24.000Z",
  "likes": 2277,
  "replyCount": 29,
  "language": "es",
  "isReply": false,
  "parentCommentId": null,
  "pinnedByAuthor": false,
  "likedByAuthor": false,
  "mentions": [],
  "username": "example_user",
  "nickname": "example_user",
  "userId": "7042472163…",
  "secUid": "MS4wLjABAAAA…",
  "profileUrl": "https://www.tiktok.com/@example_user",
  "avatarUrl": "https://p16-common-sign.tiktokcdn-us.com/…",
  "videoCommentTotal": 19489,
  "scrapedAt": "2026-10-12T20:23:32.168Z"
}
```

### How much does it cost?

TikTok Comments Scraper uses pay-per-event pricing. You pay **$0.50 per 1,000 comments** ($0.0005 per comment) on the Free plan. Replies count as comments. Apify platform usage is included in the price.

| Plan | Price per 1,000 comments |
|---|---|
| Free | $0.50 |
| Bronze (-10%) | $0.45 |
| Silver (-20%) | $0.40 |
| Gold and higher (-30%) | $0.35 |

Worked examples on the Free plan:

- 100 comments from one video = **$0.05**
- 10,000 comments = **$5.00**
- 50 videos with 1,000 comments each, plus 30,000 replies = 80,000 comments = **$40.00**

What you are not charged for:

- Error rows: entries that are not a TikTok video, videos with no comments (deleted, private or comments turned off), and videos where TikTok did not answer.
- Duplicate comments: a comment seen twice while paging is returned once.
- Duplicate entries: the same text entered twice in **Videos** is scraped once.

### Use cases

- **Audience research**: read what viewers really think of a product, ad, song or creator.
- **Sentiment analysis**: send the comment text to an AI model or a spreadsheet to tag positive, negative and neutral comments, or split them by `language`.
- **Product feedback**: collect questions and complaints under your own videos or competitors' videos.
- **Lead finding**: spot people asking where to buy something or how to get a service.
- **Giveaways**: export every comment on a giveaway video and pick a winner from the list.
- **Creator vetting**: check whether a creator's comments are real conversations before you sponsor them.
- **Community management**: find the comments the creator pinned or liked, and the ones with the most replies.

### Tips and limits

- **Order**: comments come in TikTok's order (most relevant first), not by date. Sort by `createdAt` in your spreadsheet if you need a timeline.
- **Replies are extra rows**: with **Include replies** on, replies are added on top of `maxCommentsPerVideo`, up to `maxRepliesPerComment` for each comment. Only comments with at least one reply are opened.
- **Comment totals**: `videoCommentTotal` is the number TikTok reports for the whole video. Use it to see how much of the comment section you collected.
- **Partial results**: if TikTok stops answering in the middle of a video, the comments collected so far are kept and the scraper moves on to the next video. If replies of one comment cannot be loaded, that comment's replies are skipped.
- **Short links**: the scraper follows `vm.tiktok.com` links to find the video ID. If the link does not lead to a video, you get an error row.
- **Same video twice**: entries are merged only when the text is identical, so a video link and the same video's ID are scraped (and charged) twice.
- **Avatar links expire**: `avatarUrl` is a signed TikTok link that stops working after some time. Download avatars soon if you need them.
- **Error rows**: `Not a TikTok video URL or ID`, `No comments found (video deleted, private or comments turned off)` and `TikTok did not answer`. They contain `input`, `error` and, when known, `videoId`. Error rows are free.

### Use it from the API, Python or JavaScript

You can run the scraper and read the comments with the official Apify clients. Replace `YOUR_TOKEN` with your Apify API token.

JavaScript (Node.js):

```javascript
const { ApifyClient } = require('apify-client');

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const input = {
  videos: ['https://www.tiktok.com/@charlidamelio/video/7137423965982592302'],
  maxCommentsPerVideo: 500,
  includeReplies: true,
};

const run = await client.actor('juliob.rangel/tiktok-comments-scraper-fast').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

Python:

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_TOKEN')
input = {
    'videos': ['https://www.tiktok.com/@charlidamelio/video/7137423965982592302'],
    'maxCommentsPerVideo': 500,
    'includeReplies': True,
}

run = client.actor('juliob.rangel/tiktok-comments-scraper-fast').call(run_input=input)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

The scraper also works with Make, Zapier and n8n, can export results to Google Sheets, can call your webhook when a run finishes, and can be used by AI agents through the Apify MCP server.

### FAQ

**Do I need a TikTok login or cookies?**
No. The scraper reads public comment sections without logging in, so your own account is never used.

**Can I export TikTok comments to Excel or CSV?**
Yes. Open the Output tab after the run and download the dataset as Excel, CSV, JSON or HTML, or send it to Google Sheets.

**How many comments can I get?**
Up to 100,000 top-level comments per video, plus up to 10,000 replies per comment, limited by how many comments the video has.

**Are replies included?**
Only when you turn on **Include replies**. Each reply is one row and costs the same as a comment.

**Can I scrape comments of private or deleted videos?**
No. Those videos return an error row (`No comments found…`) and are not charged.

**Is it legal to scrape TikTok comments?**
The scraper only collects publicly available data. You are responsible for complying with TikTok's terms and with privacy laws such as GDPR and LGPD. Comments and commenter usernames are personal data, so you need a legitimate reason to collect them, and you should store only what you need.

**Why did I get an error row?**
The entry was not a TikTok video link or ID, the video has no public comments, or TikTok did not answer after several tries. Error rows are not charged.

### Related scrapers

- [TikTok Video Scraper (Views, Likes, Comments, Shares)](https://apify.com/juliob.rangel/tiktok-video-scraper-fast)
- [TikTok Profile Stats Scraper (Followers, Likes, Bio)](https://apify.com/juliob.rangel/tiktok-profile-stats)
- [YouTube Comments Scraper (Fast & Cheap)](https://apify.com/juliob.rangel/youtube-comments-fast)
- [Instagram Posts Scraper (Reels, Likes, Views, Captions)](https://apify.com/juliob.rangel/instagram-posts-scraper-fast)
- [Threads Scraper (Profiles, Posts, Search)](https://apify.com/juliob.rangel/threads-scraper-fast)

***

## Extrator de Comentários do TikTok (PT-BR)

Cole links de vídeos do TikTok e receba os comentários: texto, curtidas, número de respostas, data, idioma, se o criador fixou ou curtiu, e quem escreveu. Respostas opcionais. Sem login. Você paga só por comentário retornado.

# Actor input Schema

## `videos` (type: `array`):

TikTok video URLs (tiktok.com/@user/video/...), short links (vm.tiktok.com/...) or video IDs.

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

Top-level comments to return for each video, in TikTok's order (most relevant first).

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

Also return the replies under each comment (each reply counts as one result).

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

Only used when replies are included.

## `proxy` (type: `object`):

Apify Proxy settings.

## Actor input object example

```json
{
  "videos": [
    "https://www.tiktok.com/@charlidamelio/video/7137423965982592302"
  ],
  "maxCommentsPerVideo": 100,
  "includeReplies": false,
  "maxRepliesPerComment": 20,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "videos": [
        "https://www.tiktok.com/@charlidamelio/video/7137423965982592302"
    ],
    "maxCommentsPerVideo": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("juliob.rangel/tiktok-comments-scraper-fast").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 = {
    "videos": ["https://www.tiktok.com/@charlidamelio/video/7137423965982592302"],
    "maxCommentsPerVideo": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("juliob.rangel/tiktok-comments-scraper-fast").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 '{
  "videos": [
    "https://www.tiktok.com/@charlidamelio/video/7137423965982592302"
  ],
  "maxCommentsPerVideo": 100
}' |
apify call juliob.rangel/tiktok-comments-scraper-fast --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,juliob.rangel/tiktok-comments-scraper-fast"
        }
    }
}
```

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/I4bqiARNloXDVq7RZ/builds/dzyzIsGzao5Mb9KRh/openapi.json
