預測市場錢包事件訂閱API
1. 概覽
1.1 業務說明
Binance Web3 Prediction(預測市場)通過 Binance SApi WebSocket 通道向單個使用者即時推送 14 種業務事件,覆蓋交易(市價/限價)、收益領取(claim)、資金劃轉、市場結算 4 大類。
1.2 通道特性
| 項 | 說明 |
|---|---|
| 協議 | WebSocket(WSS) |
| 閘道器 | Binance SApi WSS(與現貨 / U本位 SApi 共用同一連線基礎設施) |
| 路由維度 | (topic, userId) 精確匹配,僅推送給匹配使用者 |
| 投遞語義 | at-most-once(最多一次,不保證重發) |
| 順序性 | 同一 user 同一 topic 不保證嚴格順序,建議用 pushId 做冪等 |
| 離線訊息 | 不快取,重連後請通過 REST API 拉取最新狀態 |
| 時延 | 業務事件觸發後 < 500 ms 投遞(不含網路) |
| 單條大小 | < 2 KB |
1.3 適用受眾
- 整合 Prediction 業務的錢包客戶端
- 第三方代理交易(agent trading)方
- 資料分析 / 風控類系統
2. WebSocket 連線
基礎連線規範完全遵循 Binance CMS General Info。本節摘錄關鍵內容並補充 Prediction 特定示例。
2.1 連線 URL
Base URL:
Code
完整連線 URL 格式:
Code
示例(訂閱 prediction buy success topic):
Code
2.2 URL 參數
| 參數 | 必填 | 說明 |
|---|---|---|
random | ✅ | 隨機字串或數字,建議 ≤ 32 字元,用於保證簽名唯一性 |
topic | ✅ | 訂閱的 topic,多個 topic 用豎線 | 分隔 |
recvWindow | ✅ | 時間視窗(ms),最大 60000 |
timestamp | ✅ | 客戶端發起請求的毫秒級 UTC 時間戳 |
signature | ✅ | HMAC SHA256 簽名(見下文) |
2.3 鑑權
Header
Code
簽名生成步驟
- 收集所有 URL 參數(不含
signature) - 按參數名字母升序排列後拼接為 query string
- 使用 Secret Key 對該字串 HMAC SHA256
Payload 示例:
Code
Bash 驗證:
Code
2.4 時間視窗
服務端校驗:server_time <= timestamp + recvWindow,超出則拒絕連線。建議客戶端定期校準本機時間與 Binance
Server Time。
2.5 連線生命週期
| 項 | 規則 |
|---|---|
| 單連線最長有效期 | 24 小時 |
| 超時後 | 客戶端需重連,並重新生成 timestamp + signature |
| 服務端心跳超時斷連 | 1 分鐘未收到 PING |
2.6 訂閱、取消訂閱、心跳、限流
完全遵循 Binance CMS 通用規範,本文不重複列舉。
簡要要點:
- 連線時通過 URL 參數
topic=topic1|topic2訂閱 - 連線後可通過 JSON 命令
{"command":"SUBSCRIBE","value":"..."}動態訂閱 / 取消訂閱 - 客戶端需每 30 秒傳送一次 PING(空 payload)
- 單連線 5 條/秒訊息上限,超限斷連,反覆超限 IP 封禁
詳細欄位、響應結構、錯誤碼、重連建議請參考 CMS 文件。
3. 推送訊息通用結構
3.1 信封
每條業務推送由 SApi 閘道器投遞,整體結構遵循 SApi 推送規範,業務 payload 即為 data
欄位中的 JSON 字串:
Code
注意
data欄位是字串化的 JSON,需要二次JSON.parse。
3.2 業務 Payload 通用欄位
Code
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
pushId | string | ✅ | 推送唯一 ID,所有 topic 都有 |
| 其他業務欄位 | string | 視 topic | 詳見第 4 節,型別統一為 string |
3.3 pushId 格式
Code
| 段 | 說明 |
|---|---|
pm_ | 固定字首 |
<refId> | 業務關聯 ID(訂單 ID / claimBatchId / transferId / marketId 等,詳見第 4 節) |
<scenarioCode> | 場景碼,與 topic 字尾一致 |
<8hex> | 隨機 8 位 hex,保證唯一性 |
4. Topic 列表與詳細 Payload
14 個 topic 全部以
web3_prediction_為字首。第三方按需訂閱。
4.0 Topic 總覽
| # | scenarioCode | Topic | 觸發時機 |
|---|---|---|---|
| 1 | pm_market_buy_success | web3_prediction_pm_market_buy_success | 市價買單完全成交 |
| 2 | pm_market_buy_fail | web3_prediction_pm_market_buy_fail | 市價買單失敗 / 過期 |
| 3 | pm_market_sell_success | web3_prediction_pm_market_sell_success | 市價賣單完全成交 |
| 4 | pm_market_sell_fail | web3_prediction_pm_market_sell_fail | 市價賣單失敗 / 過期 |
| 5 | pm_limit_submit_success | web3_prediction_pm_limit_submit_success | 限價單掛單成功 |
| 6 | pm_limit_submit_fail | web3_prediction_pm_limit_submit_fail | 限價單掛單失敗 |
| 7 | pm_limit_order_filled | web3_prediction_pm_limit_order_filled | 限價單完全成交 |
| 8 | pm_limit_order_partial_fill | web3_prediction_pm_limit_order_partial_fill | 限價單部分成交 |
| 9 | pm_claim_success | web3_prediction_pm_claim_success | 收益領取成功 |
| 10 | pm_claim_fail | web3_prediction_pm_claim_fail | 收益領取失敗 |
| 11 | pm_claim_partial_success | web3_prediction_pm_claim_partial_success | 收益批次領取部分成功 |
| 12 | pm_transfer_success | web3_prediction_pm_transfer_success | 資金劃轉成功 |
| 13 | pm_transfer_fail | web3_prediction_pm_transfer_fail | 資金劃轉失敗 |
| 14 | pm_market_close | web3_prediction_pm_market_close | 市場結算關閉通知 |
4.1 web3_prediction_pm_market_buy_success
觸發條件
使用者的市價買單(Market Order BUY)完全成交(OrderStatus = FILLED)。
refId
<refId> = OrderHistory.orderId
Payload
Code
| 欄位 | 型別 | 必填 | 資料來源 | 說明 |
|---|---|---|---|---|
pushId | string | ✅ | 系統生成 | 唯一 ID |
amount | string | ✅ | OrderHistory.amountIn | 使用者支付的 USDT 金額,2 位小數向下截斷 |
topic | string | ✅ | MarketTopic.title 截斷 12 字元 | 市場標題 |
文案模版
Bought ${amount} USDT in ${topic}
4.2 web3_prediction_pm_market_buy_fail
觸發條件
市價買單狀態變為 FAILED 或 EXPIRED。
refId
<refId> = OrderHistory.orderId
Payload
Code
| 欄位 | 型別 | 必填 | 資料來源 | 說明 |
|---|---|---|---|---|
pushId | string | ✅ | 系統生成 | |
amount | string | ✅ | OrderHistory.amountIn | 原下單 USDT 金額(非實際扣款) |
topic | string | ✅ | 市場標題截斷 |
4.3 web3_prediction_pm_market_sell_success
觸發條件
使用者的市價賣單(Market Order SELL)完全成交(FILLED)。
refId
<refId> = OrderHistory.orderId
Payload
Code
| 欄位 | 型別 | 必填 | 資料來源 | 說明 |
|---|---|---|---|---|
pushId | string | ✅ | 系統生成 | |
amount | string | ✅ | amountOut − totalFee | 使用者實際到手 USDT(已扣手續費) |
topic | string | ✅ | 市場標題截斷 |
4.4 web3_prediction_pm_market_sell_fail
觸發條件
市價賣單 FAILED 或 EXPIRED。
refId
<refId> = OrderHistory.orderId
Payload
Code
| 欄位 | 型別 | 必填 | 資料來源 | 說明 |
|---|---|---|---|---|
pushId | string | ✅ | 系統生成 | |
amount | string | ✅ | amountOut − totalFee | 失敗前預期到賬金額(未實際入賬) |
topic | string | ✅ | 市場標題截斷 |
4.5 web3_prediction_pm_limit_submit_success
觸發條件
使用者的限價單成功掛入訂單簿。
refId
<refId> = OrderHistory.orderId
Payload
Code
| 欄位 | 型別 | 必填 | 資料來源 | 說明 |
|---|---|---|---|---|
pushId | string | ✅ | 系統生成 | |
amount | string | ✅ | BUY: amountIn / SELL: amountOut | 限價單總額 |
topic | string | ✅ | 市場標題截斷 |
4.6 web3_prediction_pm_limit_submit_fail
觸發條件
限價單掛單失敗(提交時即被拒絕)。
refId
<refId> = OrderHistory.orderId
Payload
Code
| 欄位 | 型別 | 必填 | 資料來源 | 說明 |
|---|---|---|---|---|
pushId | string | ✅ | 系統生成 | |
topic | string | ✅ | 市場標題截斷 |
⚠️ 特別注意:本場景不攜帶
amount欄位。
文案模版
Failed to submit your limit order for ${topic}. Please try again.
4.7 web3_prediction_pm_limit_order_filled
觸發條件
已掛入訂單簿的限價單完全成交。
refId
<refId> = OrderHistory.orderId
Payload
Code
| 欄位 | 型別 | 必填 | 資料來源 | 說明 |
|---|---|---|---|---|
pushId | string | ✅ | 系統生成 | |
amount | string | ✅ | BUY: amountIn / SELL: amountOut − totalFee | 全部成交對應的 USDT |
topic | string | ✅ | 市場標題截斷 |
4.8 web3_prediction_pm_limit_order_partial_fill
觸發條件
限價單部分成交(PARTIALLY_FILLED)。每次新一筆部分成交都會推送。
refId
<refId> = OrderHistory.orderId
Payload
Code
| 欄位 | 型別 | 必填 | 資料來源 | 說明 |
|---|---|---|---|---|
pushId | string | ✅ | 系統生成 | |
amount | string | ✅ | BUY: amountIn / SELL: amountOut − totalFee | 本次部分成交後累計金額,非單次增量 |
topic | string | ✅ | 市場標題截斷 |
⚠️ 同一筆限價單可能多次推送,客戶端務必用
pushId去重。
4.9 web3_prediction_pm_claim_success
觸發條件
使用者領取(claim)收益全部成功:單筆成功 或 批次全部成功。
refId
<refId> = batchId(claim 批次 ID)
Payload
Code
| 欄位 | 型別 | 必填 | 資料來源 | 說明 |
|---|---|---|---|---|
pushId | string | ✅ | 系統生成 | |
amount | string | ✅ | SUM(dataItems[].amount) | 多筆合計到賬 USDT |
⚠️ 本場景不含
topic/outcome欄位(即使是單筆 claim 也只顯示總額)。
文案模版
Successfully claimed ${amount} USDT.
4.10 web3_prediction_pm_claim_fail
觸發條件
claim 全部失敗(單筆失敗或批次全部失敗)。
refId
<refId> = batchId
Payload
Code
| 欄位 | 型別 | 必填 | 資料來源 | 說明 |
|---|---|---|---|---|
pushId | string | ✅ | 系統生成 | |
amount | string | ✅ | dataItems[0].amount | 首筆失敗 claim 的金額 |
outcome | string | ✅ | dataItems[0].outcome.name | 首筆失敗 claim 對應的 outcome 名(如 Yes/No,可能為 "") |
⚠️ 即使批次多筆失敗,也只取第一筆的 amount/outcome。
文案模版
Failed to claim ${amount} from ${outcome}. Please try again.
4.11 web3_prediction_pm_claim_partial_success
觸發條件
批次 claim 部分成功部分失敗。
refId
<refId> = batchId
Payload
Code
| 欄位 | 型別 | 必填 | 資料來源 | 說明 |
|---|---|---|---|---|
pushId | string | ✅ | 系統生成 |
⚠️ 本場景僅有
pushId,無任何業務欄位。詳情請客戶端調 REST API 查詢。
文案模版
Partially claimed. Please try again to collect the remaining.
4.12 web3_prediction_pm_transfer_success
觸發條件
資金劃轉成功(充值進 prediction 錢包 / 提現出 prediction 錢包)。
refId
<refId> = FundTransferOrder.transferId
Payload
Code
| 欄位 | 型別 | 必填 | 資料來源 | 說明 |
|---|---|---|---|---|
pushId | string | ✅ | 系統生成 | |
amount | string | ✅ | FundTransferOrder.fromTokenAmount | 劃轉 token 數量 |
⚠️ 不區分充值/提現方向,也不攜帶 token 型別(當前業務上僅 USDT)。
4.13 web3_prediction_pm_transfer_fail
觸發條件
資金劃轉失敗。
refId
<refId> = transferId
Payload
Code
| 欄位 | 型別 | 必填 | 資料來源 | 說明 |
|---|---|---|---|---|
pushId | string | ✅ | 系統生成 | |
amount | string | ✅ | FundTransferOrder.fromTokenAmount | 原劃轉金額 |
4.14 web3_prediction_pm_market_close
觸發條件
市場結算(Market.status = RESOLVED)後,對所有持有該市場任意 outcome 倉位的使用者推送(無論持倉是否 win)。
refId
<refId> = marketId(注意:不是 outcomeId)
Payload
Code
| 欄位 | 型別 | 必填 | 資料來源 | 說明 |
|---|---|---|---|---|
pushId | string | ✅ | 系統生成 | |
topic | string | ✅ | 市場標題截斷 |
⚠️ 本場景不含
amount/outcome/isWinner。展示使用者持倉盈虧請收到推送後調 REST API 查詢。
文案模版
Market ${topic} has been resolved. Please claim your winnings.
4.15 欄位矩陣速查
| Scenario | pushId | amount | topic | outcome | refId 型別 |
|---|---|---|---|---|---|
| pm_market_buy_success | ✅ | ✅ | ✅ | — | orderId |
| pm_market_buy_fail | ✅ | ✅ | ✅ | — | orderId |
| pm_market_sell_success | ✅ | ✅ | ✅ | — | orderId |
| pm_market_sell_fail | ✅ | ✅ | ✅ | — | orderId |
| pm_limit_submit_success | ✅ | ✅ | ✅ | — | orderId |
| pm_limit_submit_fail | ✅ | ❌ | ✅ | — | orderId |
| pm_limit_order_filled | ✅ | ✅ | ✅ | — | orderId |
| pm_limit_order_partial_fill | ✅ | ✅ | ✅ | — | orderId |
| pm_claim_success | ✅ | ✅ | ❌ | ❌ | batchId |
| pm_claim_fail | ✅ | ✅ | ❌ | ✅ | batchId |
| pm_claim_partial_success | ✅ | ❌ | ❌ | ❌ | batchId |
| pm_transfer_success | ✅ | ✅ | ❌ | ❌ | transferId |
| pm_transfer_fail | ✅ | ✅ | ❌ | ❌ | transferId |
| pm_market_close | ✅ | ❌ | ✅ | ❌ | marketId |