Douyin (抖音) Hot Search Scraper - Trending Words + Heat Value
Pricing
$3.99 / 1,000 hot words
Douyin (抖音) Hot Search Scraper - Trending Words + Heat Value
The live Douyin (抖音) hot search board as a signed-out visitor sees it: rank, word, heat value, badge, event time, video count, cover and search URL, plus Douyin word and event IDs. Also the rising strip. No login, no cookie. Cut-short boards are marked partial, never reported as empty.
Pricing
$3.99 / 1,000 hot words
Rating
0.0
(0)
Developer
Lantern Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Douyin (抖音) Hot Search Scraper - Live Trending Words + Heat Value
The Douyin hot search board (抖音热搜榜) as a signed-out visitor sees it: one row per trending word with its rank, Douyin's own heat value, the badge, the event time, how many videos sit under it, the cover image and the search URL that opens it - plus Douyin's own word and event IDs so you can join runs over time. No Douyin login, no cookies, no account of your own. $3.99 per 1,000 words, no start fee. See Pricing.
Input:
{"boards": ["hot", "rising"]}
Output - one row per word (recordType: "hot_word"); per-board status rows and the run summary are free. Sample from a real run (long signed URLs shortened):
{"recordType": "hot_word","board": "hot","rank": 1,"word": "骑行四千五百公里赴赛里木湖","hotValue": 11453793,"label": 3,"labelUrl": "https://lf3-static.bytednsdoc.com/obj/eden-cn/vjl_avo_up…","eventTime": "2026-10-23T08:23:58.000Z","publishedAt": "2026-10-23T08:23:58.000Z","videoCount": 1,"discussVideoCount": 1,"coverUrl": "https://p26-sign.douyinpic.com/tos-cn-i-0629/ocbTHDibbEBdqwAA2…","url": "https://www.douyin.com/search/%E9%AA%91%E8%A1%8C%E5%9B%9B%E5…","sentenceId": "2709968","groupId": "7697991401896744201","sentenceTag": 10000,"wordType": 1,"maxRank": 2,"boardActiveTime": "2026-10-24 14:07:46","partial": false,"partialReason": null,"collectedAt": "2026-10-24T06:10:27.463Z"}
Limits:
- Public data only. The board a visitor sees, read without a login, a cookie or an account. No personal data: the board carries words, not people.
- The board is as long as Douyin makes it - about 50 words on
hotand about 5 onrising. There is no paging past it, so one run is one snapshot. Run it on a schedule to build a history. - The signed-in-browser board can be one or two words longer. Compared against Douyin's own hot page at the same board snapshot (2026-10-24 14:07:46), the page showed 50 ranked words plus one promoted entry pinned on top, while the public board endpoint served 48 to a visitor who sends no cookie and no browser signature - the page's top word and one mid-list word were not in the public answer at all, and its
positionnumbers are counted over the 48 it did serve. Sorankis the position Douyin served, which can sit one below the rank on screen. Everything the public answer does carry matched the page exactly: 60 of 60 field comparisons over five words, heat value included. The same endpoint also varies between reads at some snapshots (48 or 49 words), so this Actor reads it twice and keeps the fuller answer whole - it never merges two reads, which would carry a ranking Douyin never served, andboardSampleSizesin the run summary shows what each read carried. Follow a word across runs bysentenceId, and usemaxRankfor Douyin's own best-rank value. - Douyin publishes no heat value on the rising strip, so
hotValueisnullthere rather than0. The same holds for the entry it pins above the hot board. - Entertainment, society and challenge boards are not included: Douyin's public board endpoint ignores the board parameter and the dedicated paths are closed to signed-out visitors, so there is nothing to read them from.
- Related videos per word are not included in this version - the word's
urlopens Douyin's own search page for it. - Every board gets a status row saying what happened. A board Douyin answered with nothing is an empty result; a board that was refused or cut short is
partialwith the reason - the two are never confused.
What it does
- Reads both lists Douyin's own hot page shows - the hot search board (
word_list) and the rising strip (trending_list) - out of the same response, so asking for both costs the same as asking for one. - Reads the board twice and keeps the more complete answer, because the endpoint varies by a word between reads of the same snapshot (see Limits).
- Keeps Douyin's ranking (
rank, andmaxRank, the best rank the word has reached), its heat value, and its own identifiers (sentenceIdfor the word,groupIdfor the event behind it). - Keeps the platform's own event time (
eventTime, mirrored aspublishedAt), Douyin's board refresh stamp (boardActiveTime, its own Beijing-time wording) and our collection time (collectedAt) as separate fields. - Deduplicates by board and word inside the run, so one board never writes the same word twice.
- Says what happened per board. A board Douyin answered with nothing is recorded as an empty result; a board that was refused, capped or cut short is marked
partial: truewith the reason. The two are different records and are never confused. - Caps itself:
maxUpstreamRequestsis a hard ceiling on requests to Douyin for the whole run, derived from your input when you leave it empty, so a run is never unbounded. - Charges only word rows. Empty results, per-board status rows and the run summary are free.
What it does not do
- No videos, comments, authors or music charts - the board's words, not the content under them.
- No login-only or app-only boards, no region-specific boards, no historical board (Douyin serves the current snapshot only).
- No video downloads and no images stored:
coverUrlis Douyin's own URL, and it expires. - No scheduling or monitoring built in; use Apify schedules.
Input
| Field | Default | Meaning |
|---|---|---|
boards | ["hot"] | hot (the hot search board, about 50 ranked words) and/or rising (the "rising now" strip, about 5 words). Both come from the same response. |
maxWordsPerBoard | 500 | Upper bound on rows per board. The board is shorter than this by default; a board cut short by your setting is marked partial with word_limit_reached. |
maxUpstreamRequests | derived (4) | Hard ceiling on requests to Douyin for the whole run, retries included. The default pays for two board reads with one retry each. Set it to 1 for a single read. |
proxyConfiguration | Apify Proxy | The proxy the request goes through. The datacenter default is what this Actor is measured on. |
Output
One row per word, recordType: "hot_word":
| Field | Meaning |
|---|---|
board | hot or rising - which board the row came from. Part of the dedupe key. |
rank | Douyin's own position on that board, counting from 1. An entry Douyin pins above the ranking carries null rather than an invented number, and the rising strip, which has no position at all, is numbered in the order Douyin sent. |
word | The trending word, exactly as Douyin writes it. |
hotValue | Douyin's heat value for the word, or null when Douyin publishes none (the whole rising strip). |
label / labelUrl | Douyin's badge code for the word and the badge image it serves. The codes are Douyin's own and are passed through, not translated. |
eventTime | When the event behind the word started, as Douyin dates it, in ISO 8601. |
publishedAt | The same instant under this repo's shared field name. |
videoCount / discussVideoCount | Videos Douyin counts under the word, and how many of them are discussion videos. null when Douyin sends none. |
url | The public Douyin search page the word opens. |
coverUrl | Douyin's own cover image for the word. A signed URL that expires. |
sentenceId / groupId | Douyin's identifiers for the word and for the event behind it - use them to follow a word across runs. |
sentenceTag / wordType | Douyin's own category and type codes, passed through without interpretation. |
maxRank | The best rank the word has reached, when Douyin reports it. |
boardActiveTime | Douyin's "board last refreshed" stamp, in its own Beijing-time wording. |
partial / partialReason | Always false / null on a word row: the row exists because the word was collected. |
collectedAt | Our own collection time, separate from eventTime. |
One row per board, recordType: "board_status", never charged:
| Field | Meaning |
|---|---|
wordsReturned / wordsCharged | Rows this board wrote and charged. |
duplicatesSkipped | Words skipped because this board had already written them. |
wordsAvailable | How many words the board itself showed, before your own limits. |
boardActiveTime | Douyin's board refresh stamp. |
partial / partialReason | true with refused, upstream_request_cap, charge_limit_reached, word_limit_reached, upstream_error or not_collected when the board's words are incomplete. |
statusText | The same thing in a sentence, so the dataset explains itself. |
The last row is recordType: "RUN_SUMMARY" - words collected and charged per board, duplicates skipped, empty boards, partial boards by reason, requests sent, bytes moved, and why collection stopped. The same object is also in the run's key-value store under RUN_SUMMARY.
Partial is not empty
wordsReturned: 0 with partial: false means Douyin showed no word on that board. partial: true means the board's words are incomplete and there may well be more. A run that collected nothing and had partial boards fails rather than reporting an empty success.
Limits and boundaries
- Only the public board. No login, no cookies, no account, no personal data.
- Douyin refuses a request by answering with an empty body rather than an error. This Actor treats that as a refusal, retries it once on a fresh exit IP, and marks the board
partial: truewithrefusedif it keeps happening - it is never reported as an empty board. coverUrlandlabelUrlare Douyin's own signed URLs and stop working after a few hours. Fetch them promptly if you need the image.eventTimeandhotValueare Douyin's own values and are not re-derived or estimated.
Pricing
Pay per event, no start fee:
| Event | Price | Charged for |
|---|---|---|
result | $0.00399 ($3.99 per 1,000) | Each word row written. Per-board status rows, empty results and the run summary are free. |
Set a maximum charge for the run and the Actor stops before going over it.