Building an AI agent? Start with /llms.txt for the full site index.
Capital Flows
Director and supervisor shareholdings per company per reporting month, sourced from MOPS — shares held and pledged shares.
GET /v2/datasets/insider-director-holdingsinsider-director-holdings returns one row per company per reporting month with the aggregate director and supervisor shareholding and pledged shares, sourced from the official MOPS insider-holding disclosure. Each row carries a source role and lineage back to the MOPS filing so the holding is traceable rather than opaque.
| Field | Type | Description |
|---|---|---|
symbol | string | Ticker. |
period | string | Reporting month (YYYY-MM). |
director_shares | number | Aggregate director & supervisor shares held. |
pledged_shares | number | Shares pledged by directors & supervisors. |
holding_ratio | number | Director & supervisor holding as a ratio of issued shares (0-1). |
source_role | string | Canonical source role (official_mops_insider_holding). |
TODO — exact row / symbol counts and the coverage window are pending a measured snapshot; the source is the official MOPS director & supervisor holding disclosure (present through the latest disclosed month). No counts are shown rather than fabricated ones.
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": "insider_director_holdings", "request_context": { "scope": "insider_director_holdings_latest_balance_snapshot_only", "coverage_type": "latest_balance_snapshot_only", "filters": { "ticker": null, "market": null, "source_as_of_date": null, "holder_name": null, "holder_role": null, "holder_category": null, "source_family": null, "limit": 50 }, "min_source_as_of_date": "2026-05-20", "max_source_as_of_date": "2026-05-20" }, "quality": { "row_count": 50, "ticker_count": 3, "sensitive_fields_exposed": false }, "lineage": { "source_providers": [ "tpex_official" ], "source_roles": [ "insider_director_holdings_snapshot" ], "source_families": [ "tpex_insider_balance_snapshot" ] }, "error": null, "data": [ { "ticker": "1240", "market": "TPEx", "source_as_of_date": "2026-05-20", "holder_name": "<Chinese value - see the zh page>", "holder_role": "<Chinese value - see the zh page>", "holder_category": "manager", "holding_shares": 111169, "holding_ratio": null, "pledge_shares": 0, "source_provider": "tpex_official", "source_role": "insider_director_holdings_snapshot", "source_family": "tpex_insider_balance_snapshot", "source_row_key": "<Chinese value - see the zh page>", "lineage": { "source_family": "tpex_insider_balance_snapshot", "source_dataset": "t187ap11_balance_snapshot", "source_provider": "tpex_official" }, "data_gaps": [ "holding_ratio_not_source_provided" ], "not_investment_advice": true }, { "ticker": "1240", "market": "TPEx", "source_as_of_date": "2026-05-20", "holder_name": "<Chinese value - see the zh page>", "holder_role": "<Chinese value - see the zh page>", "holder_category": "manager", "holding_shares": 612766, "holding_ratio": null, "pledge_shares": 0, "source_provider": "tpex_official", "source_role": "insider_director_holdings_snapshot", "source_family": "tpex_insider_balance_snapshot", "source_row_key": "<Chinese value - see the zh page>", "lineage": { "source_family": "tpex_insider_balance_snapshot", "source_dataset": "t187ap11_balance_snapshot", "source_provider": "tpex_official" }, "data_gaps": [ "holding_ratio_not_source_provided" ], "not_investment_advice": true } ], "data_count": 50, "known_gaps": [ "latest_balance_snapshot_only", "holding_ratio_nullable_by_policy", "not_transaction_reconstruction" ], "warnings": [ "not_investment_advice" ], "not_investment_advice": true, "envelope": { "dataset_id": "insider_director_holdings", "scope": "insider_director_holdings_latest_balance_snapshot_only", "row_count": 50 }}Captured from the live API on 2026-07-20.
Chinese data values are shown as a marker here so this page stays in English; the /zh page shows them verbatim.
curl "https://api.twmarketdata.com/v2/datasets/insider-director-holdings?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/insider-director-holdings", 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/insider-director-holdings", 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/insider-director-holdings. The full machine-readable schema (parameters, security, response envelope) lives in the OpenAPI spec.