Douyin Trending Scraper
Pricing
from $6.00 / 1,000 results
Douyin Trending Scraper
Collect Douyin's official hot.douyin.com trend boards: overall, rising, and city hot topics, hot videos, hashtags, search terms, and content words, plus rankings for small-account hits and high like, follow, and completion-rate videos. This data normally needs a Douyin login to see.
Pricing
from $6.00 / 1,000 results
Rating
0.0
(0)
Developer
ToolzerHub
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Collect Douyin's official hot.douyin.com trend boards — overall, rising, and city hot topics, hot videos, hashtags, search terms, and content words, plus rankings for small-account hits and high like, follow, and completion-rate videos. This data normally needs a Douyin login to view. Pick a board with scraperType; 18 modes are available, grouped below.
The default hotBoard run avoids a frozen dashboard
billboard/hot only returns current rows when snapshot_time lands exactly on a five-minute mark ending in 5 — :05, :15, :25, and so on, in UTC. Leave snapshot_time blank and, instead of erroring, the source quietly serves a frozen snapshot from January 2025. Pick any other mark yourself — the current minute rounded down, midnight, "now" naively rounded — and it comes back with zero rows instead. Leave snapshot_time empty and this Actor computes the nearest valid five-minute mark itself, so a default hotBoard run returns today's board, not a stale one from over a year ago and not an empty one.
Modes
Hot-topic boards — share the same sentence/topic shape:
scraperType | Returns | Key input |
|---|---|---|
hotBoard (default) | Overall hot-topic board | range_type, snapshot_time or start_date/end_date, tag, keyword |
risingBoard | Topics rising fastest | order, city_code, tag, keyword |
cityBoard | Hot topics by city | order, city_code, tag, keyword |
challengeBoard | Hot hashtag challenges | keyword |
Video-performance boards — share the same item shape, an alias of aweme_id onto item_id:
scraperType | Returns | Key input |
|---|---|---|
videoBoard | Top-performing videos over a lookback window | date_window, sub_type, keyword |
lowFollowerHits | Videos that broke out from small accounts | date_window, keyword |
highLikeRate | Videos with the highest like rate | date_window, keyword |
highFollowRate | Videos with the highest follow-conversion rate | date_window, keyword |
highCompletionRate | Videos with the highest completion rate | date_window, keyword |
Topic and search-term performance:
scraperType | Returns | Key input |
|---|---|---|
topicBoard | Hashtag challenges by play/publish performance | date_window, keyword |
risingTopics | Hashtag challenges rising fastest | date_window, keyword |
searchBoard | Ranked in-search terms | date_window, keyword |
risingSearches | In-search terms rising fastest | date_window, keyword |
Content words:
scraperType | Returns | Key input |
|---|---|---|
contentWords | Frequently-searched content words | date_window, keyword |
contentWordDetail | Daily/weekly/monthly breakdown for one content word | keyword, word_id, query_day (all required together) |
Reference lists — fill the filters the boards above take:
scraperType | Returns |
|---|---|
categories | Category tags to pass as tag |
cityCodes | City codes to pass as city_code |
contentTags | Content-tag values, with child tags nested |
Input
| Field | Use it for |
|---|---|
range_type | hotBoard only: snapshot (default, reads one moment) or range (aggregates start_date–end_date instead). |
snapshot_time | hotBoard only, snapshot mode. As yyyyMMddHHmmss. Leave empty — see the note above. |
start_date, end_date | hotBoard in range mode, as yyyyMMdd. |
order | risingBoard, cityBoard: rank (default) or trending. |
city_code | risingBoard, cityBoard. From cityCodes. |
tag | hotBoard, risingBoard, cityBoard. Comma-separated category tags, from categories. |
keyword | Narrows almost every board to one search term. |
date_window | Video, topic, search, and content-word boards. Hours, not days: 1 past hour, 24 past day (default), 168 past week, 720 past month. |
sub_type | videoBoard only. Which board section to read. Default 1001. |
billboard_type | categories only: total, city, or rise. Douyin rejects hot here. |
word_id, query_day | contentWordDetail, alongside keyword. From a contentWords row's id and query_day. |
addonVideoDetails | Video-performance boards. Fetches full video detail per row — one extra request and one extra charge per row. |
maxItems | Caps every paginated board. Default 100. Set 0 for no limit. |
{"scraperType": "videoBoard","date_window": "168"}
Output
| Field | Modes | Contents |
|---|---|---|
rank, rank_diff, sentence, sentence_id, hot_score, video_count, sentence_tag_name, city_name, create_at, trends, label_name | Hot-topic boards | Rank, topic sentence, and heat score |
item_id, item_title, item_cover_url, item_duration, item_url, nick_name, avatar_url, fans_cnt, play_cnt, like_cnt, score, aweme_id, video_detail | Video-performance boards | Each video, with aweme_id aliased for downstream enrichment |
challenge_id, challenge_name, play_cnt, publish_cnt, cover_url, score, avg_play_cnt, create_time, trends | topicBoard, risingTopics | Each hashtag challenge |
key_word, search_score, trends | searchBoard, risingSearches | Each ranked search term |
id, title, score, rising_ratio, rising_speed, query_day | contentWords | Each content word |
word_windows, source_keyword, source_word_id | contentWordDetail | The word's daily/weekly/monthly breakdown |
label, value, num | categories | Each category tag |
label, value | cityCodes | Each city code |
label, value, count, children | contentTags | Each content tag, with children nested |
{"rank": 1,"sentence": "秋分","hot_score": 9481203,"sentence_tag_name": "节气"}
Questions
I set snapshot_time myself and got zero rows — why?
It has to land exactly on a five-minute mark ending in 5, in UTC. Any other value — including the current minute rounded down — returns an empty board rather than the nearest valid one. Leave snapshot_time empty and let the Actor compute a valid mark, or compute one to that exact rule yourself.
Why do categories, cityCodes, and contentTags exist as separate modes?
They're not trend data — they're the reference lists that fill tag, city_code, and content-tag filters on the boards above. Run one of these first if you need a valid value for those fields rather than guessing.
What does contentWordDetail need all three fields for?
keyword, word_id, and query_day together, or the run fails outright. word_id and query_day come from a row already returned by contentWords — this mode drills into one of those rows, it doesn't discover words on its own.
Why does videoBoard take a sub_type but the other video-performance boards don't?
Only videoBoard reads Douyin's board-section split; lowFollowerHits, highLikeRate, highFollowRate, and highCompletionRate are each already a single fixed ranking, so there's no section to choose on them.
Related Actors
| Actor | Purpose |
|---|---|
| Douyin Hot Search Scraper | The in-app hot-search board and music/brand charts, rather than the hot.douyin.com dashboard |
| Douyin Account Analytics Scraper | The hot-account board and per-account analytics, split out from this Actor's video and topic boards |
| Douyin Video Analytics Scraper | Comment word cloud and audience demographics for one video these boards surface |
| Douyin Marketing Calendar Scraper | Plan content around Douyin's own campaign calendar rather than reactive trend boards |
Support
Questions, bugs, or feature requests: contact@toolzerhub.com
Browse the rest: apify.com/toolzerhub