Taiwan Odd-Lot Trading (TWSE + TPEx) — Both Sessions avatar

Taiwan Odd-Lot Trading (TWSE + TPEx) — Both Sessions

Pricing

from $0.50 / 1,000 results

Go to Apify Store
Taiwan Odd-Lot Trading (TWSE + TPEx) — Both Sessions

Taiwan Odd-Lot Trading (TWSE + TPEx) — Both Sessions

Both of Taiwan's odd-lot sessions on one row for every listed and OTC security: the intraday session carrying 98% of the flow and the after-hours auction, with shares, trade count, turnover, OHLC and closing quotes. Back to 2004, reconciled against the exchanges' own totals.

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

a day ago

Last modified

Share

Taiwan Odd-Lot Trading (上市櫃零股交易) API

Get structured JSON access to both of Taiwan's odd-lot trading sessions for every listed and OTC security — share volume, trade count, turnover, open/high/low/close and the closing bid and offer, for the intraday session and the after-hours auction, on the same row.

About 2,400 securities per session across both boards. The intraday session (盤中零股) reaches back to 2020-10-26, the day it opened; the after-hours auction (盤後零股) reaches back to 2004-12-24 on TWSE.

Why this data matters

  • The session most datasets silently miss. Taiwan has run two odd-lot sessions since October 2020 and publishes them as two unrelated reports. The older after-hours auction is the one that shows up in odd-lot feeds — and it is now a rounding error. On 2026-09-11 the TWSE intraday session traded NT$36,807,891,797 against the after-hours auction's NT$504,416,597: the intraday session was 98.65% of the board's odd-lot turnover, and 98.78% on the OTC board. A feed carrying only 盤後零股 is showing you 1.35% of the market and calling it odd-lot trading. This Actor fetches all four reports and puts both sessions on one row, with intraday_share_of_value_pct already computed.
  • Odd-lot is how Taiwanese retail actually buys. A board lot is 1,000 shares, which at 台積電's NT$2,420 is NT$2.42 million a trade. Retail buys the odd lots instead — 152,482 intraday odd-lot trades in 台積電 alone on 2026-09-11, against 2,830,341 shares. That makes odd-lot volume the cleanest available read on retail participation per stock, per day.
  • An odd-lot close that is not the board-lot close. The two sessions price independently, so intraday_last_price, after_hours_price and the regular close are three different numbers. All three are published here as published, along with the intraday first price, high, low and a intraday_vwap computed from turnover — and the VWAP is verified to land inside the session's own high-low range on every row.
  • Turnover checked against the prices it came from, not against a tolerance. The after-hours auction fills at a single price, so turnover would be shares × price except that the exchange floors every matched order to whole dollars before adding them up. That leaves a shortfall of under one dollar per order and never a cent over: 0 ≤ shares × price − turnover < trades. That is a bound derived from how the figure is computed, not a fudge factor — and it held on every priced row of ten sessions sampled from 2008 to 2026, 6,663 rows, zero exceptions. The intraday session gets the two-sided form of the same bound against its own high and low.
  • Reconciled against the exchanges' own totals, every run. TWSE closes each odd-lot report with a 合計 line; five independent sums are compared against it per report. The OTC board publishes a separate statistics report (零股交易成交統計) repeating both sessions' volume, trade count and turnover per security — 2,012 security-sessions compared figure by figure on a single day, zero disagreements. Both exchanges also republish the after-hours report through open-data hosts with different column names and different decimal places; that is a third witness, and it is compared too. A run that cannot reconcile them publishes nothing.
  • A holiday and an outage are told apart. The OTC board answers a public holiday, a date before its archive and next January alike with stat: ok and an empty table. Taking that at face value turns a total outage into a successful run reporting zero trading. This Actor reads the exchange's own trading calendar first, asks only for sessions that were actually held, and fails loudly if a session the calendar lists comes back empty.

Output

One record per security per trading day, both sessions on the row. A real record, as published:

{
"record_type": "STOCK",
"date": "2026-09-11",
"market": "TWSE",
"code": "2330",
"name": "台積電",
"sessions_covered": ["INTRADAY", "AFTER_HOURS"],
"intraday_shares": 2830341,
"intraday_transactions": 152482,
"intraday_value": 6838539090,
"intraday_first_price": 2425,
"intraday_last_price": 2420,
"intraday_high": 2425,
"intraday_low": 2405,
"intraday_vwap": 2416.1537744038615,
"intraday_price_change": null,
"intraday_reference_price": null,
"intraday_best_bid_price": 2420,
"intraday_best_bid_volume": 733,
"intraday_best_ask_price": 2425,
"intraday_best_ask_volume": 26078,
"after_hours_shares": 43016,
"after_hours_transactions": 1620,
"after_hours_value": 104313800,
"after_hours_price": 2425,
"after_hours_best_bid_price": 2420,
"after_hours_best_bid_volume": 200937,
"after_hours_best_ask_price": 2425,
"after_hours_best_ask_volume": 18385,
"total_shares": 2873357,
"total_transactions": 154102,
"total_value": 6942852890,
"intraday_share_of_value_pct": 98.4975,
"identity_ok": true
}

And one MARKET_SUMMARY row per board per session, summed from the rows above it and checked against the exchange's own published totals:

{
"record_type": "MARKET_SUMMARY",
"date": "2026-09-11",
"market": "TWSE",
"securities_listed": 1364,
"securities_traded_intraday": 1312,
"securities_traded_after_hours": 1050,
"intraday_shares": 111506452,
"intraday_transactions": 2076279,
"intraday_value": 36807891797,
"after_hours_shares": 2174052,
"after_hours_transactions": 29192,
"after_hours_value": 504416597,
"total_value": 37312308394,
"intraday_share_of_value_pct": 98.6481,
"official_totals_match": true
}

The two sessions

intraday_ fieldsafter_hours_ fields
Chinese name盤中零股盤後零股
How it matchescall auction every three minutes, alongside the regular boardone call auction after the close
Prices publishedfirst, last, high, lowone auction price
Opened2020-10-26long before the archive
Archive reaches2020-10-26 (both boards)2004-12-24 TWSE, 2011-01-03 TPEx
Share of odd-lot turnover (2026-09-11)98.65% TWSE, 98.78% TPEx1.35% / 1.22%

The two reports cover slightly different universes — TWSE listed 1,253 securities in its after-hours report and 1,234 in its intraday report on 2025-01-03 — so the join is an outer one. A security in only one report still gets a row, with the other session's columns null rather than zero.

Input

{
"startDate": "2026-09-01",
"endDate": "2026-09-11",
"markets": ["TWSE", "TPEX"],
"sessions": ["INTRADAY", "AFTER_HOURS"],
"stockCodes": ["2330", "6182"],
"includeMarketSummary": true,
"crossCheck": true,
"maxSessions": 60
}

Leave both dates empty for the most recent session. stockCodes takes exchange codes as strings — they are not always numeric: active ETFs use forms like 00400A, index ETFs 006201, preferred shares 1101A.

maxSessions defaults to 60 because a session is about 2,400 securities and a full year of both boards is over half a million rows. Set it to 0 to lift the cap.

Turn useApifyProxy on for a backfill longer than a few months: TWSE's firewall refuses by address and will cut a long run off partway through.

Things worth knowing about this data

  • The unit is shares, not lots. Everything on the board-lot reports is in 1,000-share lots; odd-lot reports are in single shares. intraday_shares: 2830341 is 2,830,341 shares, not lots.
  • The OTC board's two odd-lot reports disagree about which calendar to use. The after-hours report accepts a ROC year (115/09/11) or a Western one; the intraday report accepts only Western and answers 參數輸入錯誤 to a ROC year. Both are normalised here, and dates come out as ISO YYYY-MM-DD regardless of which of the three shapes the exchange used.
  • intraday_price_change is TPEx-only, and it is not measured from the previous odd-lot price. The OTC board prints a change column; TWSE does not. It is measured from the previous session's regular-board close — checked both ways, and 921 of 922 securities agreed with the regular close against 108 with the previous odd-lot close. intraday_reference_price backs that base out, which equals the previous regular close except on ex-dividend and ex-rights days, where it is the adjusted reference price.
  • TWSE's early after-hours rows carry volume only. Before 2005-12-19, 成交筆數 and 成交金額 are literally -- on every row. They come through as null, not zero, and the turnover check simply has nothing to check on those sessions.
  • identity_ok: false rows are published, not dropped. A handful of rows failing a derived bound is the exchange's own arithmetic and is flagged; a systematic failure means a report changed shape, and that fails the whole run rather than publishing anything.
  • Column layouts are read by name, never by position. All four reports have carried the same columns since their first session — twenty-one years for the TWSE after-hours report — so a column name that stops existing means the layout changed, and the run stops rather than reading the wrong column.

Data source

TWSE 盤中零股交易行情單 (TWTC7U) and 盤後零股交易行情單 (TWT53U); TPEx 盤中零股每日收盤行情 (oddQuote), 盤後零股每日收盤行情 (odd) and 零股交易成交統計 (oddSummary); TWSE 每日市場成交資訊 (FMTQIK) as the trading calendar; and the TWSE and TPEx open-data editions of the after-hours report for independent verification. Public official data, no login required.

Taiwan Market Data Suite

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