訊息
使用者推送將每條更新作為裸 JSON 物件傳送(無元組包裝)。所有更新共用同一結構;動作由unmatched / matched 哪個被填充以及 origin 決定。
通用結構
messageID 是 streaming-api 在傳送前新增的流條目 id。請持久化你已處理的最新一條 — 它就是你的回放遊標。參見下方回放錯過的訊息。
matched 塊
只要更新表示一筆成交(matched != null),就會出現該塊。除非標明為有條件,下列每個欄位都會在每筆成交上傳送。所有取值都從你的視角出發 — 作為 taker 你看到自己吃到的方向,作為 maker 你看到自己掛出的方向。
REST 上的相同數量(獲取已撮合投注)以保留 2 位小數的字串而非數字給出,且佣金與舍入順序略有不同。對帳時請允許一分錢的容差,不要要求精確相等。
unmatched 塊
只要更新涉及留在(或離開)訂單簿的訂單 — 下單、取消,以及成交的 maker 一側 — 就會出現該塊。賠率和方向來自 maker 視角,即你掛出的內容,而不是訂單簿向他人展示的報價。
如何識別動作
unmatched.filled === 0 && unmatched.offered > 0-> 已下單unmatched.offered === 0-> 已取消matched != null && unmatched == null-> 作為 taker 成交matched != null && unmatched != null-> 作為 maker 成交(若unmatched.remaining > 0則為部分成交)
orderType: "postArb" 下的訂單,其更新還會在 matched / unmatched 內帶有 isPostArb: true(下單、成交和取消更新均如此);否則省略該欄位。
按投注型別區分的 side 與 market 語義
matched / unmatched 內 side 的含義(以及會出現哪些額外欄位)取決於 type:
market 僅出現在 moneyline1x2 更新中:它指明該盤口所針對的三項結果(主隊、客隊或平局),side 則表示對該結果是 yes 還是 no。所有欄位都從你的視角出發 — 作為 maker 你看到自己掛出的方向;作為 taker 你看到自己吃到的方向。
動作:已下單
一筆新掛單進入訂單簿。unmatched.filled 為 0,unmatched.offered > 0,且 matched 為 null。
動作:已取消
使用者(或系統代其)取消了一筆掛單。區分欄位是unmatched.offered === 0。
動作:訂單成交(taker)
使用者吃掉了他人的掛單。unmatched 為 null,matched 攜帶成交,origin 為 "wager"。
動作:訂單成交(maker,部分成交)
有人吃到了使用者掛出的報價。matched 和 unmatched 均被填充;unmatched.remaining 顯示訂單簿上仍剩餘的數量。因為設定了 unmatched,origin 為 "offer"。
動作:訂單成交(moneyline1x2)
足球三項盤上的成交攜帶上文所述的market + side 組合,而不是參賽者十六進位 side。此處使用者以 +120 吃了主隊的 “yes”(投注阿森納獲勝):
market 上 side: "yes"、賠率 +120,maker 看到 side: "no"、賠率 -120。
回放錯過的訊息
v2 使用者推送支援連線中斷後的缺口恢復。每條訊息都帶有messageID(單調遞增的流條目 id,例如 "1751552702114-0")。若連線斷開,你可以精確拉取錯過的訊息。
介面
Authorization 請求標頭、Auth 請求標頭或 token 查詢參數中攜帶 token。僅回傳屬於已鑑權使用者的訊息。
回應:success
你的 afterID 仍在保留歷史中,因此回傳的列表是完整的缺口填充 — afterID 與 beforeID 之間沒有任何丟失:
回應:cache_expired
你的 afterID 已超出保留歷史,因此伺服器無法證明回放是完整的:
availableMessages 是仍被保留的內容,最舊的在前。超出保留視窗的更早訊息無法透過回放恢復 — 請及時重連,而不要依賴過長的回看。