Taiwan Index History — TAIEX & TPEx 指數歷史 API
Pricing
from $0.50 / 1,000 results
Taiwan Index History — TAIEX & TPEx 指數歷史 API
Daily history for Taiwan's stock indices: the TAIEX back to 1990-01-04 with market turnover, its total-return twin, the TPEx OTC index back to 1999-09-01, and one row per session for every one of the ~273 indices TWSE publishes, each with its official English name.
Pricing
from $0.50 / 1,000 results
Rating
0.0
(0)
Developer
chris
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 hours ago
Last modified
Categories
Share
Taiwan Index History (TAIEX & TPEx 指數歷史) API
Structured JSON for every stock index Taiwan publishes, day by day. The TAIEX back to 1990-01-04 with the whole market's turnover beside it, its dividends-reinvested twin, the TPEx OTC index back to 1999-09-01, and one row per session for all ~273 indices the Taiwan Stock Exchange compiles — sector, thematic, ESG, corporate-governance, leveraged and inverse — each carrying the exchange's own official English name.
Nine separate official feeds go in — five dated reports and four open-data mirrors. One consistent record shape comes out, with every figure the exchanges publish twice reconciled before it is written.
Why this data matters
- Thirty-six years of TAIEX in one series. The daily close and the market's turnover genuinely start at 1990-01-04 — the session before it is refused outright rather than returned empty — so the February 1990 bubble top, the crash that followed, the 2000 dot-com unwind and 2008 all sit in the same table. A run over Q1 1990 comes back with 67 sessions peaking at a 12,495.34 close on 1990-02-10. The intraday high and low only start at 1999-01-05, and every row says which it is via
has_intraday_rangerather than quietly serving nulls — so the 12,682 everyone quotes, an intraday print, is correctly absent rather than faked. - Four separately compiled reports, cross-checked against each other on every row. TWSE publishes the closing index inside its turnover report, inside its historical-bar report, a third time inside the all-indices book, and a fourth time on its open-data host — a different domain, a different date format, different column names, a different publishing pipeline. None is derived from the others. The Actor requires all of them to agree wherever they overlap and fails the run if they do not.
- Every change reconciles against the previous session, across month and year boundaries. The reports are served a month at a time, so a naive parser never notices that the change printed on the 1st of a month should equal that day's close minus the last close of the previous month. Here the whole range is chained and checked end to end.
- The exchange's own percentage rule, reverse-engineered and proved. The daily series print a point change but no percentage. The all-indices report prints both — so the rule was recovered from it: half-up to two decimals, off the recovered previous close. Measured against 1,413 printed percentages spread over 2009-2026 it reproduces 1,413 of them, while rounding down reproduces only 683. That is the rule the Actor then applies to the series that do not print one.
- Official English names, matched on the numbers rather than by position. TWSE serves the same index book in English. Pairing it row for row is the obvious approach and it is wrong: on 2026-08-10 the English edition carries an index the Chinese one omits, which shifts every name after it. The Actor diffs the numeric columns instead and only names the stretches that match exactly — and then drops any name two sessions disagree on. Across seven sessions from 2009 to 2026, 1,209 of 1,209 indices were named this way.
- The oldest row in the archive is marked, not quietly trusted. On 1990-01-04 the turnover report prints a change of
0.00, and there is no earlier session published anywhere to measure that against — a genuinely flat day and a placeholder look identical from the data. That row carries the official figures plusis_archive_start: true, so it can be dropped before computing returns. Nothing is invented in either direction. - A dash is never a zero. An index suspended for the session, or one that has not launched yet, prints
--in all four numeric columns. And on an index's inaugural session the report repeats the index level in the change column while leaving the percentage a dash — publishing that as written would show a brand-new index up several thousand percent. Those rows are flaggedis_series_startand their change left null.
Output
One record per session for the headline series. A real TAIEX session, as published:
{"record_type": "TAIEX_DAILY","date": "2026-08-10","market": "TWSE","index_code": "TAIEX","index_name": "發行量加權股價指數","index_name_en": "TAIEX","open": 44540.71,"high": 45219.4,"low": 44540.71,"close": 44928.76,"change_points": 702.85,"change_pct": 1.59,"previous_close": 44225.91,"total_return_index": 103618.12,"trade_volume_shares": 10238975923,"trade_value": 880440723750,"transaction_count": 4441614,"change_matches_previous_close": true,"has_intraday_range": true,"source_reports": ["FMTQIK", "MI_5MINS_HIST", "MFI94U"]}
Three reports merged into one row: the turnover report brought the volume, value, trade count and the change; the historical-bar report brought the open, high and low; the total-return report brought its own series. All three agreed on the close, and 702.85 / 44225.91 × 100 = 1.5892…, which rounds to the 1.59 the exchange prints for the same session in its index book.
And one row per index per session from ALL_INDICES:
{"record_type": "INDEX_QUOTE","date": "2026-08-10","market": "TWSE","index_code": null,"index_name": "臺灣50指數","index_name_en": "FTSE TWSE Taiwan 50 Index","index_type": "PRICE","compiler": "TWSE","section": "TWSE price indices","close": 41642.8,"change_points": 544.48,"change_pct": 1.32,"previous_close": 41098.32,"is_series_start": false,"official_note": null,"source_reports": ["MI_INDEX type=IND"]}
What you can ask for
| Dataset | One row is | Archive starts | Cost |
|---|---|---|---|
TAIEX_DAILY | a TWSE session — TAIEX bar, turnover, total-return index | 1990-01-04 (bar from 1999-01-05, total return from 2003-01-02) | 3 requests per month of range |
TPEX_DAILY | an OTC session — TPEx index bar | 1999-09-01 | 1 request per month of range |
ALL_INDICES | one index on one session (~273 indices) | 2009-01-05 | 1-2 requests per session |
TPEX_SUB_INDICES | one TPEx open-data series on one session | rolling window of recent sessions only | 4 requests total |
The daily series are served a month at a time, so a decade of TAIEX costs about 360 requests no matter how many sessions it holds. ALL_INDICES is the expensive one — it is a per-day report — which is why it carries a maxSessions cap, set to 250 by default.
TPEX_SUB_INDICES covers the TPEx total-return index, TPEx 50 and its total-return twin, the corporate-governance pair and the high-dividend pair. The OTC board serves these through open-data endpoints with no date parameter at all, so they carry a rolling window of recent sessions and nothing more. Schedule the Actor daily to accumulate them; there is no backfill to be had, and this README will not pretend otherwise.
Archive floors, as measured
Each was probed rather than read off a documentation page, because the documentation and the data disagree.
| Series | First session | What comes back before it |
|---|---|---|
| TWSE turnover + TAIEX close | 1990-01-04 | 查詢日期小於79年1月4日 |
| TAIEX open/high/low | 1999-01-05 | 查詢日期小於88年1月5日 |
| TAIEX total return index | 2003-01-02 | 查詢日期小於92年1月 |
| TPEx index | 1999-09-01 | an empty table, no message |
| All-indices book | 2009-01-05 | stat: OK with zero rows |
That last one is the trap. Between 2004-02-11 and 2009-01-04 the all-indices endpoint answers OK and serves nothing, which looks exactly like a public holiday. Ask it about 2008-01-02 and you get a clean, empty, entirely misleading success. The Actor knows the floor and does not go below it.
Things the official reports do that will break a naive parser
- Two calendars, one shape. TWSE prints Republic-of-China years, TPEx prints Gregorian ones, both as
y/m/d. Worse, TWSE pads two-digit ROC years with a leading space — the 1999 archive returns' 88/01/05'— so splitting on/hands you an empty first field. - The total-return report's date column is named
日 期, with an ideographic space in the middle of the word. A column check that compares strings literally fails on it. - The direction of a move lives in a separate column, shipped as HTML.
<p style ='color:red'>+</p>means up, green means down, and the change column itself is always unsigned. Read the number without the arrow and every decline becomes a rally. - The English edition of the TPEx table labels its last column
Change(%)while serving a point change. The Chinese漲/跌is the honest label. The values are identical; only the header is wrong. - The all-indices report always returns ten tables, four of them nameless and empty. The six real ones are identified by their titles — and the first one's title carries a date prefix while the rest do not.
- The OTC board republished one session's row verbatim, once, in 2002. In the exchange's own September 2002 table,
2002/09/20carries2002/09/19's open, high, low, close and change unchanged — five figures to two decimals, all identical. It is visible as corruption rather than coincidence because the next session, 09/23, prints a change of-2.56against a close of103.32, which measures from105.88— a close the exchange never published. Both rows are served exactly as the exchange serves them and flagged (republished_previous_session,previous_session_republished) rather than dropped, patched or quietly reconciled. Every OTC session ever published was swept to find out how common this is: 6,684 sessions from 1999-09-01 to 2026-09-10, exactly one repeated row, and the only two change-identity violations in twenty-seven years are the two that row causes. - The index book grows. 74 indices on 2009-01-05, 150 on 2020-03-02, 273 today. New sections appeared along the way, so the Actor matches sections by name and raises rather than guessing if an unknown one turns up.
- The exchange's firewall answers a fast caller with an HTTP 307 and no
Location. The body is the exchange's "FOR SECURITY REASONS" page. It was measured to trip at a sustained four requests a second and — this is the part that catches people — once tripped it refuses every uncached report for that address, not just the one that tripped it, for several minutes. Anything the CDN happens to have cached still comes back 200, so a naive backfill appears to half-work. The Actor paces well under the threshold, slows the whole run down the moment a refusal lands, waits minutes rather than seconds before retrying, and names the firewall in its log instead of blaming the network.
The firewall refuses by address, so the way through a long backfill is to stop using the address it objected to: turn useApifyProxy on and TWSE requests go out through Apify Proxy, taking a different exit node each time they are refused. It is off by default because a direct run is faster and cleaner for any ordinary range. Only TWSE requests are proxied — the OTC board resets proxied connections (measured: six consecutive ECONNRESETs through a datacentre pool against one clean direct request), so it always goes direct.
When a refusal outlasts the retries anyway, the Actor falls back to the open-data host for the sessions that host carries — which is the current month, so a run over recent sessions survives it. For anything older there is no fallback, and rather than publish a run whose missing total-return column would read as history, it fails and says so. It also fails immediately in that case instead of working through the rest of the range first: once a month older than the current one has been refused for good, no later request can rescue it, and a run that is already going to fail should not spend ten minutes a month proving it.
Verification
Every run reports what it reconciled. These checks are not optional switches — a failure fails the run.
twse_close_agrees_across_reports— the turnover report and the historical-bar report, independently compiled, must print the same closing index for the same session.taiex_agrees_across_three_reports/total_return_agrees_across_reports— and so must the all-indices book, when that dataset is also requested.twse_change_matches_previous_close/tpex_change_matches_previous_close— the printed change must equal this close minus the previous session's, chained across the whole requested range including month boundaries.twse_bar_within_high_low/tpex_bar_within_high_low— open and close inside the session's own range.index_percent_reproduces— the printed percentage must reproduce from the recovered previous close under the half-up rule.tpex_agrees_with_open_data— where the OTC board's rolling open-data mirror overlaps the dated table, every value must match.tpex_session_republished_by_exchange— counts the rows above, which are excluded from the change identity because the figure they would be measured against was overwritten at the source. Everything either side of them is still checked.twse_agrees_with_open_data— same again on the TWSE side: the open, high, low, close and total-return index from the dated reports against the ones published onopenapi.twse.com.tw.english_name_stable_across_sessions— an index whose English name comes out differently on two sessions is published with no English name at all rather than a possibly-shifted one.
Measured results behind the claims above: the OTC dated table against its open-data mirror, 8 sessions × 5 values, zero disagreements; the change identity over every OTC session ever published — 6,684 of them, 1999-09-01 to 2026-09-10 — with two violations, both caused by the single repeated 2002 row described above; a 43-month TWSE backfill of 1999-08 to 2003-02, 911 sessions, close agreeing across two independently compiled reports 911 of 911, change identity 910 of 910; the printed percentage across ten sessions from 2009 to 2026, 1,413 of 1,413; the English pairing across seven sessions, 1,209 of 1,209.
Limitations, stated plainly
- No intraday data. These are daily closes. The five-minute series behind the exchange's own charts is not published with a date parameter.
ALL_INDICESis closes only. The index book prints a close, a change and a percentage for each index — no open, high or low. Only the TAIEX and the TPEx index have a published daily bar.index_codeis null onINDEX_QUOTErows. The exchange names its 273 indices and never codes them. Inventing codes would be guesswork, so the Chinese and English names are the key.- The TPEx sub-indices do not backfill. See above. This is a property of the source, not of the Actor.
- Taiwan 50, Formosa and the rest have no standalone historical endpoint — their
openapifeeds return a single latest row and the dated paths redirect. They are covered here only through the all-indices book, which is why that dataset matters despite being a per-day report.
Taiwan Market Data Suite
This Actor is part of a suite of 29 Taiwan market data APIs by chamarix — official sources only, cross-validated against independent official endpoints, clean JSON out. Code samples for the whole suite: GitHub.
Market data:
- taiwan-stock-daily-quotes — Daily OHLCV, VWAP, P/E, price-to-book & dividend yield for every listed/OTC stock since 2004
- taiwan-index-history — Daily TAIEX & TPEx index history since 1990 with market turnover, the total-return index & all 273 TWSE indices
- twse-institutional-trades — Daily institutional buy/sell (foreign, investment trust, dealer) per stock — TWSE listed
- tpex-institutional-trades — Daily institutional buy/sell per stock — TPEx OTC market
- taiwan-monthly-revenue — Monthly revenue of 1,900+ listed & OTC companies, MoM/YoY
- taiwan-financial-statements — Quarterly income statement, balance sheet & cash flow back to 2013
- taiwan-esg-disclosures — 21 ESG topics for 1,950+ companies — Scope 1/2/3 emissions, energy, water, waste, pay, board & climate risk
- taiwan-dividend-calendar — Ex-dividend / ex-rights dates, reference prices & payouts back to 2003
- taiwan-margin-trading — Daily margin trading & short sale balances per stock
- taiwan-sbl-short-sale-balance — Securities-lending short sale balances per stock
- taiwan-day-trading-stats — Day-trading volume, value & ratio per stock since 2014
- tdcc-shareholding-dispersion — Weekly TDCC shareholding dispersion (retail vs whale structure)
- taiwan-foreign-shareholding — Foreign ownership percentage & remaining quota per stock
- taiwan-futures-daily — Daily bars, settlement price & open interest for all 384 TAIFEX futures contracts since 1998, with the large-trader report
- taifex-institutional-derivatives — Institutional futures & options positions (TAIFEX), incl. put/call ratio
- taifex-options-chain — Full options chain by strike & expiry, both sessions, with the exchange's own Delta, since 2001
- taiwan-warrants-daily — Daily quotes, strike, expiry & moneyness for every listed/OTC warrant since 2004
- taiwan-government-bonds — Central government bond benchmark yields, the full yield curve & issuance master, with staleness stated
- taiwan-stock-alerts — Watch-list, disposition & short-sale suspension alerts
- taiwan-insider-share-transfers — Insider share-transfer filings (directors, officers, 10% holders) since 2002
- taiwan-director-shareholdings — Monthly director/officer shareholdings & share-pledge ratio since 1999
- taiwan-block-trades — Every block trade (鉅額交易) with price, size & basket constituents since 2005
- taiwan-shareholder-meetings — Shareholder meeting dates, book closure periods & e-voting since 2005
- taiwan-emerging-stock-quotes — Emerging (興櫃) board quotes, pre-IPO register & history since 2003
- taiwan-etf-regular-investment — Monthly regular savings plan (定期定額) rankings for stocks & ETFs since 2020
- taiwan-treasury-stock-buybacks — Every treasury-stock buyback (庫藏股) filing, plan vs execution, since 2000
Property market:
- taiwan-real-estate-transactions — Actual registered sale, presale & lease prices (實價登錄) for all 22 cities since 2012
Government & civic data:
- taiwan-legislator-monitor — Legislative Yuan bills, legislators & meetings
- taiwan-tender-monitor — Government e-procurement tenders (open calls, awards, failures)
Data source
Taiwan Stock Exchange 市場成交資訊 (FMTQIK), 發行量加權股價指數歷史資料 (MI_5MINS_HIST), 發行量加權股價報酬指數 (MFI94U) and 每日收盤行情-指數 (MI_INDEX type=IND), in both their Chinese and English editions; Taipei Exchange 櫃買指數(月查詢) (indexInfo/inx) and the 櫃買指數 / 富櫃50 / 公司治理 / 高股息 open-data feeds used for verification and for the OTC sub-indices. Public data, no login required.