Building an AI agent? Start with /llms.txt for the full site index.
Financials & Growth
Monthly revenue with the growth and trailing metrics pre-computed — year-over-year, month-over-month and trailing-twelve-month revenue on top of the official MOPS figure.
GET /v2/datasets/monthly-revenue-enhancedmonthly-revenue-enhanced is a derived dataset: it starts from the official MOPS monthly-revenue disclosure and adds the growth and trailing-twelve-month figures an agent would otherwise compute itself. The lineage block points back to the underlying MOPS form so the base number stays auditable.
| Field | Type | Description |
|---|---|---|
symbol | string | Ticker. |
period | string | Reporting month (YYYY-MM). |
revenue | number | Monthly revenue from MOPS (TWD thousands). |
yoy | number | Year-over-year revenue growth (ratio). |
mom | number | Month-over-month revenue growth (ratio). |
ttm_revenue | number | Trailing-twelve-month revenue (TWD thousands). |
source_role | string | Canonical source role (derived_mops_monthly_revenue_enhanced). |
| Rows | 331,109 |
| Window | 2010-02-10 – 2026-07-10 |
| Grade | Derived |
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/monthly-revenue-enhanced", "request_id": "req_3b0e0cee6363", "plan_id": "enterprise", "dataset": "monthly_revenue_enhanced", "query": { "ticker": "2330", "period_from": null, "period_to": null, "limit": 50, "offset": 0, "sort_by": "period", "sort_order": "desc" }, "meta": { "rows_returned": 50, "mandatory_contract_fields_present": [ "api_version", "data", "data_as_of" ], "plan": "enterprise", "row_limit": 100000, "is_limited": false }, "envelope": { "api_version": "v2", "dataset": "monthly_revenue_enhanced", "dataset_version": "v2.0.0-preview", "release_version": "v2.2026-06-10.preview", "release_date": "2026-06-10", "data_as_of": "2026-06-10", "request_context": { "ticker": "2330", "as_of_date": "2026-06-10", "family": "fundamentals", "field_group_type": "derived", "dataset_view": "monthly_revenue_enhanced_v1", "supported_sort_by": [ "period" ], "supported_filter_fields": [ "ticker", "period_from", "period_to" ] }, "data": [ { "ticker": "2330", "market": "TWSE", "period": "2026-05", "as_of_date": "2026-06-10", "revenue": 416975163, "revenue_yoy_pct": 30.095, "revenue_mom_pct": 1.5217, "revenue_rolling_3m": 1242891980, "revenue_rolling_12m": 4261521438, "revenue_ytd": 1961803721, "revenue_ytd_yoy_pct": 29.9779, "provider": "twse_official", "source_role": "official_mops_monthly_revenue", "lineage": { "row_index": 279, "source_hash": "", "payload_date": "2026-05-01", "request_date": "2026-05-01", "endpoint_name": "t187ap05", "source_authority": "MOPS t187ap05" }, "updated_at": "2026-07-14T02:21:44.473057" }, { "ticker": "2330", "market": "TWSE", "period": "2026-04", "as_of_date": "2026-05-10", "revenue": 410725118, "revenue_yoy_pct": 17.495412, "revenue_mom_pct": -1.075788, "revenue_rolling_3m": 1143573430, "revenue_rolling_12m": 4165062226, "revenue_ytd": 1544828558, "revenue_ytd_yoy_pct": 29.946314, "provider": "mops_official", "source_role": "canonical", "lineage": { "revision_key": null, "source_table": "p0_canonical_fundamentals_daily", "normalization": "monthly_revenue_v1", "announcement_date": "2026-05-17", "source_publish_date": "2026-05-17", "transformation_version": "monthly_revenue_enhanced_v1" }, "updated_at": "2026-07-14T02:21:47.017593" } ], "quality": { "freshness_state": "fresh", "freshness_as_of": "2026-06-10", "completeness_ratio": 1, "quality_status": "ready" }, "lineage": { "source_role": "canonical", "selected_source": "mops_official", "fallback_chain": [ "data_gov_mirror", "finmind_legacy" ], "policy_notes": [ "official/public-first canonical", "monthly_revenue_enhanced derived from canonical fundamentals monthly rows", "unstable fields excluded from public contract (surprise/score/seasonality-adjusted/custom)" ] }, "error": { "error_code": null, "error_message": null, "dataset": "monthly_revenue_enhanced", "request_id": "read-api-f27c556ebe6b", "blocking_gate": null } }}Captured from the live API on 2026-07-20.
curl "https://api.twmarketdata.com/v2/datasets/monthly-revenue-enhanced?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/monthly-revenue-enhanced", 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/monthly-revenue-enhanced", 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/monthly-revenue-enhanced. The full machine-readable schema (parameters, security, response envelope) lives in the OpenAPI spec.