# Douyin 抖音 Video Stats Scraper: Comments & Profiles, No Login (`neverempty/douyin-scraper`) Actor

For brands, agencies and researchers watching China: paste Douyin (抖音) video links, get likes, comments, shares, saves, caption, hashtags and author followers per video, plus top comments, related videos and creator profile stats. No login. Monitoring returns only new comments. CSV, Excel, JSON.

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

## Pricing

from $5.30 / 1,000 video returneds

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 抖音 Video Stats Scraper: Comments & Profiles, No Login

**For brands, agencies and researchers watching the China market: paste Douyin (抖音) video links and get each video's likes, comments, shares, saves, caption, hashtags, posting time and the author's follower count in one table.** Add creator profile links to get followers, following, total likes and video count in bulk, turn on comments to get each video's top comments, or turn on related videos to collect the videos Douyin recommends next to yours. No login, no cookies, no API key. Export to CSV, Excel or JSON, or pull it through the Apify API.

- **Video stats in bulk** – one row per video with likes, comments, shares, saves, duration, cover and video URLs, sound, hashtags and the collection (合集) it belongs to.
- **Creator stats** – followers, following, total likes, number of posts, Douyin ID (抖音号), verification and IP location for every profile you list.
- **Top comments** – the comments Douyin shows first under each video, with likes, reply counts, pinned and liked-by-creator flags.
- **Related videos** – the recommendations next to each video, filtered by date and likes, so one link turns into a list of similar content.
- **Monitoring** – run it on a schedule and receive only comments and related videos you have not received before.
- **Runs that come back with data** – it reads the public pages a visitor sees, with no account to get blocked. In our test runs on 2026-10-14, 30 of 30 videos and 20 of 20 profiles returned full rows.

### What people use it for

- **Influencer vetting and campaign reports** – check the real like, share and save counts of a creator's posts and their follower count before or after a campaign.
- **Brand and product research in China** – track how videos about a product perform and what viewers say in the top comments.
- **Trend and content research** – start from one video and collect the related videos Douyin recommends, with their stats.
- **Competitor tracking** – schedule runs on competitors' videos and profiles and watch the counts change over time.

### How to scrape Douyin video data

1. Copy video links from Douyin (web `https://www.douyin.com/video/...` links, `v.douyin.com` share links from the app, or the numeric video id) into **Douyin video URLs**.
2. Optionally set **Maximum comments per video**, turn on **Scrape related videos**, or add **Douyin profile URLs**.
3. Click **Start**. Each video takes a few seconds; the table fills as it runs.
4. Download the results as CSV, Excel or JSON, or connect them to Google Sheets, Make, Zapier or your own code through the API.

### Input

| Field | What it does |
|---|---|
| `postURLs` | Douyin video links, share links, /note/ links or ids. One row per video. |
| `commentsPerPost` | Top comments to return per video (0 = none). |
| `scrapeRelatedVideos` / `resultsPerPage` | Also return up to this many related videos per video. Ads are never returned. |
| `oldestPostDateUnified` / `newestPostDate` | Only related videos and comments posted in this window (`2026-09-01` or `30 days`). |
| `leastDiggs` / `mostDiggs` | Only related videos within this like range. |
| `profiles` | Douyin profile links (`https://www.douyin.com/user/MS4wLjABAAAA...`) or sec_uids. One row per profile. |
| `monitoringMode` / `resetMonitoringState` | Return only comments and related videos not returned before. |

Example:

```json
{
  "postURLs": ["https://www.douyin.com/video/7577614489533680959"],
  "commentsPerPost": 10,
  "scrapeRelatedVideos": true,
  "resultsPerPage": 20,
  "profiles": ["https://www.douyin.com/user/MS4wLjABAAAAjjwfy25gmtDlk8Wg6FNIBzHdHicG6BpZZNvWoTLL8S4"]
}
```

### Output

Every row has `type` (`video`, `comment`, `profile` or `note`) and `status` (`ok` for data rows).

Video row (shortened):

```json
{
  "type": "video",
  "status": "ok",
  "videoId": "7577614489533680959",
  "url": "https://www.douyin.com/video/7577614489533680959",
  "text": "caption text #tag",
  "createTimeISO": "2025-11-28T09:00:00.000Z",
  "hashtags": ["tag"],
  "diggCount": 4064688,
  "commentCount": 163238,
  "shareCount": 5189794,
  "collectCount": 855172,
  "playCount": null,
  "durationSeconds": 1082.5,
  "coverUrl": "https://p3-pc-sign.douyinpic.com/...",
  "videoUrl": "https://v5-dy-....zjcdn.com/...",
  "musicTitle": "original sound",
  "authorNickname": "creator name",
  "authorDouyinId": "creatorid",
  "authorFollowerCount": 2275052,
  "authorProfileUrl": "https://www.douyin.com/user/MS4wLjABAAAA...",
  "relatedTo": null
}
```

Comment rows carry `commentId`, `videoId`, `text`, `createTimeISO`, `diggCount`, `replyCount`, `authorNickname`, `likedByCreator`, `isPinned` and `isHot`. Profile rows carry `nickname`, `douyinId`, `signature`, `followerCount`, `followingCount`, `totalLikes`, `videoCount`, `verification`, `isEnterprise`, `ipLocation` and `avatarUrl`.

### FAQ

**How do I get likes, comments and shares for a list of Douyin videos?**
Paste the video links into `postURLs` and run. Each link becomes one row with likes (`diggCount`), comments, shares and saves, plus the caption, hashtags, posting time and the author's follower count.

**Can I get the follower count of Douyin accounts in bulk?**
Yes. Put profile links (or sec_uids) into `profiles`. Each returns followers, following, total likes and number of posts.

**Do I need a Douyin account, cookies or an API key?**
No. The Actor reads the public Douyin web pages the way a visitor who is not logged in sees them.

**Can I watch a video for new comments?**
Yes. Turn on `monitoringMode`, set `commentsPerPost`, and schedule the run. Each run returns the video's current counts and only comments not returned before.

**Is there a Douyin API for video stats and comments?**
Yes. This Actor works as one: send video or profile links to the Apify API and get likes, comments, shares, saves, top comments and follower counts back as JSON. No Douyin developer account is needed.

**How do I export Douyin comments to Excel or CSV?**
Paste the video links, set `commentsPerPost`, run, and download the dataset as CSV or Excel. Each comment is its own row with its text, likes, reply count and posting time, next to the video row it belongs to.

**How do I track a Douyin influencer campaign?**
List the campaign videos in `postURLs` and the creators in `profiles`, turn on `monitoringMode` and schedule the run daily. Each run returns the videos' current likes, shares and saves and the creators' follower counts, so you get the numbers over time plus only the new comments.

**Does it work with share links from the Douyin app?**
Paste the `v.douyin.com` link and the Actor follows it to the video or profile. If a link cannot be followed, you get a free row that says so, and nothing is charged for it. Full `https://www.douyin.com/video/...` links always work.

### Rows that are never charged

Free rows tell you why something was not returned. They have `status` set to the reason and a `note`:

- `invalid-input` – not a Douyin link, or a filter value that cannot be read (the run reads nothing rather than guess).
- `duplicate` – the same video or profile was listed twice; it is read once.
- `no-such-video` / `no-such-profile` – deleted, private or mistyped.
- `no-answer` – Douyin sent no data for that item in two tries.
- `comments-ended` / `related-ended` – fewer comments or related videos were listed than you asked for; the note says how many.
- `no-new-comments` – monitoring found nothing new for that video.
- `verification-page` / `not-checked` – Douyin showed a verification page; the run stops there and lists what it did not read.

### Pricing

Pay per result: one charge per video row (including related videos), per comment row and per profile row. Free rows above are never charged. See the **Pricing** tab for the current prices.

### Monitoring mode

With `monitoringMode` on, the Actor remembers, per video, which comments and related videos it already returned. Later runs skip those and return only new ones, while the video row itself comes back every run with its current counts, so a schedule gives you a time series of each video's numbers plus new comments. `resetMonitoringState` clears the memory once.

### Good to know

- **Views:** Douyin's web pages do not show view counts, so `playCount` is `null` (never a made-up 0).
- **Comments:** Douyin shows visitors who are not logged in only the first comments of each video, usually about 10 to 15, ordered by Douyin's ranking. Asking for more returns those and a free `comments-ended` row with the count. Replies are not expanded.
- **Profiles:** a profile row gives the profile's own numbers. Douyin does not list a creator's videos to visitors who are not logged in, so the videos of a profile are read from the video links you provide.
- **Not included:** keyword search, hashtag pages and live streams. Douyin requires a login or a verification puzzle there, and this Actor does not log in or solve puzzles.
- **Media links:** `videoUrl`, `coverUrl` and `imageUrls` are signed by Douyin and expire after some hours; download them soon after the run.
- **Douyin ID only:** a bare Douyin ID (抖音号) cannot be opened without search; paste the profile link instead (in the app: profile, Share, Copy link).
- Contact details in profile bios and comments (emails, phone numbers) are replaced with `[email removed]` / `[phone removed]`. Comment rows carry only the commenter's display name.

### Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

- **Missing a field, or need another filter?** Tell us in the **Issues** tab. If the data is there, we add it.
- **Found a bug or a wrong value?** Post the run ID in the **Issues** tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.

# Actor input Schema

## `postURLs` (type: `array`):

Videos to read: https://www.douyin.com/video/7577614489533680959, a v.douyin.com share link, a /note/ (image post) link or the numeric video id. One per line. Each video returns one row with its likes, comments, shares, saves, caption, hashtags, author and follower count. Leave empty to read only profiles.

## `commentsPerPost` (type: `integer`):

How many comments to return for each video in postURLs, in the order Douyin shows them (top comments first). 0 = no comments. If Douyin lists fewer, a free row says how many came back.

## `scrapeRelatedVideos` (type: `boolean`):

On = for each video in postURLs, also return the videos Douyin recommends next to it (same columns as a video row, plus relatedTo = the video it was found on). Off (default) = only the videos you listed.

## `resultsPerPage` (type: `integer`):

With related videos on: at most this many related videos per video in postURLs. Ads are never returned.

## `oldestPostDateUnified` (type: `string`):

Optional. A date (2026-09-01, read as 00:00 UTC), a time (2026-09-01T12:00:00Z) or a number of days back (30 days). Older related videos and comments are skipped and not charged. The videos you list in postURLs are always returned.

## `newestPostDate` (type: `string`):

Optional. Same formats as the date above. Newer related videos and comments are skipped and not charged.

## `leastDiggs` (type: `integer`):

Optional. Related videos with fewer likes are skipped and not charged. Empty = no minimum.

## `mostDiggs` (type: `integer`):

Optional. Related videos with this many likes or more are skipped and not charged. Empty = no maximum.

## `profiles` (type: `array`):

Creators to read: https://www.douyin.com/user/MS4wLjABAAAA..., a v.douyin.com share link of a profile, or the sec_uid. One per line. Each returns one row with followers, following, total likes, video count, bio, Douyin ID and verification. Leave empty to skip profiles.

## `monitoringMode` (type: `boolean`):

Off = every run returns everything asked for. On = for each video, comments and related videos returned in an earlier run are skipped and not charged, so a schedule receives only new ones. The video rows and profile rows themselves are returned every run with their current counts. Remembered per video; do not put the same video in two schedules that can run at the same time.

## `resetMonitoringState` (type: `boolean`):

Clears everything remembered for every video, so the next monitoring run returns comments and related videos again as on a first run. Turn it off again after one run.

## Actor input object example

```json
{
  "postURLs": [
    "https://www.douyin.com/video/7577614489533680959"
  ],
  "commentsPerPost": 10,
  "scrapeRelatedVideos": false,
  "resultsPerPage": 20,
  "monitoringMode": false,
  "resetMonitoringState": false
}
```

# Actor output Schema

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

One row per Douyin video you listed (likes, comments, shares, saves, caption, hashtags, author and follower count), plus top comments, related videos and profile rows when asked. Videos or profiles that do not exist, verification pages and invalid input come back as free rows that say why.

# 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 = {
    "postURLs": [
        "https://www.douyin.com/video/7577614489533680959"
    ],
    "commentsPerPost": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/douyin-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 = {
    "postURLs": ["https://www.douyin.com/video/7577614489533680959"],
    "commentsPerPost": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("neverempty/douyin-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 '{
  "postURLs": [
    "https://www.douyin.com/video/7577614489533680959"
  ],
  "commentsPerPost": 10
}' |
apify call neverempty/douyin-scraper --silent --output-dataset

```

## MCP server setup

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