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
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 -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.
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 973e674244098835d874d6efc6d1d22a07095f05ee554ecfc4eddd0924ebb149Records
The first 25 of 262 records. The complete set is in the CSV.
| Type | Series or title | Period | Value | Revised | First seen | ID |
|---|---|---|---|---|---|---|
| Indicator release | cpi-yoy | 2026-09 | 0.9% % | No | 2026-10-14 02:35 UTC | indicator_releases:43337 |
| Indicator release | cpi-yoy | 2026-08 | 0.8% % | No | 2026-09-09 02:34 UTC | indicator_releases:34425 |
| Indicator release | cpi-yoy | 2026-07 | 0.5% % | No | 2026-08-09 02:36 UTC | indicator_releases:26600 |
| Indicator release | cpi-yoy | 2026-06 | 1% % | No | 2026-07-09 06:26 UTC | indicator_releases:20532 |
| Indicator release | cpi-yoy | 2026-05 | 1.2% | No | 2026-06-10 03:47 UTC | indicator_releases:15329 |
| Indicator release | cpi-yoy | 2026-04 | 1.2% | No | 2026-05-11 03:46 UTC | indicator_releases:11010 |
| Indicator release | cpi-yoy | 2026-03 | 1% | No | 2026-04-10 03:40 UTC | indicator_releases:7032 |
| Indicator release | cpi-yoy | 2026-02 | 1.3% | No | 2026-03-09 03:37 UTC | indicator_releases:2880 |
| Indicator release | cpi-yoy | 2026-01 | 0.2% | No | 2026-02-15 03:31 UTC | indicator_releases:20 |
| Indicator release | ppi-yoy | 2026-09 | 5% % | No | 2026-10-14 02:35 UTC | indicator_releases:43338 |
| Indicator release | ppi-yoy | 2026-08 | 3.8% % | No | 2026-09-09 02:34 UTC | indicator_releases:34426 |
| Indicator release | ppi-yoy | 2026-07 | 3.5% % | No | 2026-08-09 22:03 UTC | indicator_releases:26643 |
| Indicator release | ppi-yoy | 2026-06 | 4.1% % | No | 2026-07-25 19:13 UTC | indicator_releases:23600 |
| Indicator release | ppi-yoy | 2026-05 | 3.9 % | No | 2026-05-15 08:00 UTC | indicator_releases:58231 |
| Indicator release | ppi-yoy | 2026-04 | 2.8 % | No | 2026-04-15 08:00 UTC | indicator_releases:58230 |
| Indicator release | ppi-yoy | 2026-03 | 0.5 % | No | 2026-03-15 08:00 UTC | indicator_releases:58229 |
| Indicator release | ppi-yoy | 2026-02 | -0.9 % | No | 2026-02-15 08:00 UTC | indicator_releases:58228 |
| Indicator release | ppi-yoy | 2026-01 | -1.4 % | No | 2026-01-15 08:00 UTC | indicator_releases:58227 |
| Indicator release | 1y-lpr | 2026-10-20 | 3.00% % | No | 2026-10-20 02:31 UTC | indicator_releases:44929 |
| Indicator release | 1y-lpr | 2026-09-20 | 3.00% % | No | 2026-09-20 02:36 UTC | indicator_releases:37498 |
| Indicator release | 1y-lpr | 2026-08-20 | 3.00% % | No | 2026-08-20 02:33 UTC | indicator_releases:29172 |
| Indicator release | 1y-lpr | 2026-07-20 | 3.00% % | No | 2026-07-25 07:34 UTC | indicator_releases:23457 |
| Indicator release | 1y-lpr | 2026-06-22 | 3.00% % | No | 2026-06-22 08:00 UTC | indicator_releases:17593 |
| Indicator release | 1y-lpr | 2026-05-20 | 3.00% % | No | 2026-05-20 08:00 UTC | indicator_releases:12230 |
| Indicator release | 1y-lpr | 2026-04-20 | 3.00% % | No | 2026-04-20 08:00 UTC | indicator_releases:8378 |
Sources
- China Snapshot public datasets API (indicators) — mode=release, one row per series and reference period.
- China Snapshot public datasets API (documents) — fields= selects the citation columns; format=csv returns the same page as a file.
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.
# 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"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
- 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.
- For each series, request dataset=indicators&mode=release&series=<series_id> over the range and follow next_cursor.
- Keep every field the API returns, adding record_type to tell indicator rows from document rows. Nothing is recalculated.
- 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.
- To reproduce: run the Python snippet on this page, or fetch the CSV evidence file directly with pandas.read_csv.