Douyin Scraper: Videos, Creators, Comments & Trends
Pricing
from $0.51 / 1,000 videos
Douyin Scraper: Videos, Creators, Comments & Trends
Scrape Douyin (Chinese TikTok) without an account: videos, creator profiles, comments and replies, related videos and trending topics, 210 fields. Export to JSON, CSV or Excel.
Pricing
from $0.51 / 1,000 videos
Rating
0.0
(0)
Developer
Nice Dev
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
1
Monthly active users
10 hours ago
Last modified
Categories
Share
🎬 What is Douyin Scraper?
Douyin Scraper extracts videos, photo posts, creators, comments with their replies, bullet comments (弹幕) and trending topics from Douyin (抖音, the Chinese TikTok): description, hashtags, likes, comments, shares and saves, engagement rate, sound, tagged place, every video quality, and the creator's followers and verification — for influencer research, trend watching, social listening or content archives. It works as a Douyin API alternative: run it on a schedule, call it from your code, or plug it into Make, Zapier or n8n.
Paste a video, creator, sound or collection link (or the whole share text copied from the app), tick what you want next to it — comments, trending topics — click Start, and download the rows in JSON, CSV or Excel. No Douyin account, nothing to set up. Only the keyword search needs more: Douyin answers it to a logged-in account, so you give the cookie of your own account (a run that also reads links or creators then reads all of it with that account).
📋 What data can you extract from Douyin?
One item per row — a video or photo post, a creator, a comment or reply, a bullet comment or a trending topic — 211 fields:
| Category | What you get |
|---|---|
| 🎬 Video | description, link, publication date, length, post type (video or photo post), pinned or not, AI-generated label — 《夏天的心动》-你的第一次心动是什么时候? |
| 📊 Engagement | likes, comments, shares, saves, recommendations, number of bullet comments, and the engagement rate against the author's followers — 60,954 likes · 1,081 comments · 8,491 shares |
| #️⃣ Hashtags and categories | hashtags (with their Douyin id), tagged accounts, Douyin's own content categories on 3 levels, chapters of a long video, the searches Douyin suggests under the video |
| 🖼️ Media | cover, every video stream (quality, size, bit rate, codec, resolution), the images of a photo post, when the signed links stop working, and — with the file options — a lasting copy of the MP4 or the cover |
| 🎵 Sound | title, author, length, original or licensed music, link, who uploaded it |
| 📍 Place, collection, shop | the place tagged on the video (name, address, city, coordinates), the collection or series it belongs to (episode, size), the products and anchors linked to it |
| 👤 Creator of each video | nickname, Douyin ID, followers, total likes, verification, bio — and, with the option, province (IP location), video count, following, gender, age, school, live status |
| 🪪 Creator profile rows | bio, followers, following, total likes, video count, province (IP location), gender, age, verification, live status, QR code, linked Instagram, X and YouTube accounts, shop flag |
| 📈 Creator statistics (optional) | average and median likes, comments, shares and saves per video, average engagement rate, videos per week, date of the latest video |
| 📇 Contacts in the bio (optional) | the e-mail addresses, phone numbers and WeChat IDs the creator wrote in the bio |
| 💬 Comments and replies | text, likes, number of replies, date, the commenter (nickname, province), hot, pinned and liked-by-author marks, pictures — 当我意识到这样的瞬间这辈子都不会再有了 |
| 🗨️ Bullet comments (弹幕) | text, the moment of the video it appears at, likes, author id |
| 🔥 Trending topics | rank, topic, heat value, label (new, hot, exclusive…), number of videos, since when it trends, lead video and cover — 小鹏正式宣布对外卖技术 · 12,297,060 |
| 🔗 Where it comes from | the link, keyword or board that found it, its rank in that source, the video a related video was suggested under |
Every field, with an example, is listed in the Output section below. The type column says which kind of row it is: video, profile, comment, trend or danmaku; a column that belongs to another kind of row is empty.
✅ Why use Douyin Scraper?
- 🧩 All of Douyin in one Actor: videos, photo posts, creators, sounds, collections, comments with replies, bullet comments and the trending boards — combined in one run, each kind of row in its own place of the dataset.
- 🔓 No Douyin account for everything except the keyword search, which uses the cookie of YOUR account (in a run that also has other sources, the whole run is read with that account): it is a secret field, used for reading only, never saved in the dataset or the log.
- 📎 Paste anything: video, photo-post, creator, sound and collection links, short share links, the share text copied from the app, or bare ids — each one is read for what it is.
- 📊 More than counts: engagement rate, 3-level categories, hashtags with their id, tagged place, chapters, linked products, sound details, every stream quality, and the province Douyin shows for creators and commenters.
- 💾 Keep the files: Douyin's video and image links stop working after a few hours — tick the file options to keep a lasting copy of the MP4 or the cover.
- 🔔 Monitoring built in: tick Only new results, schedule the Actor, and each run returns (and charges) only the videos and comments it has never delivered before.
- 📅 Filters: dates, words, likes, comments, shares, length, post type, author followers, verified authors — filtered-out videos are not saved and never count in Max results.
- 🔌 API, scheduling, monitoring, integrations (Make, Zapier, n8n, Google Sheets…), proxy rotation and JSON/CSV/Excel export via the Apify platform.
🚀 How to scrape Douyin
- Create a free Apify account.
- Open Douyin Scraper and paste links into Video URLs (videos, photo posts, short share links) or Creator profile URLs; or add Sound URLs and Collection URLs, or tick Scrape trending topics.
- Tick what you want on top: Scrape comments (and Include replies), Scrape bullet comments (弹幕), Creator profile rows, related videos.
- For a keyword search, type the Search keyword and paste Your Douyin session cookie (see the tip below). Without the cookie the keywords are skipped, the run says so, and the other sources still run.
- Set Max results (100 by default, 0 = no limit) — and Max results per source when you combine several sources — then click Start, and download the dataset in JSON, CSV, Excel or via API.
💰 How much does it cost to scrape Douyin?
This Actor uses pay per event pricing: you pay for the rows saved, each kind of row at its own price, plus a small fee per run start. Prices per 1,000 events, by Apify plan:
| What you pay for | Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|---|
| Video or photo post (a creator's, a sound's or a collection's video, a related video, a search result, the lead video of a trending topic) | video | $0.54 | $0.53 | $0.52 | $0.51 |
| Creator profile row (Creator profile rows, or a keyword search for creators) | profile | $1.69 | $1.39 | $1.19 | $0.99 |
| Comment or reply (Scrape comments) | comment | $0.45 | $0.43 | $0.39 | $0.34 |
| Bullet comment (Scrape bullet comments (弹幕)) | danmaku | $1.79 | $1.78 | $1.77 | $1.39 |
| Trending topic (Scrape trending topics) | trend | $0.36 | $0.35 | $0.34 | $0.33 |
| Full author profile added to a video row, only with Full author profile on each video (once per video row completed) | author-profile | $0.45 | $0.44 | $0.43 | $0.42 |
| Statistics added to a creator profile row, only with Creator statistics (once per profile row completed) | account-stats | $2.69 | $2.68 | $2.67 | $2.66 |
| Contacts found in a creator's bio, only with Contacts written in the bio (once per profile row with at least one contact) | bio-contact | $2.59 | $2.58 | $2.57 | $2.56 |
Video file saved, only with Download video files (MP4) (once per started 5 MB of the file: a 3 MB video = 1, a 12 MB video = 3; a photo post: all its images together; videoFileMb says the size) | video-file | $0.81 | $0.80 | $0.79 | $0.78 |
| Cover image saved, only with Download cover images (once per video) | cover-file | $0.45 | $0.44 | $0.43 | $0.42 |
| Video checked by one of the Actor's own filters, kept or dropped | filter-check | $0.103 | $0.093 | $0.083 | $0.073 |
| Run start (counted once per GB of memory: 2 GB by default, so 2 events per run) | apify-actor-start | $0.02 per GB, each | $0.02 per GB, each | $0.02 per GB, each | $0.02 per GB, each |
Examples on the Free plan: 100 videos of a creator, no option ≈ $0.09 (100 × $0.00054 + $0.04 start at 2 GB). A daily check of 10 creators that brings about 50 new videos a day ≈ $2.01 a month (1,500 videos + 30 run starts at 2 GB). Saving the MP4 of a short video (under 5 MB) adds $0.00081 per video.
The five options (full author profile, creator statistics, contacts in the bio, video files, cover images) and the extra kinds of row (creator profile rows, comments and replies, bullet comments, trending topics) are all off by default: nothing is charged for them unless you tick them. The engagement rate is free. The filters Douyin does not apply itself (dates, words, likes, comments, shares, length, post type, author followers, verified authors) are checked by the Actor on every video it reads: each check is charged as filter-check, and a video you keep also pays its video price. Platform usage (compute, proxy) is included in the price.
⚙️ Input
{"profileUrls": ["https://www.douyin.com/user/MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM"],"maxVideosPerProfile": 50,"includeProfileRows": true,"maxItems": 100}
A video with its comments and replies, and the trending topics:
{"videoUrls": ["https://www.douyin.com/video/7682152870929567026"],"includeComments": true,"maxCommentsPerVideo": 100,"includeReplies": true,"maxRepliesPerComment": 5,"includeTrends": true,"trendBoards": ["hot", "society"],"maxItems": 500}
Only the new videos of a creator, recent ones, checked every day:
{"profileUrls": ["https://www.douyin.com/user/MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM"],"maxVideosPerProfile": 100,"postedAfter": "7 days","onlyNew": true,"stateKey": "brand-watch"}
Keyword search with the cookie of your own account:
{"searchQueries": ["咖啡", "iPhone 17"],"sessionCookie": "sessionid=abc123; ttwid=xyz789","searchSort": "latest","searchPublishTime": "week","maxItemsPerQuery": 100,"maxItems": 500}
| Field | Notes |
|---|---|
videoUrls | Video or photo-post links (https://www.douyin.com/video/7682152870929567026), short share links, the whole share text copied from the app, or bare video ids (17 to 20 digits). Each link is read for what it is: a creator link pasted here is read as a creator. |
profileUrls | Creator pages (https://www.douyin.com/user/MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM), share links of a profile, or a bare id: the long sec_uid of the page address, or the numeric uid (63163250759). The Douyin ID (the short name under the nickname) is refused by Douyin. |
maxVideosPerProfile | Videos read for EACH creator, newest first (0 = no video rows, the profile row only). Douyin shows a visitor without an account the first page of a creator's videos only, about 44 (see Known limitations). |
includeProfileRows, skipPinned | One row per creator (bio, followers, likes, video count, province, verification, live status…); leave out the videos the creator pinned at the top of the profile. Both off by default. |
includeAuthorProfiles, includeAccountStats, includeBioContacts | Options, off by default and charged apart. Full author profile on each video row (province, video count, following, gender, age, school, live status; one request per author); statistics over the creator's latest 36 videos on each profile row (a visitor without an account gets the first page only, about 44, enough for the 36); e-mail addresses, phone numbers and WeChat IDs written in the bio of each profile row. The last two work on profile rows only. |
maxRelatedPerVideo | For each video of the video list, also the videos Douyin recommends next to it, up to this many (0 = off). Each one is a video row. |
musicUrls | Sound pages (https://www.douyin.com/music/7561006047303010321), share links of a sound, or bare sound ids: the videos made with the sound. |
maxVideosPerMusic | Videos read for EACH sound. |
collectionUrls | Collection pages (https://www.douyin.com/collection/7673031667082070079), share links of a collection, or bare collection ids: the videos of the collection, in its order. |
maxVideosPerCollection | Videos read for EACH collection. |
includeComments, maxCommentsPerVideo, includeReplies, maxRepliesPerComment | Comments of every video the run delivers (Douyin's own order, hot first; maxCommentsPerVideo 0 = all of them) and, when ticked, the replies under each comment. Each comment and each reply is a row of its own. |
includeDanmaku, maxDanmakuPerVideo | The bullet comments (弹幕) of every video the run delivers, up to the maximum for each video. Each one is a row of its own. |
includeTrends, trendBoards, trendVideos | Douyin's trending topics: hot (the main board), entertainment, society and challenge. trendVideos also delivers the lead video of each topic as a video row. |
query, searchQueries | Keywords, as typed in the Douyin app, in Chinese or not (咖啡, iPhone 17); searchQueries adds more, one search each. They need sessionCookie. |
sessionCookie | The cookie of your own logged-in douyin.com tab, copied whole (sessionid=abc123; ttwid=xyz789), or at least its sessionid part. Needed for keyword search only; a secret field. |
searchType | videos (one video row per result) or creators (one profile row per account found). |
searchSort | Douyin's own sort of the results: relevance, most-liked or latest. Videos search only. |
searchPublishTime | Douyin's own date filter of the search: any, day, week or half-year. Videos search only. |
searchDuration | Douyin's own length filter of the search: any, under-1-min, 1-5-min or over-5-min. Videos search only. |
maxItems, maxItemsPerQuery | Stop after this many rows for the whole run, all kinds together / for each source (a creator, a sound, a collection, a keyword, a board, a pasted video with its comments); 0 = unlimited. |
downloadVideos, downloadCovers, maxVideoFileMb | Keep a lasting copy in the run's key-value store: the MP4 (the smallest stream of at least 720p, H.264 first, without the Douyin watermark when Douyin serves one; photo posts: every image) and the cover image of each delivered video. Off by default and charged apart. When that stream is larger than Max video file size (100 MB by default), the best smaller stream Douyin offers is kept instead (highest resolution first, H.264 before H.265); when none fits, the video is not downloaded, the row says why and nothing is charged for the file. The video file is charged once per started 5 MB of the file saved (a 3 MB video = 1 Video file event, a 12 MB video = 3; the Video file size column gives its size), so a larger Max video file size raises the most a single file can cost. |
postedAfter, postedBefore | Publication date range: 2026-09-01, or a period before now (7 days, 2 weeks, 1 month). |
excludeKeywords, includeKeywords | Drop the videos whose description, title or hashtags contain one of these words / keep only the videos that contain at least one (case and accents ignored). |
minLikes, minComments, minShares | Only videos with at least this many likes, comments or shares. |
minDurationSeconds, maxDurationSeconds | Only videos at least / at most this long (photo posts have no length and are dropped when a length is set). |
mediaType | Post type: all, video (videos only) or images (photo posts only). |
minAuthorFollowers, maxAuthorFollowers, verifiedOnly | Only videos whose author has at least / at most this many followers (micro-influencer search), or carries a Douyin verification badge. The Actor reads each author's profile once for these. |
onlyNew, stateKey, resetState | Monitoring: only the videos, comments and bullet comments never delivered under this memory key (for example brand-watch); resetState forgets the memory. |
| Advanced | proxyConfiguration (Apify proxy by default, included in the price; the residential proxy is not available), maxConcurrency, maxRequestsPerMinute, minRequestIntervalMs, maxRequestRetries, debugLog. |
📦 Output
A video (shortened: empty fields left out and the signed links cut):
{"type": "video","id": "7682152870929567026","url": "https://www.douyin.com/video/7682152870929567026","source": "video-url","sourceInput": "https://www.douyin.com/video/7682152870929567026","position": 1,"scrapedAt": "2026-10-15T12:00:00.000Z","description": "《夏天的心动》-你的第一次心动是什么时候?你是否还记得让你心动的那个人?#校园 #暗恋 #青春","createTime": 1788651000,"createTimeIso": "2026-09-05T23:30:00.000Z","mediaType": "video","awemeType": 0,"isPinned": false,"durationMs": 247363,"durationSeconds": 247.4,"likeCount": 60954,"commentCount": 1081,"shareCount": 8491,"collectCount": 6965,"danmakuCount": 358,"engagementRate": 0.6927,"hashtags": [{ "name": "校园", "id": "1767587367750663" },{ "name": "暗恋", "id": "1575530906796046" }],"hashtagNames": ["校园", "暗恋"],"mentions": [],"categories": [{ "level": 1, "id": 2025, "name": "剧情演绎" },{ "level": 2, "id": 2025003, "name": "剧情" }],"category": "剧情演绎","subCategory": "剧情","chapters": [],"suggestedSearches": ["夏天的心动全集", "夏天的心动评分多少"],"mixId": "7673031667082070079","mixName": "青春的第N节课","mixEpisode": 4,"mixVideoCount": 12,"coverUrl": "https://p3-pc-sign.douyinpic.com/image-cut-tos-priv/…","videoUrl": "https://v5-dy-ov-experiment.zjcdn.com/…","videoWidth": 3840,"videoHeight": 2160,"videoSizeBytes": 36614801,"bitRates": [{"quality": "normal_1080_0","bitRate": 1184164,"width": 1920,"height": 1080,"fps": 30,"codec": "h264","sizeBytes": 36614801,"url": "https://v5-dy-ov-experiment.zjcdn.com/…"}],"images": [],"cdnUrlExpiresAt": "2026-10-15T05:46:06.000Z","isAiGenerated": false,"anchors": [],"products": [],"musicId": "7682152908917312275","musicTitle": "@林苏记创作的原声","musicAuthor": "林苏记","authorId": "942738897652219","authorSecUid": "MS4wLjABAAAAFnjcoKWYQPDcHMD2mikJ23gcYJXWVYSdLMlFqMYW27w","authorNickname": "林苏记","authorUrl": "https://www.douyin.com/user/MS4wLjABAAAAFnjcoKWYQPDcHMD2mikJ23gcYJXWVYSdLMlFqMYW27w","authorFollowerCount": 111875,"authorVerified": null,"bioEmails": [],"bioPhones": [],"bioWechatIds": [],"commentImages": []}
You can download the dataset in various formats such as JSON, HTML, CSV or Excel.
The other kinds of row
The same columns carry the other kinds of row; the columns of another kind stay empty. Shortened examples:
// type: "profile" (Creator profile rows){"type": "profile","id": "MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM","url": "https://www.douyin.com/user/MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM","uid": "63163250759","uniqueId": "Oct_yooz","nickname": "由嘉郁¹⁰¹⁹(10月19生日版)","followerCount": 380471,"followingCount": 453,"totalFavorited": 4058511,"videoCount": 39,"ipLocation": "辽宁","verified": false,}
// type: "comment" (a comment, or a reply with isReply: true){"type": "comment","id": "7681155207737230117","url": "https://www.douyin.com/video/7682152870929567026","videoId": "7682152870929567026","text": "当我意识到这样的瞬间这辈子都不会再有了[泣不成声]","createTimeIso": "2026-09-03T04:05:12.000Z","likeCount": 14869,"replyCount": 178,"isReply": false,"isHot": true,"authorNickname": "哈哈","authorIpLocation": "浙江",}
// type: "trend" (a trending topic){"type": "trend","id": "trend:hot:2694823","trendBoard": "hot","position": 1,"word": "小鹏正式宣布对外卖技术","hotValue": 12297060,"trendLabel": "hot","trendVideoCount": 3,"trendingSince": "2026-10-14T06:03:03.000Z",}
// type: "danmaku" (a bullet comment){"type": "danmaku","id": "danmaku:7669598344973714227","videoId": "7682152870929567026","text": "好像宋雨琦","offsetMs": 32071,"likeCount": 4,}
All 211 fields
| Fields | What you get |
|---|---|
type, id, url, source, sourceInput, position, scrapedAt | Row: its kind (video, profile, comment, trend or danmaku); the video id, the creator's sec_uid, the comment id, trend:<board>:<topic id> or danmaku:<id> (unique per row); its Douyin page; where it comes from (video-url, profile, search, music, collection, trend, trend-video, related, comments, danmaku); the link, keyword or board you gave; its rank in that source (1 = first); ISO timestamp |
title, description, createTime, createTimeIso, shareUrl, mediaType, awemeType, isPinned, isAd, isStory, isOriginal | Video: title (long videos), caption with its hashtags, publication time (Unix seconds and ISO — what the date filters read), share link, video or images, Douyin's post code, pinned at the top of the creator page, ad, story and original marks |
durationMs, durationSeconds | length in milliseconds and seconds (empty for a photo post) |
likeCount, commentCount, shareCount, collectCount, recommendCount, admireCount, danmakuCount, engagementRate | Engagement: likes (of a video, a comment or a bullet comment), comments, shares, saves, recommendations to friends, admires, number of bullet comments; the engagement rate = (likes + comments + shares + saves) ÷ the author's followers, 4 decimals, empty when the followers are not known. Douyin gives no view count on the web |
hashtags, hashtagNames, mentions, categories, category, subCategory, chapters, suggestedSearches, region | Hashtags and categories: hashtags with their id and names alone, tagged accounts, Douyin's content categories on 3 levels and the first two names, chapters of a long video, suggested searches, region code |
poiId, poiName, poiAddress, poiLatitude, poiLongitude, poiCity, poiCityCode, poiDistrict, poiProvince, poiCountry | Place tagged on the video: id, name, address, coordinates, city, district, province, country |
mixId, mixName, mixEpisode, mixVideoCount, seriesId, seriesName | Collection and series the video belongs to: id, name, episode, number of videos; paid series |
allowDownload, allowDuet, allowStitch, allowComment, allowShare, allowReact, allowMusic | what the author allows: download, duet, stitch, comments, sharing, reactions, reuse of the sound |
coverUrl, originCoverUrl, dynamicCoverUrl, videoUrl, videoWidth, videoHeight, videoFormat, videoSizeBytes, isLongVideo, bitRates, images, imageCount | Media: covers (normal, original size, animated), the playable MP4 (signed link), its size and format, long-video flag, every stream Douyin offers (quality, bit rate, size, codec, link), the images of a photo post and their number |
playUrlH264, playUrlH265, downloadUrl, cdnUrlExpiresAt, hasWatermark, isHdr, horizontalType | the main stream in H.264 and H.265, the download stream with the Douyin watermark when the author allows downloads, when the signed links stop working (ISO), watermark and HDR marks, orientation code |
videoFileUrl, videoFileMb, coverFileUrl, fileError | Files (file options): the lasting link to the saved MP4 and its size in MB (the Video file price is per started 5 MB), the cover in the run's key-value store, and why a requested file was not saved (too large, link expired…) |
isAiGenerated, ocrText, shareTitle, shareDescription | marked AI-generated by Douyin, the text Douyin read on the video frames (when it gives it), the title and text shown when the video is shared |
isPrivate, isInReview, isProhibited, isLifeItem, isDuetSing, isImageBeat, crossPostedToXigua | status marks: visible to the author or friends only, under review, restricted, local-life post, karaoke duet, photo slideshow to music, also on Xigua Video |
anchors, products, hasProducts | Shop: anchors shown on the video (game, app, place, mini-program) and the Douyin Shop products linked to it (id, title, price, link) |
relatedTo | for a related video: the id of the video it was suggested under |
musicId, musicTitle, musicAuthor, musicDurationSeconds, musicIsOriginal, musicIsCommercial, musicAlbum, musicUrl, musicCoverUrl, musicOwnerId, musicOwnerNickname, musicOwnerHandle, musicOwnerSecUid, musicIsPgc, musicCollectCount | Sound: id, title, author, length, original or licensed, album, MP3, cover, the account that uploaded it (id, nickname, Douyin ID, sec_uid), professionally produced or not, times saved |
authorId, authorSecUid, authorUniqueId, authorNickname, authorUrl, authorAvatarUrl, authorSignature, authorFollowerCount, authorTotalFavorited, authorVerified, authorVerificationType, authorVerifyReason | Creator of the video (of the comment on a comment row, of the bullet comment on a bullet comment row): numeric uid, sec_uid, Douyin ID, nickname, profile page, avatar, bio, followers, total likes, verification badge, type and text. Followers, total likes and badge are read from the creator's profile: they are empty (null, never 0 or false) on a video link, a sound or a collection unless Full author profile or one of the author filters is on |
authorIpLocation, authorVideoCount, authorFollowingCount, authorGender, authorAge, authorSchool, authorIsLive | Full author profile (option): province or country Douyin shows, video count, following, gender, age, school, live status. On a comment row authorIpLocation is the commenter's province, always given |
uid, secUid, uniqueId, nickname, signature, avatarUrl, bannerUrl | Creator profile row: numeric uid, sec_uid, Douyin ID, nickname, bio, avatar, header image |
bioEmails, bioPhones, bioWechatIds | Contacts in the bio (option): the e-mail addresses, phone numbers and WeChat IDs written in the bio; empty lists on other rows and when the option is off |
followerCount, followingCount, totalFavorited, videoCount, favoritingCount | the creator's counts: followers, following, likes received, videos posted, videos liked (when public) |
ipLocation, gender, age, country, province, city, schoolName | where and who: the province or country Douyin shows (IP location), gender (male, female or empty), age shown on the profile, country, province, city, school |
verified, verificationType, verifyReason, isLive, liveRoomId, mixCount, seriesCount, isStar, profileShareUrl, qrCodeUrl | verification badge, its type and text, streaming live when read and the live room, number of collections and paid series, star account, share link and QR code of the profile |
instagramId, twitterName, youtubeChannelId, youtubeChannelTitle, hasShop, commerceLevel, publicCollectsCount, isGovMedia, isOriginalMusician | Linked accounts and badges: Instagram, X and YouTube accounts shown on the profile, shop tab, commerce level, public saved-videos count, government or media account, original-musician badge |
statsVideoCount, avgLikes, medianLikes, avgComments, avgShares, avgSaves, avgEngagementRate, videosPerWeek, lastVideoAt | Creator statistics (option, on profile rows): how many videos they rest on, average and median likes, average comments, shares and saves, average engagement rate, videos per week, date of the latest video that is not pinned |
videoId, text, replyCount, isReply, parentCommentId, replyToCommentId, isHot, isAuthorLiked, isPinnedComment, commentLabel, commentImages, videoCommentTotal | Comment, reply or bullet comment: the video it is under, its text, number of replies, reply or not and the comment it answers, hot, liked by the video author, pinned by the author, Douyin's label (author, friend…), attached pictures, total comments Douyin announces for the video |
offsetMs | Bullet comment: the moment of the video, in milliseconds, at which it appears on screen |
trendBoard, word, hotValue, trendLabel, trendVideoCount, discussVideoCount, trendingSince | Trending topic: the board (hot, entertainment, society or challenge), the topic, its heat value, label (new, hot, exclusive, rising…), videos grouped under it and videos discussing it, since when it trends |
topVideoId, topVideoUrl, trendCoverUrl, sentenceId, trendWordType, trendSentenceTag, articleCount, boardUpdatedAt, isRisingTopic | the lead video of the topic, its cover, Douyin's topic id, word type and topic family codes, articles grouped under it, when the board was refreshed, and whether it comes from the rising list under the board |
💡 Tips
How to get more results
Raise Max results (maxItems, 0 = no limit) and Max videos per creator (maxVideosPerProfile). Combine creators, sounds, collections and keywords in one run, and set maxItemsPerQuery so that one big source does not use up the whole budget. Max results counts every row — videos, profile rows, comments, bullet comments and topics together — so a run that asks for the comments of 10 videos needs a Max results large enough for them all.
How to reduce costs
The price is per row, so the levers are maxItems, maxItemsPerQuery, the number of comments, replies and bullet comments per video, the filters (a video a filter checks costs only the filter fee when it is dropped) and onlyNew for recurring runs (you never pay twice for the same video or comment). The profile rows, the comments, the bullet comments, the trending topics and the five options are off by default: tick only what you need. A comment, a reply and a bullet comment are rows like a video, each at its own price.
Several sources in one run
Fill videoUrls, profileUrls, musicUrls, collectionUrls, searchQueries and includeTrends together: each link, keyword and board is a source of its own. A video found by several sources is saved — and charged — once. Comments, bullet comments, related videos and files apply to every video the run delivers, whatever source it comes from. Set maxItemsPerQuery to give every source its own cap.
Comments, replies and bullet comments
Tick Scrape comments to read the top-level comments of each delivered video, in Douyin's own order (hot first), up to Max comments per video (20 by default; 0 = all the video has, which can be thousands). Include replies reads the replies under each comment, up to Max replies per comment; each reply is a comment row with isReply true and the id of its parent comment. Scrape bullet comments (弹幕) reads the messages that scroll over the video, with the moment they appear at, up to Max bullet comments per video. Every comment, reply and bullet comment is a row of its own, counted in Max results.
Keyword search with your Douyin cookie
Douyin answers searches only to a logged-in account, so the keyword search needs the cookie of YOUR account. Log in to douyin.com in your browser, open the developer tools (Network tab), click any request to douyin.com and copy the whole cookie value of its request headers (or at least its sessionid part) into Your Douyin session cookie. The cookie is a secret field: it is used for reading only, nothing is posted, liked or followed with it, and it is never written to the dataset or the log. Use an account of your own: Douyin may ask it to log in again after heavy use. Choose Search for videos or creators, then the sort, the publication period and the length of Douyin's own search filters. Without the cookie the keywords are skipped and the run says so; the other sources still run.
Monitoring: only the new results
Tick Only new results (onlyNew) and schedule the Actor. The first run returns everything; each later run skips the videos, comments and bullet comments already delivered: they are not saved and not charged. Profile rows and trending topics are always delivered. On a sound, a collection or a keyword search the list is not read newest first, so each run delivers the videos it has never delivered, up to your maximum, even when the search is sorted by date: it does not stop at the first known video as it does on a creator. The memory lives in a named key-value store of your account (douyin-videos-scraper-seen, up to 150,000 results per key) and is only updated with results that really reached the dataset, so a failed run never hides anything. Give each schedule its own stateKey (two schedules sharing a key would hide each other's results), and tick resetState once to start over. A creator's videos are read newest first and the reading stops once it meets a run of videos you already have — never more than the previous run delivered for that creator, and never more than your caps allow (pinned videos are not counted) — so the older videos your cap left out are never delivered later.
Filter by publication date
postedAfter and postedBefore take a date (2026-09-01, the whole day is included, Beijing time) or a period before now (7 days, 2 weeks, 1 month; via the API also 24 hours or a full ISO date-time). The filter reads the publication time of a video (createTimeIso); a video without a publication date is dropped as soon as a date bound is set. Filtered-out videos are not saved and do not count in Max results (each video the filter checks is charged the filter fee, see the pricing section); the run summary tells how many were filtered. On a creator, reading stops at the first video older than postedAfter that is not pinned. Comments, bullet comments, profiles and trending topics are not filtered.
Keep the video and image files
The video and image links Douyin gives expire after a few hours (cdnUrlExpiresAt tells when). Tick Download video files (MP4) and / or Download cover images to keep a copy in the run's key-value store: the row then carries a lasting link to it. A video whose best stream is larger than Max video file size (100 MB by default) is saved in a smaller stream when Douyin offers one; otherwise it is not downloaded and the row says why.
🔌 Integrations and API
Call the Actor via the Apify API, the JavaScript or Python clients, or connect it with integrations and webhooks (Make, Zapier, n8n, Google Sheets, Slack, Airtable…). The dataset can be fetched as JSON or CSV from any tool.
🤖 Use with AI agents (MCP)
AI agents (Claude, ChatGPT, Cursor…) can find and run this Actor through the Apify MCP server, billed to their Apify account like any run. It returns one item per Douyin row: a video, a creator, a comment, a bullet comment or a trending topic (type says which). Actor id: nice_dev/douyin-videos-scraper; MCP server with this Actor only: https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/douyin-videos-scraper.
Smallest input, for a cheap first call:
{"profileUrls": ["https://www.douyin.com/user/MS4wLjABAAAArB6pB4M5W77nh-dtEpir53PoXSWn6vpZIFoJdFRHRrM"],"maxVideosPerProfile": 5,"maxItems": 10}
Key output fields: type, url, description, createTimeIso, likeCount, commentCount, shareCount, authorNickname.
Cost: pay per event, each kind of row at its own price, see the pricing section above; the Actor's own filters and the options (all off by default) cost extra. Cap each call with maxItems and, through the API, with the run option maxTotalChargeUsd.
❓ FAQ
Is it legal to scrape Douyin?
The Actor only reads what Douyin shows publicly to any anonymous visitor. The one exception is the keyword search, which Douyin answers only to a logged-in account: there it reads with the session of the account whose cookie you give; in a run that also has links, creators or comments, the whole run is read with that account. Results contain personal data (nicknames, bios, comments, the province Douyin shows, e-mail addresses or phone numbers people wrote in their bio), which is protected by China's Personal Information Protection Law (PIPL), by GDPR and by similar laws: do not store it without a legitimate reason, and delete what an author has deleted. You are responsible for using the data in compliance with Douyin's Terms of Service and applicable law. This Actor is not affiliated with Douyin or ByteDance.
Does it need a Douyin account, a cookie or a proxy?
No account and no cookie for videos, photo posts, creators, sounds, collections, comments, bullet comments and trending topics. The keyword search is the exception: it needs the cookie of your own Douyin account (see the tip above), and a run that also has other sources reads them all with that account; without it the keywords are skipped and the run says so. A run made of keywords alone, without the cookie, is refused with a message that says why. The proxy is included in the price: leave the default setting (the residential proxy is not available).
Is the data safe to open in Excel or to show on a web page?
Descriptions, bios, comments and bullet comments are their authors' own words, copied as they are. A text can begin with -, +, = or @ (a mention, -20% today): Excel and Google Sheets may read such a cell of a CSV file as a formula or as a number. The Actor leaves the text as it is, so that the JSON and the API give the real value: when you open a CSV, import these columns as text. On a web page, escape every field like any text written by a stranger.
Known limitations
- Douyin gives no view count on the web: the Actor does not give one.
- A creator is found by link, sec_uid or numeric uid, never by Douyin ID (the short name under the nickname): Douyin refuses it.
- A creator's videos: about 44 per creator. Douyin shows a visitor without an account the first page of a creator's videos and nothing after it, whatever Max videos per creator says. The run keeps that page, says so once in the log and in its last message, and does not fail; the creator's profile row says in
videoCounthow many videos exist. The statistics of the creator rest on the same videos. Comments, bullet comments, sounds, collections and trending topics are not limited this way. - A creator's videos come newest first, the pinned ones on top; Douyin offers no other order. Douyin's trending boards are the same for everybody: there is no board by city.
- The video, cover and sound links are signed and stop working after a few hours; tick the file options to keep a copy.
- The keyword search gives what Douyin shows to your account, and Douyin may ask the account to log in again after heavy use.
- The filters judge videos only. The author filters (followers, verified) read each author's profile once per run. A video page, a sound and a collection do not give the author's followers, likes received or badge reliably: those columns stay empty unless Full author profile or an author filter is on, and a video whose author could not be read is dropped by these filters.
- A photo post has no length: Min length / Max length drop it.
onlyNewremembers row ids, not their content: a video whose likes changed is not returned again.- Two runs sharing the same
stateKeyat the same time may both return the same new video.
A run that reaches its timeout stops itself about 45 seconds before it: no new page is asked, what it read is saved and, with onlyNew, remembered, and the run ends Succeeded with "Stopped before the run's timeout". Resurrect it to go on from there, or give the next run a longer timeout (Run options).
A run the platform stops without warning (out of memory)
- Resurrect it: it goes on from where it stood at most a minute before the stop. What it had read since is read again, and the rows already saved are skipped: none is delivered or charged twice, and
maxItemsstill counts them. - With
onlyNew, the memory is saved after each write (2 seconds apart at most): resurrect the stopped run and the results it had saved meanwhile join the memory; leave it stopped for good, and the next run may return at most the last 2 seconds of them once more.
Something doesn't work?
The last line of the log counts the rows saved, filtered out and not found on Douyin (a video, creator or comment that does not exist or was deleted), and the requests that failed after every retry. Those requests and the targets not found are listed, with the reason, in the FAILED_REQUESTS record of the run's key-value store. A run that saved nothing and had failed requests fails, and its last message gives the cause (a keyword search without a cookie says so, instead of "run it again").
If Douyin changes its pages, you are told instead of paying for blank rows. If the first 20 rows read all lack the same field (the publication date, the like count, a creator's nickname, a topic's text…), the run saves nothing more, stops and fails, and its last message names the missing field: at most those first rows are charged. A video that Posted after / Posted before drops because it has no date at all counts among those 20. A run of fewer rows (a scheduled onlyNew run that finds a few new ones, a small Max results) is checked at its end, from 2 rows: its rows are already saved, and the run fails with the missing field instead of ending green.
🛟 Support
Open an issue in the Issues tab with a link to your run: the run log and the FAILED_REQUESTS record of the key-value store show exactly which URLs failed and why.