Building an AI agent? Start with /llms.txt for the full site index.
Capital Flows
Per-ticker TDCC big-holder concentration: total holder count, count and % held by ≥400-lot and ≥1000-lot holders, retail %, and week-over-week deltas. Derived from the TDCC 15-tier distribution. Not a forecast, not a recommendation.
GET /v2/datasets/shareholding-concentrationThis dataset is in build and not yet queryable via the API. The coverage and honest limitations below are the real database state; it moves off "Building" once serving lands (targeted 8/1).
| Field | Type | Description |
|---|---|---|
holder_count_total | holders | |
large_holder_count_400 | holders | ≥400 lots |
large_holder_pct_400 | ratio | |
large_holder_pct_1000 | ratio | ≥1000 lots |
retail_pct | ratio | |
large_holder_pct_1000_wow_delta | ratio | NULL on single snapshot |
1,978 rows at report_date 2026-05-29 — CURRENT-WEEK SNAPSHOT only (the view surfaces the latest TDCC weekly report). wow_delta columns are NULL on the first/only snapshot (no prior week in-view to diff). tier_map_version=tdcc_15tier_v1. Historical weekly series is available in the underlying table but this serving view is latest-snapshot.
A real response from this endpoint. Rows are returned under "data", and provenance is carried in the shape shown below — it is not identical across datasets, so read this page's rather than assuming another's.
{ "dataset_id": "shareholding-concentration", "row_count": 1, "data": [ { "ticker": "1101", "market": "TWSE", "report_date": "2026-05-29", "holder_count_total": 523992, "large_holder_count_400": 933, "large_holder_pct_400": 0.5477, "large_holder_pct_1000": 0.5056, "retail_pct": 0.0027 } ]}Captured from the live API on 2026-07-20.
curl "https://api.twmarketdata.com/v2/datasets/shareholding-concentration?symbol=2330" \ -H "X-API-Key: sk_live_..."| Parameter | Required | Type | Description |
|---|---|---|---|
symbol | Yes | string | Ticker, e.g. 2330. |
start_date | No | string (YYYY-MM-DD) | Start of the query range. |
end_date | No | string (YYYY-MM-DD) | End of the query range. |
limit | No | integer | Maximum rows to return. |
A first call:
import requests resp = requests.get( "https://api.twmarketdata.com/v2/datasets/shareholding-concentration", params={"symbol": "2330"}, headers={"X-API-Key": "sk_live_..."},)resp.raise_for_status()print(resp.json()["data"])With a date-range filter:
import requests # The full verified example — the same call with every supported filter set.resp = requests.get( "https://api.twmarketdata.com/v2/datasets/shareholding-concentration", params={"symbol": "2330"}, headers={"X-API-Key": "sk_live_..."},)resp.raise_for_status()for row in resp.json()["data"]: print(row)This endpoint is GET /v2/datasets/shareholding-concentration. The full machine-readable schema (parameters, security, response envelope) lives in the OpenAPI spec.