Actively maintained
Changelog
Feature changes, new endpoints and fixes — plus how we handle breaking changes.
Change policy
New endpointsNo extra charge (you pay per call; the number of endpoints does not change the price)
Response shape changesAnnounced in advance; fields are only added, never removed (unless there is a clear defect)
Retiring a featureAnnounced 30 days ahead
Bug fixesShipped immediately, logged on this page
2026-10-02ReleaseDeepSeek Harness plugin released: install by package name- New [DSH plugin page](/en/dsh/): a [DeepSeek Harness](https://www.deepseek.com/harness/) plugin — once installed, DSH can query A-share data directly: quotes / K-lines / financials / money flow / top-trader boards / sectors / factor screening, 24 tools in total.
- How to install: in Desktop / Web UI open the “Plugins” page and enter the package name `ashareapi-dsh-plugin`; or from the command line run `npx @deepseek-ai/dsh plugin --profile web add ashareapi-dsh-plugin`. No config files to edit.
- Free tools need no key: quote snapshot / K-line / hot list / market overview / breadth work right after install; the paid tools unlock with a key.
2026-10-02ReleasePi package released: one command gives Pi A-share data- Published on [pi.dev](https://pi.dev) (npm `ashareapi-pi`): install with `pi install npm:ashareapi-pi`, then `/reload` — no JSON config, no scripts.
- Covers 32 endpoints: quotes / K-lines / level-2 order book / financials / money flow / top-trader boards / sectors / convertible bonds / factor screening / macro — 5 of them free, no Key needed.
- Same source as the Agent Skill: one endpoint reference — Pi knows which endpoint to call, what parameters to pass, what units the fields use, and how to handle errors.
2026-10-01ReleaseSource opened: Python SDK / Node SDK / MCP server / Agent Skill on GitHub- All four repositories are open source (MIT): read the source, self-host, or file an issue — [Python SDK](https://github.com/ashareapi/ashareapi-python) · [Node SDK](https://github.com/ashareapi/ashareapi-node) · [MCP server](https://github.com/ashareapi/ashareapi-mcp) · [Agent Skill](https://github.com/ashareapi/ashareapi-skill).
- Official SDK updated to 0.1.9 ([PyPI](https://pypi.org/project/ashareapi/) · [npm](https://www.npmjs.com/package/ashareapi)): adds an English README.
2026-10-01GuidesNew guide: realtime quote and daily close with /v1/quote (no Key)- New [Realtime quotes and daily close with /v1/quote](/en/docs/guides/quote-realtime-price/): get the last price, OHLC, volume, turnover value and turnover rate in one GET — free, no Key, no signup. Covers unit conversion (volume in lots / amount in CNY / turnover as a percent), the data-date semantics behind "realtime vs close", batching and rate limits (anonymous 5/min, up to 60/min with one PoW challenge), and quote vs kline.
- Data from live responses (2026-10-01: 600667 returned 30 rows, `data[0]` date=2026-09-30 last=17.29).
2026-09-30FixK-line count is capped at 1212; Retry-After added to rate-limit responses- `/v1/kline` now has a maximum `count` of 1212: values above it return `422`. The default is still 30 — normal calls are unaffected.
- Rate-limit (429) and upstream-failure (502) responses now carry a `Retry-After` header, so clients can back off automatically instead of retrying blindly. No change needed for official SDK users — the SDK already backs off exponentially.
2026-09-30GuidesFour new practical guides: block trades / shareholder counts / K-line indicators / market breadth- New [Reading A-share block trades](/en/docs/guides/block-trade-signals/): discount rate, institutional seats and both sides, with a real Hengrui 252m / -8% trade.
- New [Reading shareholder counts](/en/docs/guides/shareholder-structure/): three tables, chip concentration, with the Tai Ji count-tripling case.
- New [Technical indicators from K-line](/en/docs/guides/kline-technical-indicators/): MA / MACD / RSI / KDJ / BOLL in pure pandas (no TA-Lib).
- New [Market temperature from breadth](/en/docs/guides/market-breadth/): advance ratio and limit-ups, tracking days for a turning point.
- All based on live data (2026-09-29), runnable as-is.
2026-09-29GuidesNew factor screening series: four guides (with a data health-check method)- New [Factor screening basics](/en/docs/guides/factor-screening/): how to use `/v1/screen`, how to read results, and the mandatory 3-step data health check (multi-metric consistency / ex-non-recurring / leverage) - with a real case showing how a screened PE 0.36 / ROE 883% was verified as an unusable factor value.
- New [Expression syntax & factor dictionary](/en/docs/guides/screen-expressions/): `intersect([...])` structure, 6 operators, unit and percentage rules, 85 verified factors, 14 copy-paste templates and 8 pitfalls.
- New [22 ready-made screening strategies](/en/docs/guides/stock-screening-strategies/): grouped by valuation / profitability quality / technical / money flow, with live results from five strategies.
- New [Value screening in practice](/en/docs/guides/value-stock-screening/): four-condition screen, a four-step investigation, then turning it into a reusable function that caught the outlier without false positives.
- All examples are live responses (reproduced 2026-09-29) and can be run as-is.
2026-09-28FixData source count basis corrected: 67 → 70- We aggregate 70 data sources (some pages previously showed 67) — the 67 came from an earlier per-category estimate, while 70 is counted from the sources we actually integrate.
- What changed is the displayed number, not the data: responses, fields and the endpoint count (32) are unchanged; affected pages — the homepage status card, the [status page](/en/status/), pricing, comparison pages and the footer — now read 70.
- The [status page](/en/status/) lists the size of each category: quotes / financials / money flow / top-trader boards / sectors / attention / filings & news / other — the groups add up to 70.
2026-09-28FixK-line basis: fixed to forward-adjusted (no need to adjust yourself)- `/v1/kline` returns forward-adjusted prices — no gap on ex-dividend days; there is no `adjust` parameter (the basis is fixed, not configurable). ⚠️ Please do not adjust again (double adjustment leaves prices that no longer match the real market); unadjusted / back-adjusted series are not provided.
- When our prices do not match an unadjusted source, the difference lands exactly on windows that cross an ex-dividend date (more visible on long windows such as MA120), while short windows (MA5 / MA10) usually agree — that is a basis difference, not a data error.
- This basis is now stated everywhere you read us: guides and FAQ · endpoint descriptions (`/openapi.json` and the endpoint pages) · the MCP tool `ashare_kline` · the [Agent Skill](/en/skill) · both official SDKs (the `kline()` docs and READMEs for Python and Node.js).
- The MCP server address is `https://api.ashareapi.com/mcp` (use this one in your client); `ashareapi.com/mcp` is the configuration guide page, not the endpoint.
- New comparison page: [ashareapi vs BaoStock](/en/compare/baostock/) — a free historical database vs a hosted service: BaoStock switches between three price-adjustment modes via `adjustflag` and exposes adjustment factors, plus 5/15/30/60-minute bars; we provide real-time snapshots, structured money-flow surfaces (money flow / top-trader boards / sectors / convertible bonds) and native AI Agent access. Includes "who each fits" and honest boundaries.
2026-09-26CapabilityField rename: turnover rate on /v1/quote and /v1/kline is now `turnover` (was `exchange`)- Unified field name: the turnover-rate field on `/v1/quote` and `/v1/kline` used to be `exchange` — the raw column name of the upstream data source, which reads like "exchange" the venue (our own endpoint description was misled by it and labelled the field as the exchange name while claiming "no turnover rate" — see the fix in the entry above). It is now `turnover`, the same name and value as `/v1/snapshot` (`sz000001` = `0.54` in both)
- ⚠️ Breaking change: code reading `row["exchange"]` must switch to `row["turnover"]`. This is a direct replacement — no `exchange` alias is kept (rationale: no external customer depends on this field yet)
- Propagated to: HTTP endpoint description · OpenAPI (`/openapi.json`) · MCP tool descriptions (`ashare_quote` / `ashare_kline`) · endpoint pages · guide code samples (Python / Node.js) · Agent Skill
- Also fixed a wrong statement in the guides: it said the turnover rate lives on `quote` / `snapshot` and not on kline — `/v1/kline` does return it
- Unchanged: `/v1/snapshot` already used `turnover`. The `/v1/kline` endpoint description previously did not mention the field at all — now it does
2026-09-26FixFixed: /v1/quote turnover field was mislabelled as "exchange"- The `exchange` field IS the turnover rate (%) — not the exchange name: an earlier description labelled the 8th field as "exchange" and claimed "no turnover rate" — a conclusion drawn from the field NAME alone. Measured values are numeric (`sz000001` = `0.54`, `sh600036` = `0.24`) and identical to `/v1/snapshot`'s `turnover` (0.54 for sz000001 in both) → it is the turnover rate
- Cross-check: 1,043,819 lots ÷ 19.406e9 shares = 0.538% ≈ the measured 0.54; the same-day change (−0.44%) and amplitude (1.59%) are both ≠ 0.54 (elimination)
- The description now reads "lightweight, 8 fields: last price / OHLC / volume / amount / turnover rate" and notes the field name is `exchange` (counter-intuitive — it is NOT the exchange name)
- Also unified `/v1/snapshot`'s field count to 35 fields (the HTTP side said "24+", the MCP side said "35")
2026-09-26FixAgent Skill doc fix: wrong response-shape description (copying it caused KeyError)- Corrected the "unified envelope" claim: the skill said every response carries `structured` / `tables`. Measured across all 32 endpoints, they are added only when `data` is Markdown text (9 endpoints: `market-overview` / `changedist` / `lhb` / `sector` / `sector-valuation` / `bond` / `etf` / `screen` / `macro`). Other endpoints have no such keys, so AI code copying `body["structured"]` hits a KeyError (use `body.get("structured")`)
- Added a "four shapes of `data`" quick-reference: object array (most endpoints) / table list (`finance`) / sectioned structure (`shareholder`, `calendar`) / Markdown text — plus a shape-agnostic row extractor
- Documented response shapes: `finance` = table list · `shareholder` / `calendar` = sectioned (with section keys) · `fund` = flat dict; fixed `profile` being labelled "returns a string" (it is an object array)
- `/v1/snapshot` field count: 24+ → 35 fields (now consistent with the endpoint page and the MCP side)
- Skill version 0.2.0 → 0.2.1; re-packed both the `/skill` download and the Agent Skills distribution zip (`/.well-known/agent-skills/`)
2026-09-25FixFixed: /v1/calendar returned stale data + used the wrong data channel- It returned months-old stale data: /v1/calendar used a crippled channel whose output had only two columns, `date` + `event.zy` (the latter always "1", with no business fields at all), and it ignored the `date` / `limit` parameters (passing `date=2026-09-25` still returned the full ascending list from 06-01) — so clients received data from months ago, the opposite of a "calendar"
- Switched to the correct channel: it now returns sections by event type (earnings disclosure / dividend / IPO / meeting / lockup release / rights issue) with business fields such as `symbol` / `stockName` / `registrationDate` / `exDividendDate` / `paymentDate`, and `date` now takes effect (defaults to from today, returning upcoming events over roughly the following month)
- Response structure change: `data` is now a sectioned structure — `data.tables` is an ordered list of sections, each with `title` (Chinese label) / `slug` (English key) / `rows`; plus `data.data{slug: rows}` as a convenience index
- Slugs: `financial_report` / `dividend` / `ipo` / `meeting` / `lockup_release` / `rights_issue` (plus `trading_halt`)
- ⚠️ Breaking change: code that iterated over `data` to read rows must now go through `data.tables` section by section (see the endpoint docs example)
- Also corrected the parameter docs: `date` is the window start date (blank = from today); `limit` is an upstream scale parameter, and per-section counts are not exactly this value
2026-09-25FixFixed: /v1/shareholder dropped holder sections + response structure change- Only the first section was returned: the upstream returns three sections (A-shares: top-10 holders / top-10 float holders / holder counts; HK: shareholder info / holder distribution / institutional holdings), but the parser kept only the first table — the other two were silently dropped
- Response structure change: `data` is now a sectioned structure — `data.tables` is an ordered list of sections, each with `title` (Chinese label) / `slug` (English key) / `rows`; plus `data.data{slug: rows}` as a convenience index
- A-share slugs: `top10_holders` / `top10_float_holders` / `holder_count` (includes `totalSHNum` / `avgHoldShares` for chip concentration)
- HK slugs: `shareholders` / `holder_distribution` / `institutional_holdings` (semantically different from A-shares — do not index by position)
- ⚠️ Breaking change: code that iterated over `data` to read rows must now go through `data.tables` section by section (see the endpoint docs example)
- Also fixed the `ok` flag: when upstream has no data (e.g. an index code) it used to return `ok:true` with an empty list — it now correctly reports `ok:false`
- Also documented the response shape of `/v1/quote`: `data` is an array (30 daily bars by default, `data[0]` is the latest). This was previously unstated, so parsing it as an object would fail — read the current price from `data[0].last`
- Also documented the response shape of `/v1/quote`: `data` is an array (30 daily bars by default, `data[0]` is the latest). This was previously unstated, so parsing it as an object would fail — read the current price from `data[0].last`
2026-09-25FixFixed: /v1/finance period direction + response structure change- Period direction fixed: `num=N` used to return the earliest N periods (possibly excluding the newest disclosure) — it now returns the latest N periods, matching the parameter description
- Response structure change: `data` went from a list of periods to a list of tables — `data[0]`=income · `data[1]`=balance sheet · `data[2]`=cash flow; each table is `[{EndDate: …, field: …}]` in descending order (latest period first)
- Far more fields: the three tables now carry 85 / 70 / 31 columns (full Tushare-style line items); the previous single table had only 36
- ⚠️ Breaking change: code that iterated over `data` must index by table first (see the docs example). Note that `structured` was always empty for this endpoint — it had been falling back to `data`
- Also fixed /v1/block-trade: it used to return only meta info and dropped the trade details — it now returns the full detail rows (price / premium-discount / volume / both-side brokerages)
2026-09-23CapabilityNew endpoint: full quote profile (/v1/snapshot)- One request returns the full picture: price + order book + valuation (PE TTM/dynamic/static + PB) + market cap + shares + limit up/down + volume ratio + amplitude + speed
- Split from /v1/quote: quote is light (8 fields, free); snapshot is full (24+ fields, pro tier) — use quote when you only need the price
- A-shares only (HK/US field layouts differ; parsing them would return wrong data, so they are not supported — use quote)
- Endpoint count 31 -> 32; MCP tools 23 -> 24 (ashare_snapshot)
2026-09-23CapabilityOrder-book fields flattened (b1_p / a1_v …)- Field names follow the common data-interface convention: b1_p/b1_v ~ b5_p/b5_v (bids), a1_p/a1_v ~ a5_p/a5_v (asks)
- Flat layout (one row, 30 columns) instead of nested arrays → read df["b1_p"] directly, no df["buy"][0][0]
- Response data is now always a row array → both SDKs (Python / Node) return DataFrames / arrays of objects automatically
- SDKs bumped to 0.1.2; limit-down zeros the bids and limit-up zeros the asks (normal, documented)
2026-09-23CapabilityNew endpoint: five-level order book (/v1/orderbook)- Bid 1–5 / Ask 1–5 prices and resting size (lots), plus last / change / data time
- Second-level snapshot (10s cache) · meaningful intraday · after close it is the final snapshot of the day
- Endpoint count 30 → 31; MCP tools 22 → 23 (ashare_orderbook)
- Both SDKs (Python / Node) gain an orderbook() method
2026-09-23ReleaseNode.js / TypeScript SDK published on npm- npm install ashareapi — 30 endpoints as 30 methods (npmjs.com/package/ashareapi)
- Zero runtime dependencies (native fetch, Node >= 18); ESM + CommonJS builds with TypeScript types
- Free endpoints need no key; returns arrays of objects; both camelCase and snake_case method names work
- Tutorial: /docs/guides/nodejs-ashare-quotes
2026-09-23ReleasePython SDK published on PyPI- pip install ashareapi — official Python SDK, 30 endpoints as 30 methods (pypi.org/project/ashareapi)
- Free endpoints need no key; returns pandas DataFrames (falls back to list[dict] without pandas)
- Symbol formats: sh600667 / 600667.SH / bare 6 digits all work
- 5 exception types separate "no data right now" from "fetch failed" (EmptyResultError / UpstreamError)
- Tutorial: /docs/guides/python-sdk
2026-09-23CapabilityAgent Skill launched (works with 45+ clients)- Drop one folder into Claude Code / Cursor / Codex / OpenCode and 45+ other Agent Skills clients — the AI then knows how to use the API
- Open standard (agentskills.io) · only the 6 standard frontmatter fields, so it stays portable across clients
- Progressive disclosure: an always-on SKILL.md plus 4 references (endpoints / fields / errors / SDK) read on demand
- Page and download: /skill
2026-09-21CapabilityAnonymous quota boost + 29 endpoints- New endpoint /v1/challenge: solve one challenge to raise the anonymous quota from 5/min to 60/min
- Endpoint count 28 → 29 (26 data endpoints + 3 utility endpoints: health / challenge / usage)
- The hot list limit now applies (/v1/hot, default 30, max 50)
- CORS enabled — the status page and browsers can call the API directly
2026-09-16LaunchService launch- All 28 endpoints open (6 free + 22 paid)
- Seoul node · multi-source fetch (100% success / 862ms)
- HTTPS site-wide · certificates auto-renew
- MCP access (23 tools)
- IP-level anti-resale protection
2026-09-15CapabilityData source expansion- 67 data sources · picks the fastest, skips the ones that keep failing
- Three money-flow sources back each other up
- Split of top-trader boards (institutions / hot money / seats)