China signal desk · refreshed five times each Beijing day

Search

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

Example / 1 Jan 2026 to 31 Oct 2026

Release-level indicators and citation-ready documents, Jan to Oct 2026

Machine-built, not yet reviewed

The question this answers for a buyer

Can I get records into a spreadsheet or an agent workflow with the source, period and revision status still attached?

The exact question and range

For five series (CPI YoY, PPI YoY, 1Y LPR, M2 YoY, 10Y government bond yield), what does one row per release look like between 2026-01-01 and 2026-10-31, and can a documents page be exported with id and source_url for citation?

Date range
2026-01-01 to 2026-10-31, inclusive
Frozen
2026-11-02 01:46 UTC
Records
262

Result

237 release rows across 5 series arrive with series_id, period, value, unit, source_url, first_seen_at, last_seen_at, revised, and a 25-row documents page exports with id and source_url so each row can be cited.

  • Release rows237One row per (series, reference period) across five series.
  • Provenance columns presentseries_id, period, value, unit, source_url, first_seen_at, last_seen_at, revisedEvery provenance column the example promises was returned.
  • Release rows without a source link11Some earlier archive writes did not retain a source URL.
  • Citation page25 documentsid and source_url requested with fields=; the same page as CSV has a verified header.
  • cpi-yoy9 rows; latest 2026-09 = 0.9%0 flagged revised.
  • ppi-yoy9 rows; latest 2026-09 = 5%0 flagged revised.
  • 1y-lpr10 rows; latest 2026-10-20 = 3.00%0 flagged revised.
  • m2-yoy9 rows; latest 2026-09 = +7.2%0 flagged revised.
  • cn-govt-bond-yield-10y200 rows; latest 2026-10-30 = 1.6500%0 flagged revised.

Reproduce the documented result

One anonymous request with a fixed date range and at most 100 rows. Running it returns the rows counted below; the digest is the SHA-256 of their sorted ids joined by a newline.

curl
curl -sS 'https://china-snapshot.com/api/datasets?dataset=documents&from=2026-10-01&to=2026-10-31&fields=id,title,source,source_url,published_at,collected_at&limit=25'
Request
citation-ready documents page (JSON)
Rows returned
25
ids_sha256
973e674244098835d874d6efc6d1d22a07095f05ee554ecfc4eddd0924ebb149
Further pages
Yes. The documented result is this first page only.
Python (verify the digest)
import hashlib
import requests

items = requests.get("https://china-snapshot.com/api/datasets?dataset=documents&from=2026-10-01&to=2026-10-31&fields=id,title,source,source_url,published_at,collected_at&limit=25", timeout=60).json()["items"]
digest = hashlib.sha256("\n".join(sorted(i["id"] for i in items)).encode()).hexdigest()
print(len(items), digest)  # documented: 25 973e674244098835d874d6efc6d1d22a07095f05ee554ecfc4eddd0924ebb149

Records

The first 25 of 262 records. The complete set is in the CSV.

First 25 records for Release-level indicators and citation-ready documents, Jan to Oct 2026
TypeSeries or titlePeriodValueRevisedFirst seenID
Indicator releasecpi-yoy2026-090.9% %No2026-10-14 02:35 UTCindicator_releases:43337
Indicator releasecpi-yoy2026-080.8% %No2026-09-09 02:34 UTCindicator_releases:34425
Indicator releasecpi-yoy2026-070.5% %No2026-08-09 02:36 UTCindicator_releases:26600
Indicator releasecpi-yoy2026-061% %No2026-07-09 06:26 UTCindicator_releases:20532
Indicator releasecpi-yoy2026-051.2%No2026-06-10 03:47 UTCindicator_releases:15329
Indicator releasecpi-yoy2026-041.2%No2026-05-11 03:46 UTCindicator_releases:11010
Indicator releasecpi-yoy2026-031%No2026-04-10 03:40 UTCindicator_releases:7032
Indicator releasecpi-yoy2026-021.3%No2026-03-09 03:37 UTCindicator_releases:2880
Indicator releasecpi-yoy2026-010.2%No2026-02-15 03:31 UTCindicator_releases:20
Indicator releaseppi-yoy2026-095% %No2026-10-14 02:35 UTCindicator_releases:43338
Indicator releaseppi-yoy2026-083.8% %No2026-09-09 02:34 UTCindicator_releases:34426
Indicator releaseppi-yoy2026-073.5% %No2026-08-09 22:03 UTCindicator_releases:26643
Indicator releaseppi-yoy2026-064.1% %No2026-07-25 19:13 UTCindicator_releases:23600
Indicator releaseppi-yoy2026-053.9 %No2026-05-15 08:00 UTCindicator_releases:58231
Indicator releaseppi-yoy2026-042.8 %No2026-04-15 08:00 UTCindicator_releases:58230
Indicator releaseppi-yoy2026-030.5 %No2026-03-15 08:00 UTCindicator_releases:58229
Indicator releaseppi-yoy2026-02-0.9 %No2026-02-15 08:00 UTCindicator_releases:58228
Indicator releaseppi-yoy2026-01-1.4 %No2026-01-15 08:00 UTCindicator_releases:58227
Indicator release1y-lpr2026-10-203.00% %No2026-10-20 02:31 UTCindicator_releases:44929
Indicator release1y-lpr2026-09-203.00% %No2026-09-20 02:36 UTCindicator_releases:37498
Indicator release1y-lpr2026-08-203.00% %No2026-08-20 02:33 UTCindicator_releases:29172
Indicator release1y-lpr2026-07-203.00% %No2026-07-25 07:34 UTCindicator_releases:23457
Indicator release1y-lpr2026-06-223.00% %No2026-06-22 08:00 UTCindicator_releases:17593
Indicator release1y-lpr2026-05-203.00% %No2026-05-20 08:00 UTCindicator_releases:12230
Indicator release1y-lpr2026-04-203.00% %No2026-04-20 08:00 UTCindicator_releases:8378

Sources

Known gaps

  • The reproducible request returns the first 25 rows of a longer result (the API answered with next_cursor). result.row_count and result.ids_sha256 describe exactly that response, not the longer result.
  • Rows come from mode=release, which collapses repeated captures to one row per (series, period). release_date and first_seen_at record when our collection first saw the value, not the publisher's release timestamp.
  • revised is null for daily series (a quote moves within a day by nature) and is only meaningful for monthly and policy series; a revision is detected by comparing first and latest captured values.
  • The archive begins after some of these series started. A period with no capture is absent, not zero; check the earliest period against your own needs.
  • Some rows lack a source link where earlier archive writes did not retain one.
  • Five series are shown, chosen to cover monthly, policy-event and daily frequencies. The API serves many more; this is a sample, not the catalogue.
  • The documents page is the most recent 25 collected records of October 2026, shown only to demonstrate the id and source_url columns. It is not a topical selection.

Every request behind the figures

These are the exact anonymous requests used. Responses are paged at 100 rows by following next_cursor; the 1 follow-up page URLs, which carry short-lived signed cursors, are listed in the JSON evidence. Keep to one request a second.

curl
# release rows for cpi-yoy
curl -s "https://china-snapshot.com/api/datasets?dataset=indicators&mode=release&series=cpi-yoy&from=2026-01-01&to=2026-10-31&limit=100"

# release rows for ppi-yoy
curl -s "https://china-snapshot.com/api/datasets?dataset=indicators&mode=release&series=ppi-yoy&from=2026-01-01&to=2026-10-31&limit=100"

# release rows for 1y-lpr
curl -s "https://china-snapshot.com/api/datasets?dataset=indicators&mode=release&series=1y-lpr&from=2026-01-01&to=2026-10-31&limit=100"

# release rows for m2-yoy
curl -s "https://china-snapshot.com/api/datasets?dataset=indicators&mode=release&series=m2-yoy&from=2026-01-01&to=2026-10-31&limit=100"

# release rows for cn-govt-bond-yield-10y
curl -s "https://china-snapshot.com/api/datasets?dataset=indicators&mode=release&series=cn-govt-bond-yield-10y&from=2026-01-01&to=2026-10-31&limit=100"

# citation-ready documents page (JSON)
curl -s "https://china-snapshot.com/api/datasets?dataset=documents&from=2026-10-01&to=2026-10-31&fields=id,title,source,source_url,published_at,collected_at&limit=25"

# citation-ready documents page (CSV)
curl -s "https://china-snapshot.com/api/datasets?dataset=documents&from=2026-10-01&to=2026-10-31&fields=id,title,source,source_url,published_at,collected_at&limit=25&format=csv"
Python (pandas)
import time
from urllib.parse import quote

import pandas as pd
import requests

URLS = [
    "https://china-snapshot.com/api/datasets?dataset=indicators&mode=release&series=cpi-yoy&from=2026-01-01&to=2026-10-31&limit=100",  # release rows for cpi-yoy
    "https://china-snapshot.com/api/datasets?dataset=indicators&mode=release&series=ppi-yoy&from=2026-01-01&to=2026-10-31&limit=100",  # release rows for ppi-yoy
    "https://china-snapshot.com/api/datasets?dataset=indicators&mode=release&series=1y-lpr&from=2026-01-01&to=2026-10-31&limit=100",  # release rows for 1y-lpr
    "https://china-snapshot.com/api/datasets?dataset=indicators&mode=release&series=m2-yoy&from=2026-01-01&to=2026-10-31&limit=100",  # release rows for m2-yoy
    "https://china-snapshot.com/api/datasets?dataset=indicators&mode=release&series=cn-govt-bond-yield-10y&from=2026-01-01&to=2026-10-31&limit=100",  # release rows for cn-govt-bond-yield-10y
    "https://china-snapshot.com/api/datasets?dataset=documents&from=2026-10-01&to=2026-10-31&fields=id,title,source,source_url,published_at,collected_at&limit=25",  # citation-ready documents page (JSON)
]

rows = []
for first_url in URLS:
    url = first_url
    while url:
        page = requests.get(url, timeout=60).json()
        rows += page["items"]
        cursor = page.get("next_cursor")
        url = f"{first_url}&cursor={quote(cursor)}" if cursor else None
        time.sleep(1)  # anonymous limit: 60 requests a minute

df = pd.DataFrame(rows)
if "id" in df: df = df.drop_duplicates("id")
print(len(df), "rows")

# The API can also return a page as CSV directly:
citations = pd.read_csv("https://china-snapshot.com/api/datasets?dataset=documents&from=2026-10-01&to=2026-10-31&fields=id,title,source,source_url,published_at,collected_at&limit=25&format=csv")

# Or load the frozen evidence file without calling the API:
evidence = pd.read_csv("https://china-snapshot.com/data/examples/research-export.csv")

Download the evidence

The JSON holds the question, every request URL, known gaps and up to 500 rows. The CSV holds the full row set.

Method

  1. The reproducible request is the citation-ready documents page: result.row_count and result.ids_sha256 are computed from exactly its response. Document ids are used because a document keeps one id per source URL.
  2. For each series, request dataset=indicators&mode=release&series=<series_id> over the range and follow next_cursor.
  3. Keep every field the API returns, adding record_type to tell indicator rows from document rows. Nothing is recalculated.
  4. Request one documents page with fields=id,title,source,source_url,published_at,collected_at, and the same page with format=csv, and check that the CSV header matches the requested fields.
  5. To reproduce: run the Python snippet on this page, or fetch the CSV evidence file directly with pandas.read_csv.