前言
這篇原本紀錄於 2022-08。
幾年前嘗試開發網站時,相關功能特別打過證交所的 API;後來開發給同事用的「上班看報價」腳本同樣也是打這個 API,不過這幾年一直沒有找到官方文件,所以相關欄位還是紀錄了一篇,近期也搬移過來。(除舊 + 佈新 + 回顧,為什麼 blog 又得再搬一次家? )
現在這個年代應該是已經不需要附上完整的腳本了,ChatGPT 產一產就好;倒是一樣希望大家愛用 terminal,是個輕鬆高效的好東西。
另外本篇說明主要學習指令與 API 用途,不包含任何投資建議;及如果需要更正確即時的資料還是要向其他更正式的管道取得。
說明
Request 參數
其中會帶上參數:
jsonflag:字面上的意思,讓 output 是 JSON 格式;不過目前 (2022-08-07) 只有提供 JSON 一種,所以設定0或是1都不影響ex_ch:交易標的- 用底線
_隔開 - 前面是
otc或是tse,代表上櫃或是上市 - 後半則是接上股票 (或債券) 代碼、後綴
.tw。例如tse_1316.tw、otc_13164.tw
- 用底線
- 例如:
範例
例如大家最了解的台積電:
https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_2330.tw&json=1&delay=0
想一次查詢多個標的,就用 | 分隔代碼:
https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_2330.tw|tse_2317.tw|tse_2308.tw&json=1&delay=0
Response 參數
msgArray:主要資料回傳的 key
裡面資料的 key 如下 (方格子居然沒有支援表格 layout,我用 code block 紀錄):
欄位簡寫 說明
tv 當盤成交量
ps 未知
pz 未知
bp 未知
a 五檔賣價 (低到高、底線分隔)
b 五檔買價 (低到高、底線分隔)
c 標的 (股票、債券) 代碼
d 最近交易日期 (YYYYmmdd)
ch 未知
tlong epoch time (毫秒)
f 五檔賣量、配合 a 欄位
ip 未知
g 五檔買量、配合 b 欄位
mt 未知
h 最高價
it 未知
l 最低價
n 公司簡稱
o 開盤價
p 未知
ex 上市或上櫃 (tse / otc)
s 未知
t 最新成交時間點
u 漲停價
v 累積成交量
w 跌停價
nf 公司全名
y 昨收價
z 當盤成交價
ts 未知
因為沒有找到相關的 API 文件,某些欄位不太確定是什麼意思。
還是附上原本的表格好了,code block 還是有點難讀:

使用方式
一般程式語言
如果你在開發程式,Python、JS、Golang、Rust...,就直接用對應的套件解析回傳的 JSON 就可以了。
Terminal 快速查看
打開你的 terminal (終端機),mac 可以在 Spotlight 中搜尋:

然後輸入:
curl -s "https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_2330.tw|tse_2317.tw|tse_2308.tw&json=1&delay=0"
(你可以在 mac 中搜尋「終端機」;我是下載 iTerm2)
類似這樣

你可能需要另外安裝 jq 才能快速處理 JSON 格式的資料 (安裝方式)。
有用 jq 的話就會得到比較漂亮的結果:
[
{
"@": "2330.tw",
"tv": "25947",
"ps": "26115",
"pid": "9.tse.tw|14452",
"pz": "1270.0000",
"bp": "0",
"fv": "54",
"oa": "1280.0000",
"ob": "1275.0000",
"m%": "000000",
"^": "20250919",
"key": "tse_2330.tw_20250919",
"a": "1270.0000_1275.0000_1280.0000_1285.0000_1290.0000_",
"b": "1265.0000_1260.0000_1255.0000_1250.0000_1245.0000_",
"c": "2330",
"#": "13.tse.tw|2639",
"d": "20250919",
"%": "14:30:00",
"ch": "2330.tw",
"tlong": "1758263400000",
"ot": "14:30:00",
"f": "198_221_169_1163_3259_",
"g": "2291_1839_613_626_1692_",
"ip": "0",
"mt": "000000",
"ov": "51316",
"h": "1290.0000",
"i": "24",
"it": "12",
"oz": "1275.0000",
"l": "1265.0000",
"n": "台積電",
"o": "1285.0000",
"p": "0",
"ex": "tse",
"s": "25947",
"t": "13:30:00",
"u": "1410.0000",
"v": "44808",
"w": "1160.0000",
"nf": "台灣積體電路製造股份有限公司",
"y": "1285.0000",
"z": "1265.0000",
"ts": "0"
},
{
"@": "2317.tw",
"tv": "17697",
"ps": "17685",
"pid": "9.tse.tw|14445",
"pz": "214.0000",
"bp": "0",
"fv": "180",
"oa": "214.5000",
"ob": "214.0000",
"m%": "000000",
"^": "20250919",
"key": "tse_2317.tw_20250919",
"a": "214.5000_215.0000_215.5000_216.0000_216.5000_",
"b": "214.0000_213.5000_213.0000_212.5000_212.0000_",
"c": "2317",
"#": "13.tse.tw|3090",
"d": "20250919",
"%": "14:30:00",
"ch": "2317.tw",
"tlong": "1758263400000",
"ot": "14:30:00",
"f": "54_556_837_2751_2646_",
"g": "1372_2230_2087_1926_2712_",
"ip": "0",
"mt": "000000",
"ov": "45409",
"h": "217.0000",
"i": "31",
"it": "12",
"oz": "214.0000",
"l": "214.0000",
"n": "鴻海",
"o": "216.5000",
"p": "0",
"ex": "tse",
"s": "17697",
"t": "13:30:00",
"u": "236.5000",
"v": "56136",
"w": "193.5000",
"nf": "鴻海精密工業股份有限公司",
"y": "215.0000",
"z": "214.0000",
"ts": "0"
},
{
"@": "2308.tw",
"tv": "4147",
"ps": "4146",
"pid": "9.tse.tw|14440",
"pz": "888.0000",
"bp": "0",
"fv": "57",
"oa": "894.0000",
"ob": "893.0000",
"m%": "000000",
"^": "20250919",
"key": "tse_2308.tw_20250919",
"a": "889.0000_890.0000_891.0000_892.0000_893.0000_",
"b": "888.0000_887.0000_886.0000_885.0000_884.0000_",
"c": "2308",
"#": "13.tse.tw|2445",
"d": "20250919",
"%": "14:30:00",
"ch": "2308.tw",
"tlong": "1758263400000",
"ot": "14:30:00",
"f": "3_16_31_19_25_",
"g": "378_237_247_391_167_",
"ip": "0",
"mt": "000000",
"ov": "7182",
"h": "909.0000",
"i": "28",
"it": "12",
"oz": "893.0000",
"l": "885.0000",
"n": "台達電",
"o": "894.0000",
"p": "0",
"ex": "tse",
"s": "4147",
"t": "13:30:00",
"u": "981.0000",
"v": "19500",
"w": "803.0000",
"nf": "台達電子工業股份有限公司",
"y": "892.0000",
"z": "888.0000",
"ts": "0"
}
]
看起來過去三年,欄位有新增了一些:@、^、%...,不過應該還是只能依據資料去大致猜測他的意思。
上班看盤?
雖然原本腳本寫的比較詳細、功能也比較多,不過我相信現在靠 ChatGPT 大家都可以快速產出一個喜歡的版本。這邊我只留最單純的 loop 指令讓大家看看自動刷新報價的感覺:
while true; do
curl -s "https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_2330.tw|tse_2317.tw|tse_2308.tw&json=1&delay=0" | jq -r '.msgArray[] | "\(.c): \(.z)"'
sleep 3
clear
done
於是每 3 秒你的螢幕上就會出現 (現在是 2025-09-20 週六的結果)
2330: 1265.0000
2317: 214.0000
2308: 888.0000
從上面的表格我們可以知道:c 代表的是「股票代碼」、z 是當盤收盤價。
這兩個應該是大家最需要的資料,所以範例就先拿這兩個內容當作示範,可以依據自己的喜好調整欄位。如果你的股票代碼相對少、也想低調一點,可以只顯示 z 就好:
# 這邊省略了其他部分,只關注 jq 語法
jq -r '.msgArray[].z'
這樣就沒人知道你在做什麼。
String Interpolation
另外,jq 的這個 "\(............)" 語法叫做 string interpolation,可以用來控制你想要的顯示格式。特別要注意的是,他只有左側有跳脫符號。
例如假設資料是:
{
"prefix": "Hi",
"name": "ktc",
"counts": 13
}
可以在這個基礎上加一些調整:
echo ${MY_JSON_DATA} | jq -r '"\(.prefix) \(.name | ascii_upcase)"'
# Hi KTC
echo ${MY_JSON_DATA} | jq -r '"Counts = \(.counts + 1)"'
# Counts = 14
所以如果你想讓結果顯示地清楚一點,你可以在你的報價指令中再新增:「代碼」、「當盤成交價」等說明。
補充:
大約三年前測試的時候,這支證交所 API 大約有以下限制:
- 報價約莫 10 秒左右才更新一次。
- 一次取多檔報價的上限約在 120 檔。
- 數秒內不能打超過 N 次 (有點忘記 ratelimit 的具體限制)
當時如果要更新全部的 1500 檔股票報價,大約需要 25 ~ 35 秒左右。
所以指令的部分只適合我們這種一般人加減使用。
最後,Terminal 以及指令是超方便的東西,希望大家愛用!










