# Douyin Scraper: Videos, Creators, Comments & Trends (`nice_dev/douyin-videos-scraper`) Actor

Scrape Douyin (Chinese TikTok) without an account: videos, creator profiles, comments and replies, related videos and trending topics, 210 fields. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/nice_dev/douyin-videos-scraper.md
- **Developed by:** [Nice Dev](https://apify.com/nice_dev) (community)
- **Categories:** Social media, Videos, MCP servers
- **Stats:** 4 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.51 / 1,000 videos

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

### 🎬 What is Douyin Scraper?

**Douyin Scraper** extracts **videos, photo posts, creators, comments with their replies, bullet comments (弹幕) and trending topics from [Douyin](https://www.douyin.com)** (抖音, the Chinese TikTok): description, hashtags, **likes, comments, shares and saves**, engagement rate, sound, tagged place, every video quality, and the creator's followers and verification — for influencer research, trend watching, social listening or content archives. It works as a **Douyin API alternative**: run it on a schedule, call it from your code, or plug it into Make, Zapier or n8n.

Paste a **video, creator, sound or collection link** (or the whole share text copied from the app), tick what you want next to it — comments, trending topics — click **Start**, and download the rows in JSON, CSV or Excel. No Douyin account, nothing to set up. Only the **keyword search** needs more: Douyin answers it to a logged-in account, so you give the cookie of your own account (a run that also reads links or creators then reads all of it with that account).

### 📋 What data can you extract from Douyin?

One item per row — a video or photo post, a creator, a comment or reply, a bullet comment or a trending topic — 211 fields:

| Category                              | What you get                                                                                                                                                                                                 |
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 🎬 **Video**                          | description, link, publication date, length, post type (video or photo post), pinned or not, AI-generated label — `《夏天的心动》-你的第一次心动是什么时候？`                                                |
| 📊 **Engagement**                     | likes, comments, shares, saves, recommendations, number of bullet comments, and the **engagement rate** against the author's followers — `60,954 likes · 1,081 comments · 8,491 shares`                      |
| #️⃣ **Hashtags and categories**        | hashtags (with their Douyin id), tagged accounts, Douyin's own content categories on 3 levels, chapters of a long video, the searches Douyin suggests under the video                                        |
| 🖼️ **Media**                          | cover, every video stream (quality, size, bit rate, codec, resolution), the images of a photo post, when the signed links stop working, and — with the file options — a lasting copy of the MP4 or the cover |
| 🎵 **Sound**                          | title, author, length, original or licensed music, link, who uploaded it                                                                                                                                     |
| 📍 **Place, collection, shop**        | the place tagged on the video (name, address, city, coordinates), the collection or series it belongs to (episode, size), the products and anchors linked to it                                              |
| 👤 **Creator of each video**          | nickname, Douyin ID, followers, total likes, verification, bio — and, with the option, province (IP location), video count, following, gender, age, school, live status                                      |
| 🪪 **Creator profile rows**           | bio, followers, following, total likes, video count, province (IP location), gender, age, verification, live status, QR code, linked Instagram, X and YouTube accounts, shop flag                            |
| 📈 **Creator statistics (optional)**  | average and median likes, comments, shares and saves per video, average engagement rate, videos per week, date of the latest video                                                                           |
| 📇 **Contacts in the bio (optional)** | the e-mail addresses, phone numbers and WeChat IDs the creator wrote in the bio                                                                                                                              |
| 💬 **Comments and replies**           | text, likes, number of replies, date, the commenter (nickname, province), hot, pinned and liked-by-author marks, pictures — `当我意识到这样的瞬间这辈子都不会再有了`                                         |
| 🗨️ **Bullet comments (弹幕)**         | text, the moment of the video it appears at, likes, author id                                                                                                                                                |
| 🔥 **Trending topics**                | rank, topic, heat value, label (new, hot, exclusive…), number of videos, since when it trends, lead video and cover — `小鹏正式宣布对外卖技术 · 12,297,060`                                                  |
| 🔗 **Where it comes from**            | the link, keyword or board that found it, its rank in that source, the video a related video was suggested under                                                                                             |

Every field, with an example, is listed in the **Output** section below. The `type` column says which kind of row it is: `video`, `profile`, `comment`, `trend` or `danmaku`; a column that belongs to another kind of row is empty.

### ✅ Why use Douyin Scraper?

- 🧩 **All of Douyin in one Actor**: videos, photo posts, creators, sounds, collections, comments with replies, bullet comments and the trending boards — combined in one run, each kind of row in its own place of the dataset.
- 🔓 **No Douyin account** for everything except the keyword search, which uses the cookie of YOUR account (in a run that also has other sources, the whole run is read with that account): it is a secret field, used for reading only, never saved in the dataset or the log.
- 📎 **Paste anything**: video, photo-post, creator, sound and collection links, short share links, the share text copied from the app, or bare ids — each one is read for what it is.
- 📊 **More than counts**: engagement rate, 3-level categories, hashtags with their id, tagged place, chapters, linked products, sound details, every stream quality, and the province Douyin shows for creators and commenters.
- 💾 **Keep the files**: Douyin's video and image links stop working after a few hours — tick the file options to keep a lasting copy of the MP4 or the cover.
- 🔔 **Monitoring built in**: tick **Only new results**, schedule the Actor, and each run returns (and charges) only the videos and comments it has never delivered before.
- 📅 **Filters**: dates, words, likes, comments, shares, length, post type, author followers, verified authors — filtered-out videos are not saved and never count in **Max results**.
- 🔌 API, scheduling, monitoring, integrations (Make, Zapier, n8n, Google Sheets…), proxy rotation and JSON/CSV/Excel export via the Apify platform.

### 🚀 How to scrape Douyin

1. Create a free Apify account.
2. Open **Douyin Scraper** and paste links into **Video URLs** (videos, photo posts, short share links) or **Creator profile URLs**; or add **Sound URLs** and **Collection URLs**, or tick **Scrape trending topics**.
3. Tick what you want on top: **Scrape comments** (and **Include replies**), **Scrape bullet comments (弹幕)**, **Creator profile rows**, related videos.
4. For a keyword search, type the **Search keyword** and paste **Your Douyin session cookie** (see the tip below). Without the cookie the keywords are skipped, the run says so, and the other sources still run.
5. Set **Max results** (100 by default, 0 = no limit) — and **Max results per source** when you combine several sources — then click **Start**, and download the dataset in JSON, CSV, Excel or via API.

### 💰 How much does it cost to scrape Douyin?

This Actor uses **pay per event** pricing: you pay for the rows saved, each kind of row at its own price, plus a small fee per run start. Prices per 1,000 events, by Apify plan:

| What you pay for                                                                                                                                                                                        | Event               | Free               | Bronze             | Silver             | Gold               |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | ------------------ | ------------------ | ------------------ | ------------------ |
| Video or photo post (a creator's, a sound's or a collection's video, a related video, a search result, the lead video of a trending topic)                                                              | `video`             | **$0.54** | $0.53 | $0.52 | $0.51 |
| Creator profile row (**Creator profile rows**, or a keyword search for creators)                                                                                                                        | `profile`           | **$1.69**          | $1.39              | $1.19              | $0.99              |
| Comment or reply (**Scrape comments**)                                                                                                                                                                  | `comment`           | **$0.45** | $0.43 | $0.39 | $0.34 |
| Bullet comment (**Scrape bullet comments (弹幕)**)                                                                                                                                                      | `danmaku`           | **$1.79**          | $1.78              | $1.77              | $1.39              |
| Trending topic (**Scrape trending topics**)                                                                                                                                                             | `trend`             | **$0.36**          | $0.35              | $0.34              | $0.33              |
| Full author profile added to a video row, only with **Full author profile on each video** (once per video row completed)                                                                                | `author-profile`    | **$0.45**          | $0.44              | $0.43              | $0.42              |
| Statistics added to a creator profile row, only with **Creator statistics** (once per profile row completed)                                                                                            | `account-stats`     | **$2.69**          | $2.68              | $2.67              | $2.66              |
| Contacts found in a creator's bio, only with **Contacts written in the bio** (once per profile row with at least one contact)                                                                           | `bio-contact`       | **$2.59**          | $2.58              | $2.57              | $2.56              |
| Video file saved, only with **Download video files (MP4)** (once per started 5 MB of the file: a 3 MB video = 1, a 12 MB video = 3; a photo post: all its images together; `videoFileMb` says the size) | `video-file`        | **$0.81**          | $0.80              | $0.79              | $0.78              |
| Cover image saved, only with **Download cover images** (once per video)                                                                                                                                 | `cover-file`        | **$0.45**          | $0.44              | $0.43              | $0.42              |
| Video checked by one of the Actor's own filters, kept or dropped                                                                                                                                        | `filter-check`      | **$0.103**         | $0.093             | $0.083             | $0.073             |
| Run start (counted once per GB of memory: 2 GB by default, so 2 events per run)                                                                                                                      | `apify-actor-start` | $0.02 per GB, each | $0.02 per GB, each | $0.02 per GB, each | $0.02 per GB, each |

Examples on the Free plan: 100 videos of a creator, no option ≈ **$0.09** (100 × $0.00054 + $0.04 start at 2 GB). A daily check of 10 creators that brings about 50 new videos a day ≈ **$2.01 a month** (1,500 videos + 30 run starts at 2 GB). Saving the MP4 of a short video (under 5 MB) adds $0.00081 per video.

The five options (full author profile, creator statistics, contacts in the bio, video files, cover images) and the extra kinds of row (creator profile rows, comments and replies, bullet comments, trending topics) are all off by default: nothing is charged for them unless you tick them. The engagement rate is free. The filters Douyin does not apply itself (dates, words, likes, comments, shares, length, post type, author followers, verified authors) are checked by the Actor on every video it reads: each check is charged as `filter-check`, and a video you keep also pays its video price. Platform usage (compute, proxy) is included in the price.

### ⚙️ Input

```json
{
    "profileUrls": ["https://www.douyin.com/user/MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM"],
    "maxVideosPerProfile": 50,
    "includeProfileRows": true,
    "maxItems": 100
}
```

A video with its comments and replies, and the trending topics:

```json
{
    "videoUrls": ["https://www.douyin.com/video/7682152870929567026"],
    "includeComments": true,
    "maxCommentsPerVideo": 100,
    "includeReplies": true,
    "maxRepliesPerComment": 5,
    "includeTrends": true,
    "trendBoards": ["hot", "society"],
    "maxItems": 500
}
```

Only the new videos of a creator, recent ones, checked every day:

```json
{
    "profileUrls": ["https://www.douyin.com/user/MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM"],
    "maxVideosPerProfile": 100,
    "postedAfter": "7 days",
    "onlyNew": true,
    "stateKey": "brand-watch"
}
```

Keyword search with the cookie of your own account:

```json
{
    "searchQueries": ["咖啡", "iPhone 17"],
    "sessionCookie": "sessionid=abc123; ttwid=xyz789",
    "searchSort": "latest",
    "searchPublishTime": "week",
    "maxItemsPerQuery": 100,
    "maxItems": 500
}
```

| Field                                                                              | Notes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `videoUrls`                                                                        | Video or photo-post links (`https://www.douyin.com/video/7682152870929567026`), short share links, the whole share text copied from the app, or bare video ids (17 to 20 digits). Each link is read for what it is: a creator link pasted here is read as a creator.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `profileUrls`                                                                      | Creator pages (`https://www.douyin.com/user/MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM`), share links of a profile, or a bare id: the long sec_uid of the page address, or the numeric uid (`63163250759`). The Douyin ID (the short name under the nickname) is refused by Douyin.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| `maxVideosPerProfile`                                                              | Videos read for EACH creator, newest first (`0` = no video rows, the profile row only). Douyin shows a visitor without an account the first page of a creator's videos only, about 44 (see *Known limitations*).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| `includeProfileRows`, `skipPinned`                                                 | One row per creator (bio, followers, likes, video count, province, verification, live status…); leave out the videos the creator pinned at the top of the profile. Both off by default.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| `includeAuthorProfiles`, `includeAccountStats`, `includeBioContacts`               | Options, off by default and charged apart. Full author profile on each video row (province, video count, following, gender, age, school, live status; one request per author); statistics over the creator's latest 36 videos on each profile row (a visitor without an account gets the first page only, about 44, enough for the 36); e-mail addresses, phone numbers and WeChat IDs written in the bio of each profile row. The last two work on profile rows only.                                                                                                                                                                                                                                                                                                                                                 |
| `maxRelatedPerVideo`                                                               | For each video of the video list, also the videos Douyin recommends next to it, up to this many (`0` = off). Each one is a video row.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `musicUrls`                                                                        | Sound pages (`https://www.douyin.com/music/7561006047303010321`), share links of a sound, or bare sound ids: the videos made with the sound.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `maxVideosPerMusic`                                                                | Videos read for EACH sound.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `collectionUrls`                                                                   | Collection pages (`https://www.douyin.com/collection/7673031667082070079`), share links of a collection, or bare collection ids: the videos of the collection, in its order.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `maxVideosPerCollection`                                                           | Videos read for EACH collection.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| `includeComments`, `maxCommentsPerVideo`, `includeReplies`, `maxRepliesPerComment` | Comments of every video the run delivers (Douyin's own order, hot first; `maxCommentsPerVideo` 0 = all of them) and, when ticked, the replies under each comment. Each comment and each reply is a row of its own.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| `includeDanmaku`, `maxDanmakuPerVideo`                                             | The bullet comments (弹幕) of every video the run delivers, up to the maximum for each video. Each one is a row of its own.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `includeTrends`, `trendBoards`, `trendVideos`                                      | Douyin's trending topics: `hot` (the main board), `entertainment`, `society` and `challenge`. `trendVideos` also delivers the lead video of each topic as a video row.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| `query`, `searchQueries`                                                           | Keywords, as typed in the Douyin app, in Chinese or not (`咖啡`, `iPhone 17`); `searchQueries` adds more, one search each. They need `sessionCookie`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `sessionCookie`                                                                    | The cookie of your own logged-in douyin.com tab, copied whole (`sessionid=abc123; ttwid=xyz789`), or at least its sessionid part. Needed for keyword search only; a secret field.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `searchType`                                                                       | `videos` (one video row per result) or `creators` (one profile row per account found).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| `searchSort`                                                                       | Douyin's own sort of the results: `relevance`, `most-liked` or `latest`. Videos search only.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `searchPublishTime`                                                                | Douyin's own date filter of the search: `any`, `day`, `week` or `half-year`. Videos search only.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| `searchDuration`                                                                   | Douyin's own length filter of the search: `any`, `under-1-min`, `1-5-min` or `over-5-min`. Videos search only.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `maxItems`, `maxItemsPerQuery`                                                     | Stop after this many rows for the whole run, all kinds together / for each source (a creator, a sound, a collection, a keyword, a board, a pasted video with its comments); `0` = unlimited.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `downloadVideos`, `downloadCovers`, `maxVideoFileMb`                               | Keep a lasting copy in the run's key-value store: the MP4 (the smallest stream of at least 720p, H.264 first, without the Douyin watermark when Douyin serves one; photo posts: every image) and the cover image of each delivered video. Off by default and charged apart. When that stream is larger than **Max video file size** (100 MB by default), the best smaller stream Douyin offers is kept instead (highest resolution first, H.264 before H.265); when none fits, the video is not downloaded, the row says why and nothing is charged for the file. The video file is charged once per started 5 MB of the file saved (a 3 MB video = 1 **Video file** event, a 12 MB video = 3; the Video file size column gives its size), so a larger **Max video file size** raises the most a single file can cost. |
| `postedAfter`, `postedBefore`                                                      | Publication date range: `2026-09-01`, or a period before now (`7 days`, `2 weeks`, `1 month`).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `excludeKeywords`, `includeKeywords`                                               | Drop the videos whose description, title or hashtags contain one of these words / keep only the videos that contain at least one (case and accents ignored).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `minLikes`, `minComments`, `minShares`                                             | Only videos with at least this many likes, comments or shares.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `minDurationSeconds`, `maxDurationSeconds`                                         | Only videos at least / at most this long (photo posts have no length and are dropped when a length is set).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `mediaType`                                                                        | Post type: `all`, `video` (videos only) or `images` (photo posts only).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| `minAuthorFollowers`, `maxAuthorFollowers`, `verifiedOnly`                         | Only videos whose author has at least / at most this many followers (micro-influencer search), or carries a Douyin verification badge. The Actor reads each author's profile once for these.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `onlyNew`, `stateKey`, `resetState`                                                | Monitoring: only the videos, comments and bullet comments never delivered under this memory key (for example `brand-watch`); `resetState` forgets the memory.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| Advanced                                                                           | `proxyConfiguration` (Apify proxy by default, included in the price; the residential proxy is not available), `maxConcurrency`, `maxRequestsPerMinute`, `minRequestIntervalMs`, `maxRequestRetries`, `debugLog`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |

### 📦 Output

A video (shortened: empty fields left out and the signed links cut):

```json
{
    "type": "video",
    "id": "7682152870929567026",
    "url": "https://www.douyin.com/video/7682152870929567026",
    "source": "video-url",
    "sourceInput": "https://www.douyin.com/video/7682152870929567026",
    "position": 1,
    "scrapedAt": "2026-10-15T12:00:00.000Z",
    "description": "《夏天的心动》-你的第一次心动是什么时候？你是否还记得让你心动的那个人？#校园 #暗恋 #青春",
    "createTime": 1788651000,
    "createTimeIso": "2026-09-05T23:30:00.000Z",
    "mediaType": "video",
    "awemeType": 0,
    "isPinned": false,
    "durationMs": 247363,
    "durationSeconds": 247.4,
    "likeCount": 60954,
    "commentCount": 1081,
    "shareCount": 8491,
    "collectCount": 6965,
    "danmakuCount": 358,
    "engagementRate": 0.6927,
    "hashtags": [
        { "name": "校园", "id": "1767587367750663" },
        { "name": "暗恋", "id": "1575530906796046" }
    ],
    "hashtagNames": ["校园", "暗恋"],
    "mentions": [],
    "categories": [
        { "level": 1, "id": 2025, "name": "剧情演绎" },
        { "level": 2, "id": 2025003, "name": "剧情" }
    ],
    "category": "剧情演绎",
    "subCategory": "剧情",
    "chapters": [],
    "suggestedSearches": ["夏天的心动全集", "夏天的心动评分多少"],
    "mixId": "7673031667082070079",
    "mixName": "青春的第N节课",
    "mixEpisode": 4,
    "mixVideoCount": 12,
    "coverUrl": "https://p3-pc-sign.douyinpic.com/image-cut-tos-priv/…",
    "videoUrl": "https://v5-dy-ov-experiment.zjcdn.com/…",
    "videoWidth": 3840,
    "videoHeight": 2160,
    "videoSizeBytes": 36614801,
    "bitRates": [
        {
            "quality": "normal_1080_0",
            "bitRate": 1184164,
            "width": 1920,
            "height": 1080,
            "fps": 30,
            "codec": "h264",
            "sizeBytes": 36614801,
            "url": "https://v5-dy-ov-experiment.zjcdn.com/…"
        }
    ],
    "images": [],
    "cdnUrlExpiresAt": "2026-10-15T05:46:06.000Z",
    "isAiGenerated": false,
    "anchors": [],
    "products": [],
    "musicId": "7682152908917312275",
    "musicTitle": "@林苏记创作的原声",
    "musicAuthor": "林苏记",
    "authorId": "942738897652219",
    "authorSecUid": "MS4wLjABAAAAFnjcoKWYQPDcHMD2mikJ23gcYJXWVYSdLMlFqMYW27w",
    "authorNickname": "林苏记",
    "authorUrl": "https://www.douyin.com/user/MS4wLjABAAAAFnjcoKWYQPDcHMD2mikJ23gcYJXWVYSdLMlFqMYW27w",
    "authorFollowerCount": 111875,
    "authorVerified": null,
    "bioEmails": [],
    "bioPhones": [],
    "bioWechatIds": [],
    "commentImages": []
}
```

You can download the dataset in various formats such as JSON, HTML, CSV or Excel.

#### The other kinds of row

The same columns carry the other kinds of row; the columns of another kind stay empty. Shortened examples:

```jsonc
// type: "profile" (Creator profile rows)
{
    "type": "profile",
    "id": "MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM",
    "url": "https://www.douyin.com/user/MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM",
    "uid": "63163250759",
    "uniqueId": "Oct_yooz",
    "nickname": "由嘉郁¹⁰¹⁹（10月19生日版）",
    "followerCount": 380471,
    "followingCount": 453,
    "totalFavorited": 4058511,
    "videoCount": 39,
    "ipLocation": "辽宁",
    "verified": false,
}
```

```jsonc
// type: "comment" (a comment, or a reply with isReply: true)
{
    "type": "comment",
    "id": "7681155207737230117",
    "url": "https://www.douyin.com/video/7682152870929567026",
    "videoId": "7682152870929567026",
    "text": "当我意识到这样的瞬间这辈子都不会再有了[泣不成声]",
    "createTimeIso": "2026-09-03T04:05:12.000Z",
    "likeCount": 14869,
    "replyCount": 178,
    "isReply": false,
    "isHot": true,
    "authorNickname": "哈哈",
    "authorIpLocation": "浙江",
}
```

```jsonc
// type: "trend" (a trending topic)
{
    "type": "trend",
    "id": "trend:hot:2694823",
    "trendBoard": "hot",
    "position": 1,
    "word": "小鹏正式宣布对外卖技术",
    "hotValue": 12297060,
    "trendLabel": "hot",
    "trendVideoCount": 3,
    "trendingSince": "2026-10-14T06:03:03.000Z",
}
```

```jsonc
// type: "danmaku" (a bullet comment)
{
    "type": "danmaku",
    "id": "danmaku:7669598344973714227",
    "videoId": "7682152870929567026",
    "text": "好像宋雨琦",
    "offsetMs": 32071,
    "likeCount": 4,
}
```

#### All 211 fields

| Fields                                                                                                                                                                                                                                                             | What you get                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `type`, `id`, `url`, `source`, `sourceInput`, `position`, `scrapedAt`                                                                                                                                                                                              | **Row**: its kind (`video`, `profile`, `comment`, `trend` or `danmaku`); the video id, the creator's sec_uid, the comment id, `trend:<board>:<topic id>` or `danmaku:<id>` (unique per row); its Douyin page; where it comes from (`video-url`, `profile`, `search`, `music`, `collection`, `trend`, `trend-video`, `related`, `comments`, `danmaku`); the link, keyword or board you gave; its rank in that source (1 = first); ISO timestamp                         |
| `title`, `description`, `createTime`, `createTimeIso`, `shareUrl`, `mediaType`, `awemeType`, `isPinned`, `isAd`, `isStory`, `isOriginal`                                                                                                                           | **Video**: title (long videos), caption with its hashtags, publication time (Unix seconds and ISO — what the date filters read), share link, `video` or `images`, Douyin's post code, pinned at the top of the creator page, ad, story and original marks                                                                                                                                                                                                              |
| `durationMs`, `durationSeconds`                                                                                                                                                                                                                                    | length in milliseconds and seconds (empty for a photo post)                                                                                                                                                                                                                                                                                                                                                                                                            |
| `likeCount`, `commentCount`, `shareCount`, `collectCount`, `recommendCount`, `admireCount`, `danmakuCount`, `engagementRate`                                                                                                                                       | **Engagement**: likes (of a video, a comment or a bullet comment), comments, shares, saves, recommendations to friends, admires, number of bullet comments; the engagement rate = (likes + comments + shares + saves) ÷ the author's followers, 4 decimals, empty when the followers are not known. Douyin gives no view count on the web                                                                                                                              |
| `hashtags`, `hashtagNames`, `mentions`, `categories`, `category`, `subCategory`, `chapters`, `suggestedSearches`, `region`                                                                                                                                         | **Hashtags and categories**: hashtags with their id and names alone, tagged accounts, Douyin's content categories on 3 levels and the first two names, chapters of a long video, suggested searches, region code                                                                                                                                                                                                                                                       |
| `poiId`, `poiName`, `poiAddress`, `poiLatitude`, `poiLongitude`, `poiCity`, `poiCityCode`, `poiDistrict`, `poiProvince`, `poiCountry`                                                                                                                              | **Place** tagged on the video: id, name, address, coordinates, city, district, province, country                                                                                                                                                                                                                                                                                                                                                                       |
| `mixId`, `mixName`, `mixEpisode`, `mixVideoCount`, `seriesId`, `seriesName`                                                                                                                                                                                        | **Collection and series** the video belongs to: id, name, episode, number of videos; paid series                                                                                                                                                                                                                                                                                                                                                                       |
| `allowDownload`, `allowDuet`, `allowStitch`, `allowComment`, `allowShare`, `allowReact`, `allowMusic`                                                                                                                                                              | what the author allows: download, duet, stitch, comments, sharing, reactions, reuse of the sound                                                                                                                                                                                                                                                                                                                                                                       |
| `coverUrl`, `originCoverUrl`, `dynamicCoverUrl`, `videoUrl`, `videoWidth`, `videoHeight`, `videoFormat`, `videoSizeBytes`, `isLongVideo`, `bitRates`, `images`, `imageCount`                                                                                       | **Media**: covers (normal, original size, animated), the playable MP4 (signed link), its size and format, long-video flag, every stream Douyin offers (quality, bit rate, size, codec, link), the images of a photo post and their number                                                                                                                                                                                                                              |
| `playUrlH264`, `playUrlH265`, `downloadUrl`, `cdnUrlExpiresAt`, `hasWatermark`, `isHdr`, `horizontalType`                                                                                                                                                          | the main stream in H.264 and H.265, the download stream with the Douyin watermark when the author allows downloads, when the signed links stop working (ISO), watermark and HDR marks, orientation code                                                                                                                                                                                                                                                                |
| `videoFileUrl`, `videoFileMb`, `coverFileUrl`, `fileError`                                                                                                                                                                                                         | **Files** (file options): the lasting link to the saved MP4 and its size in MB (the Video file price is per started 5 MB), the cover in the run's key-value store, and why a requested file was not saved (too large, link expired…)                                                                                                                                                                                                                                   |
| `isAiGenerated`, `ocrText`, `shareTitle`, `shareDescription`                                                                                                                                                                                                       | marked AI-generated by Douyin, the text Douyin read on the video frames (when it gives it), the title and text shown when the video is shared                                                                                                                                                                                                                                                                                                                          |
| `isPrivate`, `isInReview`, `isProhibited`, `isLifeItem`, `isDuetSing`, `isImageBeat`, `crossPostedToXigua`                                                                                                                                                         | status marks: visible to the author or friends only, under review, restricted, local-life post, karaoke duet, photo slideshow to music, also on Xigua Video                                                                                                                                                                                                                                                                                                            |
| `anchors`, `products`, `hasProducts`                                                                                                                                                                                                                               | **Shop**: anchors shown on the video (game, app, place, mini-program) and the Douyin Shop products linked to it (id, title, price, link)                                                                                                                                                                                                                                                                                                                               |
| `relatedTo`                                                                                                                                                                                                                                                        | for a related video: the id of the video it was suggested under                                                                                                                                                                                                                                                                                                                                                                                                        |
| `musicId`, `musicTitle`, `musicAuthor`, `musicDurationSeconds`, `musicIsOriginal`, `musicIsCommercial`, `musicAlbum`, `musicUrl`, `musicCoverUrl`, `musicOwnerId`, `musicOwnerNickname`, `musicOwnerHandle`, `musicOwnerSecUid`, `musicIsPgc`, `musicCollectCount` | **Sound**: id, title, author, length, original or licensed, album, MP3, cover, the account that uploaded it (id, nickname, Douyin ID, sec_uid), professionally produced or not, times saved                                                                                                                                                                                                                                                                            |
| `authorId`, `authorSecUid`, `authorUniqueId`, `authorNickname`, `authorUrl`, `authorAvatarUrl`, `authorSignature`, `authorFollowerCount`, `authorTotalFavorited`, `authorVerified`, `authorVerificationType`, `authorVerifyReason`                                 | **Creator of the video** (of the comment on a comment row, of the bullet comment on a bullet comment row): numeric uid, sec_uid, Douyin ID, nickname, profile page, avatar, bio, followers, total likes, verification badge, type and text. Followers, total likes and badge are read from the creator's profile: they are empty (`null`, never 0 or false) on a video link, a sound or a collection unless **Full author profile** or one of the author filters is on |
| `authorIpLocation`, `authorVideoCount`, `authorFollowingCount`, `authorGender`, `authorAge`, `authorSchool`, `authorIsLive`                                                                                                                                        | **Full author profile** (option): province or country Douyin shows, video count, following, gender, age, school, live status. On a comment row `authorIpLocation` is the commenter's province, always given                                                                                                                                                                                                                                                            |
| `uid`, `secUid`, `uniqueId`, `nickname`, `signature`, `avatarUrl`, `bannerUrl`                                                                                                                                                                                     | **Creator profile row**: numeric uid, sec_uid, Douyin ID, nickname, bio, avatar, header image                                                                                                                                                                                                                                                                                                                                                                          |
| `bioEmails`, `bioPhones`, `bioWechatIds`                                                                                                                                                                                                                           | **Contacts in the bio** (option): the e-mail addresses, phone numbers and WeChat IDs written in the bio; empty lists on other rows and when the option is off                                                                                                                                                                                                                                                                                                          |
| `followerCount`, `followingCount`, `totalFavorited`, `videoCount`, `favoritingCount`                                                                                                                                                                               | the creator's counts: followers, following, likes received, videos posted, videos liked (when public)                                                                                                                                                                                                                                                                                                                                                                  |
| `ipLocation`, `gender`, `age`, `country`, `province`, `city`, `schoolName`                                                                                                                                                                                         | where and who: the province or country Douyin shows (IP location), gender (`male`, `female` or empty), age shown on the profile, country, province, city, school                                                                                                                                                                                                                                                                                                       |
| `verified`, `verificationType`, `verifyReason`, `isLive`, `liveRoomId`, `mixCount`, `seriesCount`, `isStar`, `profileShareUrl`, `qrCodeUrl`                                                                                                                        | verification badge, its type and text, streaming live when read and the live room, number of collections and paid series, star account, share link and QR code of the profile                                                                                                                                                                                                                                                                                          |
| `instagramId`, `twitterName`, `youtubeChannelId`, `youtubeChannelTitle`, `hasShop`, `commerceLevel`, `publicCollectsCount`, `isGovMedia`, `isOriginalMusician`                                                                                                     | **Linked accounts and badges**: Instagram, X and YouTube accounts shown on the profile, shop tab, commerce level, public saved-videos count, government or media account, original-musician badge                                                                                                                                                                                                                                                                      |
| `statsVideoCount`, `avgLikes`, `medianLikes`, `avgComments`, `avgShares`, `avgSaves`, `avgEngagementRate`, `videosPerWeek`, `lastVideoAt`                                                                                                                          | **Creator statistics** (option, on profile rows): how many videos they rest on, average and median likes, average comments, shares and saves, average engagement rate, videos per week, date of the latest video that is not pinned                                                                                                                                                                                                                                    |
| `videoId`, `text`, `replyCount`, `isReply`, `parentCommentId`, `replyToCommentId`, `isHot`, `isAuthorLiked`, `isPinnedComment`, `commentLabel`, `commentImages`, `videoCommentTotal`                                                                               | **Comment, reply or bullet comment**: the video it is under, its text, number of replies, reply or not and the comment it answers, hot, liked by the video author, pinned by the author, Douyin's label (author, friend…), attached pictures, total comments Douyin announces for the video                                                                                                                                                                            |
| `offsetMs`                                                                                                                                                                                                                                                         | **Bullet comment**: the moment of the video, in milliseconds, at which it appears on screen                                                                                                                                                                                                                                                                                                                                                                            |
| `trendBoard`, `word`, `hotValue`, `trendLabel`, `trendVideoCount`, `discussVideoCount`, `trendingSince`                                                                                                                                                            | **Trending topic**: the board (`hot`, `entertainment`, `society` or `challenge`), the topic, its heat value, label (new, hot, exclusive, rising…), videos grouped under it and videos discussing it, since when it trends                                                                                                                                                                                                                                              |
| `topVideoId`, `topVideoUrl`, `trendCoverUrl`, `sentenceId`, `trendWordType`, `trendSentenceTag`, `articleCount`, `boardUpdatedAt`, `isRisingTopic`                                                                                                                 | the lead video of the topic, its cover, Douyin's topic id, word type and topic family codes, articles grouped under it, when the board was refreshed, and whether it comes from the rising list under the board                                                                                                                                                                                                                                                        |

### 💡 Tips

#### How to get more results

Raise **Max results** (`maxItems`, 0 = no limit) and **Max videos per creator** (`maxVideosPerProfile`). Combine creators, sounds, collections and keywords in one run, and set `maxItemsPerQuery` so that one big source does not use up the whole budget. **Max results** counts every row — videos, profile rows, comments, bullet comments and topics together — so a run that asks for the comments of 10 videos needs a **Max results** large enough for them all.

#### How to reduce costs

The price is per row, so the levers are `maxItems`, `maxItemsPerQuery`, the number of comments, replies and bullet comments per video, the filters (a video a filter checks costs only the filter fee when it is dropped) and `onlyNew` for recurring runs (you never pay twice for the same video or comment). The profile rows, the comments, the bullet comments, the trending topics and the five options are off by default: tick only what you need. A comment, a reply and a bullet comment are rows like a video, each at its own price.

#### Several sources in one run

Fill `videoUrls`, `profileUrls`, `musicUrls`, `collectionUrls`, `searchQueries` and `includeTrends` together: each link, keyword and board is a source of its own. A video found by several sources is saved — and charged — once. Comments, bullet comments, related videos and files apply to every video the run delivers, whatever source it comes from. Set `maxItemsPerQuery` to give every source its own cap.

#### Comments, replies and bullet comments

Tick **Scrape comments** to read the top-level comments of each delivered video, in Douyin's own order (hot first), up to **Max comments per video** (20 by default; 0 = all the video has, which can be thousands). **Include replies** reads the replies under each comment, up to **Max replies per comment**; each reply is a comment row with `isReply` true and the id of its parent comment. **Scrape bullet comments (弹幕)** reads the messages that scroll over the video, with the moment they appear at, up to **Max bullet comments per video**. Every comment, reply and bullet comment is a row of its own, counted in **Max results**.

#### Keyword search with your Douyin cookie

Douyin answers searches only to a logged-in account, so the keyword search needs the cookie of YOUR account. Log in to douyin.com in your browser, open the developer tools (Network tab), click any request to douyin.com and copy the whole `cookie` value of its request headers (or at least its `sessionid` part) into **Your Douyin session cookie**. The cookie is a secret field: it is used for reading only, nothing is posted, liked or followed with it, and it is never written to the dataset or the log. Use an account of your own: Douyin may ask it to log in again after heavy use. Choose **Search for** videos or creators, then the sort, the publication period and the length of Douyin's own search filters. Without the cookie the keywords are skipped and the run says so; the other sources still run.

#### Monitoring: only the new results

Tick **Only new results** (`onlyNew`) and schedule the Actor. The first run returns everything; each later run skips the videos, comments and bullet comments already delivered: they are not saved and not charged. Profile rows and trending topics are always delivered. On a sound, a collection or a keyword search the list is not read newest first, so each run delivers the videos it has never delivered, up to your maximum, even when the search is sorted by date: it does not stop at the first known video as it does on a creator. The memory lives in a named key-value store of your account (`douyin-videos-scraper-seen`, up to 150,000 results per key) and is only updated with results that really reached the dataset, so a failed run never hides anything. Give each schedule its own `stateKey` (two schedules sharing a key would hide each other's results), and tick `resetState` once to start over. A creator's videos are read newest first and the reading stops once it meets a run of videos you already have — never more than the previous run delivered for that creator, and never more than your caps allow (pinned videos are not counted) — so the older videos your cap left out are never delivered later.

#### Filter by publication date

`postedAfter` and `postedBefore` take a date (`2026-09-01`, the whole day is included, Beijing time) or a period before now (`7 days`, `2 weeks`, `1 month`; via the API also `24 hours` or a full ISO date-time). The filter reads the publication time of a video (`createTimeIso`); a video without a publication date is dropped as soon as a date bound is set. Filtered-out videos are not saved and do not count in **Max results** (each video the filter checks is charged the filter fee, see the pricing section); the run summary tells how many were filtered. On a creator, reading stops at the first video older than `postedAfter` that is not pinned. Comments, bullet comments, profiles and trending topics are not filtered.

#### Keep the video and image files

The video and image links Douyin gives expire after a few hours (`cdnUrlExpiresAt` tells when). Tick **Download video files (MP4)** and / or **Download cover images** to keep a copy in the run's key-value store: the row then carries a lasting link to it. A video whose best stream is larger than **Max video file size** (100 MB by default) is saved in a smaller stream when Douyin offers one; otherwise it is not downloaded and the row says why.

### 🔌 Integrations and API

Call the Actor via the Apify API, the JavaScript or Python clients, or connect it with integrations and webhooks (Make, Zapier, n8n, Google Sheets, Slack, Airtable…). The dataset can be fetched as JSON or CSV from any tool.

### 🤖 Use with AI agents (MCP)

AI agents (Claude, ChatGPT, Cursor…) can find and run this Actor through the [Apify MCP server](https://mcp.apify.com), billed to their Apify account like any run. It returns one item per Douyin row: a video, a creator, a comment, a bullet comment or a trending topic (`type` says which). Actor id: `nice_dev/douyin-videos-scraper`; MCP server with this Actor only: `https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/douyin-videos-scraper`.

Smallest input, for a cheap first call:

```json
{
    "profileUrls": ["https://www.douyin.com/user/MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM"],
    "maxVideosPerProfile": 5,
    "maxItems": 10
}
```

Key output fields: `type`, `url`, `description`, `createTimeIso`, `likeCount`, `commentCount`, `shareCount`, `authorNickname`.

Cost: pay per event, each kind of row at its own price, see the pricing section above; the Actor's own filters and the options (all off by default) cost extra. Cap each call with `maxItems` and, through the API, with the run option `maxTotalChargeUsd`.

### ❓ FAQ

#### Is it legal to scrape Douyin?

The Actor only reads what Douyin shows publicly to any anonymous visitor. The one exception is the keyword search, which Douyin answers only to a logged-in account: there it reads with the session of the account whose cookie you give; in a run that also has links, creators or comments, the whole run is read with that account. Results contain personal data (nicknames, bios, comments, the province Douyin shows, e-mail addresses or phone numbers people wrote in their bio), which is protected by China's Personal Information Protection Law (PIPL), by GDPR and by similar laws: do not store it without a legitimate reason, and delete what an author has deleted. You are responsible for using the data in compliance with Douyin's Terms of Service and applicable law. This Actor is not affiliated with Douyin or ByteDance.

#### Does it need a Douyin account, a cookie or a proxy?

No account and no cookie for videos, photo posts, creators, sounds, collections, comments, bullet comments and trending topics. The keyword search is the exception: it needs the cookie of your own Douyin account (see the tip above), and a run that also has other sources reads them all with that account; without it the keywords are skipped and the run says so. A run made of keywords alone, without the cookie, is refused with a message that says why. The proxy is included in the price: leave the default setting (the residential proxy is not available).

#### Is the data safe to open in Excel or to show on a web page?

Descriptions, bios, comments and bullet comments are their authors' own words, copied as they are. A text can begin with `-`, `+`, `=` or `@` (a mention, `-20% today`): Excel and Google Sheets may read such a cell of a CSV file as a formula or as a number. The Actor leaves the text as it is, so that the JSON and the API give the real value: when you open a CSV, import these columns as text. On a web page, escape every field like any text written by a stranger.

#### Known limitations

- Douyin gives no view count on the web: the Actor does not give one.
- A creator is found by link, sec_uid or numeric uid, never by Douyin ID (the short name under the nickname): Douyin refuses it.
- **A creator's videos: about 44 per creator.** Douyin shows a visitor without an account the first page of a creator's videos and nothing after it, whatever **Max videos per creator** says. The run keeps that page, says so once in the log and in its last message, and does not fail; the creator's profile row says in `videoCount` how many videos exist. The statistics of the creator rest on the same videos. Comments, bullet comments, sounds, collections and trending topics are not limited this way.
- A creator's videos come newest first, the pinned ones on top; Douyin offers no other order. Douyin's trending boards are the same for everybody: there is no board by city.
- The video, cover and sound links are signed and stop working after a few hours; tick the file options to keep a copy.
- The keyword search gives what Douyin shows to your account, and Douyin may ask the account to log in again after heavy use.
- The filters judge videos only. The author filters (followers, verified) read each author's profile once per run. A video page, a sound and a collection do not give the author's followers, likes received or badge reliably: those columns stay empty unless **Full author profile** or an author filter is on, and a video whose author could not be read is dropped by these filters.
- A photo post has no length: **Min length** / **Max length** drop it.
- `onlyNew` remembers row ids, not their content: a video whose likes changed is not returned again.
- Two runs sharing the same `stateKey` at the same time may both return the same new video.

**A run that reaches its timeout** stops itself about 45 seconds before it: no new page is asked, what it read is saved and, with `onlyNew`, remembered, and the run ends *Succeeded* with "Stopped before the run's timeout". Resurrect it to go on from there, or give the next run a longer timeout (Run options).

**A run the platform stops without warning** (out of memory)

- Resurrect it: it goes on from where it stood at most a minute before the stop. What it had read since is read again, and the rows already saved are skipped: none is delivered or charged twice, and `maxItems` still counts them.
- With `onlyNew`, the memory is saved after each write (2 seconds apart at most): resurrect the stopped run and the results it had saved meanwhile join the memory; leave it stopped for good, and the next run may return at most the last 2 seconds of them once more.

#### Something doesn't work?

The last line of the log counts the rows saved, filtered out and not found on Douyin (a video, creator or comment that does not exist or was deleted), and the requests that failed after every retry. Those requests and the targets not found are listed, with the reason, in the `FAILED_REQUESTS` record of the run's key-value store. A run that saved nothing and had failed requests fails, and its last message gives the cause (a keyword search without a cookie says so, instead of "run it again").

If Douyin changes its pages, you are told instead of paying for blank rows. If the first 20 rows read all lack the same field (the publication date, the like count, a creator's nickname, a topic's text…), the run saves nothing more, stops and fails, and its last message names the missing field: at most those first rows are charged. A video that **Posted after** / **Posted before** drops because it has no date at all counts among those 20. A run of fewer rows (a scheduled `onlyNew` run that finds a few new ones, a small **Max results**) is checked at its end, from 2 rows: its rows are already saved, and the run fails with the missing field instead of ending green.

### 🛟 Support

Open an issue in the **Issues** tab with a link to your run: the run log and the `FAILED_REQUESTS` record of the key-value store show exactly which URLs failed and why.

# Actor input Schema

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

Douyin video or photo-post links (`https://www.douyin.com/video/7682152870929567026`), short share links (`https://v.douyin.com/abc123/`), the whole share text copied from the app, or bare video ids (17 to 20 digits). One result per video. Max 1 000.

## `profileUrls` (type: `array`):

Creator pages (`https://www.douyin.com/user/MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM`), short share links of a profile, the whole share text of the app, or a bare creator id: the long sec_uid of the page address, or the numeric uid (such as `63163250759`). The Douyin ID (the short name shown under the nickname) is not accepted: Douyin refuses it. For each creator: their videos, newest first (pinned videos come first on Douyin, see **Skip pinned videos**), and one profile row if **Creator profile rows** is ticked. Max 500.

## `maxVideosPerProfile` (type: `integer`):

Videos read for EACH creator, newest first (up to 50 per page read). Douyin shows a visitor without an account the first page only, so about 44 videos per creator whatever this number says. 0 = no video rows, the profile only. Also capped by **Max results**.

## `includeProfileRows` (type: `boolean`):

One row per creator of **Creator profile URLs** (and of a link to a creator pasted in another list): Douyin ID, bio, followers, following, total likes, video count, IP location (province), gender, age, verification, live status. Charged as a profile row (see Pricing). Off = the videos only.

## `skipPinned` (type: `boolean`):

Leave out the videos the creator pinned at the top of the profile (they are often old and break a newest-first reading).

## `includeAuthorProfiles` (type: `boolean`):

Add the author's IP location (province), video count, real following count, gender, age, school and live status to every video row (1 extra request per new author, read once per run). Charged per video row it completes as **Author profile** (see Pricing). The author's follower count, total likes and verification badge are free on a creator's videos and when an author filter is on; on a video link, a sound or a collection they are empty without this option or a filter.

## `includeAccountStats` (type: `boolean`):

Add to each creator profile row: average and median likes, comments, shares and saves per video, average engagement rate, videos per week and date of the latest video, over the creator's latest videos (up to 36, pinned ones left out; a visitor without an account gets the first page only, about 44, enough for the 36; usually 1 extra request per creator). Charged per profile row as **Creator statistics** (see Pricing). Works on profile rows only: without **Creator profile rows** or a keyword search for creators it does nothing.

## `includeBioContacts` (type: `boolean`):

Add to each creator profile row the e-mail addresses, phone numbers and WeChat IDs the creator wrote in the bio. Charged as **Bio contact** only for a profile row where at least one contact is found (see Pricing). Works on profile rows only: without **Creator profile rows** or a keyword search for creators it does nothing.

## `maxRelatedPerVideo` (type: `integer`):

For each video of **Video URLs**, also deliver up to this many of the videos Douyin recommends next to it (相关推荐), each as a video row with `relatedTo` = the video it came from (1 extra request per 10-20 related videos; charged as videos). 0 = off.

## `musicUrls` (type: `array`):

Douyin sound pages (`https://www.douyin.com/music/7561006047303010321`), share links of a sound, the whole share text copied from the app, or bare sound ids (17 to 20 digits). For each sound: the videos made with it, up to **Max videos per sound**. Max 100.

## `maxVideosPerMusic` (type: `integer`):

Videos read for EACH sound of **Sound URLs**. Also capped by **Max results**.

## `collectionUrls` (type: `array`):

Douyin collection pages (`https://www.douyin.com/collection/7673031667082070079`), share links of a collection, the whole share text copied from the app, or bare collection ids (17 to 20 digits). For each collection: its videos in the collection's order, up to **Max videos per collection**. Max 100.

## `maxVideosPerCollection` (type: `integer`):

Videos read for EACH collection of **Collection URLs**. Also capped by **Max results**.

## `includeComments` (type: `boolean`):

Read the comments of each delivered video: text, likes, reply count, date, commenter's nickname and IP location (province), hot / pinned / liked-by-author flags, images.

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

Top-level comments read per video (20 per page, Douyin's own order: hot first). 0 = all the video has (can be thousands).

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

Also read the replies under each comment (1 extra request per comment with replies). Each reply is a comment row with `isReply` = true and its parent comment id.

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

Replies read under each comment when **Include replies** is on. 0 = all.

## `includeDanmaku` (type: `boolean`):

Read the bullet comments of each delivered video: text, moment of the video they appear at, likes and the author's uid. Each one is a row of its own, charged as a bullet comment (see Pricing).

## `maxDanmakuPerVideo` (type: `integer`):

Most bullet comments saved for EACH video when **Scrape bullet comments** is on. Also capped by **Max results**.

## `includeTrends` (type: `boolean`):

One row per topic of the boards chosen below: rank, topic, heat value, label (new / hot / exclusive…), number of videos, time it started trending, lead video. Charged as a trend row (see Pricing).

## `trendBoards` (type: `array`):

Which boards to read. **Hot** is the main board (50 topics); the others are Douyin's entertainment, society and challenge boards.

## `trendVideos` (type: `boolean`):

Also deliver the lead video of each trending topic as a video row (1 extra request per topic; charged as a video).

## `query` (type: `string`):

Keyword as typed in the Douyin app, in Chinese or not (e.g. `咖啡`, `iPhone 17`).

## `searchQueries` (type: `array`):

Several keywords in one run, one search each. Added to **Search keyword**; a video found by several searches is saved once.

## `sessionCookie` (type: `string`):

The cookie of YOUR logged-in douyin.com tab (DevTools › Network › any request to douyin.com › Request headers › cookie, copied whole, like `sessionid=abc123; ttwid=xyz789`), or at least its sessionid part. Needed for keyword search only. Use an account of your own: Douyin may ask it to log in again after heavy use.

## `searchType` (type: `string`):

**Videos** = one video row per result. **Creators** = one profile row per account found (Douyin's user search).

## `searchSort` (type: `string`):

Douyin's own sort of the search results. Videos search only: a creators search ignores it.

## `searchPublishTime` (type: `string`):

Douyin's own date filter of the search. Videos search only: a creators search ignores it. For any other window, use **Posted after** / **Posted before** below.

## `searchDuration` (type: `string`):

Douyin's own length filter of the search. Videos search only: a creators search ignores it.

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

Maximum number of rows saved for the whole run, all types together (videos, profiles, comments, trends, bullet comments), after deduplication and filters. 0 = no limit.

## `maxItemsPerQuery` (type: `integer`):

Cap for EACH source (a creator, a sound, a collection, a keyword, a board, a pasted video with its comments), so that the first one cannot use up the whole **Max results** budget. 0 = no per-source cap.

## `downloadVideos` (type: `boolean`):

Save each delivered video as an MP4 file (the smallest stream of at least 720p, H.264 first, without the Douyin watermark when Douyin serves one; photo posts: every image). Charged as **Video file** once per started 5 MB of the file saved (a 3 MB video = 1, a 12 MB video = 3; a photo post: all its images together); the column `videoFileMb` gives the size (see Pricing).

## `downloadCovers` (type: `boolean`):

Save the cover image of each delivered video. Charged per image saved as **Cover file** (see Pricing).

## `maxVideoFileMb` (type: `integer`):

Largest video file kept. A video is saved in a smaller stream when the best one is larger than this; none small enough: not downloaded (the row says why, nothing is charged for the file). The most a single file can cost is one Video file event per 5 MB of this limit (100 MB = 20 events).

## `postedAfter` (type: `string`):

Only videos published on or after this date (`createTimeIso`): `2026-09-01`, or a period before now such as `7 days`, `2 weeks`, `1 month` (API: `24 hours` and full ISO date-times work too). On a creator, reading stops at the first older video that is not pinned.

## `postedBefore` (type: `string`):

Only videos published on or before this date (the whole day is included), or older than a period such as `30 days`.

## `excludeKeywords` (type: `array`):

Drop the videos whose description, title or hashtags contain one of these words (case and accents ignored).

## `includeKeywords` (type: `array`):

Keep only the videos whose description, title or hashtags contain at least one of these words. Empty = no filter.

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

Only videos with at least this many likes.

## `minComments` (type: `integer`):

Only videos with at least this many comments.

## `minShares` (type: `integer`):

Only videos shared at least this many times.

## `minDurationSeconds` (type: `integer`):

Only videos at least this long. Photo posts have no length and are dropped when this is set.

## `maxDurationSeconds` (type: `integer`):

Only videos at most this long. 0 = no maximum.

## `mediaType` (type: `string`):

Videos, photo posts (图文), or both.

## `minAuthorFollowers` (type: `integer`):

Only videos whose author has at least this many followers (one extra read per creator, kept in memory for the run).

## `maxAuthorFollowers` (type: `integer`):

Only videos whose author has at most this many followers (micro-influencer search; one extra read per creator, kept in memory for the run). 0 = no maximum.

## `verifiedOnly` (type: `boolean`):

Only videos of authors with a Douyin verification badge, personal or business (one extra read per creator, kept in memory for the run).

## `onlyNew` (type: `boolean`):

Skip the videos, comments and bullet comments that a previous run (same **Memory key**) already delivered: they are not saved and not charged. On a creator, reading stops once it meets a run of already-known videos (never more than the previous run delivered for that creator, and never more than your caps allow; pinned ones aside). Profiles and trends are always delivered. On a sound, a collection or a keyword search the list is not read newest first, so each run delivers the videos never delivered before, up to **Max results** or the maximum per sound, collection or search, even when the search is sorted by date. First run = everything is new.

## `stateKey` (type: `string`):

Name of the memory used by **Only new results**. Give each schedule / task its own key (e.g. `brand-watch`) so that they do not share their memory. Letters, digits, `-` and `_`.

## `resetState` (type: `boolean`):

Forget everything remembered under this **Memory key** before the run: this run returns (and charges) every result again. Untick it afterwards.

## `proxyConfiguration` (type: `object`):

Apify Proxy or your own proxies. Keep the default: it is included in the price. The residential Apify proxy is not available in this Actor.

## `maxConcurrency` (type: `integer`):

Maximum number of Douyin requests processed in parallel.

## `maxRequestsPerMinute` (type: `integer`):

Most requests to Douyin in any 60 seconds, all of them counted (video pages, creator pages, comment pages, trend boards). A budget, not an even pace. Lower it if the log shows refusals.

## `minRequestIntervalMs` (type: `integer`):

Smallest gap between two requests, in milliseconds. Unlike the per-minute rate, this spreads the requests evenly. 0 = no gap.

## `maxRequestRetries` (type: `integer`):

Retries per request before it is marked as failed. A request Douyin turns away is also retried in a fresh browser session without using up these retries. A page that does not answer at all is retried only once more.

## `debugLog` (type: `boolean`):

Include debug messages in the run log.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.douyin.com/video/7682152870929567026"
  ],
  "profileUrls": [
    "https://www.douyin.com/user/MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM"
  ],
  "maxVideosPerProfile": 10,
  "includeProfileRows": false,
  "skipPinned": false,
  "includeAuthorProfiles": false,
  "includeAccountStats": false,
  "includeBioContacts": false,
  "maxRelatedPerVideo": 0,
  "musicUrls": [],
  "maxVideosPerMusic": 20,
  "collectionUrls": [],
  "maxVideosPerCollection": 50,
  "includeComments": false,
  "maxCommentsPerVideo": 20,
  "includeReplies": false,
  "maxRepliesPerComment": 5,
  "includeDanmaku": false,
  "maxDanmakuPerVideo": 100,
  "includeTrends": false,
  "trendBoards": [
    "hot"
  ],
  "trendVideos": false,
  "searchQueries": [],
  "searchType": "videos",
  "searchSort": "relevance",
  "searchPublishTime": "any",
  "searchDuration": "any",
  "maxItems": 50,
  "maxItemsPerQuery": 0,
  "downloadVideos": false,
  "downloadCovers": false,
  "maxVideoFileMb": 100,
  "excludeKeywords": [],
  "includeKeywords": [],
  "minLikes": 0,
  "minComments": 0,
  "minShares": 0,
  "minDurationSeconds": 0,
  "maxDurationSeconds": 0,
  "mediaType": "all",
  "minAuthorFollowers": 0,
  "maxAuthorFollowers": 0,
  "verifiedOnly": false,
  "onlyNew": false,
  "stateKey": "default",
  "resetState": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 4,
  "maxRequestsPerMinute": 60,
  "minRequestIntervalMs": 0,
  "maxRequestRetries": 5,
  "debugLog": false
}
```

# 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 = {
    "videoUrls": [
        "https://www.douyin.com/video/7682152870929567026"
    ],
    "profileUrls": [
        "https://www.douyin.com/user/MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM"
    ],
    "maxVideosPerProfile": 10,
    "includeProfileRows": false,
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nice_dev/douyin-videos-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/7682152870929567026"],
    "profileUrls": ["https://www.douyin.com/user/MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM"],
    "maxVideosPerProfile": 10,
    "includeProfileRows": False,
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("nice_dev/douyin-videos-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/7682152870929567026"
  ],
  "profileUrls": [
    "https://www.douyin.com/user/MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM"
  ],
  "maxVideosPerProfile": 10,
  "includeProfileRows": false,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call nice_dev/douyin-videos-scraper --silent --output-dataset

```

## MCP server setup

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