# Douyin Search Scraper — Find Videos by Keyword (No Watermark) (`hgservices/douyin-search-scraper`) Actor

Search Douyin (抖音) by keyword and export full video data: no-watermark MP4 URLs, captions, likes, comment & share counts, music & hashtags. No login, no code. Export to JSON, CSV, or Excel.

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

## Pricing

from $2.00 / 1,000 search results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

Search **Douyin (抖音)** — China's version of TikTok — by keyword and export clean, structured video data in seconds. Get **no-watermark video download URLs**, captions, hashtags, like/comment/share counts, author details, and music for every matching video. **No login, no coding, no browser extensions.**

Export results to **JSON, CSV, or Excel**, or pull them straight into your app through the Apify API. Schedule runs, monitor keywords over time, and connect [Douyin](https://www.douyin.com/) data to your existing tools — all on the Apify platform.

### What does Douyin Search Scraper do?

Douyin Search Scraper turns any keyword into a structured dataset of matching Douyin videos — a practical alternative to a Douyin search API.

- 🔎 **Search Douyin by keyword** — discover videos by any search term: Chinese or English words, hashtags, brand names, person names, even emoji. Filter by publish window and video duration.
- 🎬 **No-watermark video download URLs** — every video includes a direct MP4 link without the Douyin watermark. Links are temporary, so download the files promptly after the run if you need to keep them.
- 📊 **Full engagement metrics** — likes, comments, shares, and saves for every video.
- 🖼️ **Photo and slideshow posts too** — image posts are captured alongside videos, with all picture URLs.
- ⚡ **Zero setup** — works out of the box. No Douyin account, cookie, or proxy configuration needed.

### Why scrape Douyin search results?

Douyin is China's largest short-video platform and a window into Chinese consumer trends, but its data is hard to access from outside. Use this scraper to:

- **Monitor brands and competitors** — see which videos surface for your brand, products, or competitors, and how audiences engage with them.
- **Discover influencers** — find creators posting about your topics, with engagement stats to shortlist partners.
- **Research trends and content** — track which captions, hashtags, and sounds gain traction in your niche.
- **Run China market research** — study consumer interests and local trends before entering or expanding in the Chinese market.
- **Collect videos without watermark** — download clean MP4s of content you have rights to, for analysis or reuse.

### How to scrape Douyin search results

1. **Add search keywords** — one or more terms (e.g. `美食`, `#travel`, a brand or person name).
2. **Set your options** — max results per keyword, publish window, and duration filters.
3. **Click Start** — then download the dataset as JSON, CSV, or Excel, or fetch it via the Apify API.

#### Example input

```json
{
  "searchKeywords": ["美食", "家常菜"],
  "maxResultsPerKeyword": 50,
  "searchPublishTime": "one_week",
  "searchDuration": "under_1m"
}
```

### Input options

| Option | Values | Description |
|--------|--------|-------------|
| `searchKeywords` | list of strings | **Required.** One or more search terms. Each keyword is searched independently; a video surfacing under several keywords is returned — and billed — only once. |
| `maxResultsPerKeyword` | `1`–`2000` (default `50`) | Upper bound on results per keyword. |
| `searchPublishTime` | `unlimited` / `one_day` / `one_week` / `half_year` | Only videos published within this window. |
| `searchDuration` | `unlimited` / `under_1m` / `one_to_five` / `over_5m` | Only videos in this length range. |

### What data do you get?

One row per matching video. Example (shortened):

```json
{
  "awemeId": "7669384517982899506",
  "searchKeyword": "美食",
  "url": "https://www.douyin.com/video/7669384517982899506",
  "desc": "鸡爪这样做太香了 #美食 #美食教程",
  "authorName": "孟娜",
  "diggCount": 15234,
  "commentCount": 340,
  "videoUrlNoWatermark": "https://.../main.mp4"
}
```

Main output fields:

| Field | Description |
|-------|-------------|
| `url` | Link to the video page on Douyin |
| `desc` | Video caption text |
| `hashtags` | Hashtags parsed from the caption |
| `authorName`, `uniqueId`, `authorUid`, `secUserId` | Author display name, @handle, and user IDs |
| `createTime` | Publish date (ISO 8601 timestamp) |
| `durationMs` | Video length in milliseconds |
| `region` | Country/region code reported for the video |
| `diggCount`, `commentCount`, `shareCount`, `collectCount`, `admireCount` | Engagement counts: likes, comments, shares, saves, admires |
| `videoUrlNoWatermark` | Direct no-watermark MP4 download URL (temporary link) |
| `videoMirrors` | Backup no-watermark download URLs |
| `cover` | Cover/thumbnail image URL |
| `musicUrl` | Background music/audio track URL |
| `images` | Image URLs for photo (slideshow) posts |
| `seoOcrContent` | On-screen text recognized in the video, when available |
| `isVideo` | `true` for videos, `false` for photo posts |
| `searchKeyword` | The keyword that surfaced this video |

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

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

This Actor uses **pay-per-event pricing** — you only pay for what you actually get:

| Event | Price | When you're charged |
|-------|-------|---------------------|
| **Search query** | $0.02 | Once per search keyword processed. A keyword whose search fails entirely is **not** charged. |
| **Search result** | $0.005 | Once per video row delivered to the dataset. |

A keyword typically returns ~10–15 videos, so one keyword costs roughly **$0.07–$0.10**. Videos surfacing under multiple keywords are delivered — and billed — only once. Set a **Maximum cost per run** cap when starting the Actor and you'll never be charged beyond it; results are only delivered while your budget covers them.

### Tips for best results

- **Use broader keywords** — niche or very new terms may match few videos; broader terms surface more.
- **Download media promptly** — no-watermark links are temporary, so grab the files soon after the run. No media files are stored on Apify.
- **Schedule runs** — run daily or weekly to track how Douyin search results for your keywords change over time.
- **Cap your budget** — set a Maximum cost per run for full cost control.

### Frequently asked questions

**Do I need a Douyin account or cookie?**
No. Search works out of the box with no Douyin account.

**Can I download Douyin videos without a watermark?**
Yes. Every video result includes a direct no-watermark MP4 URL. The link is temporary, so download the file promptly if you need to keep it.

**How many results do I get per keyword?**
Typically about 10–15 per keyword — the most relevant matches for that term.

**Is this a Douyin API?**
It works like one. Douyin doesn't offer a public keyword-search API, so this Actor is a practical Douyin API alternative — trigger runs and consume results as JSON through the Apify API, or from Make, Zapier, or n8n.

**What if a keyword returns nothing?**
Niche or very new terms may have few matching videos — try a broader keyword.

**Does it capture photo (slideshow) posts?**
Yes. Image posts return their picture URLs alongside the usual metadata.

**What formats can I export?**
JSON, CSV, Excel, or HTML — or pull data programmatically through the Apify API.

### Integrations

Connect Douyin Search Scraper to your workflow with the **Apify API**, or automate it with **Make**, **Zapier**, **n8n**, Google Sheets, Slack, and more. Schedule runs to keep your Douyin data fresh automatically.

### Is it legal to scrape Douyin?

This scraper collects **publicly available** data only. You are responsible for how you use the data — respect Douyin's terms of service, applicable laws (such as GDPR), and copyright. Do not use scraped content in ways that infringe creators' rights. If in doubt, seek legal advice.

# Actor input Schema

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

Search Douyin by keyword and get one row per matching video. Chinese, English, hashtags (e.g. #美食), brand or person names, and emoji all work. Each keyword is searched independently; duplicates across keywords are removed automatically so a video is only returned (and billed) once.

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

Upper bound on videos fetched per keyword. Web discovery returns roughly the top 10–15 indexed videos per keyword. One row = one billable result, so set this to what you actually need.

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

Limit search results to videos published within this window.

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

Limit search results to videos in this length range.

## Actor input object example

```json
{
  "searchKeywords": [
    "美食"
  ],
  "maxResultsPerKeyword": 50,
  "searchPublishTime": "unlimited",
  "searchDuration": "unlimited"
}
```

# Actor output Schema

## `videos` (type: `string`):

One row per Douyin video matching the search keywords: video URL, caption, author info, publish time, duration, engagement stats (likes, comments, shares, saves, admires), hashtags, cover image, background music URL and no-watermark MP4 URLs (primary + CDN mirrors). Keywords whose web discovery failed appear as rows with only "searchKeyword" and "error" set. Note: no-watermark douyinvod.com CDN URLs are signed and expire — download the files promptly after the run. No media is stored on Apify.

# 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("hgservices/douyin-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 = { "searchKeywords": ["美食"] }

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

```

## MCP server setup

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