Douyin (抖音) Hot Search Scraper - Trending Words + Heat Value avatar

Douyin (抖音) Hot Search Scraper - Trending Words + Heat Value

Pricing

$3.99 / 1,000 hot words

Go to Apify Store
Douyin (抖音) Hot Search Scraper - Trending Words + Heat Value

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

Lantern Lab

Maintained by Community

Actor 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 hot and about 5 on rising. 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 position numbers are counted over the 48 it did serve. So rank is 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, and boardSampleSizes in the run summary shows what each read carried. Follow a word across runs by sentenceId, and use maxRank for Douyin's own best-rank value.
  • Douyin publishes no heat value on the rising strip, so hotValue is null there rather than 0. 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 url opens 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 partial with 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, and maxRank, the best rank the word has reached), its heat value, and its own identifiers (sentenceId for the word, groupId for the event behind it).
  • Keeps the platform's own event time (eventTime, mirrored as publishedAt), 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: true with the reason. The two are different records and are never confused.
  • Caps itself: maxUpstreamRequests is 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: coverUrl is Douyin's own URL, and it expires.
  • No scheduling or monitoring built in; use Apify schedules.

Input

FieldDefaultMeaning
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.
maxWordsPerBoard500Upper 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.
maxUpstreamRequestsderived (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.
proxyConfigurationApify ProxyThe proxy the request goes through. The datacenter default is what this Actor is measured on.

Output

One row per word, recordType: "hot_word":

FieldMeaning
boardhot or rising - which board the row came from. Part of the dedupe key.
rankDouyin'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.
wordThe trending word, exactly as Douyin writes it.
hotValueDouyin's heat value for the word, or null when Douyin publishes none (the whole rising strip).
label / labelUrlDouyin's badge code for the word and the badge image it serves. The codes are Douyin's own and are passed through, not translated.
eventTimeWhen the event behind the word started, as Douyin dates it, in ISO 8601.
publishedAtThe same instant under this repo's shared field name.
videoCount / discussVideoCountVideos Douyin counts under the word, and how many of them are discussion videos. null when Douyin sends none.
urlThe public Douyin search page the word opens.
coverUrlDouyin's own cover image for the word. A signed URL that expires.
sentenceId / groupIdDouyin's identifiers for the word and for the event behind it - use them to follow a word across runs.
sentenceTag / wordTypeDouyin's own category and type codes, passed through without interpretation.
maxRankThe best rank the word has reached, when Douyin reports it.
boardActiveTimeDouyin's "board last refreshed" stamp, in its own Beijing-time wording.
partial / partialReasonAlways false / null on a word row: the row exists because the word was collected.
collectedAtOur own collection time, separate from eventTime.

One row per board, recordType: "board_status", never charged:

FieldMeaning
wordsReturned / wordsChargedRows this board wrote and charged.
duplicatesSkippedWords skipped because this board had already written them.
wordsAvailableHow many words the board itself showed, before your own limits.
boardActiveTimeDouyin's board refresh stamp.
partial / partialReasontrue with refused, upstream_request_cap, charge_limit_reached, word_limit_reached, upstream_error or not_collected when the board's words are incomplete.
statusTextThe 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: true with refused if it keeps happening - it is never reported as an empty board.
  • coverUrl and labelUrl are Douyin's own signed URLs and stop working after a few hours. Fetch them promptly if you need the image.
  • eventTime and hotValue are Douyin's own values and are not re-derived or estimated.

Pricing

Pay per event, no start fee:

EventPriceCharged 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.