# Douyin Search Scraper (`maximedupre/douyin-search-scraper`) Actor

Search public Douyin posts by keyword and save rows with captions, source links, publish times, creators, engagement, sounds, hashtags, media links, and content types. Choose video or mixed video and image-text results, then add video details when needed. No buyer login or cookies are needed.

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

## Pricing

from $1.80 / 1,000 matching posts

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

### 🔎 Find Public Douyin Posts by Keyword

For researchers, marketers, and developers who need public Douyin data, this Actor searches posts by keyword and saves structured rows with post links, captions, publish times, creators, engagement, sounds, hashtags, topic tags, and source-hosted media links. Choose video or mixed video and image-text results, then add video details when needed. No buyer login or cookies are needed.

**Use it to**

- Search public posts for a phrase with [**Douyin Keyword Search**](https://apify.com/maximedupre/douyin-search-scraper/examples/douyin-keyword-search).
- Find public posts for a hashtag with [**Douyin Hashtag Search**](https://apify.com/maximedupre/douyin-search-scraper/examples/douyin-hashtag-search).
- Collect video matches for a topic with [**Douyin Video Search**](https://apify.com/maximedupre/douyin-search-scraper/examples/douyin-video-search).
- Review creator, engagement, and media fields from a search with [**Douyin Search Scraper**](https://apify.com/maximedupre/douyin-search-scraper/examples/douyin-search-scraper).
- Search video posts with optional detail fields with [**Douyin Video Scraper**](https://apify.com/maximedupre/douyin-search-scraper/examples/douyin-video-scraper).

#### 📦 What Each Douyin Post Row Contains

Each saved row is one matching public Douyin post. It includes the post ID and source URL, caption, publication time, content type, and the keyword that first found it. When Douyin provides them, the row also includes creator details, engagement counts, sound data, hashtags, topic tags, and source-hosted media links.

If the same post matches more than one submitted keyword, the Actor saves the first eligible match and keeps that first keyword in `matchedKeyword`. It does not rewrite the row with later matching keywords. Optional source fields can be absent when Douyin does not provide them.

#### ▶️ Run a Douyin Search

1. Enter one or more search terms. Chinese, English, pinyin, hashtags, brand names, and emoji are supported by the input form.
2. Choose mixed video and image-text posts or video posts only.
3. Set a maximum number of posts, or leave it empty to return all available results until the Douyin source is exhausted.
4. Turn on video details when you need extra fields for matching video posts.
5. Start the run and open the dataset from the Output panel.

All search terms in one run use the same content type, result limit, and video-detail setting. Use a separate run when you need a different setup.

#### ⚙️ Input

Use one shared setup for all submitted search keywords. The Actor searches public Douyin posts and keeps the first saved match when a post appears for more than one keyword.

**Input fields**

| Field | Type | What it does |
|---|---|---|
| `searchKeywords` | array of strings | Search terms to submit. Each term uses the same settings in this run. |
| `contentTypes` | string | Choose `videoAndImageText` for mixed video and image-text posts, or `video` for video posts only. |
| `maxItems` | integer | Sets the maximum number of matching posts to save. Leave it empty to return all available results until the Douyin source is exhausted. |
| `includeVideoDetails` | boolean | Requests extra video fields for matching video posts. Image-text posts do not receive these fields, and unavailable source data stays absent. |

**Example input**

This example is copied from the public input of the successful current-beta default-input run.

```json
{
  "searchKeywords": [
    "douyin"
  ],
  "contentTypes": "videoAndImageText",
  "includeVideoDetails": false
}
```

**Work limit**

Leave `maxItems` empty to return all available results until the Douyin source is exhausted. The source can return fewer posts when it has fewer matching posts.

#### 🧾 Output

The Output panel links to the default dataset. Each dataset row is one matching Douyin post.

**Output panel**

| Field | Type | What it does |
|---|---|---|
| `dataset` | string URL | Opens the run dataset with the saved Douyin post rows. |

**Standard post row**

This shape covers video and image-text rows when video-detail enrichment is not saved. Optional nested fields appear only when Douyin provides them.

| Field | Type | What it does |
|---|---|---|
| `postId` | string | Stable ID for the Douyin post. |
| `postUrl` | string URL | Source page for the post. |
| `caption` | string | Caption published with the post. |
| `publishedAt` | date-time string | Publication time reported by Douyin. |
| `contentType` | string | Public result type: `video` or `imageText`. |
| `matchedKeyword` | string | Submitted keyword that first found the post. |
| `creator` | object | Public creator details when available. |
| `creator.id` | string | Stable creator ID. |
| `creator.displayName` | string | Creator name shown by Douyin. |
| `creator.handle` | string | Creator handle shown by Douyin. |
| `creator.followerCount` | integer | Followers reported for the creator. |
| `creator.postCount` | integer | Posts reported for the creator. |
| `creator.region` | string | Region shown for the creator. |
| `creator.bio` | string | Biography shown for the creator. |
| `creator.isVerified` | boolean | Whether Douyin marks the creator as verified. |
| `creator.profileUrl` | string URL | Source page for the creator profile. |
| `engagement` | object | Public engagement counts when available. |
| `engagement.likeCount` | integer | Likes reported for the post. |
| `engagement.commentCount` | integer | Comments reported for the post. |
| `engagement.shareCount` | integer | Shares reported for the post. |
| `engagement.saveCount` | integer | Saves reported for the post. |
| `engagement.viewCount` | integer | Views reported for the post. |
| `sound` | object | Attached sound or music details when available. |
| `sound.id` | string | ID for the attached sound. |
| `sound.title` | string | Title of the attached sound or music. |
| `sound.author` | string | Author shown for the sound or music. |
| `sound.url` | string URL | Source-hosted direct link to the sound when available. |
| `hashtags` | array of strings | Hashtags attached to the post. |
| `topicTags` | array of strings | Content topic tags supplied by Douyin. |
| `media` | object | Source-hosted direct media links when available. |
| `media.videoUrl` | string URL | Direct source-hosted link to the post video. |
| `media.coverUrl` | string URL | Direct source-hosted link to the post cover image. |

**Example standard row**

This unshortened row is copied from the successful current-beta default-input run.

```json
{
  "postId": "7618946574072925157",
  "postUrl": "https://www.iesdouyin.com/share/video/7618946574072925157/?region=US&mid=6844597190434752513&u_code=0&did=MS4wLjABAAAAhI_xXlyIOBbg-MhlIWkA6wmFOLKt-VuaeAPaRMxm-jEa7C99CQkoLADeBBVh8u1-&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&with_sec_did=1&video_share_track_ver=&titleType=title&share_sign=mzWqRysVMH5EQctTrUvnITYrGwpby3ZjZ5MKJYPkOmI-&share_version=290000&ts=1790261938&from_aid=581610&from_ssr=1&share_track_info=%7B%22link_description_type%22%3A%22%22%7D",
  "caption": "从夯到拉排名抖音分支APP#从夯到拉 #锐评 #排名 #抖音",
  "publishedAt": "2026-03-19T12:43:55.000Z",
  "contentType": "video",
  "matchedKeyword": "douyin",
  "creator": {
    "id": "7494199450790921276",
    "displayName": "熊大爱玩三角洲",
    "handle": "XDlove_play_Game",
    "followerCount": 0,
    "postCount": 0,
    "region": "CN",
    "bio": "三角洲行动攻略区/爆料区主播\n粉丝🐧🐧1108966072",
    "isVerified": true,
    "profileUrl": "https://m.douyin.com/share/user/MS4wLjABAAAAqOY0YrSiNSz2m92ELo4LQj4uIe9LOgNOl_0DtrCFngWzzzEFj4i2BzpwnR_RmQfe?scene_from=douyin_h5_search"
  },
  "engagement": {
    "likeCount": 9286,
    "commentCount": 396,
    "shareCount": 976,
    "saveCount": 2680,
    "viewCount": 0
  },
  "sound": {
    "id": "6844597190434752513",
    "title": "Si Tu Vois Ma Mere",
    "author": "Max Greger"
  },
  "hashtags": [
    "从夯到拉",
    "锐评",
    "排名",
    "抖音"
  ],
  "topicTags": [
    "个人管理",
    "职场技能",
    "职场营销"
  ],
  "media": {
    "videoUrl": "https://v3-dymsearch.douyinvod.com/94eb25b3e7b0c05c22e8f8096230c602/6ab54918/video/tos/cn/tos-cn-ve-15c000-ce/owVBiDOCeB77BWe7IQC5ifZVQ7d8TEAwrJ97gJ/?a=581610&ch=11&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=276&bt=276&cs=0&ds=3&ft=ukz_CPa1DyjNHwVQ9wzTglHhd.7EPJER3-ApQX&mime_type=video_mp4&qs=0&rc=aWg3ZWk4NDs2OzU4OmVoaEBpajR1ZnU5cmR4OTMzbGkzNUBfXzEyMF8wNjAxMS00Y18tYSNgbi4uMmRzcnFhLS1kLTVzcw%3D%3D&btag=c0000e00028000&dy_q=1790261938&feature_id=f5241e7604dff1d9d6c943fd20bd51a2&l=202609242258575D7A177467F64EA6444A",
    "coverUrl": "https://p5-ex-gddgtc-sign.douyinpic.com/tos-cn-i-0813c000-ce/o0QzdQl7uEjwB7ZJET9g4eDeFJfAAF4ACIP7AF~tplv-dy-resize-walign-adapt-aq:540:q75.webp?biz_tag=aweme_video&card_type=153&column_n=0&from=327834062&l=202609242258575D7A177467F64EA6444A&lk3s=138a59ce&s=PackSourceEnum_SEARCH&sc=cover&se=false&x-expires=1791468000&x-signature=Xhn2%2FXs3fOYMvLC7vy3qhrSI9fA%3D"
  }
}
```

**Enriched video row**

When `includeVideoDetails` is true and Douyin provides detail data for a matching video, the row keeps the standard fields and adds `videoDetails`.

| Field | Type | What it does |
|---|---|---|
| `postId` | string | Stable ID for the Douyin post. |
| `postUrl` | string URL | Source page for the post. |
| `caption` | string | Caption published with the post. |
| `publishedAt` | date-time string | Publication time reported by Douyin. |
| `contentType` | string | Public result type, which is `video` for this shape. |
| `matchedKeyword` | string | Submitted keyword that first found the post. |
| `creator` | object | Public creator details when available. |
| `creator.id` | string | Stable creator ID. |
| `creator.displayName` | string | Creator name shown by Douyin. |
| `creator.handle` | string | Creator handle shown by Douyin. |
| `creator.followerCount` | integer | Followers reported for the creator. |
| `creator.postCount` | integer | Posts reported for the creator. |
| `creator.region` | string | Region shown for the creator. |
| `creator.bio` | string | Biography shown for the creator. |
| `creator.isVerified` | boolean | Whether Douyin marks the creator as verified. |
| `creator.profileUrl` | string URL | Source page for the creator profile. |
| `engagement` | object | Public engagement counts when available. |
| `engagement.likeCount` | integer | Likes reported for the post. |
| `engagement.commentCount` | integer | Comments reported for the post. |
| `engagement.shareCount` | integer | Shares reported for the post. |
| `engagement.saveCount` | integer | Saves reported for the post. |
| `engagement.viewCount` | integer | Views reported for the post. |
| `sound` | object | Attached sound or music details when available. |
| `sound.id` | string | ID for the attached sound. |
| `sound.title` | string | Title of the attached sound or music. |
| `sound.author` | string | Author shown for the sound or music. |
| `sound.url` | string URL | Source-hosted direct link to the sound when available. |
| `hashtags` | array of strings | Hashtags attached to the post. |
| `topicTags` | array of strings | Content topic tags supplied by Douyin. |
| `media` | object | Source-hosted direct media links when available. |
| `media.videoUrl` | string URL | Direct source-hosted link to the post video. |
| `media.coverUrl` | string URL | Direct source-hosted link to the post cover image. |
| `videoDetails` | object | Extra video fields returned when requested and available. |
| `videoDetails.durationSeconds` | number | Video duration in seconds. |
| `videoDetails.width` | integer | Video width in pixels. |
| `videoDetails.height` | integer | Video height in pixels. |
| `videoDetails.frameRate` | number | Video frame rate. |
| `videoDetails.bitrateKbps` | number | Video bitrate in kilobits per second. |
| `videoDetails.format` | string | Video format. |
| `videoDetails.codec` | string | Video codec. |
| `videoDetails.fileSizeBytes` | integer | Video file size in bytes. |

**Example enriched video row**

This unshortened row is copied from the successful current-beta video run with video details enabled.

```json
{
  "postId": "7665457860315743161",
  "postUrl": "https://www.iesdouyin.com/share/video/7665457860315743161/?region=US&mid=7665457675165862698&u_code=0&did=MS4wLjABAAAAQn6FJUle4o4qrHa0PmxvwXd89yWgveNiK8jtnEzvYm7rxF3ThNUi3m852xpbOLxk&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&with_sec_did=1&video_share_track_ver=&titleType=title&share_sign=UBZsnpOaNAtomAfEpaIHBL0xBfkwU0aMbDt._4cIH9Q-&share_version=290000&ts=1790261472&from_aid=581610&from_ssr=1&share_track_info=%7B%22link_description_type%22%3A%22%22%7D",
  "caption": "#抖音如何升级最新版本新功能全都有。#手机使用小妙招 #实用数码小技巧 #抖音小技巧",
  "publishedAt": "2026-07-22T20:51:28.000Z",
  "contentType": "video",
  "matchedKeyword": "douyin",
  "creator": {
    "id": "3123038106943695",
    "displayName": "娟子「砥砺前行」",
    "handle": "J3876888",
    "followerCount": 34367,
    "postCount": 0,
    "region": "CN",
    "bio": "强大自己是解决问题的唯一方法\n以视频传递知识，用内容记录热爱\n每天分享手机技巧小知识",
    "isVerified": true,
    "profileUrl": "https://m.douyin.com/share/user/MS4wLjABAAAAPN7CC1Sn0wYT3Q7iz89e2X7XB95OMVNisQs7XSUkALayZAAr4sFpm3-icfCU0A3p?scene_from=douyin_h5_search"
  },
  "engagement": {
    "likeCount": 2090,
    "commentCount": 140,
    "shareCount": 647,
    "saveCount": 1567,
    "viewCount": 0
  },
  "sound": {
    "id": "7665457675165862698",
    "title": "@娟子「砥砺前行」创作的原声",
    "author": "娟子「砥砺前行」",
    "url": "https://sf3-sign.douyinstatic.com/ies-music-hj/7665457798964054833.mp3?x-expires=1790347872&x-signature=vbp9oEYsg8dH52y2KsAPhx8ToS0%3D"
  },
  "hashtags": [
    "抖音如何升级最新版本新功能全都有。",
    "实用数码小技巧",
    "抖音小技巧"
  ],
  "topicTags": [
    "科技",
    "手机",
    "手机功能教程"
  ],
  "media": {
    "videoUrl": "https://v3-dymsearch.douyinvod.com/438491e52ba22e4664c36af43a9eb970/6ab546fc/video/tos/cn/tos-cn-ve-15c000-ce/oMepBw21DGGhihoIILLQfIgVTfsiEAGfLzGg8A/?a=581610&ch=11&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=281&bt=281&cs=0&ds=3&ft=ukz_CPa1DyjNHwVQ9wKoglHhd.UfGUAg3-ApQX&mime_type=video_mp4&qs=0&rc=ZzozOzw3ODhmaGg8PGQ3ZEBpanM4N3k5cjZsPDMzbGkzNUBiLjMwLV8tNTYxNi40NjZgYSNzZF5zMmRzbmRhLS1kLTVzcw%3D%3D&btag=c0000e00008000&dy_q=1790261472&feature_id=f5241e7604dff1d9d6c943fd20bd51a2&l=20260924225111A4DF505215765E6EB919",
    "coverUrl": "https://p26-sign.douyinpic.com/tos-cn-p-0015c000-ce/o8nfWpkD8AG2BFMfDpVCQ5QAFX2eLhXjhgQITe~tplv-dy-resize-walign-adapt-aq:540:q75.webp?lk3s=138a59ce&x-expires=1791468000&x-signature=Lobbjs0ZkTGq03d5NZaKho5n3Bw%3D&from=327834062&s=PackSourceEnum_SEARCH&se=false&sc=cover&biz_tag=aweme_video&l=20260924225111A4DF505215765E6EB919"
  },
  "videoDetails": {
    "durationSeconds": 12.168,
    "width": 1080,
    "height": 1920,
    "frameRate": 30,
    "bitrateKbps": 288.492,
    "format": "mp4",
    "codec": "h264",
    "fileSizeBytes": 438797
  }
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. The charged events describe saved outcomes in the dataset.

| Event | Charged for |
|---|---|
| Matching post | One matching post saved to the dataset. |
| Video details | Video details saved for one matching video when requested. |

#### 🔌 Integrations

Open the dataset in Apify or read it through the Apify API. The source-hosted media and profile links in each row can be passed to your own workflow when available.

**Watch the walkthrough**

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### What happens when one post matches more than one keyword?

The Actor saves the first eligible match and keeps the first submitted keyword in `matchedKeyword`. It does not replace that row with a later match.

##### Can a mixed search return image-text posts?

Yes. Set `contentTypes` to `videoAndImageText` for mixed results. Set it to `video` when you want video posts only.

##### What does video-detail enrichment add?

When requested, matching video posts can include duration, size, frame rate, bitrate, format, codec, and file size fields. Image-text posts do not receive video details, and unavailable source fields stay absent.

##### What happens when I leave the result limit empty?

The Actor returns all available results until the Douyin source is exhausted. The source can return fewer posts when it has fewer matching posts.

##### Do I need a Douyin login or cookies?

No buyer-supplied Douyin login credentials or cookies are needed. The Actor searches public Douyin content.

##### Can one run use different settings for each keyword?

No. All keywords in one run use the same content type, result limit, and video-detail choice. Use separate runs for different setups.

##### Does the Actor store video or image files?

No. It returns source-hosted direct media links when Douyin provides them. It does not archive media files in Apify Storage.

##### Can I search profiles, comments, live streams, or hot-search boards?

No. This Actor searches public posts. Account search, comment search, live-stream search, and hot-search-board data are separate products.

### 📝 Changelog

**v0.0** (24-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~douyin-search-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Douyin Search Scraper - Video & User Insights](https://apify.com/cloudcharlestom/douyin-search-scraper) - Explore keyword search with video, creator, engagement, and music fields.
- [Douyin Search Scraper](https://apify.com/kuaima/douyin-search) - Open another simple Douyin search workflow for public search data.
- [Douyin Video Search Scraper](https://apify.com/toolzerhub/douyin-video-search-scraper) - Filter video searches by sort order, recency, length, and content type.
- [Douyin Scraper - Search 抖音 Videos, Creators & Downloads](https://apify.com/vulnv/douyin-search-scraper) - Review creator, music, hashtag, and video-tag data from keyword searches.
- [Douyin Search Scraper](https://apify.com/khadinakbar/douyin-search-scraper) - Use keyword search for author, view, like, comment, music, and hashtag fields.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

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

Enter one or more Douyin search terms. You can use Chinese, English, pinyin, hashtags, brand names, or emoji. All terms use the same settings in this run.

## `contentTypes` (type: `string`):

Choose mixed video and image-text results, or video results only. Mixed results use Douyin's public video and image-text search, while video-only results use its video-only route.

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

Set the maximum number of matching posts to save. Leave it empty to return all available results until the Douyin source is exhausted.

## `includeVideoDetails` (type: `boolean`):

Add full video-detail enrichment for matching video posts. This does not add details to image-text or article results, and unavailable source data stays empty.

## Actor input object example

```json
{
  "searchKeywords": [
    "douyin"
  ],
  "contentTypes": "videoAndImageText",
  "maxItems": 20,
  "includeVideoDetails": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the dataset with one row for each matching Douyin post.

# 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": [
        "douyin"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/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": ["douyin"],
    "maxItems": 20,
}

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

```

## MCP server setup

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