Taiwan Intraday 5-Second Stats — 每5秒委託成交與指數 API avatar

Taiwan Intraday 5-Second Stats — 每5秒委託成交與指數 API

Pricing

from $0.50 / 1,000 results

Go to Apify Store
Taiwan Intraday 5-Second Stats — 每5秒委託成交與指數 API

Taiwan Intraday 5-Second Stats — 每5秒委託成交與指數 API

Taiwan's stock market every five seconds since 2004-10-15: cumulative bid and ask orders, trade count, volume and turnover, joined on the same timestamp to the TAIEX and 37 more TWSE indices. 3,241 rows a session, reconciled against the exchange's own daily close and change.

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

3 hours ago

Last modified

Share

Taiwan Intraday 5-Second Stats (每5秒委託成交與指數) API

Taiwan's stock market sampled every five seconds, as structured JSON, back to 2004-10-15. Every row carries the whole exchange's cumulative order book — bid orders and size, ask orders and size — beside the matched trade count, volume and turnover, and on the same timestamp the TAIEX plus 37 more TWSE indices — every sector, plus the non-finance and non-electronics cuts of the market.

3,241 rows per session. This is the only free, official, machine-readable intraday time series Taiwan publishes, and it goes back twenty-two years.

Why this data matters

  • Order-book pressure, second by second. The exchange publishes accumulated buy and sell order size for the entire market, not just what traded. Differencing it gives the arrival rate of buying and selling interest in any window you like, and order_volume_imbalance gives the standing tilt as a single number between −1 and +1. There is no other free source for this in Taiwan.
  • Sector rotation at five-second resolution. Semiconductor, finance, shipping, green energy and thirty-three more indices sit on the identical timestamp as the order flow. Whether money left electronics for financials at 09:47 is a question you can actually answer with one row.
  • Cumulative and incremental. The exchange publishes running totals; running totals are awkward. Every row also carries the change since the previous row, so a bar series at any resolution is a filter, not an arithmetic exercise. They sum back to the session total exactly, including when the grid is thinned.
  • Twenty-two years, and the interval changed four times. The same two URLs have served 60-second rows since 2004-10-15, 15-second since 2011-01-17, 10-second since 2014-02-24 and 5-second since 2014-12-29 — and the only place that says which is the report's own Chinese title. Every row here states its resolution_seconds, and every session's row count is checked against the interval before anything is written.
  • The two reports are proved to be on one clock before they are joined. Order flow and indices are separate reports. They have shared an identical timestamp grid on every session tested back to 2004, including both sides of each interval change, which is what makes a single row meaningful. The Actor asserts it per session and fails rather than joining two grids that have drifted apart.
  • Every session reconciles against a separately compiled report. The closing index, the change in points, and one-sided bounds on volume, turnover and trade count are all checked against TWSE's daily market-turnover report, which is not derived from this one.

Output

One record per timestamp. A real row, mid-session:

{
"record_type": "INTRADAY_TICK",
"date": "2026-09-18",
"time": "09:30:00",
"timestamp": "2026-09-18T09:30:00+08:00",
"seconds_from_open": 1800,
"resolution_seconds": 5,
"delta_seconds": 5,
"cum_bid_orders": 5336712,
"cum_bid_volume_lots": 36027380,
"cum_ask_orders": 5907600,
"cum_ask_volume_lots": 23771539,
"cum_trades": 825256,
"cum_trade_volume_lots": 3172075,
"cum_trade_value_ntd_million": 251112,
"bid_orders_delta": 10380,
"bid_volume_delta_lots": 197020,
"ask_orders_delta": 12040,
"ask_volume_delta_lots": 186923,
"trades_delta": 949,
"trade_volume_delta_lots": 4084,
"trade_value_delta_ntd_million": 282,
"order_volume_imbalance": 0.204951,
"order_count_imbalance": -0.050771,
"taiex": 46722.63,
"taiex_change": 434.63,
"taiex_change_pct": 0.939,
"indices": {
"semiconductor": 1579.49,
"finance_and_insurance": 3609.88,
"shipping_and_transportation": 215.16,
"...": "34 more"
}
}

Thirty minutes into 2026-09-18, the market had taken 36.0 million lots of buy orders against 23.8 million of sell — an imbalance of +0.20 — and matched 3.17 million lots for NT$251 billion. In the five seconds to 09:30:00 alone: 949 trades, 4,084 lots, NT$282 million.

And one SESSION_SUMMARY per day, which is where the reconciliation is written down:

{
"record_type": "SESSION_SUMMARY",
"date": "2026-09-18",
"resolution_seconds": 5,
"published_rows": 3241,
"expected_rows": 3241,
"first_time": "09:00:00",
"last_time": "13:30:00",
"previous_close_taiex": 46288.0,
"closing_taiex": 47180.75,
"taiex_change": 892.75,
"official_close_index": 47180.75,
"official_change_points": 892.75,
"official_total_shares": 12052158761.0,
"official_total_value_ntd": 1142321910407.0,
"official_total_trades": 4680943.0,
"close_cum_trade_volume_lots": 11751121,
"close_cum_trade_value_ntd_million": 1075065,
"close_cum_trades": 2869805,
"round_lot_volume_coverage_pct": 97.5022,
"round_lot_value_coverage_pct": 94.1123,
"round_lot_trade_count_coverage_pct": 61.3083,
"identity_ok": true
}

What one row means

ColumnUnitNote
cum_bid_orders / cum_ask_ordersordersAccumulated from the 08:30 pre-open
cum_bid_volume_lots / cum_ask_volume_lotslots (1,000 shares)Can fall — cancelled and reduced orders are netted out
cum_tradestradesRound lots, continuous session
cum_trade_volume_lotslots (1,000 shares)Never falls
cum_trade_value_ntd_millionNT$ millionThe unit the exchange's own English edition states
taiex, indices.*index pointsTwo decimals, as published

Units are not printed in the Chinese edition. They were taken from the English one — its last column is literally headed Acc. Trade Value (NT$M) — and then confirmed against the exchange's daily turnover report on sessions spanning 2004 to 2026: official shares ÷ this report's volume lands just above 1,000 every time, official dollars ÷ its value just above 1,000,000. The "just above" is the part the next section is about.

The three things that will catch you out

1. The 09:00:00 row is not an opening print. It is the previous session's close for every index, and the pre-open order book for every order column — the opening auction has not matched yet, which is why cum_trades is often 0 on that row. It was verified on sessions from 2004, 2019, 2020 and 2026 that the 09:00:00 index equals the prior day's official close exactly. So taiex_change is measured from it, and the deltas on that row are null rather than treating half an hour of order collection as one five-second bucket.

2. This report covers round lots in the continuous session only — and its share of the market has collapsed. The closing call auction at 13:30 and all odd-lot trading sit outside it. That was a rounding error once and is not any more:

SessionRound-lot share of the day's trade count
2004-10-1597.1%
2019-06-1797.4%
2020-11-0294.5%
2026-09-1861.3%

Intraday odd-lot trading opened in October 2020 and has grown ever since. By value the gap is much smaller — 94.1% on 2026-09-18 — because odd-lot trades are tiny. Every SESSION_SUMMARY carries all three coverage percentages against the exchange's own daily totals, so this is measured per session rather than assumed. It is also why the check here is a one-sided bound (the intraday total can never exceed the day's) rather than an equality: an equality would be a lie about what the report is.

3. The bid and ask volume columns go down. Not a parsing fault and not a data error: the exchange nets cancelled and reduced orders out of the accumulated quantity, while the order counts keep climbing. A monotonicity check on those two columns fails on essentially every real session. This Actor asserts monotonicity on the five columns where it holds and leaves those two alone, and their deltas are signed.

What you can ask for

InputEffect
startDate / endDateEmpty for the latest session. Archive floor 2004-10-15
includeOrderStatsThe 每5秒委託成交統計 report — order book and trades
includeIndicesThe 每5秒指數統計 report — TAIEX on the same clock
includeSectorIndicesThe other 37 indices as an indices object. Off ≈ a quarter the row size
timeFrom / timeToKeep only a window of the session. The open, or the last ten minutes
sampleEverySecondsThin to one row a minute (60), five minutes (300), anything
maxSessionsDefault 5, because one session is 3,241 rows

Cost is two requests per session, plus one per month of range for the exchange's trading calendar — which is also the report every session is reconciled against, so it is never optional.

Thinning and windowing are not the same operation and they compose in the order that keeps the arithmetic honest: the grid is thinned first across the whole session, deltas are taken along the thinned series, and only then is the time window applied. So the first row inside a window is a full interval, not a partial one, and a thinned series still sums back to the session total.

Archive floors and interval changes, as measured

Every boundary below was found by binary search against the live endpoints, one day at a time, not read off a documentation page.

RangeThe report's own titleresolution_secondsRows
2004-10-15 → 2011-01-14每一分鐘60271
2011-01-17 → 2014-02-21每15秒151,081
2014-02-24 → 2014-12-27每10秒101,621
2014-12-29 → today每5秒53,241

Both reports change interval on exactly the same day, every time — checked day by day on all three boundaries — which is why the join holds across the whole archive without special-casing.

The row count is not decoration. The session runs 09:00:00 to 13:30:00 inclusive, so it must be 270 × 60 ÷ resolution + 1, and all four eras match. A response that parses cleanly but arrived short is the failure mode this Actor exists to catch, so a session that does not produce exactly that many evenly spaced rows from 09:00:00 to 13:30:00 is refused, not published.

Ask for 2004-10-14 or earlier and both reports answer HTTP 200 with 查詢日期小於93年10月15日,請重新查詢!. That is a different thing from a public holiday, which answers 很抱歉,沒有符合條件的資料!, and conflating them is how a backfill quietly returns nothing. The Actor distinguishes them.

The index report has changed shape six times

25 columns in October 2004, 26 by November 2005, 24 in November 2006 — it got smaller — then 35 in 2008, a different 35 in 2009, and 39 today. Along the way the exchange renamed its columns twice:

  • the whole set dropped from 加權股價 / 水泥類 style to 發行量加權股價指數 / 水泥類指數 in late 2006;
  • 百貨貿易類指數 became 貿易百貨類指數 (2009) and 觀光類指數 became 觀光餐旅類指數 (2024).

Positional parsing is therefore not an option, and neither is keying on the Chinese name if you want a series that survives a rename. Each column is matched by name to a stable keytourism, trading_and_consumer_goods, taiex — that both sides of every rename share, plus the exchange's own English name for that era. A column this Actor has never seen is published under its own Chinese name and reported in the log, rather than being dropped. Every SESSION_SUMMARY lists the day's columns with both names.

Two 2004-era columns, 綜合平均 and 工業平均, are average share prices rather than index levels. The exchange stopped publishing them in 2006. They are carried through because deleting a published column would be editing the archive, and flagged is_price_index: false so they are not mistaken for indices.

Verification

Every run reports what it reconciled. These are not optional switches — a failure fails the run and nothing is written.

  • reports_share_one_clock — the order-book report and the index report must have identical timestamps and an identical interval for the session. The entire premise of one joined row rests on this.
  • cumulative_columns_never_fall — the five columns that must be monotonic, are. (The two order-volume columns are deliberately excluded; see above.)
  • last_row_is_the_official_close — the 13:30:00 TAIEX must equal the close in the exchange's separately compiled daily turnover report.
  • session_move_matches_official_change — 13:30:00 minus 09:00:00 must equal the change in points that report publishes. This is the check that catches a day's file being served under the wrong date.
  • session_opens_where_the_last_one_closed — across consecutive sessions in the range, every index must open exactly where it closed the session before, not just the TAIEX. On a modern session that is 38 comparisons a day, needing no extra request and no second source.
  • session_total_within_official_day — intraday volume, turnover and trade count, scaled to the exchange's units, must each be no greater than the whole day's official total.

Tolerance on the index comparisons is 0.01 — one unit in the last decimal place the exchange itself publishes — because that is the only disagreement its own rounding can produce. It is not a number chosen to make a run pass; on every session tested the identities hold exactly.

Limitations, stated plainly

  • This is market-wide, not per stock. One row is the whole exchange. There is no per-security intraday feed in the free data; for per-stock daily figures see taiwan-stock-daily-quotes.
  • TWSE only. The OTC board publishes no equivalent series, so there is no TPEx half of this and this README will not pretend otherwise.
  • Round lots, continuous session. Excludes the closing auction and all odd-lot trading. See the coverage table above; for odd lots see taiwan-odd-lot-trading.
  • No bid/ask prices or depth. The exchange publishes accumulated order quantities market-wide, not a price ladder. This is not a limit-order book snapshot.
  • It is a big dataset. 3,241 rows a session is by design, and maxSessions defaults to 5 for that reason. Use sampleEverySeconds and timeFrom/timeTo for a long backfill.
  • The exchange's firewall refuses by address. A sustained fast caller gets a redirect whose body is the "FOR SECURITY REASONS" page, and once tripped it refuses every uncached report for that address for minutes — sometimes arriving instead as an HTTP 200 whose body is HTML. The Actor paces under the threshold, slows the whole run at the first refusal, treats a non-JSON 200 as throttling rather than as an empty day, and can route through Apify Proxy (useApifyProxy) to take a different exit address when a long backfill is refused.

Taiwan Market Data Suite

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