# Douyin Scraper (抖音): Videos, Profiles, Search & Comments (`scrape-lads/douyin-scraper`) Actor

Scrape Douyin (抖音, Chinese TikTok): keyword search, creator profiles and their latest videos, single videos and comments. Likes, shares, collects, hashtags, music and no-watermark video links. No login, no cookies.

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

## Pricing

from $2.40 / 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 does Douyin Scraper do?

**Douyin Scraper extracts data from Douyin (抖音), the Chinese version of TikTok: keyword search results, creator profiles and their latest videos, single videos, and comments.** You get likes, comments, shares, collects (saves), hashtags, publish time, duration, author details, music, and **no-watermark video links**, ready for a spreadsheet, database or AI pipeline.

No Douyin account, no cookies and no Chinese phone number needed. Run it in Apify Console, call it from the **API**, **schedule** it, or connect it to Make, Zapier, n8n or Google Sheets.

### What data can you extract from Douyin?

| 🎬 Video ID and URL | 📝 Description | #️⃣ Hashtags |
|---|---|---|
| ❤️ Likes | 💬 Comment count | 🔁 Shares |
| ⭐ Collects (saves) | ⏱️ Duration | 📅 Publish time |
| 📥 No-watermark MP4 link | 🖼️ Cover image | 🎵 Music / original sound |
| 👤 Author name and Douyin ID | 🔗 Author profile URL | 🖼️ Image-post (图文) photos |
| 👥 Followers and following | 🏆 Total likes | 🎞️ Video count |
| ✅ Verified badge | 📍 IP location (IP属地) | 🪪 Bio (signature) |
| 🗨️ Comment text | 👍 Comment likes | ↩️ Reply count |

### Why use this Douyin scraper?

- **Everything in one actor:** search, profiles, videos and comments, so you don't need four separate tools.
- **Works from outside China.** Douyin blocks most foreign and proxy traffic; this actor uses a dedicated data service that gets through reliably.
- **No-watermark MP4 links** for every video, plus cover images and the original sound.
- **Creator profile data:** followers, following, total likes, video count, bio, verification and IP location (IP属地).
- **Comments with IP location** and like counts, for sentiment and audience research.
- **Free filters:** only recent videos, or only videos above a like threshold, skipped before anything is charged.

Common uses: **China market research**, **KOL / influencer discovery** for brands entering China, **trend and hashtag tracking**, **e-commerce and product research**, **competitor monitoring**, and **training data** for AI models.

### How to scrape Douyin

1. Click **Try for free** and open the **Input** tab.
2. Add **search keywords** (Chinese or English), **creator profile URLs**, **video URLs**, or any mix.
3. Set how many videos you want and, optionally, how many comments per video.
4. Click **Start**, then download the results as **JSON, CSV, Excel or HTML**.

### Input

```json
{
    "searchKeywords": ["咖啡", "美妆教程"],
    "profiles": ["https://www.douyin.com/user/MS4wLjABAAAAk9mpFofCPQpsv1I1SVFxdb-A_BWiJnGy1qoDQxLEB4s"],
    "videoUrls": ["https://www.douyin.com/video/7534679152504376595"],
    "maxResultsPerSearch": 20,
    "maxVideosPerProfile": 20,
    "commentsPerVideo": 0,
    "sortBy": "relevance",
    "publishedWithin": "any",
    "postedWithinDays": 0,
    "minLikes": 0
}
```

Accepted links: `douyin.com/video/<id>`, links with `?modal_id=<id>`, `v.douyin.com` share links (copy them from the Douyin app's Share button), `iesdouyin.com` share pages, and profile links `douyin.com/user/<sec_uid>`.

### Output

Every row has a `rowType`: `video`, `comment`, `profile` or `error`. The dataset has separate **Videos**, **Comments** and **Profiles** views.

Video row (shortened):

```json
{
    "rowType": "video",
    "id": "7534679152504376595",
    "url": "https://www.douyin.com/video/7534679152504376595",
    "description": "雨天开车秒变“睁眼瞎”？玻璃起雾别慌！3步极速除雾法",
    "hashtags": ["雨天开车除雾正确方法", "新手司机"],
    "createTime": "2025-08-04T10:43:20.000Z",
    "durationSec": 67.8,
    "likes": 12761,
    "comments": 649,
    "shares": 5135,
    "collects": 6914,
    "authorName": "懂车小彬",
    "authorUrl": "https://www.douyin.com/user/MS4wLjABAAAA...",
    "videoUrl": "https://v26-colds.douyinvod.com/...",
    "coverUrl": "https://p3-pc-sign.douyinpic.com/...",
    "musicTitle": "@懂车小彬创作的原声",
    "source": "url"
}
```

Comment rows have `text`, `likes`, `replies`, `ipLocation`, `createTime` and the commenter. Profile rows have `nickname`, `douyinId`, `followers`, `following`, `totalLikes`, `videoCount`, `signature`, `ipLocation` and `verified`.

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

Pay per result, no subscription. See the **Pricing** tab for exact prices:

- one charge per **video**,
- a smaller charge per **comment**,
- one charge per **profile info** row,
- a small start fee per run.

Errors and filtered-out videos are free. Higher Apify plans get up to 20% off.

### Run it on a schedule

Save a task with the creators or keywords you follow, set **Only videos from the last N days** to 1 or 7, and add a daily **schedule**. Connect Google Sheets, Slack or a webhook to get new Douyin videos automatically.

### Use it with AI agents (MCP)

Add the Apify MCP server (`https://mcp.apify.com`) to Claude, ChatGPT or Cursor and ask, for example: "Find the 20 most-liked Douyin videos about 咖啡 this week and summarize the trends."

### FAQ

**Is there an official Douyin API?** Douyin's Open Platform only gives access to accounts that authorize your app, and requires a Chinese business entity. This actor reads public data about any video, creator or search without that.

**What are the alternatives?** Other Douyin scrapers on Apify (usually one per data type), Chinese data vendors, or scraping manually from a mainland IP. This actor combines search, profiles, videos and comments in one run.

**Why are view counts missing?** Douyin hides play counts on most videos. Likes, comments, shares and collects are always included.

**Can I download the videos?** Each video row has `videoUrl`, a direct no-watermark MP4 link. Links expire after a few hours, so download them soon after the run.

**Does it work for 图文 (image posts)?** Yes: `isPhotoPost` is true and `imageUrls` lists the images.

**Is it legal?** The actor only reads public content. Respect copyright, Douyin's terms and privacy laws such as PIPL and the GDPR.

### Related actors

- [Douyin Transcript Scraper](https://apify.com/scrape-lads/douyin-transcript-scraper): turn Douyin videos into text (Mandarin speech-to-text).
- [TikTok Profile Scraper](https://apify.com/scrape-lads/tiktok-profile-scraper): the same data for TikTok creators.
- [TikTok Keyword Video Search](https://apify.com/scrape-lads/tiktok-keyword-video-search): search TikTok videos by keyword.
- [Video Transcript Scraper](https://apify.com/scrape-lads/video-transcript-scraper): transcripts from TikTok, Instagram, YouTube and X.
- [Reddit Scraper](https://apify.com/scrape-lads/reddit-scraper): posts and comments from Reddit.

### Privacy

This Actor sends anonymous run inputs (such as keywords and URLs) and a hashed account ID to the developer to see which inputs are useful. Tokens and secrets are never sent. Nothing from your results is collected.

# Actor input Schema

## `searchKeywords` (type: `array`):

Douyin video search terms, in Chinese or English (e.g. 咖啡, 美妆, iPhone). One search per line.

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

Douyin profile URLs (https://www.douyin.com/user/MS4wLjAB...), v.douyin.com share links, or bare sec_uid values. Returns the profile info and the latest videos.

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

Single Douyin videos: douyin.com/video/<id>, links with ?modal_id=<id>, v.douyin.com share links or bare video ids.

## `maxResultsPerSearch` (type: `integer`):

Stop each keyword search after this many videos.

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

Newest first.

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

0 = no comments. Comments are added as rows with rowType "comment".

## `includeProfileInfo` (type: `boolean`):

For each creator profile, add one row with followers, total likes, video count, bio and IP location.

## `sortBy` (type: `string`):

How Douyin orders the search results.

## `publishedWithin` (type: `string`):

Only search results published in this period.

## `postedWithinDays` (type: `integer`):

Skip older videos (free) in every mode. Empty or 0 = no limit.

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

Skip videos with fewer likes (free). Empty or 0 = no minimum.

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

How many inputs are processed at the same time.

## Actor input object example

```json
{
  "searchKeywords": [
    "咖啡"
  ],
  "maxResultsPerSearch": 20,
  "maxVideosPerProfile": 20,
  "commentsPerVideo": 0,
  "includeProfileInfo": true,
  "sortBy": "relevance",
  "publishedWithin": "any",
  "maxConcurrency": 3
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "searchKeywords": [
        "咖啡"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrape-lads/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 = { "searchKeywords": ["咖啡"] }

# Run the Actor and wait for it to finish
run = client.actor("scrape-lads/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 '{
  "searchKeywords": [
    "咖啡"
  ]
}' |
apify call scrape-lads/douyin-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrape-lads/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/2G4RS493eLlRYg5c5/builds/enYU8SyLQHi70seyy/openapi.json
