Skip to main content
使用者推送投遞你帳戶範圍內的更新(訂單、成交、取消)。

訊息

使用者推送將每條更新作為裸 JSON 物件傳送(無元組包裝)。所有更新共用同一結構;動作由 unmatched / matched 哪個被填充以及 origin 決定。

通用結構

messageID 是 streaming-api 在傳送前新增的流條目 id。請持久化你已處理的最新一條 — 它就是你的回放遊標。參見下方回放錯過的訊息。

matched 塊

只要更新表示一筆成交(matched != null),就會出現該塊。除非標明為有條件,下列每個欄位都會在每筆成交上傳送。所有取值都從你的視角出發 — 作為 taker 你看到自己吃到的方向,作為 maker 你看到自己掛出的方向。
不要用 risk 推導 win。 risk 和 win 各自從未經四捨五入的本金獨立保留到 2 位小數,因此 risk x odds 可能與 win 相差一分錢。請按下發的 win 入賬;若該欄位缺失,應將訊息視為格式錯誤,而不是自行重建。不要把 amount 當作 risk 的同義詞。 在 taker 成交上,amount 不含虧損時收取的佣金,而 risk 包含它。把 amount 當作風險金額入賬,會在每次吃單時少計佣金。
REST 上的相同數量(獲取已撮合投注)以保留 2 位小數的字串而非數字給出,且佣金與舍入順序略有不同。對帳時請允許一分錢的容差,不要要求精確相等。

unmatched 塊

只要更新涉及留在(或離開)訂單簿的訂單 — 下單、取消,以及成交的 maker 一側 — 就會出現該塊。賠率和方向來自 maker 視角,即你掛出的內容,而不是訂單簿向他人展示的報價。
filled 和 remaining 不是同一類數字。remaining 是執行時狀態 — 此刻訂單簿上還剩多少 — 但在成交上 filled 只描述該事件。跨多筆部分成交時它們不會相加:filled + remaining 在第一筆成交時等於 offered,之後會逐漸偏離。要跟蹤一筆掛單已成交多少,請使用 offered - remaining,或自行累加 filled。不要把兩者混用。

如何識別動作

  • 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”(投注阿森納獲勝):
注意同一筆成交的兩個視角:taker 看到同一 market 上 side: "yes"、賠率 +120,maker 看到 side: "no"、賠率 -120。

回放錯過的訊息

v2 使用者推送支援連線中斷後的缺口恢復。每條訊息都帶有 messageID(單調遞增的流條目 id,例如 "1751552702114-0")。若連線斷開,你可以精確拉取錯過的訊息。

介面

鑑權方式與 WebSocket 相同:在 Authorization 請求標頭、Auth 請求標頭或 token 查詢參數中攜帶 token。僅回傳屬於已鑑權使用者的訊息。

回應:success

你的 afterID 仍在保留歷史中,因此回傳的列表是完整的缺口填充 — afterID 與 beforeID 之間沒有任何丟失:
按順序應用這些訊息,然後繼續處理即時訊息。

回應:cache_expired

你的 afterID 已超出保留歷史,因此伺服器無法證明回放是完整的:
availableMessages 是仍被保留的內容,最舊的在前。超出保留視窗的更早訊息無法透過回放恢復 — 請及時重連,而不要依賴過長的回看。

示例:帶回放的重連用戶端

完整的 Node.js 用戶端(為簡潔起見省略 keepalive ping/pong — 參見本頁頂部的快速入門)。正確性依賴兩點:每條訊息 — 即時、緩衝或回放 — 都經過同一套只向前推進的遊標檢查;回放失敗時重連,而不是帶著缺口進入即時。