31 endpoint · Dữ liệu thị trường · Cơ bản · Dòng tiền tổ chức · Khác
https://api.blave.orgapi-key + secret-key trong mọi requestAPI plan or Blave Agent planstock_id — mã TWSE (上市) / TPEx (上櫃), ví dụ 2330, 0050, 00878, 006208. Gồm chữ cái và chữ số (cho phép dấu chấm), ≤ 8 ký tự, nếu không sẽ trả về 400 {"error": "Invalid stock_id"}.start / end — YYYY-MM-DD, bao gồm cả ngày đó. Trừ khi endpoint ghi khác, hai tham số này không được kiểm tra định dạng (việc lọc là phép so sánh chuỗi), nên hãy luôn gửi YYYY-MM-DD.503 {"error": "Upstream rate limit. Please retry shortly."} — thử lại sau.batch/<data_type> (≤ 50 mã mỗi lần gọi); không bao giờ lặp một endpoint đơn mã trên cả rổ cổ phiếu./studio/market/twstock/list Không có.
data = requests.get(f"{BASE_URL}/studio/market/twstock/list" , headers=headers, timeout=60).json()["data"]# [{"stock_id": "00400A", "name": "主動國泰動能高息", "close": 14.72, "market": "TWSE",# "industry_code": None, "listing_date": None}, ...] # 2,392 rows in this response{"data": [...]}, ~2,400 dòng (上市 + 上櫃, gồm cả ETF; không gồm 興櫃).
| Trường | Kiểu | Mô tả |
|---|---|---|
stock_id | string | Mã |
name | string | Tên |
close | float | null | Giá đóng cửa ngày mới nhất (null khi upstream không có, ví dụ bị tạm ngừng giao dịch) |
market | string | TWSE (上市) hoặc TPEx (上櫃) |
industry_code | string | null | Mã 產業別 dạng số gốc của TWSE/TPEx, trả nguyên trạng (không giải mã). null với ETF / chứng khoán không phải cổ phiếu doanh nghiệp. Các mã thường gặp: 15 航運業, 17 金融保險業, 22 生技醫療業, 24 半導體業, 25 電腦及週邊設備業, 26 光電業, 27 通信網路業, 28 電子零組件業, 29 電子通路業, 30 資訊服務業, 31 其他電子業 |
listing_date | string | null | YYYY-MM-DD; null với ETF / chứng khoán không phải cổ phiếu doanh nghiệp |
Chỉ có các lỗi dùng chung (500 nếu cả hai thị trường đều lỗi).
[:N] sẽ dồn vào một vài ngành./studio/market/twstock/info/<stock_id> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã | Xem quy ước chung của danh mục |
info = requests.get(f"{BASE_URL}/studio/market/twstock/info/2330" , headers=headers, timeout=30).json()["data"]# {"stock_id": "2330", "name": "台積電", "close": 2410.0, "industry_code": "24", "listing_date": "1994-09-05"}{"stock_id": "<stock_id>", "data": {...}}; data có cùng các trường với một dòng của /list.
| Mã trạng thái | Nội dung phản hồi | Trường hợp |
|---|---|---|
| 400 | {"error": "Invalid stock_id"} | Không qua kiểm tra định dạng |
| 404 | {"error": "Stock not found"} | Không phải chứng khoán đang niêm yết |
/list./studio/market/twstock/price/<stock_id> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã cổ phiếu / ETF niêm yết (上市) hoặc OTC (上櫃) | Chữ cái/chữ số (cho phép dấu chấm), ≤ 8 ký tự — ví dụ 2330, 0050, 00878, 006208 | |
startstring · query | Ngày đầu tiên, bao gồm cả ngày đó | YYYY-MM-DD | toàn bộ lịch sử |
endstring · query | Ngày cuối cùng, bao gồm cả ngày đó | YYYY-MM-DD | ngày mới nhất hiện có |
response = requests.get(f"{BASE_URL}/studio/market/twstock/price/2330" , headers=headers, timeout=60)data = response.json()["data"] # no start/end → full history, 8,069 rows# [{"date": "1994-10-01", "stock_id": "2330", "open": 171.0, "high": 172.0,# "low": 171.0, "close": 172.0, "spread": 1.0,# "volume": 1660506, "turnover_value": 284858008, "turnover_count": 684},# {"date": "1994-10-03", "stock_id": "2330", "open": 172.0, "high": 173.0,# "low": 171.0, "close": 172.0, "spread": 0.0,# "volume": 1560000, "turnover_value": 268084000, "turnover_count": 711}, ...]{"stock_id": "<stock_id>", "data": [ ... ]}, các dòng sắp xếp tăng dần theo date.
| Trường | Kiểu | Đơn vị | Mô tả |
|---|---|---|---|
date | string | YYYY-MM-DD | Ngày giao dịch |
stock_id | string | — | Mã cổ phiếu |
open / high / low / close | float | TWD | Giá chưa điều chỉnh |
spread | float | TWD | Thay đổi so với giá đóng cửa phiên trước |
volume | int | cổ phiếu (股) | Khối lượng giao dịch |
turnover_value | int | TWD | Giá trị giao dịch |
turnover_count | int | lệnh khớp (筆) | Số lệnh khớp |
| Mã trạng thái | Nội dung phản hồi | Trường hợp |
|---|---|---|
| 400 | {"error": "Invalid stock_id"} | stock_id không qua kiểm tra định dạng |
| 404 | {"error": "No data found for stock_id: <stock_id>"} | Mã không xác định / upstream không có dữ liệu |
| 503 | {"error": "Upstream rate limit. Please retry shortly."} | Quota upstream đã hết — thử lại sau |
start / end không được kiểm tra định dạng: giá trị sai định dạng sẽ được lọc bằng phép so sánh chuỗi thay vì trả về 400, nên hãy luôn gửi YYYY-MM-DD.price_adj để backtest tổng lợi nhuận; endpoint này trả giá chưa điều chỉnh.batch/price (≤ 50 mã mỗi lần gọi) thay vì lặp endpoint này./studio/market/twstock/price_adj/<stock_id> Giống /price/<stock_id>.
params = {"start": "2020-01-01", "end": "2024-12-31"}data = requests.get(f"{BASE_URL}/studio/market/twstock/price_adj/2330" , headers=headers, params=params, timeout=60).json()["data"]Cùng cấu trúc và các trường với /price/<stock_id>; open / high / low / close là giá đã điều chỉnh, volume / turnover_* giống hệt chuỗi gốc.
Giống /price/<stock_id>.
/price gốc có dữ liệu mới./studio/market/twstock/quote/<stock_id> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã | Xem quy ước chung của danh mục |
data = requests.get(f"{BASE_URL}/studio/market/twstock/quote/2330" , headers=headers, timeout=30).json()["data"]# {"open": 2415.0, "high": 2465.0, "low": 2415.0, "close": 2445.0,# "change_price": -20.0, "change_rate": -0.81, "average_price": 2432.58,# "volume": 4245, "total_volume": 26403, "amount": 10379025000, "total_amount": 64227410000,# "yesterday_volume": 27390, "buy_price": 2445.0, "buy_volume": 17,# "sell_price": 2450.0, "sell_volume": 11, "volume_ratio": 0.96,# "quote_time": "2026-07-03 14:30:00", "stock_id": "2330", "tick_type": 2}{"stock_id": "<stock_id>", "data": {...}}; data là một object phẳng.
| Trường | Kiểu | Mô tả |
|---|---|---|
open / high / low / close | float | OHLC của hôm nay tính đến hiện tại |
change_price / change_rate | float | Thay đổi so với giá đóng cửa phiên trước (TWD / %) |
average_price | float | Giá khớp bình quân |
volume | int | Khối lượng của tick mới nhất |
total_volume | int | Khối lượng lũy kế hôm nay |
amount / total_amount | float | Giá trị giao dịch của tick mới nhất / lũy kế |
yesterday_volume | int | Khối lượng của phiên trước |
buy_price / buy_volume | float / int | Giá mua tốt nhất |
sell_price / sell_volume | float / int | Giá bán tốt nhất |
volume_ratio | float | Tỷ lệ khối lượng |
quote_time | string | YYYY-MM-DD HH:MM:SS — dấu thời gian đầy đủ, khác với date chỉ có ngày ở các endpoint khác |
stock_id | string | Mã |
tick_type | int | 0 không xác định, 1 bên bán chủ động (賣盤成交), 2 bên mua chủ động (買盤成交) |
| Mã trạng thái | Nội dung phản hồi | Trường hợp |
|---|---|---|
| 400 | {"error": "Invalid stock_id"} | Không qua kiểm tra định dạng |
| 404 | {"error": "No data found for stock_id: <stock_id>"} | Không có báo giá |
| 503 | {"error": "Upstream rate limit. Please retry shortly."} | Quota upstream đã hết |
/studio/market/twstock/quote | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idsstring · queryBắt buộc | Mã | Phân tách bằng dấu phẩy, ≤ 50 mã |
data = requests.get(f"{BASE_URL}/studio/market/twstock/quote" , headers=headers, params={"stock_ids": "2330,2317"}, timeout=30).json()["data"]# {"2330": {...}, "2317": {...}}{"data": {"<stock_id>": {...quote fields...}, ...}}; các trường giống /quote/<stock_id>. Mã không có báo giá sẽ không xuất hiện.
| Mã trạng thái | Nội dung phản hồi | Trường hợp |
|---|---|---|
| 400 | {"error": "stock_ids parameter required"} | Thiếu |
| 400 | {"error": "stock_ids exceeds max 50 per request"} | Quá nhiều |
| 400 | {"error": "Invalid stock_id in list"} | Có mã không qua kiểm tra định dạng |
| 503 | {"error": "Upstream rate limit. Please retry shortly."} | Quota upstream đã hết |
/studio/market/twstock/quote/all Không có.
rows = requests.get(f"{BASE_URL}/studio/market/twstock/quote/all" , headers=headers, timeout=30).json()["data"]{"data": [{...quote fields...}, ...]} (~2,800 dòng); các trường giống /quote/<stock_id>.
| Mã trạng thái | Nội dung phản hồi | Trường hợp |
|---|---|---|
| 503 | {"error": "Upstream rate limit. Please retry shortly."} | Quota upstream đã hết |
/studio/market/twstock/minute/ohlcv/<stock_id>/<schema> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã | Một mã TWSE/TPEx đang niêm yết, hoặc TAIEX (加權指數) | |
schemastring · pathBắt buộc | Khung thời gian nến | 1m, 5m, 15m, 30m, 60m, 1d | |
startstring · query | Ngày bắt đầu | YYYY-MM-DD | end − khoảng tối đa của khung thời gian đó |
endstring · query | Ngày kết thúc, bao gồm cả ngày đó | YYYY-MM-DD | hôm nay (UTC) |
adjuststring · query | 1 = OHLC điều chỉnh tiến (後復權), cùng hệ số với /price_adj; volume không bao giờ được điều chỉnh | 0, 1, true, false | 0 |
Khoảng tối đa mỗi request (end − start): 1m 31 ngày · 5m 62 ngày · 15m 93 ngày · 30m 186 ngày · 60m 365 ngày · 1d 3650 ngày.
body = requests.get(f"{BASE_URL}/studio/market/twstock/minute/ohlcv/2330/1m" , headers=headers, params={"start": "2026-08-06", "end": "2026-08-06"}, timeout=60).json()# {"stock_id": "2330", "schema": "1m", "data": [# {"close": 2385.0, "high": 2395.0, "low": 2385.0, "open": 2395.0, "ts": "2026-08-06 01:00:00+00:00", "volume": 2540}, ...]}{"stock_id", "schema", "data": [...]}.
| Trường | Kiểu | Đơn vị | Mô tả |
|---|---|---|---|
ts | string | UTC ISO | Thời điểm mở nến (nhãn tính theo đầu phút); nến 13:30 giờ Đài Bắc là phiên khớp lệnh định kỳ đóng cửa |
open / high / low / close | float | TWD | Giá |
volume | int | lô (張), không phải cổ phiếu | Khối lượng. Nến TAIEX luôn mang volume: 0 ở mọi khung thời gian — chỉ số không có khối lượng nên không cung cấp; đừng đọc nó như một con số giá trị giao dịch |
| Mã trạng thái | Nội dung phản hồi | Trường hợp |
|---|---|---|
| 400 | {"error": "Invalid stock_id (must be a listed TWSE/TPEx security)"} | Không niêm yết |
| 400 | {"error": "Invalid schema. Allowed: [...]"} | Khung thời gian không hợp lệ |
| 400 | {"error": "Invalid adjust (use 0 or 1)"} | adjust không hợp lệ |
| 400 | {"error": "Invalid date format. Use YYYY-MM-DD"} | Ngày sai định dạng |
| 400 | {"error": "date_range_too_large", "message": "...", "max_days": <n>} | Khoảng thời gian vượt giới hạn |
| 503 | {"error": "market data temporarily unavailable"} | Lỗi đọc kho dữ liệu |
| 503 | {"error": "adjust factors temporarily unavailable"} | adjust=1 nhưng không lấy được hệ số — không bao giờ âm thầm trả dữ liệu chưa điều chỉnh |
minute/ohlcv/symbols trước khi yêu cầu nhiều năm lịch sử.200 kèm []./quote/<stock_id> để lấy giá thời gian thực./studio/market/twstock/minute/ohlcv/symbols Không có.
covered = requests.get(f"{BASE_URL}/studio/market/twstock/minute/ohlcv/symbols" , headers=headers, timeout=30).json()["data"]{"data": ["2330", "TAIEX", ...]} — các mã đã có dữ liệu nến phút trên đĩa (cổ phiếu đang niêm yết cùng với TAIEX), đã sắp xếp.
Chỉ có các lỗi dùng chung.
/studio/market/twstock/kbar/<stock_id> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã | Một mã TWSE/TPEx đang niêm yết, hoặc TAIEX | |
startstring · query | Ngày bắt đầu | YYYY-MM-DD | hôm nay − 6 ngày |
endstring · query | Ngày cuối cùng; end − start ≤ 31 ngày | YYYY-MM-DD | hôm nay |
data = requests.get(f"{BASE_URL}/studio/market/twstock/kbar/2330" , headers=headers, params={"start": "2026-08-03", "end": "2026-08-07"}, timeout=60).json()["data"]{"stock_id", "data": [...]}, sắp xếp tăng dần.
| Trường | Kiểu | Mô tả |
|---|---|---|
date | string | YYYY-MM-DD (giờ Đài Bắc) |
minute | string | HH:MM:SS giờ Đài Bắc, thời điểm bắt đầu nến (09:00–13:30) |
stock_id | string | Mã |
open / high / low / close | float | TWD |
volume | int | Lô (張) |
| Mã trạng thái | Nội dung phản hồi | Trường hợp |
|---|---|---|
| 400 | {"error": "Invalid stock_id (must be a listed TWSE/TPEx security)"} | Không niêm yết |
| 400 | {"error": "Date range exceeds 31 days"} | Khoảng thời gian quá dài, hoặc ngày sai định dạng |
minute/ohlcv/<stock_id>/1m. Cổ phiếu niêm yết chưa có dữ liệu phút sẽ trả về [] (endpoint này không kích hoạt việc nạp dữ liệu).minute/ohlcv/symbols mới có dữ liệu./studio/market/twstock/market_value/<stock_id> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã | Xem quy ước chung của danh mục | |
startstring · query | Ngày đầu tiên | YYYY-MM-DD | toàn bộ lịch sử |
endstring · query | Ngày cuối cùng | YYYY-MM-DD | mới nhất |
data = requests.get(f"{BASE_URL}/studio/market/twstock/market_value/2330" , headers=headers, params={"start": "2026-01-01"}, timeout=60).json()["data"]{"stock_id", "data": [{"date", "stock_id", "market_value"}]}; market_value tính bằng TWD.
400 stock_id không hợp lệ, 404 không có dữ liệu, 503 hết quota upstream.
/studio/market/twstock/market_value/all | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
topint · query | Chỉ giữ N mã đứng đầu theo vốn hóa thị trường | 1–3000 | tất cả (~2,400) |
body = requests.get(f"{BASE_URL}/studio/market/twstock/market_value/all" , headers=headers, params={"top": 10}, timeout=60).json()# {"date": "2026-09-17", "twse_ex_etf_market_value": 150952470507848,# "data": [{"is_etf": false, "market": "TWSE", "market_value": 62885997412475,# "name": "台積電", "rank": 1, "stock_id": "2330"},# ...,# {"is_etf": true, "market": "TWSE", "market_value": 2383312875000,# "name": "元大台灣50", "rank": 6, "stock_id": "0050"}, ...]}# Index weight of a 上市 non-ETF stock (works with any `top`, the denominator is whole-market)row = body["data"][0] # 2330 — market "TWSE", is_etf falseshare = row["market_value"] / body["twse_ex_etf_market_value"]# ETFs rank alongside stocks (0050 is rank 6) — filter them with `is_etf`. Never by code prefix,# and never by re-fetching a classification: `is_etf` already IS that classification.rows = requests.get(f"{BASE_URL}/studio/market/twstock/market_value/all" , headers=headers, params={"top": 100}, timeout=60).json()["data"]top50 = [r["stock_id"] for r in rows if not r["is_etf"]][:50] # ETF-free market-cap top 50tpex_only = [r["stock_id"] for r in rows if r["market"] == "TPEx"] # board filter is exact{"date": "YYYY-MM-DD", "twse_ex_etf_market_value": int, "data": [...]}, sắp xếp giảm dần theo vốn hóa thị trường.
| Trường | Kiểu | Mô tả |
|---|---|---|
date | string | Ngày dữ liệu thực tế được dùng (ngày công bố mới nhất; có thể chậm hơn hôm nay một ngày) |
twse_ex_etf_market_value | int | TWD. Tổng các dòng có market == "TWSE" và không phải ETF, trong cùng ngày dữ liệu. Đây là mẫu số toàn thị trường — không bị thu hẹp theo top |
data[].rank | int | Thứ hạng, tính từ 1 |
data[].stock_id | string | Mã |
data[].name | string | Tên |
data[].market | string | "TWSE" (上市) hoặc "TPEx" (上櫃), lấy từ danh sách niêm yết của TWSE / TPEx |
data[].market_value | int | TWD |
data[].is_etf | bool | true với các ETF trong bảng xếp hạng (359 trên 2,370 dòng vào ngày 2026-09-17). false nghĩa là "không nằm trong tập ETF", không phải "đã xác nhận không phải ETF": chứng khoán không có phân loại ngành — ví dụ REIT 01010T — là false, và vẫn nằm trong twse_ex_etf_market_value |
| Mã trạng thái | Nội dung phản hồi | Trường hợp |
|---|---|---|
| 400 | {"error": "top must be an integer between 1 and 3000"} | top không hợp lệ |
| 404 | {"error": "No recent market value data available"} (hoặc thông báo danh sách niêm yết chưa đầy đủ) | Không có dữ liệu gần đây |
| 503 | {"error": "Upstream rate limit. Please retry shortly."} | Quota upstream đã hết |
/market_value/<stock_id>.rank và twse_ex_etf_market_value thuộc hai tập hợp khác nhau. rank tính trên toàn thị trường — 上市 + 上櫃, gồm cả ETF — và không thay đổi khi mẫu số được thêm vào. Mẫu số chỉ gồm 上市 và loại trừ ETF (industry_category thuộc {ETF, 上櫃ETF, 上櫃指數股票型基金(ETF)}); REIT và cổ phiếu ưu đãi không bị loại khỏi mẫu số. Vì vậy market_value / twse_ex_etf_market_value chỉ là tỷ trọng trong chỉ số với dòng có market là "TWSE" và không phải ETF — dòng TPEx hoặc ETF chia cho mẫu số này không phải là tỷ trọng — còn rank vẫn là thứ hạng toàn thị trường. Đừng đọc hai giá trị này như cùng một bảng xếp hạng.market là nhãn sàn niêm yết, không phải cờ ETF — is_etf mới là cờ ETF. Hãy dùng nó để có rổ cổ phiếu không chứa ETF. Đừng suy ra ETF từ tiền tố của stock_id (00 là thông lệ thị trường chứ không phải cam kết, và nó bỏ sót REIT 01xxxT), cũng đừng lấy lại phân loại từ nơi khác. is_etf chính là tiêu chí dùng để tính twse_ex_etf_market_value, nên bộ lọc theo is_etf và mẫu số không bao giờ lệch nhau./studio/market/twstock/per/<stock_id> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã | Xem quy ước chung của danh mục | |
startstring · query | Ngày đầu tiên | YYYY-MM-DD | toàn bộ lịch sử |
endstring · query | Ngày cuối cùng | YYYY-MM-DD | mới nhất |
data = requests.get(f"{BASE_URL}/studio/market/twstock/per/2330" , headers=headers, params={"start": "2026-01-01", "end": "2026-07-22"}, timeout=60).json()["data"]# [{"date": "2026-07-21", "stock_id": "2330", "dividend_yield": 0.95, "PER": 34.87, "PBR": 11.05}, ...]{"stock_id", "data": [...]}.
| Trường | Kiểu | Mô tả |
|---|---|---|
date | string | Ngày giao dịch |
stock_id | string | Mã |
dividend_yield | float | Tỷ suất cổ tức (%) |
PER | float | Giá trên thu nhập (P/E) |
PBR | float | Giá trên giá trị sổ sách (P/B) |
400 stock_id không hợp lệ, 404 không có dữ liệu, 503 hết quota upstream.
batch/per./studio/market/twstock/financials/<stock_id> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã | Xem quy ước chung của danh mục | |
startstring · query | Ngày đầu tiên | YYYY-MM-DD | 2013-01-01 |
endstring · query | Ngày cuối cùng | YYYY-MM-DD | hôm nay |
import pandas as pddata = requests.get(f"{BASE_URL}/studio/market/twstock/financials/2330" , headers=headers, params={"start": "2022-01-01", "end": "2024-12-31"}, timeout=30).json()["data"]# [{"date": "2022-03-31", "stock_id": "2330", "type": "Revenue", "value": 491075000000.0, "origin_name": "營業收入"}, ...]wide = pd.DataFrame(data).pivot_table(index="date", columns="type", values="value", aggfunc="first"){"stock_id", "data": [...]}, định dạng dài (mỗi khoản mục mỗi quý một dòng).
| Trường | Kiểu | Mô tả |
|---|---|---|
date | string | Ngày cuối quý (03-31 / 06-30 / 09-30 / 12-31) |
stock_id | string | Mã |
type | string | Mã khoản mục, ví dụ Revenue, GrossProfit, OperatingIncome, NetIncome, EPS, TAX, OtherComprehensiveIncome |
value | float | Giá trị (TWD; EPS tính bằng TWD trên mỗi cổ phiếu) |
origin_name | string | Nhãn tiếng Trung — dùng để nhận biết các mã type chưa quen |
400 stock_id không hợp lệ, 404 không có dữ liệu, 503 hết quota upstream.
start mặc định là 2013-01-01; gửi start sớm hơn thì nhận được các dòng sớm hơn (2330 lùi về đến 2000-06-30)./studio/market/twstock/balance_sheet/<stock_id> Giống /financials/<stock_id>.
data = requests.get(f"{BASE_URL}/studio/market/twstock/balance_sheet/2330" , headers=headers, params={"start": "2022-01-01"}, timeout=30).json()["data"]Cùng định dạng dài với /financials/<stock_id>. Các mã type chính: CashAndCashEquivalents, TotalAssets, TotalLiabilities, TotalEquity. Các mã kết thúc bằng _per là % trên tổng tài sản.
400 stock_id không hợp lệ, 404 không có dữ liệu, 503 hết quota upstream.
start mặc định là 2013-01-01; gửi start sớm hơn thì nhận được các dòng sớm hơn (2330 lùi về đến 2012-12-31)./studio/market/twstock/cashflow/<stock_id> Giống /financials/<stock_id>.
import pandas as pddata = requests.get(f"{BASE_URL}/studio/market/twstock/cashflow/2330" , headers=headers, params={"start": "2022-01-01"}, timeout=30).json()["data"]cfo = (pd.DataFrame(data).query("type == 'CashFlowsFromOperatingActivities'") .assign(date=lambda d: pd.to_datetime(d["date"])).set_index("date")["value"].sort_index())cfo_q = cfo - cfo.groupby(cfo.index.year).shift(1).fillna(0) # YTD → single quarterCùng định dạng dài với /financials/<stock_id>. Các mã type chính (là mã riêng của bộ dữ liệu upstream; tập đầy đủ thay đổi theo công ty và theo năm, nên hãy coi phản hồi là danh sách chuẩn và dùng origin_name cho những mã không có bên dưới). Hãy lọc theo type, không lọc theo origin_name — nhãn của cùng một mã chuyển qua lại giữa ngoặc toàn chiều rộng và nửa chiều rộng qua các năm:
type | origin_name |
|---|---|
CashFlowsFromOperatingActivities | 營業活動之淨現金流入(流出) |
CashProvidedByInvestingActivities | 投資活動之淨現金流入(流出) |
CashFlowsProvidedFromFinancingActivities | 籌資活動之淨現金流入(流出) |
PropertyAndPlantAndEquipment | 取得不動產、廠房及設備 (capex, giá trị âm) |
Depreciation / AmortizationExpense | 折舊費用 / 攤銷費用 |
CashBalancesIncrease | 本期現金及約當現金增加(減少)數 |
CashBalancesBeginningOfPeriod / CashBalancesEndOfPeriod | 期初(年初)/ 期末現金及約當現金餘額 |
Các khoản mục dòng tiền là lũy kế từ đầu năm (YTD), theo cách công bố tại Đài Loan: dòng 03-31 chỉ là Q1, 06-30 là Q1–Q2, 09-30 là Q1–Q3, 12-31 là cả năm. Để có số liệu một quý, hãy trừ đi quý trước đó trong cùng năm (Q1 không cần trừ) — vì vậy hãy lấy dữ liệu với start từ tháng Một. CashBalancesEndOfPeriod là số dư cuối quý; CashBalancesBeginningOfPeriod là số dư đầu năm. Endpoint này không có tham số period — luôn trả về YTD (chế độ xem từng quý ?period=quarter chỉ có ở route biểu đồ trên web, không có ở đây).
400 stock_id không hợp lệ, 404 không có dữ liệu, 503 hết quota upstream.
start mặc định là 2013-01-01; gửi start sớm hơn thì nhận được các dòng sớm hơn (2330 lùi về đến 2012-03-31)./studio/market/twstock/monthly_revenue/<stock_id> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã | Xem quy ước chung của danh mục | |
startstring · query | Ngày đầu tiên | YYYY-MM-DD | 2000-01-01 |
endstring · query | Ngày cuối cùng | YYYY-MM-DD | hôm nay |
import pandas as pddata = requests.get(f"{BASE_URL}/studio/market/twstock/monthly_revenue/2330" , headers=headers, params={"start": "2024-01-01", "end": "2024-12-31"}, timeout=30).json()["data"]df = pd.DataFrame(data).sort_values(["revenue_year", "revenue_month"])df["yoy_pct"] = df["revenue"].pct_change(periods=12) * 100# [{"date": "2024-01-01", "stock_id": "2330", "country": "Taiwan", "create_time": "",# "revenue": 176299866000, "revenue_year": 2023, "revenue_month": 12},# {"date": "2024-02-01", "stock_id": "2330", "country": "Taiwan", "create_time": "",# "revenue": 215785127000, "revenue_year": 2024, "revenue_month": 1}, ...]{"stock_id", "data": [...]}, mỗi tháng một dòng.
| Trường | Kiểu | Mô tả |
|---|---|---|
date | string | Ngày đầu tiên của tháng sau tháng doanh thu — 2024-01-01 mang revenue_year: 2023, revenue_month: 12. Không bao giờ dùng nó làm kỳ doanh thu |
stock_id | string | Mã |
country | string | Thị trường — giá trị quan sát được là Taiwan |
create_time | string | Quan sát thấy rỗng ("") ở mọi dòng |
revenue | int | Doanh thu tháng tính bằng TWD (元), không phải nghìn — suy ra từ độ lớn, upstream không ghi rõ: 2330 với revenue_year 2024, revenue_month 1 trả về 215785127000, con số này chỉ hợp lý khi đọc theo 元 (215.8 tỷ NT$) |
revenue_month | int | Tháng doanh thu (1–12) — dùng trường này, không dùng date, để xác định kỳ |
revenue_year | int | Năm doanh thu |
400 stock_id không hợp lệ, 404 không có dữ liệu, 503 hết quota upstream.
/studio/market/twstock/ratios/<stock_id> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã | Xem quy ước chung của danh mục | |
startstring · query | Ngày cuối quý đầu tiên | YYYY-MM-DD | 2013-01-01 |
endstring · query | Ngày cuối quý cuối cùng | YYYY-MM-DD | hôm nay |
import pandas as pddata = requests.get(f"{BASE_URL}/studio/market/twstock/ratios/2330" , headers=headers, params={"start": "2024-01-01"}, timeout=30).json()["data"]# [..., {"date": "2026-06-30", "stock_id": "2330",# "gross_margin_q": 67.7207, "gross_margin_ttm": 64.2302, "operating_margin_q": 60.3443, "operating_margin_ttm": 56.1009,# "net_margin_q": 55.6354, "net_margin_ttm": 50.3717, "roe_q": 11.3934, "roe_ttm": 40.3342, "roa_q": 7.8372, "roa_ttm": 27.3074,# "eps_q": 27.25, "eps_ttm": 86.28, "eps_yoy_q": 77.4089, "eps_yoy_ttm": 53.2232,# "revenue_yoy_q": 36.0453, "revenue_yoy_ttm": 30.5567, "revenue_qoq_q": 12.0163, "revenue_qoq_ttm": 8.2017,# "debt_ratio": 30.9438, "current_ratio": 245.7635, "quick_ratio": 225.0114, "equity_multiplier": 1.4481,# "interest_coverage_q": 280.5515, "interest_coverage_ttm": 227.0232,# "inventory_turnover_q": 1.1767, "inventory_turnover_ttm": 4.6058, "cfo_to_net_income_q": 1.1084, "cfo_to_net_income_ttm": 1.1779,# "fcf_q": 287363030000.0, "fcf_ttm": 1143556366000.0, "fcf_per_share_q": 11.0827, "fcf_per_share_ttm": 44.1036, ...}]df = pd.DataFrame(data).assign(date=lambda d: pd.to_datetime(d["date"])).set_index("date"){"stock_id", "data": [...]}, định dạng rộng: mỗi quý một dòng, cũ nhất trước, mỗi chỉ số một cột. Mỗi chỉ số là một float làm tròn đến 4 chữ số thập phân, hoặc null.
| Trường | Kiểu | Mô tả |
|---|---|---|
date | string | Ngày cuối quý (03-31 / 06-30 / 09-30 / 12-31) — không phải ngày báo cáo được công bố |
stock_id | string | Mã |
<ratio>_q | float | null | Riêng quý đó |
<ratio>_ttm | float | null | Bốn quý gần nhất (cộng bốn quý đơn lẻ); null nếu thiếu bất kỳ quý nào trong bốn quý |
debt_ratio, current_ratio, quick_ratio, equity_multiplier | float | null | Chỉ số bảng cân đối kế toán cuối kỳ — không có hậu tố |
<ratio> (mỗi chỉ số có cả _q và _ttm):
| Nhóm | Chỉ số | Đơn vị |
|---|---|---|
| Khả năng sinh lời | gross_margin, operating_margin, pretax_margin, net_margin, opex_ratio, roe, roa | % (đã ×100) |
| Trên mỗi cổ phiếu | eps, revenue_per_share, fcf_per_share | TWD trên mỗi cổ phiếu |
| Tăng trưởng | revenue_yoy, revenue_qoq, operating_income_yoy, net_income_yoy, eps_yoy | % (đã ×100) |
| Cơ cấu | interest_coverage | lần |
| Hiệu quả hoạt động | receivable_turnover, inventory_turnover, asset_turnover, cfo_to_net_income | lần |
| Dòng tiền | fcf | TWD, số tiền gốc (không phải nghìn) |
Các cột không có hậu tố: debt_ratio, current_ratio, quick_ratio là % (đã ×100 — hệ số thanh toán hiện hành 2.46× trả về là 245.7635); equity_multiplier tính bằng lần.
| Mã trạng thái | Nội dung phản hồi | Trường hợp |
|---|---|---|
| 400 | {"error": "Invalid stock_id"} | Mã không qua kiểm tra định dạng |
| 404 | {"error": "No data found for stock_id: <id>"} | Mã này không có báo cáo tài chính (các ETF như 0050 / 00878), hoặc không có dòng nào trong khoảng start–end |
| 503 | {"error": "Data temporarily unavailable. Please retry shortly."} | Kho chỉ số chưa sẵn sàng — thử lại sau, không bao giờ đọc thành "không có dữ liệu" |
null (không có biên lợi nhuận gộp, hệ số thanh toán hiện hành, v.v.).date là lookahead bias.null, không bao giờ là 0.per/<stock_id>) và các chỉ số doanh thu tháng (tự tính YoY / MoM từ monthly_revenue/<stock_id>).GET /studio/market/twstock/batch/ratios?stock_ids=... (≤ 50 mã mỗi lần gọi).start sớm hơn cũng không trả về dữ liệu cũ hơn./studio/market/twstock/dividend/<stock_id> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã | Mã đang niêm yết (4–6 chữ số, có thể kèm một chữ cái ở cuối) | |
startstring · query | Ngày hiệu lực đầu tiên | bắt buộc đúng YYYY-MM-DD | toàn bộ lịch sử |
endstring · query | Ngày hiệu lực cuối cùng | bắt buộc đúng YYYY-MM-DD | toàn bộ lịch sử |
Việc lọc theo khoảng dùng ngày hiệu lực ba bậc: cash_ex_date nếu có, nếu không thì stock_ex_date, nếu không nữa thì record_date — các sự kiện vừa công bố, chưa có ngày trừ cổ tức, vẫn xuất hiện.
data = requests.get(f"{BASE_URL}/studio/market/twstock/dividend/2330" , headers=headers, params={"start": "2025-01-01", "end": "2025-12-31"}, timeout=30).json()["data"]# [{"record_date": "2025-03-24", "period": "113年第3季", "announce_date": "2025-03-03",# "cash_ex_date": "2025-03-18", "stock_ex_date": "", "pay_date": "2025-04-10",# "cash": 4.50002042, "stock": 0.0, "stock_ratio": 0.0}, ...]{"stock_id", "data": [...]}, mỗi dòng công bố một dòng.
| Trường | Kiểu | Mô tả |
|---|---|---|
record_date | string | 權利分派基準日 YYYY-MM-DD |
period | string | 股利所屬期間 — một nhãn không có cấu trúc (114年第3季, 113, 不適用, …); hãy so sánh dạng chuỗi, đừng phân tích thành năm |
announce_date | string | 公告日; "" khi không rõ |
cash_ex_date | string | 除息交易日; "" khi không có / chưa quyết định |
stock_ex_date | string | 除權交易日; "" khi không có |
pay_date | string | 現金股利發放日; "" khi không rõ |
cash | float | Cổ tức tiền mặt trên mỗi cổ phiếu (TWD, 盈餘 + 公積) |
stock | float | Cổ tức cổ phiếu trên mỗi cổ phiếu (元面額, 盈餘 + 公積) |
stock_ratio | float | stock / 10 — tỷ lệ điều chỉnh kiểu chia tách |
| Mã trạng thái | Nội dung phản hồi | Trường hợp |
|---|---|---|
| 400 | {"error": "Invalid stock_id"} | Không qua kiểm tra định dạng |
| 400 | {"error": "Invalid start date, expected YYYY-MM-DD"} (hoặc end) | Ngày sai định dạng |
| 404 | {"error": "No data found for stock_id: <id>"} / {"error": "No dividend records for stock_id: <id>"} | Không niêm yết, hoặc hoàn toàn không có lịch sử cổ tức |
| 503 | {"error": "Upstream rate limit. Please retry shortly."} | Quota upstream đã hết |
cash == 0 và stock == 0) vẫn được giữ — đó là quyết định không chia cổ tức đã được công bố.2330 kéo dài đến một ngày sau thời điểm request một tuần. Hãy tự lọc theo ngày nếu bạn chỉ cần các sự kiện đã qua.200 + [] (khác với 404).404./studio/market/twstock/news/<stock_id> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã | Xem quy ước chung của danh mục | |
startstring · query | Ngày bắt đầu | YYYY-MM-DD | hôm nay − 6 ngày |
endstring · query | Ngày cuối cùng; end − start ≤ 31 ngày | YYYY-MM-DD | hôm nay |
data = requests.get(f"{BASE_URL}/studio/market/twstock/news/2330" , headers=headers, params={"start": "2026-08-01", "end": "2026-08-07"}, timeout=60).json()["data"]{"stock_id", "data": [...]}, mỗi ngày vài bài (gồm cả cuối tuần).
| Trường | Kiểu | Mô tả |
|---|---|---|
date | string | Thời điểm đăng |
stock_id | string | Mã |
title | string | Tiêu đề |
source | string | Nguồn đăng |
link | string | URL |
| Mã trạng thái | Nội dung phản hồi | Trường hợp |
|---|---|---|
| 400 | {"error": "Date range exceeds 31 days"} hoặc một thông báo lỗi phân tích ngày | Khoảng thời gian quá dài / ngày sai định dạng |
| 503 | {"error": "Upstream rate limit. Please retry shortly."} | Quota upstream đã hết |
[]./studio/market/twstock/institutional/<stock_id> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã | Xem quy ước chung của danh mục | |
startstring · query | Ngày đầu tiên | YYYY-MM-DD | toàn bộ lịch sử |
endstring · query | Ngày cuối cùng | YYYY-MM-DD | mới nhất |
data = requests.get(f"{BASE_URL}/studio/market/twstock/institutional/2330" , headers=headers, params={"start": "2024-01-01", "end": "2024-12-31"}, timeout=60).json()["data"]# [{"date": "2024-01-02", "stock_id": "2330", "foreign_buy": 28464159, "foreign_sell": 47404324,# "trust_buy": 5553520, "trust_sell": 269712, "dealer_self_buy": 452000, "dealer_self_sell": 366190,# "dealer_hedge_buy": 942546, "dealer_hedge_sell": 780090,# "foreign_dealer_self_buy": 0, "foreign_dealer_self_sell": 0}, ...]{"stock_id", "data": [...]}, định dạng rộng, mỗi ngày một dòng. Mọi giá trị tính bằng cổ phiếu (股).
| Trường | Mô tả |
|---|---|
date, stock_id | Ngày, mã |
foreign_buy / foreign_sell | 外資 (không gồm tự doanh nước ngoài) |
trust_buy / trust_sell | 投信 |
dealer_self_buy / dealer_self_sell | 自營商自行買賣 |
dealer_hedge_buy / dealer_hedge_sell | 自營商避險 |
foreign_dealer_self_buy / foreign_dealer_self_sell | 外資自營商 (phần lớn là 0) |
400 stock_id không hợp lệ, 404 không có dữ liệu, 503 hết quota upstream.
*_buy − *_sell.GET /studio/market/twmarket/institutional) gộp nhóm theo cách khác — xem mục đó./studio/market/twstock/margin/<stock_id> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã | Xem quy ước chung của danh mục | |
startstring · query | Ngày đầu tiên | YYYY-MM-DD | toàn bộ lịch sử |
endstring · query | Ngày cuối cùng | YYYY-MM-DD | mới nhất |
import pandas as pddata = requests.get(f"{BASE_URL}/studio/market/twstock/margin/2330" , headers=headers, params={"start": "2024-01-01"}, timeout=60).json()["data"]df = pd.DataFrame(data)df["margin_util"] = df["margin_balance"] / df["margin_limit"] # 融資使用率{"stock_id", "data": [...]}, mỗi ngày một dòng. Giá trị tính bằng lô (張), không phải cổ phiếu — đã đối chiếu với TWSE MI_MARGN: với ngày 2026-09-15, 2330 trả về margin_balance: 29282 và margin_limit: 6483092, khớp chính xác với 今日餘額 29,282 và 次一營業日限額 6,483,092 do chính TWSE công bố cho ngày đó. Mỗi dòng mang date và stock_id riêng; khi đọc toàn bộ lịch sử (không có start / end), hãy lấy mọi con số từ cùng một dòng — margin_limit được công bố lại mỗi ngày và thay đổi theo thời gian.
| Trường | Mô tả |
|---|---|
margin_buy / margin_sell | 融資買進 / 賣出 |
margin_cash_repay | 融資現金償還 |
margin_balance / margin_prev_balance | 融資今日 / 前日餘額 |
margin_limit | 融資限額 — 次一營業日限額 của TWSE được công bố vào ngày của dòng đó, tức là hạn mức áp dụng cho ngày làm việc KẾ TIẾP (2330 ngày 2026-09-15: 6,483,092 lô) |
short_buy / short_sell | 融券買進 / 賣出 |
short_cash_repay | 融券現金償還 |
short_balance / short_prev_balance | 融券今日 / 前日餘額 |
short_limit | 融券限額 |
offset_loan_short | 資券相抵 |
400 stock_id không hợp lệ, 404 không có dữ liệu, 503 hết quota upstream.
/studio/market/twstock/gov_bank/<stock_id> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã | Xem quy ước chung của danh mục | |
startstring · query | Ngày bắt đầu | YYYY-MM-DD | hôm nay − 6 ngày |
endstring · query | Ngày cuối cùng; end − start ≤ 31 ngày | YYYY-MM-DD | hôm nay |
data = requests.get(f"{BASE_URL}/studio/market/twstock/gov_bank/2330" , headers=headers, params={"start": "2026-08-01", "end": "2026-08-07"}, timeout=60).json()["data"]{"stock_id", "data": [...]}, tối đa 8 dòng mỗi ngày (mỗi ngân hàng một dòng), sắp xếp theo ngày, ngân hàng.
| Trường | Mô tả |
|---|---|
date, stock_id | Ngày, mã |
bank_name | Ngân hàng |
buy / sell | Số cổ phiếu mua / bán |
buy_amount / sell_amount | Giá trị mua / bán (TWD) |
| Mã trạng thái | Nội dung phản hồi | Trường hợp |
|---|---|---|
| 400 | {"error": "Date range exceeds 31 days"} hoặc một thông báo lỗi phân tích ngày | Khoảng thời gian quá dài / ngày sai định dạng |
| 503 | {"error": "Upstream rate limit. Please retry shortly."} | Quota upstream đã hết |
/studio/market/twstock/lending/<stock_id> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã | Xem quy ước chung của danh mục | |
startstring · query | Ngày đầu tiên | YYYY-MM-DD | toàn bộ lịch sử |
endstring · query | Ngày cuối cùng | YYYY-MM-DD | mới nhất |
data = requests.get(f"{BASE_URL}/studio/market/twstock/lending/2330" , headers=headers, params={"start": "2026-08-01"}, timeout=60).json()["data"]{"stock_id", "data": [...]}, mỗi ngày vài dòng.
| Trường | Mô tả |
|---|---|
date, stock_id | Ngày, mã |
transaction_type | 競價 / 議借 |
volume | Khối lượng |
fee_rate | Lãi suất phí cho vay |
close | Giá đóng cửa |
original_return_date | Ngày hoàn trả ban đầu |
original_lending_period | Thời hạn cho vay ban đầu |
400 stock_id không hợp lệ, 404 không có dữ liệu, 503 hết quota upstream.
/studio/market/twstock/broker/search | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
namestring · queryBắt buộc | Tên chi nhánh cần tìm | Chuỗi con bất kỳ, không phân biệt hoa thường |
rows = requests.get(f"{BASE_URL}/studio/market/twstock/broker/search" , headers=headers, params={"name": "松山"}, timeout=30).json()["data"]# [{"broker_id": "9217", "broker_name": "凱基-松山"}, ...]{"query": "<name>", "data": [{"broker_id", "broker_name"}]}.
| Mã trạng thái | Nội dung phản hồi | Trường hợp |
|---|---|---|
| 400 | {"error": "name parameter required"} | Thiếu |
| 503 | {"error": "Upstream rate limit. Please retry shortly."} | Quota upstream đã hết |
/studio/market/twstock/broker/stock/<stock_id> Gửi date cho một ngày, hoặc start (+ end) cho một khoảng; start được ưu tiên nếu gửi cả hai.
| Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
stock_idstring · pathBắt buộc | Mã | Xem quy ước chung của danh mục | |
datestring · query | Một ngày | YYYY-MM-DD | hôm nay |
startstring · query | Đầu khoảng | YYYY-MM-DD | |
endstring · query | Cuối khoảng; khoảng ≤ 366 ngày, tính cả hai đầu | YYYY-MM-DD | start |
rows = requests.get(f"{BASE_URL}/studio/market/twstock/broker/stock/2330" , headers=headers, params={"start": "2026-08-03", "end": "2026-08-07"}, timeout=60).json()["data"]{"stock_id", "data": [...]}, mỗi chi nhánh mỗi ngày một dòng.
| Trường | Kiểu | Mô tả |
|---|---|---|
date | string | Ngày giao dịch |
stock_id | string | Mã |
broker_id | string | Mã chi nhánh (có thể gồm cả chữ và số, ví dụ 920A) |
broker_name | string | Tên chi nhánh |
price | float | Giá khớp bình quân gia quyền theo khối lượng |
buy / sell | int | Số cổ phiếu mua / bán |
| Mã trạng thái | Nội dung phản hồi | Trường hợp |
|---|---|---|
| 400 | {"error": "Invalid stock_id"} | Không qua kiểm tra định dạng |
| 400 | {"error": "Invalid date (YYYY-MM-DD)"} | Ngày sai định dạng |
| 400 | {"error": "start/end range is <n> days; max 366 (inclusive) — split into smaller ranges"} | Khoảng thời gian quá dài |
| 503 | {"error": "Upstream rate limit. Please retry shortly."} | Dữ liệu tạm thời không khả dụng — thử lại; đừng đọc thành "không có giao dịch" |
200 + [].start / end trên 2026-09-06 → 2026-09-13 trả về các dòng trải trên năm ngày giao dịch khác nhau, với cả broker/stock/<stock_id> lẫn broker/trader/<trader_id>./studio/market/twstock/broker/trader/<trader_id> Cùng quy tắc date / start / end với /broker/stock/<stock_id>.
| Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
trader_idstring · pathBắt buộc | Mã chi nhánh lấy từ /broker/search | Chữ cái, chữ số, - (ví dụ 9217, 920A) | |
datestring · query | Một ngày | YYYY-MM-DD | hôm nay |
startstring · query | Đầu khoảng | YYYY-MM-DD | |
endstring · query | Cuối khoảng; khoảng ≤ 366 ngày, tính cả hai đầu | YYYY-MM-DD | start |
rows = requests.get(f"{BASE_URL}/studio/market/twstock/broker/trader/9217" , headers=headers, params={"date": "2026-08-07"}, timeout=60).json()["data"]{"trader_id", "data": [...]}, mỗi cổ phiếu mỗi ngày một dòng; các trường date, broker_id, broker_name, stock_id, price, buy, sell (giống /broker/stock).
Giống /broker/stock/<stock_id>, kèm 400 {"error": "Invalid trader_id"} khi mã không hợp lệ.
/studio/market/twstock/alerts Truyền date, hoặc start / end, hoặc không truyền gì (= hôm nay, giờ Đài Bắc).
| Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
datestring · query | Một ngày: các quyết định xử lý đang có hiệu lực trong ngày đó, các cảnh báo được công bố trong ngày đó | bắt buộc đúng YYYY-MM-DD; không dùng cùng start / end | |
startstring · query | Ngày đầu tiên của khoảng | bắt buộc đúng YYYY-MM-DD | 2001-01-01 khi có stock_id, ngược lại là end − 365 ngày |
endstring · query | Ngày cuối cùng của khoảng (bao gồm cả ngày đó) | bắt buộc đúng YYYY-MM-DD | hôm nay (hoặc start nếu muộn hơn) |
kindstring · query | Loại công bố | disposal (處置), notice (注意) | cả hai |
marketstring · query | Sàn giao dịch | twse, tpex | cả hai |
stock_idstring · query | Một mã; gỡ bỏ giới hạn 366 ngày | Xem quy ước chung của danh mục | tất cả |
Ý nghĩa của khoảng: một quyết định xử lý được trả về khi thời hạn của nó (start–end) giao với khoảng truy vấn, một cảnh báo được trả về khi date công bố nằm trong khoảng. Không có stock_id thì khoảng tối đa là 366 ngày, tính cả hai đầu — hãy chia nhỏ các khoảng toàn thị trường dài hơn (mỗi lần gọi một năm dương lịch là vừa). Khác với mặc định của danh mục, start / end / date được kiểm tra nghiêm ngặt.
# disposals in force on one daydata = requests.get(f"{BASE_URL}/studio/market/twstock/alerts" , headers=headers, params={"date": "2026-10-13", "kind": "disposal"}, timeout=30).json()["data"]# [..., {"date": "2026-10-12", "stock_id": "5228", "stock_name": "鈺鎧", "market": "tpex",# "kind": "disposal", "count": 2, "start": "2026-10-13", "end": "2026-10-19",# "condition": "連續3個營業日", "measure": "第一次處置", "match_minutes": 2,# "reason": "* 公布日期:115/10/12\n* 證券代號:5228\n…", "close": 59.6, "pe": 29.22},# {"date": "2026-10-12", "stock_id": "2492", "stock_name": "華新科", "market": "twse",# "kind": "disposal", "count": 8, "start": "2026-10-13", "end": "2026-10-19",# "condition": "連續三次", "measure": "第一次處置", "match_minutes": 2,# "reason": "1處置原因:該有價證券之交易,連續三個營業日達本公司「公布注意交易資訊」標準。\n2處置期間:…", "close": None, "pe": None}, ...] # 36 rows# notices announced on one daynotes = requests.get(f"{BASE_URL}/studio/market/twstock/alerts" , headers=headers, params={"date": "2026-10-12", "kind": "notice"}, timeout=30).json()["data"]# [..., {"date": "2026-10-12", "stock_id": "5228", "stock_name": "鈺鎧", "market": "tpex",# "kind": "notice", "count": 15, "start": None, "end": None, "condition": "第一款、第三款、第四款",# "measure": None, "match_minutes": None,# "reason": "最近六個營業日(含當日)累積之最後成交價漲幅達32.63%(第一款)\n…", "close": 59.6, "pe": 29.22}, ...]# one stock's disposal history (no range cap with stock_id)hist = requests.get(f"{BASE_URL}/studio/market/twstock/alerts" , headers=headers, params={"stock_id": "2492", "kind": "disposal", "start": "2001-01-01"}, timeout=30).json()["data"]# 10 rows: 2001-11-23~2001-11-29 收足五成款券 (match_minutes None), 2018-05-08~2018-05-21 第一次處置 (5), …,# 2026-10-13~2026-10-19 第一次處置 (2){"start", "end", "data": [...]}; start / end trả lại khoảng thực tế được dùng (cả hai bằng date khi gửi date). Các dòng sắp xếp theo date, market, kind, stock_id. Mỗi công bố một dòng.
| Trường | Kiểu | Mô tả |
|---|---|---|
date | string | Ngày công bố YYYY-MM-DD (quyết định xử lý có hiệu lực từ ngày giao dịch kế tiếp) |
stock_id | string | Mã — gồm cả chứng quyền, ETF và trái phiếu chuyển đổi (ví dụ 037060, 45402) |
stock_name | string | null | Tên như trong công bố |
market | string | twse (上市) hoặc tpex (上櫃) |
kind | string | disposal hoặc notice |
count | int | Số lần lũy kế của sàn (累計 / 累計次數) |
start, end | string | null | Thời hạn xử lý, tính cả hai ngày đầu cuối; null với cảnh báo |
condition | string | null | Xử lý: điều kiện kích hoạt như trong công bố (連續三次, 連續3個營業日, 最近十個營業日已有六次 …). Cảnh báo: các điều khoản được viện dẫn (第一款、第五款); null nếu không có |
measure | string | null | Loại xử lý: 第一次處置, 第二次處置, 再次處置, 人工管制撮合, 收足五成款券 …; null với cảnh báo và với các dòng TPEx thời kỳ đầu |
match_minutes | int | null | Xử lý: N trong 「約每N分鐘撮合一次」 đọc từ nội dung; null khi nội dung không nêu (mọi quyết định xử lý của TWSE trước ~2011 — phần nội dung để trống — và các biện pháp không liên quan đến khớp lệnh) và với cảnh báo |
reason | string | null | Toàn văn công bố; null khi sàn không công bố nội dung (mọi quyết định xử lý của TWSE trước 2011-03) (xử lý là 處置內容, cảnh báo là 注意交易資訊) |
close, pe | float | null | Giá đóng cửa và P/E tại thời điểm công bố; luôn là null với các quyết định xử lý của TWSE |
| Mã trạng thái | Nội dung phản hồi | Trường hợp |
|---|---|---|
| 400 | {"error": "Invalid start date, expected YYYY-MM-DD"} (hoặc end) | start / end sai định dạng |
| 400 | {"error": "start must not be after end"} | Khoảng bị đảo ngược |
| 400 | {"error": "Invalid date, expected YYYY-MM-DD"} | date sai định dạng |
| 400 | {"error": "use either date or start/end"} | date được gửi cùng start hoặc end |
| 400 | {"error": "Invalid stock_id"} | Không qua kiểm tra định dạng |
| 400 | {"error": "kind must be one of ['disposal', 'notice']"} / {"error": "market must be one of ['twse', 'tpex']"} | Giá trị không xác định |
| 400 | {"error": "start/end range is <n> days; max 366 (inclusive) without stock_id — split into smaller ranges"} | Khoảng trên 366 ngày mà không có stock_id |
| 503 | {"error": "Data temporarily unavailable. Please retry shortly."} | Một bảng bạn yêu cầu hiện không phục vụ được (không được làm mới trong 48 giờ, hoặc không đọc được) — thử lại sau, không bao giờ đọc thành "không có công bố". Chỉ các bảng kind / market được yêu cầu mới được kiểm tra |
date là ngày công bố, start là ngày đầu tiên có hiệu lực. Để hỏi "có đang bị xử lý vào ngày D không", dùng date=D (hoặc start=end=D), không dùng ngày công bố.start / end là thời hạn theo công bố; ngày nghỉ thị trường hoặc tạm ngừng giao dịch trong thời hạn đó sẽ kéo dài ngày kết thúc thực tế, điều mà dữ liệu không ghi nhận.match_minutes theo quy định tại thời điểm đó (TPEx 5 / 20 phút → 2 từ 2026-08-10) — hãy đọc theo từng dòng, không bao giờ giả định một giá trị./studio/market/twstock/batch/<data_type> | Tên | Mô tả | Giá trị hợp lệ | Mặc định |
|---|---|---|---|
data_typestring · pathBắt buộc | Bộ dữ liệu | price, price_adj, per, institutional, shareholding, foreign_shareholding, financials, balance_sheet, monthly_revenue, ratios, dividend | |
stock_idsstring · queryBắt buộc | Mã | Phân tách bằng dấu phẩy, ≤ 50 | |
startstring · query | Ngày đầu tiên | YYYY-MM-DD (chỉ kiểm tra nghiêm ngặt với dividend) | tùy data_type |
endstring · query | Ngày cuối cùng | YYYY-MM-DD | tùy data_type |
payload = requests.get(f"{BASE_URL}/studio/market/twstock/batch/per" , headers=headers, params={"stock_ids": "2330,6182", "start": "2026-08-04", "end": "2026-08-08"}, timeout=120).json()# {"data_type": "per",# "data": {"2330": [{"date": "2026-08-04", "dividend_yield": 0.95, "PER": 31.19, "PBR": 10.21, "stock_id": "2330"}, ...],# "6182": [...]},# "failed": []}{"data_type", "data": {"<stock_id>": [...rows...]}, "failed": [...]}. Các dòng giống hệt endpoint đơn mã tương ứng.
failed — các mã mà việc lấy dữ liệu phía máy chủ thất bại (giới hạn tần suất hoặc lỗi upstream); hãy thử lại các mã đó.data lẫn failed thì thực sự không có dữ liệu.| Mã trạng thái | Nội dung phản hồi | Trường hợp |
|---|---|---|
| 400 | {"error": "Unsupported data_type '<x>'. Supported: [...]"} | data_type không hợp lệ |
| 400 | {"error": "stock_ids parameter required"} | Thiếu |
| 400 | {"error": "stock_ids exceeds max 50 per request"} | Quá nhiều |
| 400 | {"error": "Invalid stock_id in list"} | Có mã không qua kiểm tra định dạng |
| 400 | {"error": "Invalid start date, expected YYYY-MM-DD"} | Chỉ với dividend |
ratios (財務比率): các dòng của mỗi mã chính là các dòng định dạng rộng theo quý của /ratios/<stock_id> ("data": {"2330": [{"date": "2026-06-30", "stock_id": "2330", "roe_q": 11.3934, ...}], "2317": [...]}). Mã không có báo cáo tài chính (ETF) không xuất hiện trong cả data lẫn failed (không trả 404); khi kho chỉ số chưa sẵn sàng, mọi mã đều nằm trong failed (không trả 503).dividend khác với /dividend/<stock_id>: nó chỉ đọc dữ liệu đã lưu (không làm mới), mã không xác định hoặc cổ phiếu không có lịch sử cổ tức sẽ lặng lẽ không xuất hiện (không trả 404), và sự cố quota upstream thể hiện trong failed, không phải bằng 503.