Building an AI agent? Start with /llms.txt for the full site index.
Market Structure & Reference
Theme taxonomy — the TWMD-maintained reference tree of investment themes and the industries / concepts each theme groups.
GET /v2/datasets/theme-taxonomytheme-taxonomy is a reference dataset: one record per theme node describing the classification tree TWMD uses to group securities. Use it to resolve a theme id to its label and parent, or to enumerate the themes available for tagging. It is a curated snapshot, not a time series.
| Field | Type | Description |
|---|---|---|
theme_id | string | Stable theme identifier. |
theme_name | string | Theme display name. |
parent_id | string | Parent theme id (null at the root). |
level | number | Depth in the taxonomy tree. |
source_role | string | twmd_theme_taxonomy. |
| Rows | 2,160 |
| Window | 2026-05-30 (single-day snapshot) |
| Grade | Reference |
A real response from this endpoint. Rows are returned under "envelope.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.
{ "api_version": "v2", "endpoint": "/v2/datasets/theme-taxonomy", "request_id": "req_8e048197993f", "plan_id": "enterprise", "dataset": "theme_taxonomy", "query": { "symbol": "2330", "theme": null, "taxonomy_type": null, "market": null, "as_of_date": null, "limit": 50, "legacy_alias_ticker": null, "legacy_alias_theme_primary": null }, "meta": { "rows_returned": 2, "mandatory_contract_fields_present": [ "api_version", "data", "data_as_of" ], "plan": "enterprise", "row_limit": 100000, "is_limited": false }, "envelope": { "api_version": "v2", "dataset": "theme_taxonomy", "dataset_version": "v2.0.0-preview", "release_version": "v2.2026-05-30.preview", "release_date": "2026-05-30", "data_as_of": "2026-05-30", "request_context": { "ticker": "2330", "as_of_date": "2026-05-30", "family": "discovery_reference", "field_group_type": "derived", "dataset_view": "theme_taxonomy_v1", "supported_sort_by": [ "as_of_date" ], "supported_filter_fields": [ "symbol", "theme", "taxonomy_type" ] }, "data": [ { "symbol": "2330", "theme_id": "24", "theme_name": "24", "taxonomy_type": "industry", "market": "TWSE", "classification_level": "2", "source_name": "tw_feature_engine", "source_url": null, "as_of_date": "2026-05-30", "source_role": "derived_theme_taxonomy", "lineage": { "sources": [ "issuer_profiles", "ticker_metadata" ], "theme_policy": "theme fields only from explicit issuer_classification_map entries; no AI inference", "mapping_version": "theme_taxonomy_v1", "taxonomy_version": "v1", "subindustry_policy": "from issuer_classification_map taxonomy subindustry/sub_industry only" }, "updated_at": "2026-06-19T05:46:08.775720" }, { "symbol": "2330", "theme_id": "24", "theme_name": "24", "taxonomy_type": "sector", "market": "TWSE", "classification_level": "1", "source_name": "tw_feature_engine", "source_url": null, "as_of_date": "2026-05-30", "source_role": "derived_theme_taxonomy", "lineage": { "sources": [ "issuer_profiles", "ticker_metadata" ], "theme_policy": "theme fields only from explicit issuer_classification_map entries; no AI inference", "mapping_version": "theme_taxonomy_v1", "taxonomy_version": "v1", "subindustry_policy": "from issuer_classification_map taxonomy subindustry/sub_industry only" }, "updated_at": "2026-06-19T05:46:08.775720" } ], "quality": { "freshness_state": "fresh", "freshness_as_of": "2026-05-30", "completeness_ratio": 1, "quality_status": "ready" }, "lineage": { "source_role": "canonical", "selected_source": "issuer_classification_map", "fallback_chain": [ "issuer_profiles", "ticker_metadata" ], "policy_notes": [ "official/public-first canonical", "theme_taxonomy uses deterministic mapping only from explicit classification map entries", "ai/confidence/cluster/rank fields excluded from public contract" ] }, "error": { "error_code": null, "error_message": null, "dataset": "theme_taxonomy", "request_id": "read-api-f235e586efe2", "blocking_gate": null } }}Captured from the live API on 2026-07-20.
curl "https://api.twmarketdata.com/v2/datasets/theme-taxonomy?symbol=2330" \ -H "X-API-Key: sk_live_..."| Parameter | Required | Type | Description |
|---|---|---|---|
symbol | No | string | Ticker to filter to a single security. |
limit | No | integer | Maximum rows to return. |
A first call:
import requests resp = requests.get( "https://api.twmarketdata.com/v2/datasets/theme-taxonomy", params={"symbol": "2330"}, headers={"X-API-Key": "sk_live_..."},)resp.raise_for_status()print(resp.json()["envelope"]["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/theme-taxonomy", params={"symbol": "2330"}, headers={"X-API-Key": "sk_live_..."},)resp.raise_for_status()for row in resp.json()["envelope"]["data"]: print(row)This endpoint is GET /v2/datasets/theme-taxonomy. The full machine-readable schema (parameters, security, response envelope) lives in the OpenAPI spec.