# Chinese Crypto News Radar (`yzy001/chinese-crypto-news-radar`) Actor

Chinese-language crypto exchange notices (OKX, Bybit) and news (BlockTempo, PANews) in one feed. Every row keeps the original Chinese text and the exchange's own category, and tickers mentioned by more than one source are flagged. Nothing is translated or classified by guesswork.

- **URL**: https://apify.com/yzy001/chinese-crypto-news-radar.md
- **Developed by:** [宗諭 楊](https://apify.com/yzy001) (community)
- **Categories:** News, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 news items

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

## Chinese Crypto News Radar

One dataset of Chinese-language crypto news from seven sites, with the original text kept as published.

| Source key | Site | Script |
|---|---|---|
| `blocktempo` | BlockTempo 動區動趨 | Traditional |
| `blockcast` | Blockcast 區塊客 | Traditional |
| `zombit` | Zombit | Traditional |
| `cryptocity` | Crypto City 加密城市 | Traditional |
| `panews` | PANews | Simplified |
| `chaincatcher` | ChainCatcher 链捕手 | Simplified |
| `techflow` | TechFlow 深潮 | Simplified |

Each row says which site it came from, when it was published, which script it is in, and which ticker symbols it mentions.

### What you get that a plain feed reader does not give you

- **Ticker mentions checked against a real instrument list.** Every row lists the ticker-like symbols found in its title and summary. `verifiedTickers` keeps only the ones listed on OKX in the same run, so acronyms such as CME, NASDAQ or CPU drop out.
- **Crypto and stocks kept apart.** OKX also lists tokenised stocks and commodities. `tickerAssetClass` gives OKX's own asset class for each listed symbol, and `cryptoTickers` keeps only the ones OKX classes as crypto. A story about Micron earnings gives `MU` with class `stock`, not a coin.
- **Cross-source mentions.** `crossSourceTickers` and `crossSourceVerifiedTickers` name the symbols that two or more of your selected sites mention in this run.
- **Filters that work in Chinese and English.** Keep only some sites, only items that contain a keyword, or only items that mention a ticker you watch.
- **A run summary that says what it can and cannot tell you.** For each site: whether it answered, how many items its feed carried, how many were dropped for a missing date or link, and how many survived your filters.

### Input

| Field | What it does |
|---|---|
| `sources` | Any of the seven source keys above. Default is all seven. Pick only the Traditional or only the Simplified ones for a single script. |
| `maxAgeHours` | Only items published within this many hours. `0` means no limit. Default 72. |
| `maxItemsPerSource` | Cap per site after the age filter. Default 50. |
| `keywords` | Keep only items whose title or summary contains one of these words. |
| `tickers` | Keep only items that mention one of these symbols, for example `SOL`, `PEPE`. |
| `allowPartial` | On by default. See below. |

### Output

One dataset row per item, newest first:

| Field | Meaning |
|---|---|
| `source` | One of the seven source keys |
| `publishedAt` | UTC time the site gave, ISO 8601 |
| `ageHours` | Hours between publication and this run |
| `title`, `summary` | Original Chinese text. `summary` is empty when the feed gives none, and is cut at 300 characters |
| `url` | Link to the item on the site |
| `categoryLabel` | The site's own tags when its feed has them |
| `script` | `traditional` or `simplified`: the script that site publishes in |
| `tickers` | Ticker candidates found in the title and summary |
| `tickerSourceCount` | For each ticker, how many distinct sites mention it in this run |
| `crossSourceTickers` | The tickers of this row that two or more sites mention |
| `verifiedTickers` | The candidates listed on OKX (spot or perpetual), checked against OKX's public instrument lists in the same run |
| `tickerVenues` | Which OKX list each verified ticker is on: `okx:spot`, `okx:swap` or both |
| `tickerAssetClass` | OKX's own asset class for each verified ticker: `crypto`, `stock`, `commodity`, `forex`, `bond`, `unknown`, or `mixed` when the two lists disagree |
| `cryptoTickers` | The verified tickers whose class is `crypto` |
| `crossSourceVerifiedTickers` | The verified tickers of this row that two or more sites mention |

The run summary is stored under the key `SUMMARY` in the key-value store.

### Things to know before you rely on it

- **Tickers are candidates, not a verified list.** They are found by pattern in the text. An all-caps word can be a coin, an acronym or a brand. Common acronyms and stablecoins are filtered out, but the filter is not complete. Glued pair symbols such as `BTCUSDT` are reduced to the base symbol (`BTC`). Tokenised-stock symbols that begin with a lowercase x are not detected; the title still carries them.
- **Listed does not mean the article is about that asset.** An acronym can collide with a listed symbol. For example, a story about the Philippine central bank (BSP) matches a symbol OKX lists. Check the title before acting on one.
- **Only OKX's lists are used for verification.** A coin that trades elsewhere but not on OKX is not verified. If the lists cannot be fetched, all verified fields are `null` (unknown), not empty, and `SUMMARY.listingCheck` says which list failed.
- **crossSourceTickers is not a signal that something is true or tradable.** It only says several of your sites mention the same symbol. Large coins such as BTC and ETH appear nearly everywhere, so look at the less common names.
- **These are RSS feeds and carry only their latest items.** Some sites keep about 5 or 10 items in the feed, others several hundred. Raising `maxAgeHours` does not reach further back than the feed itself.
- **Each site publishes in one script.** Nothing is translated or converted between Traditional and Simplified.
- **Some sites could not be included.** ABMedia 鏈新聞 refuses requests from the cloud region this Actor runs in, so it is not offered.
- **Exchange notices are not included.** From the cloud region this Actor runs in, Bybit refuses the requests and OKX serves its US site's notices instead of the Chinese ones, so both were left out rather than worked around.
- **Binance is not included.** Its robots.txt disallows the announcement API for generic crawlers.

### If a source fails

By default the run still returns the sites that answered when one fails. The status message then contains `DEGRADED, failed:` and the failed site's key, `SUMMARY.degraded` is `true`, and `SUMMARY.failedSources` and `SUMMARY.sources` give the error. If you would rather have the whole run fail when any site fails, turn `allowPartial` off. If every selected site fails, the run fails either way.

A site whose newest item is more than 14 days old is treated as broken rather than as a quiet day. So is a feed with no items, or one where no item has a usable date and link.

### Data and fair use

The Actor reads public RSS feeds and OKX's public instrument lists, one request each per run. It does not log in, does not use cookies, does not use proxies and does not work around any blocking. It sends a descriptive User-Agent. If a site starts refusing requests, that site is reported as failed; the Actor does not retry aggressively.

News headlines and summaries belong to their publishers. Use them according to the terms of the site you read.

# Actor input Schema

## `sources` (type: `array`):

Which Chinese-language crypto news feeds to read. blocktempo, blockcast, zombit and cryptocity publish in Traditional Chinese; panews, chaincatcher and techflow publish in Simplified Chinese. Pick only the Traditional ones or only the Simplified ones if you want a single script.

## `maxAgeHours` (type: `integer`):

Only return items published within this many hours. 0 means no age limit. Every source is an RSS feed that carries only its latest items, so a large value does not reach further back than the feed itself.

## `maxItemsPerSource` (type: `integer`):

Upper bound on rows from each source after the age filter.

## `keywords` (type: `array`):

Optional. Keep only items whose title or summary contains at least one of these words, case-insensitive. Chinese and English both work.

## `tickers` (type: `array`):

Optional. Upper-case ticker symbols such as BTC, SOL, PEPE. Only items mentioning at least one of them are kept.

## `allowPartial` (type: `boolean`):

On by default: if one selected source fails, the run still returns the sources that answered, the status message names the failed source, and the run summary marks degraded as true. Turn off to make any single source failure fail the whole run. If every selected source fails, the run fails either way.

## Actor input object example

```json
{
  "sources": [
    "blocktempo",
    "blockcast",
    "zombit",
    "cryptocity",
    "panews",
    "chaincatcher",
    "techflow"
  ],
  "maxAgeHours": 72,
  "maxItemsPerSource": 50,
  "keywords": [],
  "tickers": [],
  "allowPartial": true
}
```

# Actor output Schema

## `items` (type: `string`):

Items newest first with source, published time, tickers found, listed tickers, and whether another source mentions the same ticker.

## `summary` (type: `string`):

Which sources answered, how many rows each gave, tickers mentioned by more than one source, and the caveats.

# 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 = {
    "sources": [
        "blocktempo",
        "blockcast",
        "zombit",
        "cryptocity",
        "panews",
        "chaincatcher",
        "techflow"
    ],
    "maxAgeHours": 72,
    "maxItemsPerSource": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("yzy001/chinese-crypto-news-radar").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 = {
    "sources": [
        "blocktempo",
        "blockcast",
        "zombit",
        "cryptocity",
        "panews",
        "chaincatcher",
        "techflow",
    ],
    "maxAgeHours": 72,
    "maxItemsPerSource": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("yzy001/chinese-crypto-news-radar").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 '{
  "sources": [
    "blocktempo",
    "blockcast",
    "zombit",
    "cryptocity",
    "panews",
    "chaincatcher",
    "techflow"
  ],
  "maxAgeHours": 72,
  "maxItemsPerSource": 50
}' |
apify call yzy001/chinese-crypto-news-radar --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,yzy001/chinese-crypto-news-radar"
        }
    }
}
```

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/gLMPhT6nhL1mbgr30/builds/VBILS1rH7Q3CMxhBw/openapi.json
