Douyin Trending API

POST

API health

24h health
100%
24h average time
16.79 s
  • Healthy / normal
  • Available
  • Limited
  • Mostly down
Healthy

Check Douyin's trending boards for hot keywords, each with rank, heat score, related video, article and live-room counts, label and peak rank. Choose boards with boards (default hotspot); hot_value is Douyin's own score and only comparable within a board.

Douyin Trending reads the current entries on one or more Douyin trending boards: rank, the trending phrase, heat value, related video count, board and cover image, plus, when Douyin shows them, the event time, the best rank reached so far and counts of related posts and live rooms. It answers what people on Douyin are watching right now, for content planning, newsjacking, early warning on brand topics and scheduling.

Choose boards with boards: hotspot, seeding, entertainment, social or challenge, one or several; leave it out for the hotspot board. No keyword is needed. hot_value is Douyin's own heat measure, comparable only within one board and often empty on the hotspot board, and rank is the position at the moment of the call, so call on a schedule and store each snapshot to see how entries move.

Price $0.56 per 1,000 requests ($0.000556 per call). Failed calls and empty results are not charged. Synchronous. For slow jobs add "mode": "async" to the body, take the job_id and poll.

AI prompt

Paste this into your AI assistant. It already holds this endpoint's parameters, response fields and an example request, so the assistant can ask what you need and then write the scraper.

Please help me write a data collection script with the EveryInfra Douyin Trending endpoint (douyin/trending).

Endpoint contract:
- Request: POST https://api.everyinfra.com/api/v1/social with the header Authorization: Bearer <API key>. Read the key from the EVERYINFRA_API_KEY environment variable and never hard-code it.
- In the request body, set platform to douyin and action to trending, and put the parameters inside params.
- No required parameters.
- Optional parameters:
  - boards: Specifies trending board types to query in the trending action, passed as a single string or an array of strings: hotspot, seeding, entertainment, social, and challenge. (allowed: challenge / entertainment / hotspot / seeding / social)
  - limit: The most rows to return in this call, an integer from 1 to 60. The default applies when you leave it out, and a call can return fewer rows. Larger values return 422 before any charge. (default: 20)
- Returns a list of records. Main fields of each record: rank (Position on the board: the trending ran…), keyword (Trending phrase), hot_value (Heat value of the entry), video_count (Video count: the account's videos on pr…), board (Board the entry belongs to), image_url, event_time (Time of the trending event), sentence_id (ID of the trending phrase (trending)), group_id (ID of the trending event (trending)), label (Numeric badge code on the board entry (…), word_type (Numeric type code of the trending phras…), article_count (Number of related image posts under the…); 15 fields in total, full list at https://api.everyinfra.com/api/v1/social/catalog?platform=douyin.
- Example request body:
{
  "platform": "douyin",
  "action": "trending",
  "params": {}
}
- Price: $0.56 per 1,000 requests; failed and empty results are not charged.
- For dozens or hundreds of targets, add "mode": "async" to the body: you get a job_id at once and poll GET https://api.everyinfra.com/api/v1/jobs/{job_id} for the result.
- On 422, fix the request using the suggested parameter names and allowed values in the error; on 429 or 503, wait for Retry-After and try again.

Before writing code, ask me which targets I need, how many, which fields, and what output format I want; then confirm the plan and the rough cost with me.

Request parameters

NameInTypeRequiredDefaultDescription
AuthorizationheaderstringYes-Bearer followed by your API key. Create it in the console; never put it in a URL or a code repository.
platformbodystringYesdouyinPlatform identifier, fixed value.
actionbodystringYestrendingCapability identifier, fixed value.
boardsbody.paramsenumNo-Specifies trending board types to query in the trending action, passed as a single string or an array of strings: hotspot, seeding, entertainment, social, and challenge. Defaults to hotspot if omitted or passed as an empty array.Allowed valueschallengeentertainmenthotspotseedingsocial
limitbody.paramsinteger (1–60)No20The most rows to return in this call, an integer from 1 to 60. The default applies when you leave it out, and a call can return fewer rows. Larger values return 422 before any charge.

Code samples

bash
curl -X POST 'https://api.everyinfra.com/api/v1/social' \
  -H "Authorization: Bearer $EVERYINFRA_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "platform": "douyin",
  "action": "trending",
  "params": {}
}'

[OpenAPI definition (JSON)]Samples read the key from the EVERYINFRA_API_KEY environment variable; copied code never contains your key.

Response example

Field preview

There is no real sample for these example parameters yet: this shows the response shape and fields from the contract, with … as placeholders. It is not the result of a real call.

json
{
  "id": "req_…",
  "platform": "douyin",
  "action": "trending",
  "results": [
    {
      "rank": …,
      "keyword": …,
      "hot_value": …,
      "video_count": …,
      "board": …,
      "image_url": …,
      "event_time": …,
      "sentence_id": …,
      "group_id": …,
      "label": …,
      "word_type": …,
      "article_count": …,
      "is_pinned": …,
      "max_rank": …,
      "live_room_count": …,
      "platform": …
    }
  ],
  "count": …,
  "billing": {
    "charged": …,
    "charged_usd": …,
    "balance_after_usd": …,
    …
  },
  "quota": { … }
}

Response fields

Business data is in results. The table lists the fields a record can contain; values the platform does not show are never made up.

FieldMeaning
rankPosition on the board: the trending rank on trending, the position on the Xingtu board on xingtu_creator_rankings.
keywordTrending phrase.
hot_valueHeat value of the entry. Douyin's own measure, comparable only within one board; often empty on the hotspot board.
video_countVideo count: the account's videos on profile, videos related to the entry on trending.
boardBoard the entry belongs to.
image_urlImage link. Capabilities with several images may return an image_urls array.
event_timeTime of the trending event.
sentence_idID of the trending phrase (trending).
group_idID of the trending event (trending); empty for some entries.
labelNumeric badge code on the board entry (trending), such as hot, new or surging; 0 means no badge.
word_typeNumeric type code of the trending phrase (trending).
article_countNumber of related image posts under the trend (trending).
is_pinnedWhether the item is pinned (post rows: pinned on the author's profile; trending: pinned on the board).
max_rankHighest position the trend has reached on the board (trending).
live_room_countNumber of related live rooms under the trend (trending).
platformSource platform identifier, the same as platform in the request (for example xiaohongshu, tiktok).

FAQ

Can I query several boards at once?

Yes. boards takes a single string or an array, and each row's board says which board it came from, so group by it before you merge results. Leaving boards out, or sending an empty array, returns the hotspot board only.

Can I compare hot_value across boards?

No. It is Douyin's own heat measure and only means something within one board; on hotspot rows it is often empty. Compare across boards with rank, or with related-content counts such as video_count and article_count.

How do I track a trend over time?

Call on a schedule and store every result with the time of the call. sentence_id ties rows for the same trending phrase together across snapshots, max_rank is the best position it has reached, and is_pinned marks a phrase pinned to the top of the board, which you may want to keep out of rank analysis.

Errors and billing

401
Missing or invalid key. Authentication runs before parameter checks, so unauthenticated requests never see the parameter schema.
422
Wrong parameter name or value. The error lists the parameters and allowed values this capability accepts and the closest match; it happens before any charge.
402
Insufficient balance. Top up first.
429
The account's per-minute request limit was reached (all of its API keys count together; a key's own lower limit applies first). Wait for Retry-After and try again; a rate package in the console raises the limit.
503
Could not complete right now. Any charge for the call goes back to your balance automatically, and the billing receipt in the response states the actual outcome, including when it is not yet known. Do not resend blindly.
200 empty
The request completed without data and is not charged (billing.reason = empty_result_refunded).