# TikTok Comment Insights 🎵 Themes, Questions & Buyers (`gatherworks/tiktok-comment-insights`) Actor

Turn a TikTok comment thread into answers. Top terms and phrases, buyer-intent questions, unanswered questions ranked by likes, and the commenters carrying the thread — plus every comment as a row. Paste video URLs. No login, no API key.

- **URL**: https://apify.com/gatherworks/tiktok-comment-insights.md
- **Developed by:** [GatherWorks](https://apify.com/gatherworks) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## TikTok Comment Insights 🎵 Themes, Questions & Buyers

**Stop exporting comments and reading them. Get the themes, the questions people
actually asked, the ones showing buying intent, and who is carrying the thread.**
Every comment the analysis was built from comes back with it, at no extra cost.

**No account, no cookies, no API key.** Paste video links and run.

***

### 🔍 What is the TikTok Comment Insights scraper?

Paste TikTok video URLs. You get **one row per video** carrying the analysis,
with that video's comments nested underneath it:

- 🏷️ the terms and two-word phrases people repeat
- ❓ how many comments are questions, and the top ones by likes
- 💰 comments showing buying intent — price, link, shipping, "where can I get"
- 👥 the commenters carrying the thread
- 📊 how many unique people are talking, and how engagement sits across comments

### ⚡ What can it do?

- **📦 Analyse many videos at once** and compare threads side by side.
- **❓ Surface the questions being asked**, ranked by likes — the ones worth
  replying to.
- **💰 Find buying intent** without reading a thousand comments.
- **🔢 Cut noise** by analysing only comments above a like threshold.
- **📄 Read the raw comments** in the same dataset — every one the counts were
  taken over, included.
- **🌏 Handle other languages** — terms and phrases are counted as written.
- **📄 Export anywhere.** JSON, CSV, Excel — the dataset is yours.

#### 🎯 The summary is the product

Every other way of getting this hands you a spreadsheet of comments and leaves
the reading to you. A thousand-comment thread is a day's work to skim and nobody
does it twice. Here the thread arrives already counted: what is repeated, what is
asked, what looks like a customer — with the highest-liked questions and buying
signals quoted in the row itself, and the whole analysed thread there as rows
alongside it.

### ⚡ Speed and accuracy

**Speed.** Measured on a real run: **40 comments analysed and summarised in 9
seconds**.

**Accuracy.** Comments are de-duplicated by ID, so the same comment is never
counted twice. Counts are numbers, not display text. Question and buying-intent
detection is keyword and punctuation based, so it is reproducible: a question
mark counts in any language, and the keyword lists themselves are English. The
top five matches of each kind are quoted in the summary row, and every analysed
comment comes back with it so you can re-derive any count yourself. Common filler words are excluded from term counts, and terms appearing
only once are left out.

#### 🚫 This is counting, not sentiment analysis

There is no model here guessing at mood. Everything reported is a count over the
text of the comments. That means the numbers are reproducible and checkable — the
top-ranked questions and buying signals come back quoted in the summary row, and
every comment the counts were taken over comes back too — and it means this
will not tell you whether a thread is *happy*, only what it says.

### 📊 What data does it return?

The dataset has **two ready-made tables**, switched with the view selector above
the results. **Video insights** gives one row per video — that is what a default
run fills. **Comments** unwinds the nested `comments` array back into one row per
comment. Export either as JSON, CSV or Excel.

**Video insights** — one row per video you asked for, on every run:

| Field | Notes |
|---|---|
| 🔗 `videoUrl`, `videoCaption` | Which video |
| 🏷️ `videoAuthorHandle`, `videoAuthorName` | Who posted it |
| 📊 `videoLikesCount`, `videoCommentsCount`, `videoViewsCount` | The video's own numbers |
| 🔢 `commentsAnalysed`, `uniqueCommenters` | Size of the thread analysed |
| ❓ `questionCount`, `questionSharePct` | How much of the thread is asking something |
| 💰 `purchaseIntentCount`, `purchaseIntentSharePct` | Comments about price, links or buying |
| 🏷️ `topTerms`, `topPhrases` | What people repeat, with counts |
| 👥 `topCommenters` | Who posts most in the thread |
| ❓ `topQuestions` | The five highest-liked questions, with their like counts |
| 💰 `topPurchaseIntent` | The five highest-liked buying-intent comments |
| 📊 `totalCommentLikes`, `medianCommentLikes` | Engagement across the thread — the total, and the middle comment's like count |
| ⚠️ `error` | Why a URL returned nothing, where one did |

**Comments** — one row per comment, each carrying the video it came from:

| Field | Notes |
|---|---|
| 🔗 `videoUrl`, `videoAuthorHandle` | The video and who posted it |
| 💬 `commentText` | The comment |
| 📊 `likesCount`, `repliesCount` | Engagement on it — including how many replies it drew |
| 🏷️ `authorHandle`, `authorDisplayName` | Who wrote the comment |
| 📅 `publishedAt` | When, ISO 8601 |

**🚧 A narrow like filter stops rather than running away.** Set one and the
filter may skip at most **maxScanned** comments per video before the Actor stops
and returns what it found, saying so in the log. Comments your filter removes are
never stored and never billed.

#### 🚫 What it does **not** return

- **Sentiment or emotion scores.** See above — this counts, it does not judge.
- **Whether a question was answered.** Questions are ranked by likes, not by
  whether anybody replied to them.
- **Word-splitting for scripts written without spaces.** Term and phrase counts
  split on whitespace, and the filler-word list is English.
- **Comments on private or deleted videos.**
- **Translations.** Text comes back in the language it was written in.
- **Replies to comments.** The thread comes back as top-level comments.
  `repliesCount` tells you how many replies a comment drew; the replies
  themselves are not returned, and are not billed for.

### 💰 How much does it cost?

You pay per event, for what the run actually produces — never for runtime, and
never on a subscription.

Standard rate: **💵 $0.0015 per comment analysed**. That is the only charge —
the summary built from those comments, and the comment rows themselves, are
included:

| Run | Cost |
|---|---|
| 🟩 5 videos × 200 comments *(1,000 comments)* | 💵 $1.50 |
| 🟨 25 videos × 200 comments *(5,000 comments)* | 💵 $7.50 |
| 🟧 10 videos × 1,000 comments *(10,000 comments)* | 💵 $15.00 |

You set the number of comments per video, so you set the bill before you run.

**A video with no comments is free.** So is one that cannot be analysed, and so
is a comment your like filter removes.
**A month you do not run it costs nothing at all** — there is no plan to keep alive.

#### What you get for that

| | Included here |
|---|---|
| 🏷️ Repeated terms and phrases, counted | ✅ |
| ❓ Questions surfaced and ranked by likes | ✅ |
| 💰 Buying-intent comments identified | ✅ |
| 👥 Top commenters | ✅ |
| 📄 Every raw comment the counts were taken over | ✅ **free** |
| 📊 The whole summary on top of the comments | ✅ **free** |
| 💳 Minimum spend | none |

### 🚀 How do I use it?

1. Paste one or more **TikTok video URLs**.
2. Set **comments to analyse** — 200 is enough for steady themes.
3. Optionally set a **minimum comment likes** to cut noise on huge threads.
4. Leave **📄 Also return every comment as a row** on to get the thread as rows
   as well, or switch it off for a smaller dataset at the same price.
5. Run and read the **Video insights** table. **Comments** holds one row per
   comment.

### ⚙️ Input

| Field | Notes |
|---|---|
| 🔗 `videoUrls` | TikTok video URLs or bare video IDs |
| 🔢 `maxCommentsPerVideo` | How many comments each summary is built from, and what you are billed on. Default **200** |
| 📄 `includeCommentRows` | Also return every analysed comment as a row. **On by default** — switching it off does not change the price |
| 🔢 `minLikes` | Analyse only comments above this like count. No default — off unless set |
| 🚧 `maxScanned` | How many comments a like filter may skip before stopping. Default **400** |

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@tiktok/video/7106594312292453675"
  ],
  "maxCommentsPerVideo": 200,
  "includeCommentRows": true
}
```

### 📄 Output example

One real row, captured from a live run over a 40-comment thread. The `comments`
array it carries is shown separately below.

```json
{
  "videoUrl": "https://www.tiktok.com/@khaby.lame/video/7670957230178503966",
  "videoAuthorHandle": "khaby.lame",
  "videoAuthorName": "Khabane lame",
  "commentsAnalysed": 40,
  "uniqueCommenters": 40,
  "questionCount": 3,
  "questionSharePct": 7.5,
  "purchaseIntentCount": 0,
  "purchaseIntentSharePct": 0,
  "topTerms": [{ "term": "sticker", "count": 14 }, { "term": "bro", "count": 4 }, { "term": "lame", "count": 3 }],
  "topPhrases": [{ "term": "mamá venció", "count": 2 }, { "term": "venció cáncer", "count": 2 }],
  "topQuestions": [{ "text": "Turkmen bamy?", "likesCount": 1337 }, { "text": "Azərbaycanlı var?", "likesCount": 296 }],
  "topPurchaseIntent": [],
  "topCommenters": [{ "handle": "toyotausa", "count": 1 }],
  "totalCommentLikes": 625911,
  "medianCommentLikes": 1738,
  "comments": [],
  "error": null
}
```

The same row carries the thread, which the **Comments** table unwinds into one
row each:

```json
  "comments": [
    {
      "commentText": "phew, we were waiting for you 😮‍💨",
      "authorHandle": "toyotausa",
      "authorDisplayName": "Toyota USA",
      "likesCount": 75250,
      "repliesCount": 123,
      "publishedAt": "2026-08-07T15:16:23.000Z"
    }
  ]
```

### ❓ Frequently asked questions

**Do I need a TikTok account?** No. No account, no cookies, no API key.

**Is this sentiment analysis?** No. Every figure is a count over the comment text,
and the comments each count was taken over come back with it.

**How is buying intent detected?** By looking for the things buyers actually
write — price, cost, link, discount, shipping, in stock, "where can I buy". The
five highest-liked matches are quoted in the summary row, so you can see what was
caught.

**Does it work in other languages?** Yes for terms and phrases, which are counted
as written. Languages written without spaces between words will not split into
terms, and the question and buying-intent keyword lists are English — though a
question mark is counted whatever the language.

**Can I get the raw comments too?** Yes, and they cost nothing extra — every
comment the analysis was built from is returned by default. Switching them off
makes the dataset smaller, not cheaper.

**What am I actually charged for?** Comments analysed, and nothing else. Set
**comments to analyse per video** and you know the bill before you run.

### 🏷️ Pricing

Pay per event — you are charged for output, not for platform time.

| Event | Price | Covers |
|---|---|---|
| 💬 `result` — **primary** | 💵 $0.0015 | One comment analysed. **The only charge this Actor makes** |
| ▶️ `apify-actor-start` | 💵 $0.00005 | Starting one run, charged once per GB of memory |
| 📊 The whole summary — every count, median and signal | ✅ **free** | On every video row |
| 📄 Every analysed comment as a row | ✅ **free** | Included, not an add-on |
| 🔎 Filtering | ✅ **free** | Comments your filter removes are not charged for |
| ❌ Videos that cannot be analysed | ✅ **free** | Reported, never charged |

**One event, one rate.** You are charged per comment analysed and for nothing
else — the price on the card is the price of the run.

#### 🏅 Rates by tier

The prices above are the standard rate. Higher Apify plans are billed at the
discounted tiers below, automatically:

| Event | FREE | BRONZE | SILVER | GOLD |
|---|---|---|---|---|
| 💬 `result` | 💵 $0.0015 | 💵 $0.0013 | 💵 $0.0011 | 💵 $0.0009 |
| ▶️ `apify-actor-start` | 💵 $0.00005 | 💵 $0.00005 | 💵 $0.00005 | 💵 $0.00005 |

#### 🛑 You are never billed past your limit

Set a maximum charge on the run and the Actor stops when it reaches it, with
every video summarised up to that point complete and saved. Comments your filter
removes are never billed, and neither is a video that returns nothing.

# Actor input Schema

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

Paste video links straight from the app or the web. Bare video IDs work too.

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

How many comments each summary is built from, and what the run is billed on. More comments means steadier themes; 200 is enough for most videos.

## `includeCommentRows` (type: `boolean`):

Returns each analysed comment as its own row so you can read the raw thread. <b>On by default.</b> You are charged per comment analysed either way, so switching this off does not reduce the price — it only makes the dataset smaller.

## `minLikes` (type: `integer`):

Analyse only comments with at least this many likes, to cut noise on very large threads.

## `maxScanned` (type: `integer`):

Only applies when a minimum like count is set. Caps how many comments the filter may reject before the Actor stops and returns what it found, so a very narrow filter cannot walk an entire thread. Comments it keeps do not count towards this.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@tiktok/video/7106594312292453675"
  ],
  "maxCommentsPerVideo": 200,
  "includeCommentRows": true,
  "maxScanned": 400
}
```

# Actor output Schema

## `insights` (type: `string`):

One row per video: themes, questions, buying signals and top commenters.

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

Every analysed comment as its own row, with the video it belongs to. Included on every run unless you switch the comment rows off.

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

// Run the Actor and wait for it to finish
const run = await client.actor("gatherworks/tiktok-comment-insights").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/@tiktok/video/7106594312292453675"] }

# Run the Actor and wait for it to finish
run = client.actor("gatherworks/tiktok-comment-insights").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/@tiktok/video/7106594312292453675"
  ]
}' |
apify call gatherworks/tiktok-comment-insights --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gatherworks/tiktok-comment-insights"
        }
    }
}

```

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/peVV7xxAdFJ0J2dBG/builds/fDTcBdOkStzHRHZ8x/openapi.json
