> Source: https://ashareapi.com/en/changelog/  ·  Markdown version for LLMs / AI agents

Actively maintained

# Changelog
 Feature changes, new endpoints and fixes — plus how we handle breaking changes.

 Change policy
 New endpoints No extra charge (you pay per call; the number of endpoints does not change the price)
 Response shape changes Announced in advance; fields are only added, never removed (unless there is a clear defect)
 Retiring a feature Announced 30 days ahead
 Bug fixes Shipped immediately, logged on this page

 `2026-10-02` Release DeepSeek 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-02` Release Pi 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-01` Release Source 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-01` Guides New 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-30` Fix K-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-30` Guides Four 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-29` Guides New 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-28` Fix Data 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-28` Fix K-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-26` Capability Field 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-26` Fix Fixed: /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-26` Fix Agent 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-25` Fix Fixed: /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-25` Fix Fixed: /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-25` Fix Fixed: /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-23` Capability New 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-23` Capability Order-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-23` Capability New 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-23` Release Node.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-23` Release Python 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-23` Capability Agent 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-21` Capability Anonymous 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-16` Launch Service 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-15` Capability Data 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)
