China signal desk · refreshed five times each Beijing day

Search

Search the retained record: documents, social attention and economic prints.

Agent recipes

Prompts that come back cited.

Paste one of these into an agent that can make HTTP requests. Each recipe names the exact China Snapshot endpoints, the tier it needs and the shape of the answer. Every prompt tells the agent to cite source_url and to write "unknown" instead of guessing.

These are working instructions, not demos. The endpoints answer today, the tier labels come from the API configuration, and each sample is a trimmed response from production. Nothing here promises an endpoint that does not answer.

Recipes

Seven prompts, real endpoints.

01 · Anonymous

The 7am policy brief

Who it is for. Policy and government-affairs analysts who need the documents before the commentary.

Pull the State Council and PBOC documents collected since the last run, group them, and cite the publisher link on every line.

Tier. Anonymous: no key, 60 requests/min, 100 rows a page, 400 days of history. Limits are read from the API configuration. Compare the tiers.

The prompt

You are a China policy analyst preparing a morning brief for [DATE], Beijing time.

Use only the China Snapshot public API. Fetch both URLs and read the JSON:

1. https://china-snapshot.com/api/datasets?dataset=documents&source=State%20Council%20(EN)&limit=100&fields=id,title,source,source_url,collected_at,topic
2. https://china-snapshot.com/api/datasets?dataset=documents&source=PBOC&limit=100&fields=id,title,source,source_url,collected_at,topic

Keep only records whose collected_at is later than [LAST RUN, ISO 8601 timestamp with timezone].
If a response has a non-null next_cursor, fetch the next page with the same filters before you start writing.

Write:
- One line per document: publisher, collected_at, title, and one sentence on what it announces.
- Group the lines under the publisher.
- After each document, cite its source_url exactly as returned. Never cite a URL you did not receive in the response, and never replace a source_url with a homepage or a search link.
- Close with the number of documents, the number of publishers, and a short list of what you could not verify.

If a field is missing, if the feed returns no records for the period, or if a document's meaning is unclear, write "unknown" for that field. Do not infer, translate from memory, or guess.

Endpoints it uses

  • GET /api/datasets — dataset=documents, filtered by source, from and collected_at; anonymous reads stop at 100 rows a page.

Working curl

State Council (English)

curl "https://china-snapshot.com/api/datasets?dataset=documents&source=State%20Council%20(EN)&limit=100&fields=id,title,source,source_url,collected_at,topic"

PBOC

curl "https://china-snapshot.com/api/datasets?dataset=documents&source=PBOC&limit=100&fields=id,title,source,source_url,collected_at,topic"

Output looks like

Trimmed response from GET /api/datasets?dataset=documents&source=PBOC. Captured 2026-11-01 from https://china-snapshot.com/api/datasets?dataset=documents&source=PBOC&limit=1&fields=id,title,source,source_url,collected_at,topic, trimmed.

{
  "dataset": "documents",
  "items": [
    {
      "id": "documents:25384",
      "title": "Keynote Speech by PBOC Governor Pan Gongsheng at the 2026 Financial Street Forum Annual Conference",
      "source": "PBOC",
      "source_url": "http://www.pbc.gov.cn/hanglingdao/128697/128734/128871/2026102018331488382/index.html",
      "collected_at": "2026-10-28T01:27:24.343029+00:00",
      "topic": "economy"
    }
  ],
  "row_count": 1,
  "next_cursor": null
}

Read the limits first

  • collected_at is when we collected the record, not when the publisher issued it. Say so if the brief depends on the issue date.
  • The State Council feed is the English site. A Chinese-language document may appear later under its ministry.

02 · Anonymous

Macro print watcher

Who it is for. Macro and markets analysts who want the new print, not the whole series.

Read the deviation watch, then confirm only the series that changed period. Every value and period comes from the response.

Tier. Anonymous: no key, 60 requests/min, 100 rows a page, 400 days of history. Limits are read from the API configuration. Compare the tiers.

The prompt

You are a China macro analyst. Report only what is new since [LAST RUN, ISO 8601 timestamp].

Step 1. Fetch https://china-snapshot.com/data/baselines.json and read the deviations array.
Step 2. For each deviation whose feed is nbs_monthly, pboc_rates, fx or chinabond_yields, fetch the matching series:
  https://china-snapshot.com/api/series/cpi-yoy?from=[YYYY-MM]
  https://china-snapshot.com/api/series/pmi-manufacturing?from=[YYYY-MM]
  https://china-snapshot.com/api/series/ppi-yoy?from=[YYYY-MM]
  https://china-snapshot.com/api/series/cn-govt-bond-yield-10y?from=[YYYY-MM-DD]
  https://china-snapshot.com/api/series/cny-central-parity-usd-cny?from=[YYYY-MM-DD]

Step 3. Report a series only when the latest period is later than the period you reported at the last run. Give the period, the value, the unit, previous_value and the flags from the deviation record.

Cite the source_url returned on the observation for every number. If an observation has no source_url, write "source_url: unknown" and keep the number out of any claim about policy.

If a series returns fewer than two observations, if the period did not change, or if the response is missing a value, write "unknown" for that series. Do not carry a number forward from memory, and do not describe a print that is not in the response.

Endpoints it uses

  • GET /data/baselines.json — 30/90-day baselines and a ranked deviations array with new_print and z_spike flags.
  • GET /api/series/{series_id} — One clean series per indicator, oldest first, with previous_value and the source_url on every row.

Working curl

Deviation watch

curl "https://china-snapshot.com/data/baselines.json"

One series, bounded

curl "https://china-snapshot.com/api/series/cpi-yoy?from=2026-01"

Output looks like

Trimmed deviation record from /data/baselines.json. Captured 2026-11-01 from https://china-snapshot.com/data/baselines.json, trimmed.

{
  "title": "PMI Manufacturing",
  "feed": "nbs_monthly",
  "kind": "step",
  "flags": ["new_print"],
  "z30": null,
  "first_flagged": "2026-10-31",
  "last_flagged": "2026-11-01",
  "note": "PMI Manufacturing index, year-on-year moved 50.1 % -> 49.3 % after holding 30d"
}

Read the limits first

  • A print can be revised. The series carries revised and release_date; the watch reads collection order, not the publisher's calendar.
  • baselines.json is rebuilt after collectors run. If as_of is older than your run, say the run has not landed.

03 · Anonymous

Trend radar across platforms

Who it is for. Consumer and culture teams that need a cross-platform read, not one hot list.

Find topics that appear on more than one platform in the retained hot-list observations, and state the sampling limit.

Tier. Anonymous: no key, 60 requests/min, 100 rows a page, 400 days of history. Limits are read from the API configuration. Compare the tiers.

The prompt

You are a China consumer trends analyst. Build a cross-platform radar from the China Snapshot social dataset.

Fetch https://china-snapshot.com/api/datasets?dataset=social&limit=100&fields=id,title,original_title,source,source_url,rank,observed_at

Follow next_cursor with the same filters until it is null, up to five pages. Then:
1. Group observations by topic across sources. A topic qualifies only when it appears under two or more distinct source values.
2. For each qualifying topic give the platforms, the best rank seen per platform, and the observation window.
3. Cite the source_url of each observation you use.
4. State the limit in the answer: these rows are hot-list observations, not distinct posts, ranks are not comparable between platforms, and WeChat heat is null.

If two rows cannot be shown to describe the same topic, keep them apart. If a field is missing, or the window holds too few observations to support the claim, write "unknown". Do not call a topic rising unless the response shows it moving.

Endpoints it uses

  • GET /api/datasets — dataset=social. Rows are repeated hot-list observations from Baidu, Weibo and Tencent WeChat, not distinct posts.

Working curl

Social observations

curl "https://china-snapshot.com/api/datasets?dataset=social&limit=100&fields=id,title,original_title,source,source_url,rank,observed_at"

Output looks like

Trimmed social observation. Captured 2026-11-01 from https://china-snapshot.com/api/datasets?dataset=social&limit=1, trimmed.

{
  "id": "social:486532",
  "title": "China sweeps all four women's singles semifinal spots",
  "source": "Tencent WeChat Hot Topics",
  "source_url": "https://weixin.sogou.com/weixin?type=2&query=%E5%9B%BD%E4%B9%92%E5%8C%85%E6%8F%BD%E5%A5%B3%E5%8D%95%E5%9B%9B%E5%BC%BA",
  "original_title": "国乒包揽女单四强",
  "observed_at": "2026-11-01T12:27:38+00:00",
  "rank": 40,
  "heat": null
}

Read the limits first

  • Sampling is five collection slots a day, not a continuous feed. An absence is not evidence of no interest.
  • Ranks belong to the publisher. A rank of 3 on Baidu is not a rank of 3 on Weibo.

04 · Anonymous

A research brief with citations

Who it is for. Consultants and analysts who must answer a question from a bounded evidence set.

Answer one question from retained document metadata and topic readings, with a source link per claim and an explicit unknown list.

Tier. Anonymous: no key, 60 requests/min, 100 rows a page, 400 days of history. Limits are read from the API configuration. Compare the tiers.

The prompt

Answer this question for a client: "[YOUR QUESTION]".

Use the China Snapshot record only:
1. https://china-snapshot.com/api/datasets?dataset=documents&q=[KEYWORD]&limit=50&fields=id,title,source,source_url,collected_at,topic
2. https://china-snapshot.com/data/topics/index.json

Follow next_cursor while it is not null, up to three pages.

Write a short brief with three parts:
- What the record shows: each claim followed by the source_url of the document that supports it. Quote only the title field, and do not write a quotation that is not in the response.
- What the topic reading adds: name the topic slug and version you used, and link its json_url.
- What is unknown: list every part of the question the record cannot answer.

Never cite a URL that is not in a response. Never present a document title as a finding when the body was not read (text_status tells you whether an extraction exists). If the record does not settle the question, write "unknown" and say what evidence would settle it. Do not fill the gap from general knowledge.

Endpoints it uses

  • GET /api/datasets — dataset=documents, q is a literal substring of title, original title or publisher.
  • GET /data/topics/index.json — Topic readings with a json_url, a version and a source count.

Working curl

Documents for the question

curl "https://china-snapshot.com/api/datasets?dataset=documents&q=housing&limit=50&fields=id,title,source,source_url,collected_at,topic"

Topic index

curl "https://china-snapshot.com/data/topics/index.json"

Output looks like

Trimmed document record. Captured 2026-11-01 from https://china-snapshot.com/api/datasets?dataset=documents&q=housing&limit=1&fields=id,title,source,source_url,collected_at,topic, trimmed.

{
  "id": "documents:27087",
  "title": "Shanghai-built \"good housing\" technology takes center stage: dozens of debut products appear at the City Expo, reflecting changes in urban construction",
  "source": "Shanghai Municipal Government",
  "source_url": "https://www.shanghai.gov.cn/nw4411/20261101/8ad03a0f118449fc96211d141f03d2c6.html",
  "collected_at": "2026-11-01T02:41:18.513811+00:00",
  "topic": "economy"
}

Read the limits first

  • q matches a literal substring. It is not semantic search, so try the Chinese term as well.
  • A title with text_status not_extracted has metadata only. Say that when the claim depends on the body.

05 · Anonymous

Weekly yuan and rates digest

Who it is for. Treasury and FX desks that want one page on the yuan, the fixing and the curve.

Four series, one week, computed only from returned observations and cited row by row.

Tier. Anonymous: no key, 60 requests/min, 100 rows a page, 400 days of history. Limits are read from the API configuration. Compare the tiers.

The prompt

You are an FX and rates analyst writing a Monday note for the week to [DATE].

Fetch these four China Snapshot series and read the observations array in each:
  https://china-snapshot.com/api/series/usd-cny?from=[YYYY-MM-DD]
  https://china-snapshot.com/api/series/cny-central-parity-usd-cny?from=[YYYY-MM-DD]
  https://china-snapshot.com/api/series/cn-govt-bond-yield-10y?from=[YYYY-MM-DD]
  https://china-snapshot.com/api/series/1y-lpr?from=[YYYY-MM]

For each series report: first and last period in the window, first and last value, the change, and the unit.
Compute the change only from the two observations you name. Cite the source_url on each observation you quote.

Then write two sentences on what moved together. Do not claim causation.

If a series has fewer than two observations in the window, if a value is null, or if the change cannot be computed from returned rows, write "unknown" for that series. Do not use a remembered level or a level from another source.

Endpoints it uses

  • GET /api/series/{series_id} — usd-cny, cny-central-parity-usd-cny, cn-govt-bond-yield-10y and 1y-lpr each return period, value and source_url.

Working curl

USD/CNY

curl "https://china-snapshot.com/api/series/usd-cny?from=2026-10-01"

Central parity

curl "https://china-snapshot.com/api/series/cny-central-parity-usd-cny?from=2026-10-01"

10-year yield

curl "https://china-snapshot.com/api/series/cn-govt-bond-yield-10y?from=2026-10-01"

1-year LPR

curl "https://china-snapshot.com/api/series/1y-lpr?from=2026-01"

Output looks like

Trimmed observation from GET /api/series/usd-cny. Captured 2026-11-01 from https://china-snapshot.com/api/series/usd-cny?from=2026-10-01, trimmed.

{
  "series_id": "usd-cny",
  "title": "USD/CNY",
  "frequency": "daily",
  "unit": "CNY per USD",
  "observations": [
    {
      "period": "2026-10-01",
      "value": 6.6987,
      "previous_value": 6.6968,
      "unit": "CNY per USD",
      "origin": "archive",
      "source_url": "https://finance.yahoo.com/quote/CNY=X",
      "release_date": "2026-10-01"
    }
  ],
  "truncated": false,
  "tier": "anonymous"
}

Read the limits first

  • The series window follows the tier. Anonymous reads start at the history window; Pro reads the full archive.
  • backfill_disagrees marks a row where the archive release and the older CSV differ. Keep the flag when you quote the value.

06 · Free key

Export-control and trade-policy monitor

Who it is for. Trade-compliance and supply-chain teams tracking controlled items and listed measures.

The maintained export-controls topic plus a ministry pass over retained documents, with the original-language title kept beside the translation.

Tier. Free key: one key, 60 requests/min, 500 rows a page, 730 days of history. Limits are read from the API configuration. Compare the tiers.

The prompt

You are a trade-compliance analyst. Run an export-control watch over the China Snapshot document record for [DATE RANGE].

Pass these filters, each as its own request, and follow next_cursor until it is null:
  dataset=documents&watch=export-controls&from=[YYYY-MM-DD]&to=[YYYY-MM-DD]
  dataset=documents&source=MOFCOM&from=[YYYY-MM-DD]&to=[YYYY-MM-DD]

Add &limit=500 and send your China Snapshot key as "Authorization: Bearer $CHINA_SNAPSHOT_KEY" on every request. Use https://china-snapshot.com/api/datasets as the base.
On later runs, ask only for what is new or revised: https://china-snapshot.com/api/changes?dataset=documents&watch=export-controls&since=[LAST RUN, ISO 8601 timestamp], then continue with next_since. If that route answers 503, the change feed is not enabled yet; fall back to the from/to passes.

Deduplicate by id, then report each document with: publisher, first_seen, change_type, English title, original_title where present, and source_url.
Note the text_status. When it is not_extracted, say the finding comes from the title only.

Cite source_url for every document. If a pass returns no record, write "unknown" for that pass rather than "no controls exist". Do not infer a control, an effective date or a product scope that the record does not state.

Endpoints it uses

  • GET /api/datasets — dataset=documents with watch=export-controls (alias topic=), a reviewed bilingual title-term list; source= adds a publisher pass. A Free key raises the page to 500 rows.
  • GET /api/changes — dataset=documents&watch=export-controls&since=<ISO> returns only documents added or revised after since, each with change_type and change_at; continue with next_since.

Working curl

Export-controls topic

curl "https://china-snapshot.com/api/datasets?dataset=documents&watch=export-controls&limit=100&fields=id,title,original_title,publisher,source_url,first_seen,change_type,text_status"

A ministry pass

curl "https://china-snapshot.com/api/datasets?dataset=documents&source=MOFCOM&limit=100&fields=id,title,original_title,publisher,source_url,first_seen,change_type,text_status"

What changed since the last run

curl "https://china-snapshot.com/api/changes?dataset=documents&watch=export-controls&since=2026-11-01T00:00:00Z"

Output looks like

Trimmed response to an earlier keyword request (q=export control), captured before the watch filter shipped. Captured 2026-11-01 from https://china-snapshot.com/api/datasets?dataset=documents&q=export%20control&limit=2, trimmed.

{
  "dataset": "documents",
  "items": [
    {
      "id": "documents:25377",
      "title": "Ministry of Commerce, General Administration of Customs, and Equipment Development Department of the Central Military Commission Announcement No. 49 of 2026: Announcement of the Decision to Optimize and Adjust Export Control Measures for Drone-Related Items",
      "source": "MOFCOM",
      "source_url": "https://www.mofcom.gov.cn/zcfb/zc/art/2026/art_b2fa4e60bcd24bdf8c658e476b808785.html",
      "original_title": "商务部 海关总署 中央军委装备发展部公告2026年第49号 公布优化调整无人机相关物项出口管制措施的决定",
      "collected_at": "2026-10-28T01:27:08.700699+00:00",
      "text_status": "not_extracted"
    }
  ],
  "row_count": 1,
  "next_cursor": null
}

Read the limits first

  • watch=export-controls matches titles against a reviewed list of English and Chinese terms (the list_watchlists research and MCP tool returns the terms and review dates); it infers nothing beyond the title.
  • This is a retained record, not a register of every Chinese measure. Say what was searched.

07 · Pro

Connect an agent over MCP

Who it is for. Teams wiring China Snapshot into an MCP-capable client instead of writing HTTP calls.

Discover the MCP endpoint, initialize, and call the eleven tools. Tools require a Pro credential with mcp_access.

Tier. Pro: one key, 300 requests/min, 100,000 a month, 5,000 rows a page, the full retained archive. Limits are read from the API configuration. Compare the tiers.

The prompt

Connect to the China Snapshot MCP server at https://china-snapshot.com/api/mcp as an MCP Streamable HTTP server.

1. GET https://china-snapshot.com/api/mcp and read the protocol versions, methods and tools.
2. POST an initialize request with protocolVersion from that response.
3. Send notifications/initialized.
4. Call tools/list. If it returns 401, stop and report that tools/list and tools/call need a Pro credential with the mcp_access entitlement. Do not invent a tool list.
5. When a tool is available, use it to answer "[YOUR QUESTION]" and cite source_url from the tool result for every claim.

The served tools are: get_digest, get_signal_packet, export_signal_packet, search_stories, get_entity_timeline, find_records, get_record, get_observations, get_changes, export_records, list_watchlists. For document monitoring, find_records, get_record, get_observations and get_changes read the same records as /api/datasets and /api/changes. A tool result that carries no source_url supports no citation.

If a tool is unavailable, returns an error, or a field is missing, write "unknown". Do not fall back to memory or to another source.

Endpoints it uses

  • GET /api/mcp — Unauthenticated discovery: protocol versions, methods, tool list and quota.
  • POST /api/mcp — JSON-RPC 2.0 Streamable HTTP. initialize and ping are open; tools/list and tools/call need mcp_access.

Working curl

Discovery (no key)

curl "https://china-snapshot.com/api/mcp"

Initialize (no key)

curl -X POST "https://china-snapshot.com/api/mcp" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"cli","version":"1.0"}}}'

tools/list (Pro only; 401 without a key)

curl -X POST "https://china-snapshot.com/api/mcp" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $CHINA_SNAPSHOT_KEY" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'

Output looks like

Trimmed initialize result. Captured 2026-11-01 from https://china-snapshot.com/api/mcp, trimmed.

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2025-06-18",
    "capabilities": { "tools": { "listChanged": false } },
    "serverInfo": { "name": "china-snapshot", "version": "1.0.0" }
  }
}

Read the limits first

  • tools/call is metered against the monthly professional allowance.
  • The discovery GET answers without a key. That does not mean the tools do.

FAQ

What these recipes do not do.

Do the endpoints need a key?
The datasets and series endpoints answer anonymously inside the anonymous limits. A free key raises the monthly allowance, rows a page and the history window; Pro raises them again and adds the research API and MCP. Each recipe names the tier it needs, and the label comes from the API configuration.
Are the samples real?
Yes. Each sample is a trimmed response captured from china-snapshot.com on the date printed above it. Keys and repeated records were removed; values were not changed.
What does "unknown" mean in the prompts?
It is an instruction, not a placeholder. The prompt tells the agent to write unknown when a field is missing, a window has too few rows, or the record does not settle the question, instead of filling the gap from memory.