# China Trend Tracker: Weibo, Douyin, Baidu Hot List Alerts (`memo23/china-hot-lists`) Actor

Track China's hot lists on a schedule and get only what changed: new topics on Weibo, Douyin, Baidu, Zhihu, Toutiao and 16 more boards, topics that spread to another board, climb into the top 10 or drop off, each with first seen, hours on list and best rank. Watch keywords for brand alerts.

- **URL**: https://apify.com/memo23/china-hot-lists.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Social media, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 topics

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## China Trend Tracker: Weibo, Douyin, Baidu Hot List Alerts and Topic History

Track **China's hot lists over time** and get only what changed: a new topic on Weibo hot search (微博热搜), one that jumped to Douyin (抖音热榜), climbed into Baidu's top 10 (百度热搜) or dropped off the lists. Every topic carries its **history**: first seen, hours on the list, best rank, peak heat and the boards it reached, in order. Add **watch keywords** (a brand, a person, a product) to hear only about topics that mention them. 21 boards, optional English titles. **$0.50 per 1,000 rows.** No login, no account, no API key.

![How China Trend Tracker works](https://api.apify.com/v2/key-value-stores/55CLnY0dvH7J00zfg/records/how-it-works-china-hot-lists.png)

```json
{
  "boards": ["weibo", "douyin", "baidu", "zhihu", "toutiao"],
  "watchKeywords": ["Tesla", "小米", "iPhone"]
}
```

Schedule it hourly. The first run returns every topic on the lists as `new`; from then on each run returns only the changes.

### What it reports

| `event` | When |
|---|---|
| `new` | A topic appears on a list for the first time |
| `new_board` | A known topic reaches another board (Weibo first, Douyin two hours later) |
| `entered_top` | A topic climbs to `topRank` (default 10) or higher on a board |
| `left` | A topic is gone from every board it was on; `hoursOnList` says how long it lasted |
| `returned` | A topic that had left is back |
| `on_list` | With `output: "all"`, every other topic on the lists |

A row carries every change of the run in `changes`; `event` is the most important one.

### Why Use This Actor?

- **Changes, not snapshots.** An hourly snapshot of 21 lists is 500+ rows that mostly repeat. The tracker returns the 20-60 that moved, and bills only those.
- **A lifecycle for every topic.** `firstBoard`, `boardsReached` with times and best ranks, `hoursOnList`, `peakHeat`. See where a story started and how far it spread.
- **Brand and keyword watch.** `watchKeywords` in Chinese or English keeps only the topics that mention your brand, competitor, person or product.
- **Separate histories.** Each `trackerName` keeps its own history, so a brand watch and an all-boards feed can run side by side.
- **Fair billing.** A board that does not answer is skipped, not billed, and its topics are not reported as left.

### Use Cases

- **Brand and PR monitoring in China:** an alert when your brand, product or executive reaches a hot list, and when it leaves.
- **Agency and market research:** how long topics stay on Weibo vs Douyin, which platform starts a story, how high it climbs.
- **Newsrooms:** a feed of stories as they break on Chinese social media, with the first board and time.
- **Trend datasets:** with `output: "all"`, each run is a snapshot that also carries every topic's history.

### How It Works

1. All chosen boards are read at the same time, from the endpoints the sites' own pages use.
2. Each topic is matched with the tracker's history by its title (case, spaces, hashtags and punctuation ignored), so the same headline on two boards is one topic.
3. The run compares ranks and boards with the last run and reports what changed.
4. The history is saved after the rows are in the dataset. A topic not seen for `forgetAfterHours` is dropped from it.

### Boards

| Board id | Board |
|---|---|
| `weibo` | Weibo hot search 微博热搜 (50, with label and category) |
| `douyin` | Douyin hot list 抖音热榜 (50) |
| `kuaishou` | Kuaishou hot list 快手热榜 (50) |
| `baidu` | Baidu hot search 百度热搜 (50) |
| `baidu_novel`, `baidu_movie`, `baidu_teleplay`, `baidu_car`, `baidu_game` | Baidu novels, movies, TV series, cars, games |
| `toutiao` | Toutiao hot board 头条热榜 (50) |
| `zhihu` | Zhihu hot list 知乎热榜 (30, with answer counts) |
| `bilibili` | Bilibili hot search B站热搜 (30) |
| `bilibili_rank` | Bilibili video ranking B站排行榜 (up to 100) |
| `tieba` | Baidu Tieba hot topics 贴吧热议 (30) |
| `thepaper` | The Paper 澎湃热榜 (20) |
| `kr36` | 36Kr hot articles 36氪热榜 (50) |
| `tencent` | Tencent News 腾讯新闻热点榜 (50) |
| `netease` | NetEase News 网易热点 (50) |
| `sina` | Sina hot search 新浪热榜 (45) |
| `juejin` | Juejin tech articles 掘金热榜 (50) |
| `douban_movie` | Douban movies now 豆瓣热门电影 (10) |

Leave `boards` empty for the eight main hot searches: Weibo, Douyin, Kuaishou, Baidu, Toutiao, Zhihu, Bilibili and Tieba.

### Input Configuration

| Field | Type | Description |
|---|---|---|
| `boards` | array | Board ids from the table above. Empty = the eight main hot searches. |
| `watchKeywords` | array | Keep only topics whose title contains one of these words. English words are matched on the English titles. |
| `output` | string | `changes` (default) or `all`. |
| `topRank` | integer | Rank that counts as top for `entered_top`. Default 10. |
| `translateTitles` | boolean | Add English titles in `titleEn` (on by itself for English watch words). |
| `trackerName` | string | The history to use. Default `default`. |
| `forgetAfterHours` | integer | 1-720. Default 72. |
| `maxItemsPerBoard` | integer | 1-100. Default 50. |
| `maxItems` | integer | Cap on rows. Free-plan runs return up to 100; rows past the cap come in the next run. |

#### Example: brand watch, hourly

```json
{
  "boards": ["weibo", "douyin", "baidu", "toutiao", "zhihu", "bilibili"],
  "watchKeywords": ["特斯拉", "Tesla", "小米汽车"],
  "trackerName": "ev-brands",
  "topRank": 5
}
```

### Output Sample

A topic that reached a second board: first seen on Weibo, on Baidu five minutes later (2026-10-29):

```json
{
  "event": "new_board",
  "changes": [
    "new_board"
  ],
  "title": "外交部回应三丽鸥取消Vivant联名",
  "titleEn": "The Ministry of Foreign Affairs responded to Sanrio’s cancellation of Vivant co-branding",
  "board": "weibo",
  "boardNameZh": "微博热搜",
  "rank": 1,
  "heat": 1123476,
  "url": "https://s.weibo.com/weibo?q=%23%E5%A4%96%E4%BA%A4%E9%83%A8%E5%9B%9E%E5%BA%94%E4%B8%89%E4%B8%BD%E9%B8%A5%E5%8F%96%E6%B6%88Vivant%E8%81%94%E5%90%8D%23",
  "onBoardsNow": [
    {
      "board": "weibo",
      "rank": 1,
      "heat": 1123476
    },
    {
      "board": "baidu",
      "rank": 38,
      "heat": 4167400
    }
  ],
  "newBoards": [
    "baidu"
  ],
  "firstBoard": "weibo",
  "boardsReached": [
    {
      "board": "weibo",
      "boardNameZh": "微博热搜",
      "firstSeenAt": "2026-10-29T08:33:24.399Z",
      "bestRank": 1,
      "peakHeat": 1123476
    },
    {
      "board": "baidu",
      "boardNameZh": "百度热搜",
      "firstSeenAt": "2026-10-29T08:38:50.042Z",
      "bestRank": 38,
      "peakHeat": 4167400
    }
  ],
  "bestRank": 1,
  "peakHeat": 4167400,
  "firstSeenAt": "2026-10-29T08:33:24.399Z",
  "lastSeenAt": "2026-10-29T08:38:50.042Z",
  "leftAt": null,
  "hoursOnList": 0.1,
  "matchedKeywords": []
}
```

### Key Output Fields

| Field | Meaning |
|---|---|
| `event`, `changes` | What happened this run (see the table above) |
| `board`, `rank`, `heat`, `url` | The topic's best-ranked board right now (the last one for a topic that left) |
| `onBoardsNow` | Every board the topic is on this run, with rank and heat |
| `firstBoard`, `boardsReached` | Where it started and every board it reached, with first time, best rank, peak heat |
| `firstSeenAt`, `lastSeenAt`, `leftAt`, `hoursOnList` | Its lifecycle |
| `bestRank`, `peakHeat` | Highest rank and heat across boards |
| `matchedKeywords` | Watch keywords found in the title |

### FAQ

**Why did the first run return so many rows?**
A new tracker has no history, so every topic on the lists is new. Later runs return only changes. Use a new `trackerName` to start a history from zero.

**How often should it run?**
Hourly catches nearly every topic. Weibo and Douyin move every few minutes, so a 15-30 minute schedule shows finer rank changes.

**Two runs at the same time on one tracker?**
Give each schedule its own `trackerName`. Runs that share a history at the same moment can report a change twice.

**Is the same story on two boards one topic?**
When the titles match after case, spaces, hashtags and punctuation are removed, yes. Boards often word a story differently, and then it is two topics.

**How good are the English titles?**
Machine translation: good for following what a topic is about, rough on slang, names and puns.

**Do I need an account or a Chinese IP?**
No.

### Pricing

| Event | When | Price |
|---|---|---|
| Actor start | Once per run (per GB of memory, 256 MB default) | $0.005 |
| Topic | Each row delivered | $0.0005 |

Example: an hourly tracker on the eight main boards returns about 300 rows on its first run, then usually 20-60 an hour: about $0.02-0.035 an hour with the start fee. A brand watch with keywords often returns nothing and costs only the start.

### Support

Found a bug or need a board? Open an issue on the actor's Issues tab and include the run link.

### ⚠️ Disclaimer

This actor reads public trending lists. It is not affiliated with or endorsed by Weibo, ByteDance, Kuaishou, Baidu, Zhihu, Bilibili, Tencent, NetEase, Sina, 36Kr, The Paper, Juejin or Douban. Titles belong to their sites and authors. You are responsible for using the data in line with each site's terms and the laws that apply to you.

### SEO Keywords

china trend tracker, weibo hot search monitor, 微博热搜 监控, douyin hot list alerts, 抖音热榜, baidu hot search, 百度热搜, zhihu hot list, china brand monitoring, chinese social media monitoring, weibo trending alerts, china trending topics history, hot search tracker, china pr monitoring

# Actor input Schema

## `boards` (type: `array`):

Hot lists to read. Empty = Weibo, Douyin, Kuaishou, Baidu, Toutiao, Zhihu, Bilibili hot search and Tieba.

## `watchKeywords` (type: `array`):

Return only topics whose title contains one of these words, for example a brand, a person or a product. Chinese (特斯拉, 瑞幸) or English (Tesla, iPhone); English words are matched on the English titles. Empty = every topic.

## `output` (type: `string`):

Changes: new topics, topics that came back, reached another board, entered the top ranks or left the lists. The first run of a tracker returns every topic as new.

## `topRank` (type: `integer`):

A topic that climbs to this rank or higher on a board is reported as entered_top.

## `translateTitles` (type: `boolean`):

Add an English machine translation of each title in titleEn.

## `trackerName` (type: `string`):

Each name keeps its own topic history, so several schedules can track different boards or keywords, for example brand-watch and all-boards-hourly.

## `forgetAfterHours` (type: `integer`):

A topic not seen on any list for this long is dropped from the history; if it trends again later it is new again.

## `maxItemsPerBoard` (type: `integer`):

Each board lists 10-50 topics (Bilibili's ranking up to 100).

## `maxItems` (type: `integer`):

Cap on rows in the run. Free-plan runs return up to 100; rows past the cap come in the next run.

## Actor input object example

```json
{
  "boards": [
    "weibo",
    "douyin",
    "baidu",
    "zhihu",
    "toutiao"
  ],
  "watchKeywords": [],
  "output": "changes",
  "topRank": 10,
  "translateTitles": false,
  "trackerName": "default",
  "forgetAfterHours": 72,
  "maxItemsPerBoard": 50,
  "maxItems": 10000
}
```

# Actor output Schema

## `results` (type: `string`):

One row per topic that changed.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "boards": [
        "weibo",
        "douyin",
        "baidu",
        "zhihu",
        "toutiao"
    ],
    "watchKeywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/china-hot-lists").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "boards": [
        "weibo",
        "douyin",
        "baidu",
        "zhihu",
        "toutiao",
    ],
    "watchKeywords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/china-hot-lists").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "boards": [
    "weibo",
    "douyin",
    "baidu",
    "zhihu",
    "toutiao"
  ],
  "watchKeywords": []
}' |
apify call memo23/china-hot-lists --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/china-hot-lists"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Tdjj3QSe9MImqqSH2/builds/8jie5tnNpVBrwbWdd/openapi.json
