開始使用
富果行情 WebSocket API 提供台股即時行情服務。透過 WebSocket API 可以滿足您想要接收即時行情的需求。
建立連線
您可以透過以下位置向富果行情 WebSocket API server 建立連線:
wss://api.fugle.tw/marketdata/v1.0/stock/streaming
身份驗證
建立 WebSocket 連線後,請使用 API 金鑰進行身份驗證,以獲得授權訂閱各項頻道:
{
"event": "auth",
"data": {
"apikey": "<API_KEY>"
}
}
當驗證成功後,會收到以下訊息:
{
"event": "authenticated",
"data": {
"message": "Authenticated successfully"
}
}
若驗證失敗,則會收到以下訊息:
{
"event": "error",
"code": 1000,
"data": {
"message": "Invalid authentication credentials"
}
}
其他錯誤訊息與關閉代碼請參考 錯誤與關閉代碼。
Heartbeat
每隔 30 秒 WebSocket server 會送出一個 heartbeat 訊息:
{
"event": "heartbeat",
"data": {
"time": "<Timestamp>"
}
}
Ping/Pong
將以下 JSON 格式訊息發送到 WebSocket Server(state 為可選):
{
"event": "ping",
"data": {
"state": "<ANY>"
}
}
WebSocket Server 會回應以下訊息(若 ping 未送 state 則不會有該欄位):
{
"event": "pong",
"data": {
"time": "<TIMESTAMP>",
"state": "<ANY>"
}
}
Channels
富果行情 WebSocket API 目前提供以下可訂閱頻道:
trades- 接收訂閱股票最新成交資訊candles- 接收訂閱股票最新分鐘Kbooks- 接收訂閱股票最新最佳五檔委買委賣資訊aggregates- 接收訂閱股票聚合數據的行情資訊indices- 接收訂閱股票最新指數行情資料
訂閱頻道
要訂閱一個頻道,請將以下 JSON 格式訊息發送到 WebSocket Server:
{
"event": "subscribe",
"data": {
"channel": "<CHANNEL_NAME>",
"symbol": "<SYMBOL_ID>"
}
}
在
data指定"intradayOddLot": true可訂閱盤中零股行情。
訂閱成功後,會收到以下事件回應:
{
"event": "subscribed",
"data": {
"id": "<CHANNEL_ID>",
"channel": "<CHANNEL_NAME>",
"symbol": "<SYMBOL_ID>"
}
}
支援訂閱同頻道的多檔股票:
{
"event": "subscribe",
"data": {
"channel": "<CHANNEL_NAME>",
"symbols": ["<SYMBOL_ID_1>", "<SYMBOL_ID_2>"]
}
}
訂閱成功後,會收到以下事件回應:
{
"event": "subscribed",
"data": [
{
"id": "<CHANNEL_ID>",
"channel": "<CHANNEL_NAME>",
"symbol": "<SYMBOL_ID_1>"
},
{
"id": "<CHANNEL_ID>",
"channel": "<CHANNEL_NAME>",
"symbol": "<SYMBOL_ID_2>"
}
]
}
接收行情資料
訂閱成功後,若該檔股票當日已有資料,會先收到一則 event 為 snapshot 的訊息,內容為該頻道最近一次的資料,之後有新資料時才會收到 event 為 data 的訊息。收盤後訂閱只會收到 snapshot;代碼錯誤時同樣會收到 subscribed,但不會收到任何行情訊息。
當日尚未有資料時(例如盤前試撮開始前)訂閱,trades、books、indices 不會收到 snapshot;aggregates 與 candles 仍會收到一則 snapshot,其中 aggregates 只有參考價與昨收、累計量為 0,candles 的 data 為空陣列。
除 candles 外,兩種訊息的 data 格式相同;candles 的 snapshot 以 data 陣列帶入當日已有的K線(另帶 timeframe),data 訊息則是單根K線。各頻道欄位請見各頻道頁:
{
"event": "snapshot",
"data": {
"symbol": "2330",
"type": "EQUITY",
"exchange": "TWSE",
"market": "TSE",
"price": 2420,
"size": 5574,
"bid": 2415,
"ask": 2420,
"volume": 22224,
"isClose": true,
"time": 1792560600000000,
"serial": 15057309
},
"id": "<CHANNEL_ID>",
"channel": "trades"
}
各頻道訊息的共通規則:
time等時間欄位為 Unix 時間戳記,單位為微秒(例:1792560600000000為 2026-10-21 13:30:00)。- 布林旗標(如
isTrial、isContinuous、isClose)只在值為true時出現,未出現即視為false。 - 數量單位:整股行情為交易單位,多數股票 1 張為 1,000 股;盤中零股行情為股。交易單位不是 1,000 股的標的,請以 Intraday Ticker 的
boardLot換算。 - 訂閱盤中零股(
"intradayOddLot": true)時,訊息的type為ODDLOT,可用來區分同一檔股票的整股與零股行情。
取消訂閱
要取消已訂閱頻道,請將以下 JSON 格式訊息發送到 WebSocket Server:
{
"event": "unsubscribe",
"data": {
"id": "<CHANNEL_ID>"
}
}
取消訂閱成功後,會收到以下事件回應:
{
"event": "unsubscribed",
"data": {
"id": "<CHANNEL_ID>",
"channel": "<CHANNEL_NAME>",
"symbol": "<SYMBOL_ID>"
}
}
支援取消訂閱多個頻道:
{
"event": "unsubscribe",
"data": {
"ids": ["<CHANNEL_ID_1>", "<CHANNEL_ID_2>"]
}
}
取消訂閱成功後,會收到以下事件回應:
{
"event": "unsubscribed",
"data": [
{
"id": "<CHANNEL_ID_1>",
"channel": "<CHANNEL_NAME>",
"symbol": "<SYMBOL_ID_1>"
},
{
"id": "<CHANNEL_ID_2>",
"channel": "<CHANNEL_NAME>",
"symbol": "<SYMBOL_ID_2>"
}
]
}
訂閱資訊
要取得已訂閱的頻道,請將以下 JSON 格式訊息發送到 WebSocket Server:
{
"event": "subscriptions"
}
然後會收到以下事件回應:
{
"event": "subscriptions",
"data": [
{
"id": "<CHANNEL_ID>",
"channel": "<CHANNEL_NAME>",
"symbol": "<SYMBOL_ID>"
}
]
}
錯誤與關閉代碼
WebSocket 的錯誤有兩種形式:伺服器送出 event 為 error 的訊息(code 在訊息最外層),或直接關閉連線(以 close code 與 reason 表示)。同一個數字在兩種形式中代表不同意思,請依訊息形式與文字判斷。
錯誤訊息
{
"event": "error",
"code": 1002,
"data": {
"message": "Forbidden resource"
}
}
code | data.message | 原因 | 處理方式 |
|---|---|---|---|
1000 | Invalid authentication credentials | API Key 無效,伺服器隨即關閉連線,不帶 close code | 確認 API Key 正確且有效後再連線,不要原樣重試 |
1000 | Cannot switch user on an authenticated connection | 已完成身份驗證的連線改用其他帳號的 API Key 再次驗證,伺服器隨即關閉連線,不帶 close code | 一條連線只使用一個帳號的 API Key;要使用其他帳號時,請另外建立連線 |
1000 | Your plan does not support this product type | 目前方案不包含此商品的即時行情,隨後關閉連線(close code 1001) |