# Douyin Comments Scraper: 抖音评论 Likes, Authors, Translation (`quarra/douyin-comments-scraper`) Actor

Scrape Douyin comments (抖音评论) of videos: text, likes, reply count, date, location, author, images. Paste video links, v.douyin.com share links or IDs. Optional full English translation. No login.

- **URL**: https://apify.com/quarra/douyin-comments-scraper.md
- **Developed by:** [Quarra Labs](https://apify.com/quarra) (community)
- **Categories:** Social media, Videos, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 comments

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

## Douyin Comments Scraper (抖音评论)

Get the comments of Douyin (抖音) videos in bulk, without a Douyin account, cookies or API key. Paste video links,
share links from the app (the whole share text works), or video IDs; the run reads every page of comments Douyin
serves, removes the duplicates Douyin repeats from page to page, and delivers each comment with its author, likes,
reply count, region, images and stickers. Tick **Translate to English** to get an English translation next to each
Chinese comment. Export as JSON, CSV or Excel, or read it through the Apify API.

**$3 per 1,000 comments**, plus a small start fee per run. Videos that do not exist or are private, and inputs
that fail, are not charged.

### How deep it goes

Measured on 15 October 2026:

| Video | Comments delivered | Time |
|---|---|---|
| 7694982087456004346 (1,230 announced) | 757, every top-level comment Douyin serves, until Douyin says there are no more | 49 s |
| 5 popular videos read together, Max results 12,000 | 12,000 (2,207 to 2,538 per video) | 2 min 25 s |
| 7694661751569213608 (255,000 announced), Max comments per video 10,000 | 10,000, no duplicate, comments from 9 to 15 October | 8 min 41 s |

A video is read page after page, about 20 comments per second; the videos of a run are read several at a time.

The counter Douyin shows under a video also counts replies and comments it hides, so a video announcing 1,230
comments has fewer top-level comments to deliver. On large videos Douyin sometimes serves several pages in a row with
almost nothing new, then goes on: the run keeps reading through them instead of stopping early.

### Quick start

1. Paste one or more videos into **Douyin videos**, one per line.
2. Set **Max comments per video** (100 by default, up to 10,000).
3. Click **Start** and read the comments in the run's **Output** tab.

Like any Apify Actor, it can also be run and read through the Apify API, scheduled, and connected to webhooks, Make,
Zapier, n8n or Apify's MCP server for AI agents.

### Inputs

- **Douyin videos**: any of

  - a video link: `https://www.douyin.com/video/7694982087456004346`
  - a share link from the app: `https://v.douyin.com/…/`, or the whole share text (`7.92 复制打开抖音，看看【…的作品】 https://v.douyin.com/…/ …`)
  - a link with `?modal_id=7694982087456004346` (from the Douyin home or search page)
  - a photo post: `https://www.douyin.com/note/…`
  - the video ID alone: `7694982087456004346`

  Account pages, live rooms and search pages are not videos: they get an error record that says so, free.
- **Max comments per video**: in Douyin's order, the most relevant first.
- **Translate to English** (paid option, off by default): see below.
- **Max results**: total comments the run delivers, all videos together, counted exactly.
- Up to 2,000 videos per run; several are read at the same time.

Example, through the API:

```json
{
  "videoUrls": ["https://www.douyin.com/video/7692725411565972367", "7691170921935146278"],
  "maxCommentsPerVideo": 2000,
  "translateToEnglish": false,
  "maxItems": 10000
}
```

### Output

One record per comment. A real one, from 15 October 2026:

```json
{
  "type": "comment",
  "status": "ok",
  "commentId": "7694988601826214713",
  "videoId": "7692725411565972367",
  "videoUrl": "https://www.douyin.com/video/7692725411565972367",
  "text": "跟我表白吗宝宝[舔屏]",
  "createdAt": "2026-10-10T10:45:50Z",
  "likes": 74,
  "replies": 5,
  "isPinned": false,
  "isHot": true,
  "likedByAuthor": false,
  "byVideoAuthor": false,
  "ipLocation": "贵州",
  "authorId": "97876067709",
  "authorName": "串子二班 讲解石",
  "authorHandle": "Hyx0320_sotired",
  "authorUrl": "https://www.douyin.com/user/MS4wLjABAAAAhtXnApToTEcNJYotsSgPsZqyWWbnLH9AzMrJ7Uqsp1Y",
  "images": ["https://p26-sign.douyinpic.com/tos-cn-i-p14lwwcsbr/caad9e07133a4e1a8aebf171e15e51cb~tplv-p14lwwcsbr-7.image?…"],
  "stickerUrl": null,
  "mentions": [],
  "hashtags": [],
  "videoDescription": "巴提巴提#enhypen #bloodyparadise",
  "videoAuthorName": "哦哦^o（初心纯女）",
  "position": 19,
  "input": "7692725411565972367",
  "scrapedAt": "2026-10-15T00:46:44.636Z"
}
```

Fields that need a word of explanation:

- `replies` is the number of replies Douyin counts under the comment. The replies themselves are not delivered:
  Douyin only shows them to signed-in users.
- `position` is the comment's rank in Douyin's order for that video (1 = first shown).
- `isHot`: Douyin marks the comment as a hot comment. `likedByAuthor`: the video's author liked it. `byVideoAuthor`:
  the video's author wrote it.
- `ipLocation`: the province or country Douyin shows under the comment.
- `authorSecUid` (in `authorUrl`) is the stable ID of the account in Douyin links; `authorHandle` is the Douyin ID the
  user chose, and can change.
- `videoDescription` and `videoAuthorName` come from the video page; they are empty if Douyin did not serve it at
  that moment (the comments are delivered anyway).
- `status`: `ok` (delivered, charged). A video that does not exist or is private gets one `video` record with
  `status` `notFound` or `private`, free. An input that fails gets an `error` record, free: `error` says why,
  `retryable` says if a later run may work.
- **Image links expire**: comment images and stickers are signed links that Douyin keeps valid for about four days.
  Download what you need soon after the run, or read the video again later for fresh links.

The run summary (comments per input, notes, why the run stopped) is the `OUTPUT` record of the run's key-value store.

### English translation (optional)

Tick **Translate to English** (`translateToEnglish: true`) and every comment comes with its text in English, in a
`translation` field. The original stays in `text`, so you can check a phrase or quote it in Chinese. The translation
is made by a large language model, in full, never summarized.

- It is charged only when it is complete (`translationStatus: "ok"`). If it cannot be completed, you get the comment
  as usual, `translationStatus: "failed"` with the reason in `translationError`, and nothing is charged for the
  translation.
- Comments already in English, and comments with no text of their own (only an image or Douyin emoticons such as
  `[舔屏]`), are not translated and not charged (`translationStatus: "notNeeded"`).
- Names of people, brands and places can come out in more than one English spelling: when one matters, check it
  against the Chinese.
- Translations do not count toward **Max results**: 100 results means 100 comments, with their translations.

### Pricing

Pay per event:

| Event | Price |
|---|---|
| Comment | $3 per 1,000 |
| English translation (option) | $2.00 per 1,000 comments translated |
| Run start | $0.005 per GB of memory (1 GB minimum; $0.005 at the default 512 MB) |

Never charged: videos that do not exist or are private, error records, duplicates (a comment Douyin serves twice is
delivered once). Set **Maximum cost per run** in the run options and the run stops before going over it; with
Translate to English, a comment is delivered only if it fits with its translation.

### Limits

- The text of replies to comments: Douyin only shows it to signed-in users. You get each comment's reply count.
- Comments Douyin hides from visitors are not collected; the counter under a video includes them.

### FAQ

**Do I need a Douyin account or cookies?** No.

**Does it work with TikTok?** No, Douyin only (the Chinese app, douyin.com).

**What if the run is restarted by the platform (migration or reboot)?** It resumes where it was: comments already in
the dataset are not delivered or charged again, and the run reads on from there.

**Is it legal?** It collects public comments shown to any visitor of Douyin. Check the rules that apply to your use
of the data, especially for personal data. With Translate to English, the texts are sent to a language-model service
that does not keep them to train its models.

**Is anything different on Apify's free plan?** The English translation option is available on paid Apify plans only; on the free plan the run collects everything else as usual and charges nothing for translation.

**Does the Actor send anything to Quarra?** Only when a run fails or runs out of time: the Actor, its build, the error type, the line of our code where it happened, and the memory and time the run was given, so we can fix it fast. Never your input, your results, your account or the run ID.

# Actor input Schema

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

One per line: a video link (https://www.douyin.com/video/7694982087456004346), a share link from the app (https://v.douyin.com/…/, the whole share text works too), a link with ?modal_id=…, a photo post link (/note/…) or a video ID. Each video gets its comments up to 'Max comments per video'.

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

Comments per video, in Douyin's order (the most relevant first). Douyin serves every public top-level comment of a video; its comment counter also counts replies and hidden comments, so a video announced with 1,230 comments gave 757 (all of them, measured).

## `translateToEnglish` (type: `boolean`):

Add an English translation of each comment in a translation field next to the original (which is always kept). Paid option: $2 per 1,000 comments translated, on top of the comment. Charged only when the translation is complete; comments with only emoji, and comments already in English, are not translated and not charged. Available on paid Apify plans only.

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

Total number of comments delivered by the run, all videos together, counted exactly.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.douyin.com/video/7694982087456004346"
  ],
  "maxCommentsPerVideo": 50,
  "translateToEnglish": false,
  "maxItems": 50
}
```

# Actor output Schema

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

Every comment with all its fields, and free records for videos not found and errors.

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

A table with one row per comment.

## `summary` (type: `string`):

Counts per video, why the run stopped, and errors.

# 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.douyin.com/video/7694982087456004346"
    ],
    "maxCommentsPerVideo": 50,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("quarra/douyin-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.douyin.com/video/7694982087456004346"],
    "maxCommentsPerVideo": 50,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("quarra/douyin-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.douyin.com/video/7694982087456004346"
  ],
  "maxCommentsPerVideo": 50,
  "maxItems": 50
}' |
apify call quarra/douyin-comments-scraper --silent --output-dataset

```

## MCP server setup

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