# Douyin Scraper (`automly/douyin-scraper`) Actor

Scrape Douyin (抖音) videos, image posts, profiles and comments from links, plus the Douyin hot list: likes, comments, shares, saves, hashtags, sound, video and cover links, follower counts and IP location. No login or cookies.

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

## Pricing

from $2.39 / 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

## Douyin Scraper

### What is Douyin Scraper?

**Douyin Scraper** is a tool that lets you **scrape Douyin (抖音) videos, image posts, profiles, comments and the Douyin hot list**: captions, exact likes, comments, shares and saves, hashtags, sound, video and cover links, follower counts, IP location and more. Paste Douyin links, click **Start**, and download the data as Excel, CSV or JSON.

- ⚡ **Fast:** 1,000 comments in under 30 seconds, 860 videos from 26 creators in under a minute (our tests)
- 🎬 **Video links without watermark** and cover images for every video, all photos for image posts
- 👤 **Profiles with exact counts:** followers, following, total likes, video count, IP location
- 🔥 **Douyin hot list (抖音热榜):** the 50 trending topics with heat and views
- 🔓 **No login:** no Douyin account, cookies or API key needed

### What can Douyin Scraper do?

- Scrape any public **Douyin video or image post** (图文) from its link, share link or ID
- Scrape **Douyin profiles** (博主主页) with exact follower, like and video counts
- Get each creator's **newest videos** with full stats, pinned videos marked
- Scrape **Douyin comments**, most relevant first, with likes, reply counts and the commenter's IP location
- Get the **Douyin hot list** (抖音热榜): rank, topic, heat score, views and video count
- Paste **v.douyin.com share links** or the whole share text copied from the Douyin app
- Export to Excel, CSV, JSON, HTML or XML, or send the data to Google Sheets, Make, Zapier and more

### What data can you extract from Douyin?

| | | |
|---|---|---|
| 📝 Caption, title and hashtags | ❤️ Likes | 💬 Comments |
| 🔁 Shares | ⭐ Saves (收藏) | 👍 Recommends (推荐) |
| 🎬 Video link (no watermark) | 🖼️ Cover and image-post photos | ⏱️ Duration and size |
| 🎵 Sound title, author and link | 🏷️ Douyin's topic categories | 📅 Posting date and time |
| 👤 Creator name, 抖音号 and profile link | 👥 Followers, following, total likes | 📍 IP location (IP属地) |
| 💬 Comment text and images | 🔁 Reply count per comment | 🔥 Hot list rank, heat and views |

### How to scrape Douyin

1. [Create a free Apify account](https://console.apify.com/sign-up) (no credit card needed).
2. Open **Douyin Scraper**.
3. Paste **Douyin links**: videos, image posts, profiles or v.douyin.com share links, one per line.
4. Choose how many videos per profile you want, and turn on **comments** or the **hot list** if you need them. Click **Start**.
5. When the run finishes, download your data as Excel, CSV, JSON, HTML or XML.

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

You pay only for the results you get: per video or image post, profile, comment and hot-list topic.

| Apify plan | Videos or profiles per 1,000 | Comments per 1,000 | Hot-list topics per 1,000 |
|---|---|---|---|
| Free | $3.49 | $1.49 | $1.99 |
| Starter (Bronze) | $2.99 | $0.99 | $1.79 |
| Scale (Silver) | $2.79 | $0.69 | $1.59 |
| Business (Gold) and higher | $2.39 | $0.59 | $1.49 |

Platform usage is included in these prices, so you pay nothing else for the run. There is no start fee.

Example: 1,000 videos cost $3.49 on the Free plan and $2.39 on Business. With 100 comments for each of 10 videos, add 1,000 comments: $1.49 more on Free, $0.59 more on Business. **Max results** keeps a run's cost under control, and you can also set a maximum cost per run. Every Apify account gets **$5 of free usage each month**, enough for about 1,400 videos on the Free plan.

### ⬇️ Input

| Setting | What it does |
|---|---|
| Douyin links | Videos (`www.douyin.com/video/...`), image posts (`/note/...`), profiles (`/user/...`), v.douyin.com share links, the share text from the app, or video IDs |
| Videos per profile | How many of each profile's newest videos to save (default 20, up to about 40) |
| Include comments | Also save the comments of every video saved |
| Comments per video | Most comments to save per video (default 100) |
| Include the Douyin hot list | Also save the 50 topics on Douyin's hot list right now |
| Max results | Most rows to save in the whole run (default 100; 0 for no limit) |

Example: a creator's 30 newest videos and 200 comments on each.

```json
{
  "startUrls": ["https://www.douyin.com/user/MS4wLjABAAAAPUG08xj-oo8FJcryGOGHXb18vGmgnqyyJIctPvhN-iI"],
  "videosPerProfile": 30,
  "includeComments": true,
  "commentsPerVideo": 200,
  "maxItems": 10000
}
```

Example: a few videos from share links, plus today's hot list.

```json
{
  "startUrls": [
    "https://v.douyin.com/NGbwJVU/",
    "https://www.douyin.com/video/7691170921935146278",
    "https://www.douyin.com/note/7652726341704608640"
  ],
  "includeTrending": true
}
```

### ⬆️ Output

Every row has a `type`: **video** (image posts too, with `postType` set to `images`), **profile**, **comment** or **trending**. You can view the rows as a table in Apify Console or download them as Excel, CSV, JSON, HTML or XML.

A video:

```json
{
  "type": "video",
  "id": "7691170921935146278",
  "url": "https://www.douyin.com/video/7691170921935146278",
  "postType": "video",
  "title": "男子潜水捕鱼意外失踪，在水下洞穴被困15天后奇迹获救",
  "text": "男子潜水捕鱼意外失踪，在水下洞穴被困15天后奇迹获救 #洞穴潜水 #洞潜 #奇迹生还 #捕鱼",
  "createdAt": "2026-09-30T10:00:00Z",
  "authorNickname": "好奇罗盘",
  "authorDouyinId": "haoqiluopan369",
  "authorSecUid": "MS4wLjABAAAAPUG08xj-oo8FJcryGOGHXb18vGmgnqyyJIctPvhN-iI",
  "authorUrl": "https://www.douyin.com/user/MS4wLjABAAAAPUG08xj-oo8FJcryGOGHXb18vGmgnqyyJIctPvhN-iI",
  "likes": 659177,
  "comments": 15339,
  "shares": 185802,
  "saves": 69430,
  "recommends": 21176,
  "hashtags": ["洞穴潜水", "洞潜", "奇迹生还", "捕鱼"],
  "categories": ["时政社会", "社会新闻", "民生"],
  "durationSeconds": 695,
  "width": 1920,
  "height": 1080,
  "coverUrl": "https://p3-pc-sign.douyinpic.com/image-cut-tos-priv/cbe12e87...jpeg",
  "videoUrl": "https://v3-dy-o.zjcdn.com/690e4ff3.../video/tos/cn/...",
  "images": [],
  "soundTitle": "@好奇罗盘创作的原声",
  "soundAuthor": "好奇罗盘",
  "isPinned": false,
  "isAd": false,
  "isAiGenerated": false,
  "source": "https://www.douyin.com/video/7691170921935146278",
  "scrapedAt": "2026-10-24T11:41:13Z"
}
```

A profile:

```json
{
  "type": "profile",
  "secUid": "MS4wLjABAAAAPUG08xj-oo8FJcryGOGHXb18vGmgnqyyJIctPvhN-iI",
  "url": "https://www.douyin.com/user/MS4wLjABAAAAPUG08xj-oo8FJcryGOGHXb18vGmgnqyyJIctPvhN-iI",
  "nickname": "好奇罗盘",
  "douyinId": "haoqiluopan369",
  "bio": "用 最生动的动画 还原 最真实的案例",
  "followers": 3928018,
  "following": 71,
  "likes": 32635726,
  "videos": 138,
  "collections": 3,
  "ipLocation": "河南",
  "privateAccount": false,
  "liveNow": false
}
```

A comment:

```json
{
  "type": "comment",
  "id": "7691852233973416763",
  "videoId": "7691170921935146278",
  "url": "https://www.douyin.com/video/7691170921935146278",
  "text": "这个人能活15天不奇怪，第一，他没有盲目自救去消耗体力……",
  "createdAt": "2026-10-01T23:55:08Z",
  "likes": 22,
  "replies": 2,
  "isPinned": false,
  "likedByAuthor": false,
  "ipLocation": "广西",
  "authorNickname": "…",
  "authorSecUid": "MS4wLjABAAAA…"
}
```

A hot list topic:

```json
{
  "type": "trending",
  "rank": 1,
  "topic": "中超成都蓉城0:1大连英博",
  "url": "https://www.douyin.com/hot/2711309",
  "heat": 11326611,
  "views": 74629951,
  "videos": 11,
  "startedAt": "2026-10-24T07:01:06Z"
}
```

Each run also saves a short report listing every link with the rows it gave, and any link that could not be scraped with the reason (for example, a deleted video or a profile that does not exist).

### How can I use Douyin data?

- **Market research in China:** see which products, topics and formats take off on Douyin
- **Influencer marketing (KOL):** check a creator's followers, total likes and the engagement on their newest videos before a deal
- **Competitor tracking:** follow brands' Douyin accounts and their best-performing posts
- **Trend spotting:** pull the Douyin hot list every hour and see what China is talking about
- **Sentiment and AI:** build comment datasets for sentiment, topic or audience analysis
- **Content archiving:** keep video, cover and image links with their captions and stats

### How to track a Douyin creator or the hot list

1. Add the creator's profile link (or turn on **Include the Douyin hot list**).
2. [Schedule the actor](https://docs.apify.com/platform/schedules) to run every day or every hour.
3. Send each run's rows to Google Sheets, Slack or your database with an [integration](https://apify.com/integrations).

Each run gives the creator's current follower count and the latest stats of their newest videos, so you can chart growth over time.

### Use Douyin Scraper from your code

Run the actor with the [Apify API](https://docs.apify.com/api/v2) or the Python and JavaScript clients:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("automly/douyin-scraper").call(run_input={
    "startUrls": ["https://www.douyin.com/user/MS4wLjABAAAAPUG08xj-oo8FJcryGOGHXb18vGmgnqyyJIctPvhN-iI"],
    "videosPerProfile": 20,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["type"], row.get("nickname") or row.get("text"))
```

### Use with AI agents (MCP)

Douyin Scraper works with AI agents through the Apify MCP server. Ask your agent, for example: "Get the 20 newest videos of this Douyin creator with their likes and comments: https://www.douyin.com/user/MS4wLjABAAAA..." and it will run the actor with:

```json
{"startUrls": ["https://www.douyin.com/user/MS4wLjABAAAA..."], "videosPerProfile": 20}
```

### ❓FAQ

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

You pay only for the results you get: $3.49 per 1,000 videos or profiles on the Free plan, down to $2.39 on Business, with cheaper comments and hot-list topics and platform usage included. See [How much does it cost to scrape Douyin?](#how-much-does-it-cost-to-scrape-douyin) above for every plan. Every Apify account gets $5 of free usage each month, so you can try it at no cost.

#### How many videos can I get from a Douyin profile?

Up to about 40 of the creator's newest videos, pinned videos first. That is all Douyin shows to visitors who are not logged in, so the actor cannot reach a creator's older videos. The profile row still has the exact total number of videos the creator posted. For an older video, paste its link: any public video can be scraped by link, however old.

#### How many comments can I scrape from one Douyin video?

Up to about 10,000 comments per video, the most relevant first. The comment count on a video includes replies; each comment row has its reply count, but replies themselves are not included.

#### Can I search Douyin by keyword?

No. Douyin asks visitors to log in before it shows search results, and this actor never logs in. Paste the links of the videos or profiles you want instead. Every video and comment row gives the creator's profile link, so you can follow creators from one run to the next.

#### Do the video links have a watermark?

No. The `videoUrl` link is the video without the Douyin watermark. The link works for a few hours after the run, so download the files soon (or run the actor again for fresh links).

#### Can I scrape image posts (图文)?

Yes. Paste the `/note/` or `/slides/` link or the share link. The row has `postType` set to `images` and every photo in `images`.

#### Do I need a Douyin account?

No. You don't need a Douyin account, cookies, an API key or a Chinese phone number.

#### Can I scrape private accounts or deleted videos?

No. Only public data can be scraped. A private account gives its profile row only, and deleted or mistyped links are listed in the run report as not found.

#### Can I use profile links with a user name or 抖音号?

Douyin profiles are opened by the long ID in the profile link (`www.douyin.com/user/MS4wLjABAAAA...`). Copy the link from the profile page or the share link from the app; a 抖音号 alone cannot be opened without a search.

#### Is it legal to scrape Douyin?

This scraper only collects data that people chose to publish publicly. It does not collect private data such as email addresses or phone numbers. Public profiles and comments can still contain personal data, which may be protected by laws such as GDPR or China's PIPL, so only scrape it for a legitimate reason and ask a lawyer if you are unsure. You can read more in [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

Douyin Scraper is an independent tool. It is not affiliated with, endorsed by or sponsored by Douyin or ByteDance.

#### Something isn't working. What should I do?

Open the **Issues** tab and tell us the link and what you expected. We usually reply within a day. If the scraper helps you, a review on the **Reviews** tab helps others find it.

# Actor input Schema

## `startUrls` (type: `array`):

Douyin video, image post or profile links, one per line, e.g. https://www.douyin.com/video/7691170921935146278, https://www.douyin.com/note/7652726341704608640, https://www.douyin.com/user/MS4wLjABAAAA... or a v.douyin.com share link (the whole share text copied from the app works too). Bare video ids work as well. A profile gives the profile and its newest videos; a video gives that video.

## `videosPerProfile` (type: `integer`):

How many of each profile's newest videos to save, e.g. 20. Douyin shows visitors up to about 40 of a creator's newest videos (pinned ones first). Set 0 for the profile row only.

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

Also save the comments of every video saved (videos from links and from profiles), e.g. for sentiment or audience research. Each comment is its own row, charged as a comment.

## `commentsPerVideo` (type: `integer`):

Most comments to save per video, e.g. 100. Douyin shows up to about 10,000 top-level comments of a video, most liked first.

## `includeTrending` (type: `boolean`):

Also save Douyin's hot list (抖音热榜): the 50 trending topics right now with rank, heat, views and video count. Works with no links too.

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

Most rows to save in the whole run (videos, profiles, comments and hot topics together), e.g. 100. Set 0 for no limit.

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

Leave the default.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.douyin.com/user/MS4wLjABAAAAPUG08xj-oo8FJcryGOGHXb18vGmgnqyyJIctPvhN-iI",
    "https://www.douyin.com/video/7691170921935146278"
  ],
  "videosPerProfile": 10,
  "includeComments": false,
  "commentsPerVideo": 100,
  "includeTrending": false,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `details` (type: `string`):

No description

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

No description

## `report` (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 = {
    "startUrls": [
        "https://www.douyin.com/user/MS4wLjABAAAAPUG08xj-oo8FJcryGOGHXb18vGmgnqyyJIctPvhN-iI",
        "https://www.douyin.com/video/7691170921935146278"
    ],
    "videosPerProfile": 10,
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automly/douyin-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [
        "https://www.douyin.com/user/MS4wLjABAAAAPUG08xj-oo8FJcryGOGHXb18vGmgnqyyJIctPvhN-iI",
        "https://www.douyin.com/video/7691170921935146278",
    ],
    "videosPerProfile": 10,
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automly/douyin-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://www.douyin.com/user/MS4wLjABAAAAPUG08xj-oo8FJcryGOGHXb18vGmgnqyyJIctPvhN-iI",
    "https://www.douyin.com/video/7691170921935146278"
  ],
  "videosPerProfile": 10,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automly/douyin-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automly/douyin-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1N6gaacBINRHST9LB/builds/f6u3tHJA3bdHBDhEe/openapi.json
