# Douyin Video Search Scraper (抖音搜索) (`quarra/douyin-video-search-scraper`) Actor

Search Douyin (抖音) videos and photo posts by keyword: title, caption, hashtags, categories, likes, comments, shares, saves, duration, cover, author with followers, sound. Chinese or English keywords, filters by date, likes and type. No login or API key needed.

- **URL**: https://apify.com/quarra/douyin-video-search-scraper.md
- **Developed by:** [Quarra Labs](https://apify.com/quarra) (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 $5.00 / 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 Video Search Scraper (抖音搜索)

Search Douyin (抖音) by keyword and get the videos it finds, without a Douyin account, login or API key. Type one or
more keywords, in Chinese or English; the run reads Douyin's video results page after page, adds the videos of its
general results that the video tab did not show, removes the duplicates, and delivers each video with its link,
caption, hashtags, publication date, likes, comments, shares and saves, its author (with follower count and
certification) and its sound. Export as JSON, CSV or Excel, or read it through the Apify API.

**$5 per 1,000 videos**, plus a small start fee per run. Videos removed by your filters, duplicates and failed
searches are not charged.

### How deep it goes

Measured on Apify on 17 October 2026, **Max results per keyword** 500:

| Keyword | Videos delivered |
|---|---|
| 咖啡 | 162 |
| 露营 | 234 |
| iPhone 17 | 168 |
| travel china | 323 |
| 健身 | 201 |
| **5 keywords in one run, 85 s** | **1,088**, no duplicate |

With **Search related keywords** on, plus filters (published in the last 180 days, 500 likes or more, videos only),
2 keywords gave 233 videos in 3 minutes: 1,424 more were found and removed by the filters, not charged.

Douyin's web search shows a limited number of videos per keyword, then says there are no more. To go further, turn on
**Search related keywords**: when a keyword runs out, the run also searches the related searches Douyin suggests for
it (up to 5, three at a time), and each video says which search found it (`searchedAs`). The related searches are
Douyin's own suggestions and can drift from your keyword (for `fashion`: `fashion舞蹈`, but also a song title). Several
keywords are searched at the same time.

### Quick start

1. Type one or more keywords in **Keywords**, one per line (`咖啡`, `露营`, `iPhone 17`).
2. Set **Max results per keyword** (100 by default).
3. Click **Start** and read the videos in the run's **Output** tab.

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

### Inputs

- **Keywords**: one per line, in Chinese or English. A Douyin search link (`https://www.douyin.com/search/咖啡`)
  works too. The same keyword entered more than once is searched once.
- **Max results per keyword**: in Douyin's order, the most relevant first.
- **Search related keywords** (off by default): see above.
- **Published after**: only videos published after a date (`2026-09-01`) or within a period (`30 days`).
- **Min likes**: only videos with at least this many likes.
- **Content type**: Douyin search mixes videos and photo posts (图文). Keep both, or only one of them.
- **Max results**: total videos the run delivers, all keywords together, counted exactly.

Filters are applied to what Douyin's search returns: a narrow filter on a keyword with few results can leave few
videos. Videos removed by a filter are counted in the run summary and never charged.

Example, through the API:

```json
{
  "keywords": ["咖啡", "露营装备", "travel china"],
  "maxResultsPerKeyword": 200,
  "searchRelatedKeywords": true,
  "publishedAfter": "90 days",
  "minLikes": 1000,
  "maxItems": 600
}
```

### Output

One record per video. A real one, from 17 October 2026:

```json
{
  "type": "video",
  "status": "ok",
  "keyword": "露营",
  "position": 4,
  "videoId": "7510585934795115803",
  "url": "https://www.douyin.com/video/7510585934795115803",
  "title": "☔️在雨中使用新的车顶帐篷露营",
  "caption": "☔️在雨中使用新的车顶帐篷露营 #户外露营#露营漫时光#携宠出游#周末去哪玩#住进风景里",
  "hashtags": [
    "户外露营",
    "露营漫时光",
    "携宠出游",
    "周末去哪玩",
    "住进风景里"
  ],
  "categories": [
    "随拍",
    "生活记录",
    "日常vlog"
  ],
  "publishedAt": "2025-05-31T12:32:42Z",
  "durationSeconds": 1035.5,
  "isPhotoPost": false,
  "imageCount": null,
  "likeCount": 4898,
  "commentCount": 483,
  "shareCount": 1580,
  "saveCount": 1208,
  "coverUrl": "https://p5-ex-gddgtc-sign.douyinpic.com/tos-cn-p-0015/o4tAakFOeIDYr6CAZcUgfgEMo6IJ95hADLwv9B~tplv-dy-360p.jpeg?…",
  "width": 1440,
  "height": 1080,
  "isAd": false,
  "sellsProducts": false,
  "author": {
    "id": "3393515805216940",
    "secUid": "MS4wLjABAAAAgt7nK28gRiIBkHUVzhCfc_LmkttZHBAtBnvaYZWt86JS8SJBVF3jckCSUU_nkyb_",
    "username": "49944574028",
    "fullName": "露营🏕女孩",
    "followerCount": 12166,
    "isVerified": false,
    "verification": null,
    "url": "https://www.douyin.com/user/MS4wLjABAAAAgt7nK28gRiIBkHUVzhCfc_LmkttZHBAtBnvaYZWt86JS8SJBVF3jckCSUU_nkyb_",
    "avatarUrl": "https://p3.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-i-0813_oQvgnEAGD5AAADpBBIQIaijnm7qzEZkPQq2Ai.jpeg?…"
  },
  "sound": {
    "id": "7510587183888206618",
    "title": "@露营🏕女孩创作的原声",
    "author": "露营🏕女孩",
    "isOriginal": true
  },
  "searchedAs": "露营",
  "scrapedAt": "2026-10-17T06:51:36.328Z"
}
```

Fields that need a word of explanation:

- `position` is the video's rank for that keyword in this run (1 = first shown by Douyin).
- `searchedAs` is the search that found the video: the keyword itself, or a related keyword when **Search related
  keywords** is on.
- `categories` are the topics Douyin files the video under, broadest first.
- `isPhotoPost`: a photo post (图文) rather than a video; `imageCount` is its number of images, `durationSeconds` is
  empty for it.
- `saveCount`: how often the video was saved to favorites.
- `isAd`: a paid placement in the results. `sellsProducts`: the video links to products in Douyin's shop.
- `author.secUid` is the stable ID of the account in Douyin links; `author.username` is the Douyin ID the user chose,
  and can change.
- `author.followerCount` is empty (`null`) for the videos found through Douyin's general results: that page does not
  carry the author's followers, and the run never writes a made-up 0.
- `author.isVerified` is true when Douyin shows a certification badge on the author; `author.verification` is the
  label it shows (a job, a brand, a shop, a media).
- `coverUrl` is a signed image link that Douyin keeps valid for about two weeks: download the covers you need soon
  after the run.
- A search that fails gets an `error` record, free: `error` says why, `retryable` says if a later run may work.

The run summary (videos per keyword, related searches Douyin suggested, filtered and duplicate counts, why the run
stopped) is the `OUTPUT` record of the run's key-value store.

### Go further with the other Douyin scrapers

Search is where a Douyin project starts. Pass the `url` of the videos you found to:

- [Douyin Transcript Scraper](https://apify.com/quarra/douyin-transcript-scraper): what is said in each video, as text.
- [Douyin Comments Scraper](https://apify.com/quarra/douyin-comments-scraper): the comments of each video.
- [Douyin User Search Scraper](https://apify.com/quarra/douyin-user-search-scraper): accounts instead of videos, by
  keyword, with their full public profile.

### Pricing

Pay per event:

| Event | Price |
|---|---|
| Video | $5 per 1,000 |
| Run start | $0.005 per GB of memory (1 GB minimum; $0.005 at the default 512 MB) |

Never charged: videos removed by your filters, a video found by two keywords (delivered once), error records. Set
**Maximum cost per run** in the run options and the run stops before going over it.

### Limits

- Douyin's web search has no sort or date options for visitors: the order is Douyin's relevance order, and the date
  and likes filters are applied by the run on what the search returns.
- Video playback links are not delivered: Douyin's links from search expire within minutes. Use the `url` of the video.
- View counts are not delivered: Douyin's search gives 0 views for every video, so any number would be false.
- Douyin decides how many videos a keyword shows; two runs a few hours apart can return a somewhat different list.

### FAQ

**Do I need a Douyin account or to log in?** No.

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

**Can I search in English?** Yes. Douyin is a Chinese platform, so a Chinese keyword usually finds more videos.

**Why fewer videos than my limit?** Douyin's search ran out for that keyword; the run says so in its status and in
the run summary. Turn on **Search related keywords**, or add more precise keywords.

**What if the run is restarted by the platform (migration or reboot)?** It resumes where it was: videos already in
the dataset are not delivered or charged again.

**What if Douyin changes its pages?** The run fails with an error that says so, instead of reporting "no videos", and
nothing is charged but the start.

**Is it legal?** It collects public videos shown to any visitor of Douyin's search. Check the rules that apply to your
use of the data, especially for personal data.

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

# Actor input Schema

## `keywords` (type: `array`):

One keyword per line, in Chinese or English (咖啡, 露营, iPhone, travel). A Douyin search link (https://www.douyin.com/search/咖啡) works too. Each keyword is searched like in the app, most relevant results first.

## `maxResultsPerKeyword` (type: `integer`):

Results per keyword. Douyin's web search shows about 50 to 200 videos per keyword (measured); turn on 'Search related keywords' to go further.

## `searchRelatedKeywords` (type: `boolean`):

When a keyword runs out before its limit, also search the related keywords Douyin suggests for it (up to 5), and count their results for that keyword. Each result keeps the keyword actually searched in searchedAs.

## `publishedAfter` (type: `string`):

Only videos published after this date (2026-09-01, or relative: 30 days).

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

Only videos with at least this many likes.

## `contentType` (type: `string`):

Douyin search mixes videos and photo posts (图文); keep both or one of them.

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

Total number of results delivered by the run, all keywords together, counted exactly.

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

Set by the Actor.

## Actor input object example

```json
{
  "keywords": [
    "咖啡",
    "travel"
  ],
  "maxResultsPerKeyword": 20,
  "searchRelatedKeywords": false,
  "contentType": "all",
  "maxItems": 40,
  "searchType": "videos"
}
```

# Actor output Schema

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

Every result with all its fields, and free error records.

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

A table with one row per result.

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

Counts per keyword, related searches, why the run stopped, and errors.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "咖啡",
        "travel"
    ],
    "maxResultsPerKeyword": 20,
    "maxItems": 40
};

// Run the Actor and wait for it to finish
const run = await client.actor("quarra/douyin-video-search-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 = {
    "keywords": [
        "咖啡",
        "travel",
    ],
    "maxResultsPerKeyword": 20,
    "maxItems": 40,
}

# Run the Actor and wait for it to finish
run = client.actor("quarra/douyin-video-search-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 '{
  "keywords": [
    "咖啡",
    "travel"
  ],
  "maxResultsPerKeyword": 20,
  "maxItems": 40
}' |
apify call quarra/douyin-video-search-scraper --silent --output-dataset

```

## MCP server setup

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