Taiwan Stock Daily Quotes — 台股行情 OHLCV API avatar

Taiwan Stock Daily Quotes — 台股行情 OHLCV API

Pricing

from $0.50 / 1,000 results

Go to Apify Store
Taiwan Stock Daily Quotes — 台股行情 OHLCV API

Taiwan Stock Daily Quotes — 台股行情 OHLCV API

Daily OHLCV for every security on the Taiwan Stock Exchange and Taipei Exchange, with P/E, price-to-book and dividend yield joined on. TWSE reaches back to 2004-02-11, TPEX to 2007-07-02. Ex-rights sessions are flagged, not silently mispriced.

Pricing

from $0.50 / 1,000 results

Rating

0.0

(0)

Developer

chris

chris

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 hours ago

Last modified

Share

Taiwan Stock Daily Quotes (台股每日行情) API

Get structured JSON access to daily OHLCV for every security in Taiwan — around 1,380 on the TWSE and 1,010 on the TPEX in a single session, each with open, high, low, close, change, volume, turnover and trade count, plus P/E, price-to-book and dividend yield joined on from the exchanges' own valuation reports. TWSE sessions go back to 2004-02-11, TPEX to 2007-07-02.

This is the price series everything else keys off. Whatever you are doing with Taiwan market data — margin balances, institutional flow, shareholding dispersion, revenue surprises — it has to be aligned to a price, and the price has to be right on the two days a year where it is easy to get wrong: the ex-dividend days. Each exchange marks those differently, one of them does not mark them at all, and none of it is documented. This Actor resolves all three conventions into one field you can trust.

Why this data matters

  • Ex-rights sessions are flagged, not silently mispriced. On 2026-06-11 TSMC closed at 2,250.00 against a previous close of 2,255.00 — but the exchange printed the change as X0.00, because the stock went ex-dividend that morning. The X means not comparable to the previous close; the 0.00 beside it carries no information at all. Read that column as a number and you have recorded TSMC as unchanged on a day it moved. Here it comes back as change: null, change_basis: "PRICE_NOT_COMPARABLE".
  • TPEX's per-security report has no marker at all, and prints a change measured against the ex-rights reference price. 中美晶 5483 on 2026-07-23: previous close 234.00, close 212.50, printed change −19.00. Neither number is wrong; they are measured from different bases. The Actor detects the gap, sets change_basis: "EX_RIGHTS_REFERENCE", and gives you the reference price it was measured from. Verified against the official dividend: 5483's two 2026 ex-rights sessions imply deductions of 1.00 and 2.50, summing to exactly the 3.50 per share TPEX publishes for that dividend year.
  • Every row carries its own identity checks. ohlc_consistent proves low ≤ open, close ≤ high. average_price_in_range puts turnover ÷ volume inside the day's band. change is checked against the previous session's close wherever the run has seen it — across 465 TWSE sessions in 2026 for 2330, 1101 and 2317, that identity held to the cent, every time, and the days it did not apply were exactly the four ex-rights days the official 除權息計算結果 report lists.
  • average_price is a VWAP neither exchange publishes. Turnover ÷ volume, per security per session, straight from two printed numbers.
  • Valuation is joined on by header, never by position. TWSE's P/E report changed shape in the mid-2010s and swapped the P/E and dividend yield columns while doing it. The 2010 layout is 日期 / 本益比 / 殖利率 / 股價淨值比; today's is 日期 / 殖利率 / 股利年度 / 本益比 / 股價淨值比 / 財報年季. Parse by position and every historical P/E you pull is actually a yield. Every table here is read by column name.
  • Two official reports per session, and the Actor reads both. Each exchange publishes the same session twice — once per security for a whole month, once per day for the whole board. crossCheck reads the second copy and compares it column by column. On TWSE the two agree to the last digit. On TPEX they do not, and the Actor says so rather than picking one silently (see below).
  • Nobody serves this in English. The sources are four Chinese report endpoints per exchange, in Republic-of-China dates, with three different volume units between them and a host that resets the connection if you ask too quickly.

Output

One record per security per trading session. TSMC on an ordinary day:

{
"date": "2026-08-14",
"market": "TWSE",
"code": "2330",
"name": "台積電",
"open": 2435.0,
"high": 2440.0,
"low": 2395.0,
"close": 2395.0,
"change": -40.0,
"change_pct": -1.6427,
"previous_reference_price": 2435.0,
"previous_close": 2435.0,
"change_basis": "PREVIOUS_CLOSE",
"ex_rights_marker": null,
"volume_shares": 21162682,
"turnover_value": 51159731253,
"transactions": 105889,
"average_price": 2417.450267,
"last_bid_price": null,
"last_ask_price": null,
"issued_shares": null,
"next_limit_up": null,
"next_limit_down": null,
"source_report": "TWSE STOCK_DAY",
"ohlc_consistent": true,
"average_price_in_range": true,
"pe_ratio": 27.76,
"pb_ratio": 9.66,
"dividend_yield_pct": 0.92,
"dividend_per_share": null,
"dividend_year_roc": 114,
"fiscal_period": "115/2",
"dividend_yield_matches_dividend": null
}

last_bid_price, last_ask_price, issued_shares and the two limit prices are null above because this row came from the per-security report, which does not carry them. Run without stockCodes and the whole-board report fills them in.

And an ex-rights session on the OTC board, where the exchange gives you no marker:

{
"date": "2026-07-23",
"market": "TPEX",
"code": "5483",
"name": "中美晶",
"close": 212.5,
"change": -19.0,
"previous_reference_price": 231.5,
"previous_close": 234.0,
"change_basis": "EX_RIGHTS_REFERENCE",
"ex_rights_marker": "IMPLIED",
"source_report": "TPEX tradingStock"
}

Input

FieldWhat it does
stockCodesTicker codes such as 2330, 0050, 5483. Empty means the whole board.
startDate / endDateYYYY-MM-DD. Empty means the latest session.
marketsTWSE, TPEX, or both.
includeValuationJoin P/E, price-to-book and dividend yield. Doubles the request count.
onlyTradedDrop securities that did not trade.
crossCheckRead one session from the second official report and compare.
fetchStrategyAUTO (recommended), BY_STOCK or BY_DATE.

Naming stock codes is what makes long histories cheap. The per-security reports return a whole month per request, so ten years of TSMC is 120 requests; the whole-board reports return one session per request, so ten years of everything is 3,650. AUTO picks the right one for you: per-security when you name codes, whole-board when you do not.

Archive floors, each rejected up front rather than returning an empty run:

TWSETPEX
Whole board (BY_DATE)2004-02-112007-07-02
Per security (BY_STOCK)2010-01-042003-04-01

Per-run ceilings: 90 calendar days for a whole-board run (a session is ~2,400 records across both markets), 600 report requests for a per-security run.

Things this dataset is honest about

TPEX's two reports disagree on volume. Same exchange, same session, same security, two official endpoints:

5483 中美晶, 2026-08-14VolumeTurnover
個股日成交資訊 (per security)25,996,000 sharesNT$4,884,791,000
每日收盤行情 (whole board)25,504,000 sharesNT$4,792,524,000

Open, high, low and close are identical between the two; only volume and turnover differ, with the per-security figure larger by 0–6%. The gap scales with the share price, which points at intraday odd-lot trading being folded into one report and not the other — but TPEX documents neither report's coverage, and the difference is not explained by the after-hours fixed-price feed (tpex_off_market), the after-hours odd-lot feed (tpex_odd_stock) or the block-trade feed, all of which were checked and are orders of magnitude too small. So the Actor does not pick a winner: source_report on every row says which report it came from, and with crossCheck on, the run log states the gap in shares. TWSE's two reports have no such problem — they agree to the last digit.

Turnover ÷ volume sometimes lands outside the day's range. That is block trading, not a parsing error. Both exchanges fold block trades into the daily totals, and a block prices against the previous close rather than the day's band. 元大金 2885 on 2026-08-25 traded 16,043,105 shares for NT$1,009,573,854, an average of 62.928832 against a 62.00–62.80 range. Take out the single 1,400,000-share pair trade at 68.60 that the official block-trade report lists for that session and the average falls to 62.386622 — back inside the band. average_price_in_range flags these so you can find them, not because they are wrong.

TPEX's published yield did not always follow from the dividend it publishes beside it. Both numbers are given as-is and dividend_yield_matches_dividend says whether they reconcile. One session a year: 24/361 rows reconcile in 2011 and 40/381 in 2013, against 380/469 in 2015, 436/514 in 2020 and 596/603 in 2026. Treat pre-2015 TPEX yields with care.

P/E is absent more often than it is present, and that is correct. The exchanges print a dash for a loss-making company and a zero for every ETF; both become null here rather than a misleading 0.0. On 2026-08-14 the TWSE quote report carried 1,378 securities, the valuation report covered 1,083 of them, and 869 of those had a P/E.

A security sits on exactly one board. Asking for 2330 with both markets selected costs one wasted request against TPEX, which answers "no data". Narrow markets if you know where your codes live.

Taiwan Market Data Suite

This Actor is part of a suite of 25 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:

Property market:

Government & civic data:

Data source

Taiwan Stock Exchange 個股日成交資訊 (STOCK_DAY), 每日收盤行情 (MI_INDEX), 個股日本益比、殖利率及股價淨值比 (BWIBBU, BWIBBU_d); Taipei Exchange 個股日成交資訊 (tradingStock), 上櫃股票每日收盤行情 (otc), 本益比、殖利率及股價淨值比 (peQryStock, peQryDate), and the 上櫃股票每日收盤行情 open-data mirror used for independent verification. Public data, no login required.