# Douyin 抖音 Video Scraper & Downloader - No Login (`benthepythondev/douyin-video-scraper`) Actor

Returns Douyin (抖音) videos by link, share link or id: a no-watermark MP4 link up to 1080p that does not expire, caption, hashtags, likes, comments, shares and saves, creator, music with MP3 link, cover and every quality Douyin lists. Photo posts too. Dead links are free rows. No login or cookies.

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

## Pricing

from $1.70 / 1,000 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

## 🎬 Douyin Video Scraper & Downloader (抖音)

Returns Douyin (抖音, the Chinese TikTok) videos by link, without a login or cookies. Paste video links, share links from the app or bare ids and get one row per post: an MP4 link without watermark in the largest size Douyin serves, the caption with its hashtags, likes, comments, shares and saves, the creator, the music with an MP3 link, the cover, and every rendition Douyin lists. Photo posts come back with their pictures. Export to JSON, CSV or Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

**Price:** $2.00 per 1,000 posts on the Apify Free plan, $1.90 on Bronze, $1.80 on Silver, $1.70 from Gold up. The top comments and the creator's numbers are optional and cost nothing extra. A link that leads nowhere, to a private or deleted post, or to something that is no post comes back as a row with the reason and is not charged.

### 🔎 What is the Douyin Video Scraper?

Douyin's share site answers a phone browser's plain requests. This Actor asks it for 25 videos at a time, reads photo posts and dead links from their share pages, and follows `v.douyin.com` share links to the post they name. No browser is started and no request is signed: a run of 826 links peaked at 119 MB of memory.

What Douyin hands a visitor for a video, as measured on October 6, 2026:

- **A play link without watermark that does not expire with the page.** `videoUrl` redirects to a fresh file link each time it is opened and needs no headers or cookies: plain `curl` fetched it from another address than the one that read the post. A link of this form, built from a file id that a public README printed in February 2025, still answered in October 2026.
- **The largest file, checked per video.** Douyin's redirect answers a request for 1080p with a 576-pixel file when it keeps no 1080p one, although a 720p file exists. The Actor looks at where each link leads and returns the better one; `videoQuality` names what you get. Of 800 videos in our test 713 had a 1080p file, 73 a 720p one and 14 a 540p one. Every file we opened behind these links was H.264.
- **The file with Douyin's watermark** as `videoUrlWatermark` (720p in the twelve we opened), and the sound alone as `audioUrl` (MP3). The watermark link wants a browser's `User-Agent` header; `Mozilla/5.0` was enough.
- **Every rendition Douyin lists,** mostly H.265 up to 720p, with resolution, bitrate, frame rate, bytes and a link each (`videoMeta.qualities`, five per video at the median).
- **No play count and no follower number in the post.** Douyin sends a visitor zero for both. The follower number across Douyin's platforms comes from the creator's own record, see `includeAuthorDetails`.

#### What data does it extract?

- **Files:** `videoUrl`, `videoQuality`, `videoUrlWatermark`, `audioUrl`, `coverUrl`, `videoMeta` (original width and height, covers, `qualities`), `images` of a photo post
- **Post:** `id`, `url`, `shareUrl`, `type` (video or imageText), `text`, `createTime`, `createDate`, `durationSeconds`, `hashtags`, `mentions`, `videoTags` (Douyin's own three-level classification), `series`, `cityCode`, `isAd`, `canDownload`
- **Counts:** `statistics.diggCount` (likes), `commentCount`, `shareCount`, `collectCount` (saves), `downloadCount`
- **Creator:** `authorMeta` with id, secUid, name, Douyin number, custom handle, verification, bio, avatar, number of posts, total likes received, region, profile link
- **Music:** `musicMeta` with id, title, author, album, original-sound flag, length, MP3 link
- **Optional:** `topComments` (ten to twenty per post), and in `authorMeta` the follower number across Douyin's platforms and the number of accounts followed
- **Outcome:** `status` and, when there is no post, `statusReason` with Douyin's own answer

#### What users of Douyin Actors report, and what this Actor does

The issue pages and listings of the most used Douyin Actors on Apify were read on October 6, 2026.

| Reported or stated there | Here |
|---|---|
| "没抓到作者的粉丝数" (the creator's follower number is missing); "creator follower counts may be absent" | Douyin's post record carries zero for it. With `includeAuthorDetails` the number comes from the creator's own record: 8 of 8 posts in our test had it. It is the follower number across Douyin's platforms, which Douyin gives a visitor in round numbers (2,269,000; 3,000; 100) |
| "Invalid post URL"; "a v.douyin.com short link has no ID in it and is skipped" | Share links are followed to their post. The whole share message the app copies works as an entry, and so do links with `modal_id=`. An entry that names no post is a row with `invalid_link`, not a failed run |
| "can't download the video"; the video link lives "about an hour" | `videoUrl` is a redirect that hands out a fresh file link each time. The file links themselves named an end 62 minutes ahead in our test |
| "Always output the same video" | 826 links gave 826 rows with 826 different ids, each under the link it was asked for |
| "Not authorized, Invalid apikey"; "Your APIKEY has run out of requests" | No third-party service and no key: the Actor reads Douyin's share site itself |
| "Cannot grant Full Permissions to download videos (Key-Value Store error)" | Runs with limited permissions and stores no files |
| "Not getting any results"; "Incomplete data" | Every link gets a row with a status. Of 800 videos in our test all carried the file link, the four counts, the creator and the cover; 795 carried the music |
| "Can you also add View Count"; `playCount` returns 0 | Not available: Douyin sends visitors zero. The column is left out here instead of being filled with zeros |
| Up to 10 videos on the Apify Free plan, for the account's lifetime | No cap of its own. The Free plan pays for what your Apify credit covers |
| Private and deleted posts "are not addressable" | They are rows: `private` or `not_found`, with Douyin's reason, free |

### ⬇️ Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `videoUrls` | array | | Posts to read: browser links (`douyin.com/video/…`, `/note/…`, any link with `modal_id=…`), share pages (`iesdouyin.com/share/video/…`), app share links (`v.douyin.com/…`), whole share messages, or bare ids |
| `includeComments` | boolean | false | Adds `topComments`: the ten to twenty comments Douyin's share page shows under the post |
| `includeAuthorDetails` | boolean | false | Adds to `authorMeta` the follower number across Douyin's platforms and the number of accounts followed |

A post named twice is read once, also when a share link and a full link name the same post. An empty input reads nothing and costs nothing.

#### Example input

```json
{
  "videoUrls": [
    "https://www.douyin.com/video/7577614489533680959",
    "https://www.iesdouyin.com/share/video/7599195778485161252/",
    "https://www.douyin.com/note/7630302640823912635"
  ],
  "includeComments": true,
  "includeAuthorDetails": true
}
```

A share link from the app (`https://v.douyin.com/…/`) and the whole share message the app copies work the same way. Such links expire after a while, so none is printed here.

#### Coming from another Douyin Actor?

The link fields `postUrls`, `links`, `urls` and `startUrls` are read like `videoUrls`, and `scrapeAdditionalUserInfo` like `includeAuthorDetails`. Switches that store files (`shouldDownloadVideos`, `shouldDownloadCovers`) are not read: this Actor returns links and stores nothing.

### ⬆️ Output

A video with both options on (two of five hashtags, two of six renditions and one of ten comments are shown, and the picture links are shortened):

```json
{
  "status": "ok",
  "statusReason": null,
  "inputUrl": "7577614489533680959",
  "id": "7577614489533680959",
  "url": "https://www.douyin.com/video/7577614489533680959",
  "shareUrl": "https://www.iesdouyin.com/share/video/7577614489533680959/",
  "type": "video",
  "text": "这个贵州五线小城，凭什么是中国“吃商”最高的城市？ 糟了，捅了贵州老吃家的窝了！\n#抖音美食班当季新菜单 #当季新菜单挑战赛 #贵州美食 #中国街头小吃 #老吃家",
  "createTime": 1764320400,
  "createDate": "2025-11-28T09:00:00+00:00",
  "durationSeconds": 1082.5,
  "videoUrl": "https://aweme.snssdk.com/aweme/v1/play/?video_id=v0d00fg10000d4kh28fog65galnscnag&ratio=1080p&line=0",
  "videoQuality": "1080p",
  "videoUrlWatermark": "https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0d00fg10000d4kh28fog65galnscnag&ratio=720p&line=0",
  "audioUrl": "https://lf26-music-east.douyinstatic.com/obj/ies-music-hj/7577614877490023225.mp3",
  "coverUrl": "https://p3-sign.douyinpic.com/tos-cn-i-dy/dd86d19831db4137a55d0b5b63abb717~c5_300x400.jpeg?…",
  "statistics": {
    "diggCount": 4063751,
    "commentCount": 163211,
    "shareCount": 5188056,
    "collectCount": 855106,
    "downloadCount": 815
  },
  "authorMeta": {
    "id": "75736792009",
    "secUid": "MS4wLjABAAAAjjwfy25gmtDlk8Wg6FNIBzHdHicG6BpZZNvWoTLL8S4",
    "name": "盗月社食遇记",
    "username": "124700482",
    "customUsername": "daoyueshe",
    "verified": false,
    "verificationReason": null,
    "signature": "❤️心里有光，哪儿都美❤️",
    "avatar": "https://p3.douyinpic.com/aweme/1080x1080/aweme-avatar/mosaic-legacy_46b70035a34b703f74fe.jpeg?from=327834062",
    "awemeCount": 727,
    "totalLikesReceived": 19533538,
    "followingCount": 200,
    "mplatformFollowersCount": 2269000,
    "region": "CN",
    "url": "https://www.douyin.com/user/MS4wLjABAAAAjjwfy25gmtDlk8Wg6FNIBzHdHicG6BpZZNvWoTLL8S4"
  },
  "musicMeta": {
    "id": "7577614774507424547",
    "title": "@盗月社食遇记创作的原声",
    "author": "盗月社食遇记",
    "album": null,
    "isOriginal": true,
    "duration": 1082,
    "playUrl": "https://lf26-music-east.douyinstatic.com/obj/ies-music-hj/7577614877490023225.mp3"
  },
  "videoMeta": {
    "width": 3840,
    "height": 2160,
    "ratio": "720p",
    "format": "mp4",
    "cover": "https://p3-sign.douyinpic.com/tos-cn-i-dy/dd86d19831db4137a55d0b5b63abb717~c5_300x400.jpeg?…",
    "originCover": "https://p5-ex-gddgtc-sign.douyinpic.com/tos-cn-p-0015/oUIPDfXtDAcpFwfAhpEGR6IHKBNIqVGggH9REA~tplv-dy-360p.jpeg?…",
    "dynamicCover": "https://p3-sign.douyinpic.com/obj/tos-cn-i-dy/dd86d19831db4137a55d0b5b63abb717?…",
    "qualities": [
      { "label": "720_1_1", "codec": "h265", "width": 1280, "height": 720, "bitrate": 1175087, "fps": 30, "bytes": 159006653, "url": "https://api-play.amemv.com/aweme/v1/play/?video_id=v0d00fg10000d4kh28fog65galnscnag&line=0&file_id=b6aa70a5fd844ad789706ccdcb3f230a&sign=7405f6958e810923275eb6d141c3d4db&is_play_url=1&source=PackSourceEnum_AWEME_DETAIL" },
      { "label": "540_1_1", "codec": "h265", "width": 1024, "height": 576, "bitrate": 1140455, "fps": 30, "bytes": 154320509, "url": "https://api-play.amemv.com/aweme/v1/play/?video_id=v0d00fg10000d4kh28fog65galnscnag&line=0&file_id=ffeca176785f485b92880b23952264e1&sign=b128e2b568c1fa8254b21aee440ad4a5&is_play_url=1&source=PackSourceEnum_AWEME_DETAIL" }
    ]
  },
  "hashtags": [
    { "id": "7572059655971538944", "name": "抖音美食班当季新菜单" },
    { "id": "7566214863073052715", "name": "当季新菜单挑战赛" }
  ],
  "mentions": [],
  "videoTags": [
    { "name": "美食", "level": 1 },
    { "name": "美食探店", "level": 2 },
    { "name": "餐厅探店", "level": 3 }
  ],
  "images": [],
  "series": { "id": "7486681757459154981", "name": "吃遍中国街头美食", "episode": 8, "total": 11 },
  "cityCode": "310000",
  "isAd": false,
  "canDownload": true,
  "topComments": [
    { "id": "7577705748605993785", "text": "自己来当课代表[比心]个人口味仅供参考哦～贵州的朋友也可以多多推荐好吃的哦！", "likes": 14704, "replyCount": 1041, "createTime": 1764322109, "createDate": "2025-11-28T09:28:29+00:00", "authorName": "盗月社食遇记", "ipLabel": "上海" }
  ],
  "scrapedAt": "2026-10-06T21:30:56.755602+00:00"
}
```

A photo post has `type` `imageText`, no video fields, its pictures without watermark in `images` (link, width, height) and its sound in `audioUrl`.

An id that does not exist:

```json
{
  "status": "not_found",
  "statusReason": "Douyin has no post with this id. Douyin's answer: SYSTEM_ITEM_NOT_EXIST",
  "inputUrl": "7000000000000000000",
  "id": "7000000000000000000",
  "url": "https://www.douyin.com/video/7000000000000000000",
  "type": null,
  "videoUrl": null,
  "statistics": null
}
```

The other statuses without a charge are `private` (Douyin does not show the post to visitors; its message says "because of the post's permissions or because it was deleted" and does not tell the two apart), `invalid_link` (no Douyin post link, share link or id, for example a profile link) and `failed` (Douyin did not answer). The run also writes a `SUMMARY` record with the number of rows per status.

### 💰 What a run costs

| Apify plan | Per 1,000 posts |
|---|---|
| Free | $2.00 |
| Bronze | $1.90 |
| Silver | $1.80 |
| Gold, Platinum, Diamond | $1.70 |

Apify's standard start event ($0.00005 per GB of memory) is the only other charge; proxies are included. Photo posts cost the same as videos. Rows with any other status than `ok` are free, and so are `includeComments` and `includeAuthorDetails`. Set the run's maximum charge and the Actor stops at it with the rows it has saved, without reading posts it could not charge.

### 🎞️ The file links

| Field | What it is | How long it works |
|---|---|---|
| `videoUrl` | Redirect to the largest H.264 file without watermark | A link of this form from February 2025 still answered in October 2026. Each time it is opened it hands out a file link that is valid for about an hour (62 minutes in our test) |
| `videoUrlWatermark` | The same kind of redirect, to the file with Douyin's watermark, asked at 720p. Send a browser `User-Agent` (`Mozilla/5.0` was enough): to `curl` and `python-requests` under their own names Douyin handed out a dead link | As above |
| `videoMeta.qualities[].url` | Redirect to one listed rendition, mostly H.265 | Carries no end date; we did not wait to see one stop |
| `audioUrl` | MP3 of the sound | Carries no signature and no end date |
| `coverUrl`, covers in `videoMeta` | Signed picture links | The links name an end 14 days ahead |
| `images[].url` | Pictures of a photo post without watermark | The links name an end 30 days ahead |

`videoUrl` answered every client we tried, also `curl` and `python-requests` without any header. `videoQuality` is the size of the file behind it: `1080p`, `720p` or `540p`, named after its short side (the 540p files we opened were 544 or 576 pixels there). A 544×960 original came back at that size.

### ⏱️ Measured (October 6, 2026)

These runs were made on a test server in Germany, outside Apify, with Apify's datacenter proxy available. Times on Apify can differ and will replace these numbers after the first cloud runs.

| Run | Rows | Time |
|---|---|---|
| Two video links (the default input) | 2 | 1.6 to 1.9 s |
| 16 mixed entries with both options: videos, share links, a share message, two photo posts, a private post, a missing id, three entries that are no posts, a dead share link, two repeats | 14 (8 with a post) | 8.1 s |
| 826 links: 800 videos and 26 photo posts | 826 | 76 s |

A run of 826 links that was killed after 200 rows and started again continued behind them: 826 rows at the end, each with its post, in input order, none twice.

What one address is served before Douyin turns it away, measured through proxy addresses: 130 to 145 calls for a list of videos (the Actor reads 25 videos per call and moves on after 100 calls), 71 to 83 share pages (the Actor moves on after 55). Both refusals lasted longer than a quarter of an hour, and the rest of the run goes on meanwhile. 200 comment lists, 200 creator records, 200 share links and 800 file-size checks in a row were answered without a refusal.

### 🤖 For AI agents

Smallest useful call:

```json
{"videoUrls": ["https://www.douyin.com/video/7577614489533680959"]}
```

Each row is one link, in input order. `status` is `ok` when Douyin shows the post; then `videoUrl` is an MP4 without watermark that can be fetched without headers, `videoQuality` its size, `text` the caption, `statistics` the likes, comments, shares and saves, and `authorMeta.name` the creator. For a photo post (`type` `imageText`) read `images`. Any other `status` means no post; `statusReason` says why and nothing is charged. Add `"includeComments": true` for ten to twenty comments per post and `"includeAuthorDetails": true` for the creator's follower number. No credentials are needed. A post costs $0.002 on the Free plan.

### 💡 Use cases

- 🎬 **Repurposing and editing:** fetch your own or licensed Douyin videos without watermark in the largest size Douyin keeps.
- 📊 **Campaign and creator tracking:** read likes, comments, shares and saves of a list of posts on a schedule and compare the numbers over time.
- 🗂️ **Archives and datasets:** keep captions, hashtags, Douyin's content categories, music and file links of public posts in one table.
- 🔁 **Automation:** hand the share links your team collects in a chat or a sheet to Make, Zapier or n8n and get the files and numbers back.

### ⚠️ Limits, stated plainly

- **Links only as input.** No keyword search, no hashtag pages and no list of a creator's videos. Douyin answers a visitor's search and a creator's video list only to signed requests, which this Actor does not make.
- **Comments are a sample.** Douyin's share site gives a visitor ten to twenty comments per post in its own order and no next page: 10 in one run and 18 in another, of 163,211, for the video above. Replies are not included.
- **No play count.** Douyin sends zero to visitors.
- **Follower numbers are round and cover all of Douyin's platforms.** `mplatformFollowersCount` and `followingCount` come from the creator's record as a visitor sees it: 2,269,000 and 200 in the example. The exact follower number of the Douyin app alone is not given.
- **Photo posts have a smaller record.** They are read from the share page: no creator id, no download count, no Douyin categories, and a hashtag id is left out when the page rounded it. Their avatar picture is 100 pixels wide.
- **`private` covers two cases.** Douyin's message for such a post names "its permissions or its deletion" as the cause and does not say which. An id that never existed is `not_found`.
- **The listed renditions end at 720p.** The 1080p file is reachable through `videoUrl` only.
- **Files are not stored.** The Actor returns links. Download `videoUrl` with any HTTP client that follows redirects.
- **Public posts only,** and nothing behind a login.
- **A run that reads mostly links without a post stops itself:** after 50 such rows plus four for every row with a post.

### ❓ FAQ

**Do I need a Douyin account, cookies or a Chinese phone number?** No. The Actor reads what Douyin's share site shows any visitor.

**Which links work?** Links from the browser (`douyin.com/video/…`, `douyin.com/note/…`, and any `douyin.com` link that carries `modal_id=…`), share pages (`iesdouyin.com/share/video/…`), share links from the app (`v.douyin.com/…`), the whole message the app copies when you tap "share", and bare ids.

**How do I download the video?** Fetch `videoUrl` with a client that follows redirects, for example `curl -L -o video.mp4 "<videoUrl>"`. No headers or cookies are needed.

**Why is `videoQuality` 720p for a video that was uploaded in 4K?** Because Douyin keeps no 1080p file for that video. The Actor asks Douyin's redirect and returns the largest file it serves.

**How long do the links work?** `videoUrl` hands out a fresh file link each time it is opened; see the table above for the other links.

**Why is a link not charged?** Because it gave no post: it leads nowhere, the post is private or deleted, the entry is no post link, or Douyin did not answer. The row says which.

**What is different from the fields of other Douyin Actors?** The names `id`, `url`, `shareUrl`, `videoUrl`, `audioUrl`, `coverUrl`, `durationSeconds`, `type`, `text`, `createTime`, `createDate`, `inputUrl`, `authorMeta`, `musicMeta`, `videoMeta`, `statistics`, `hashtags`, `mentions`, `videoTags`, `images` and `series` are the ones the most used Douyin video Actor uses. Differences: `createDate` is a full ISO time in UTC; `videoUrl` is the redirect link, not a file link that expires within the hour; `videoMeta.qualities` replaces `bitRates`; `statistics` has no `playCount`; `authorMeta.avatar` is one link; `cityCode` is Douyin's code without a city name; there are no `permissions`, `interaction`, `anchors`, `commerce`, `risk`, `share`, `chapters` or `location` objects; `status` and `statusReason` are new.

**How do I call it from code?** With the Apify API or the Python and JavaScript clients; every run returns a dataset you can fetch as JSON or CSV. It also works as a tool through Apify's MCP server.

**Is it legal to scrape Douyin videos?** The Actor reads only what Douyin shows publicly to any visitor and does not log in. The videos belong to their creators: download what you own or have the right to use. Captions, account names and comments can be personal data under GDPR, CCPA, China's PIPL and similar rules, and Douyin's terms apply to you as well. If in doubt, ask a lawyer.

### 🔗 You might also like

- [Bilibili Scraper](https://apify.com/benthepythondev/bilibili-scraper): videos, comments and creators of 哔哩哔哩
- [TikTok Video Scraper](https://apify.com/benthepythondev/tiktok-video-details-scraper): captions, views and likes of single TikTok videos
- [TikTok Profile Videos Scraper](https://apify.com/benthepythondev/tiktok-profile-videos-scraper): every video of a TikTok account
- [TikTok Comments Scraper](https://apify.com/benthepythondev/tiktok-comments-scraper): comments and replies under TikTok videos
- [Instagram Video Downloader](https://apify.com/benthepythondev/instagram-video-downloader): MP4 links of reels and posts

**Keywords:** douyin video scraper, douyin video downloader, 抖音视频下载, 抖音无水印, douyin no watermark, douyin api, douyin share link, v.douyin.com, douyin mp4 link, chinese tiktok scraper, douyin video data, douyin likes comments shares, douyin hashtags, douyin music mp3, douyin photo post, douyin scraper no login, 抖音数据采集, bulk douyin downloader

# Actor input Schema

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

Douyin posts to read, one row per post in the order given. Accepted: a link from the browser (douyin.com/video/…, douyin.com/note/…, any douyin.com link with modal_id=…), a share page (iesdouyin.com/share/video/…), an app share link (v.douyin.com/…), the whole share message the app copies, or the bare numeric id. A post named twice is read once. A link that leads nowhere, to a private post or to something that is no post gets a row with the reason and no charge.

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

Adds to each post the comments Douyin shows on its share page, as topComments: ten to twenty popular comments in Douyin's own order, with text, likes, reply count, date, author name and the province Douyin displays. One more request per post, no extra charge. Douyin gives a visitor no further comments, so this is not a full comment export.

## `includeAuthorDetails` (type: `boolean`):

Adds to each post's authorMeta the creator's follower number across Douyin's platforms and the number of accounts followed (Douyin rounds both for visitors), and for photo posts the total likes received. One more request per creator, no extra charge.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.douyin.com/video/7577614489533680959",
    "7599195778485161252"
  ],
  "includeComments": false,
  "includeAuthorDetails": false
}
```

# 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 = {
    "videoUrls": [
        "https://www.douyin.com/video/7577614489533680959",
        "7599195778485161252"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/douyin-video-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 = { "videoUrls": [
        "https://www.douyin.com/video/7577614489533680959",
        "7599195778485161252",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/douyin-video-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 '{
  "videoUrls": [
    "https://www.douyin.com/video/7577614489533680959",
    "7599195778485161252"
  ]
}' |
apify call benthepythondev/douyin-video-scraper --silent --output-dataset

```

## MCP server setup

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