公有WebSocket通用规范#
连接地址#
| 环境 | 公共频道地址 |
|---|---|
| Production | wss://{public-host}/ws/v5/public |
公共频道无需登录。
连接与心跳规则#
每个 IP 地址每秒最多建立 3 次 WebSocket 连接。
WebSocket 操作请求限流#
WebSocket 操作请求采用令牌桶机制,限流维度为单个 WebSocket 连接,即单个 Netty Channel。
| 规则 | 限制 |
|---|---|
| 限流维度 | 单个 WebSocket 连接 |
| 令牌桶容量 | 480 个 token |
| 连接建立时的初始令牌 | 480 个 token |
| 令牌恢复速度 | 每小时 480 个,约每 7.5 秒恢复 1 个 |
| 单次请求消耗 | 1 个 token |
| 纳入限流的请求 | login、subscribe、unsubscribe 等客户端操作请求 |
| 是否按频道分开计算 | 否,同一连接上的所有频道共享同一个令牌桶 |
| 是否按 IP 共享 | 否,同一 IP 建立的不同连接各自拥有独立令牌桶 |
| 重新连接 | 连接断开并重新建立后,新连接获得一个初始满载的 480 token 令牌桶 |
一次完整的 WebSocket 操作请求消耗 1 个 token。当一次 subscribe 或 unsubscribe 请求的 args[] 中包含多个频道或产品时,仍视为一条请求,只消耗 1 个 token。
令牌以每小时 480 个的速度持续恢复,令牌桶上限为 480;令牌不会在每小时整点重置。因此,单个连接建立后最多可以突发发送 480 条操作请求,之后约每 7.5 秒恢复一个 token。
同一连接上的所有 subscribe 和 unsubscribe 操作共享同一个令牌桶,不会按照 tickers、trades 等业务频道分别计算。
空闲断线与心跳#
连接成功后 30 秒内未订阅,或订阅后服务器连续 30 秒未推送数据,系统会自动断开连接。
客户端每次收到消息后,应设置一个小于 30 秒的定时器。如果定时器触发前未收到新消息,客户端应发送文本字符串 ping,并等待服务器返回文本字符串 pong。如果未在预期时间内收到 pong,客户端应报告错误或重新建立连接。
数据类型约定#
所有参数仅使用三种数据类型:
String:绝大多数参数使用此类型。Boolean:布尔值。Integer:仅用于序列号等例外场景。
所有数值,包括价格、数量和时间戳,均以 String 返回。时间戳统一使用 Unix epoch 毫秒,并以 String 表示。
数值不使用科学计数法,例如使用 0.000001,而不是 1E-6。小数不保留无意义的尾随零,例如使用 5,而不是 5.0。
订阅(subscribe)#
请求格式
{
"id": "1512",
"op": "subscribe",
"args": [
{
"channel": "exchangeos-tickers",
"assetId": "1"
}
]
}
一次请求可以订阅一个或多个频道。args 中的频道对象总大小不得超过 64 KB。
请求参数
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
id | String | 否 | 消息唯一标识,与 V5 对齐。由用户提供,服务器在响应中原样返回以匹配请求。仅支持字母和数字,长度为 1–32 个字符。 |
op | String | 是 | 操作类型,固定为 subscribe。 |
args | Array of Objects | 是 | 要订阅的频道列表。 |
> channel | String | 是 | 频道名称。 |
> assetId | String | 否 | 产品 ID。 |
成功返回示例
{
"event": "subscribe",
"arg": {
"channel": "exchangeos-tickers",
"assetId": "1234"
},
"connId": "accb8e21"
}
返回参数
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
event | String | 是 | 事件类型,可以是 subscribe 或 error。 |
arg | Object | 否 | 订阅的频道信息。 |
> channel | String | 是 | 频道名称。 |
> assetId | String | 否 | 产品 ID。 |
code | String | 否 | 请求失败时返回的错误码。 |
msg | String | 否 | 请求失败时返回的错误消息。 |
connId | String | 是 | WebSocket 连接 ID。 |
取消订阅(unsubscribe)#
请求示例
{
"op": "unsubscribe",
"args": [
{
"channel": "exchangeos-tickers",
"assetId": "1234"
}
]
}
请求参数
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
op | String | 是 | 操作类型,固定为 unsubscribe。 |
args | Array of Objects | 是 | 要取消订阅的频道列表。 |
> channel | String | 是 | 频道名称。 |
> assetId | String | 否 | 产品 ID。 |
返回示例
{
"event": "unsubscribe",
"arg": {
"channel": "exchangeos-tickers",
"assetId": "1234"
},
"connId": "d0b44253"
}
返回参数
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
event | String | 是 | 事件类型,可以是 unsubscribe 或 error。 |
arg | Object | 否 | 取消订阅的频道信息。 |
> channel | String | 是 | 频道名称。 |
> assetId | String | 否 | 产品 ID。 |
code | String | 否 | 错误码。 |
msg | String | 否 | 错误消息。 |
connId | String | 是 | WebSocket 连接 ID。 |
通知消息(event = notice)#
服务升级前约 60 秒,服务器会推送通知消息,提示客户端重新建立连接。
{
"event": "notice",
"code": "64008",
"msg": "The connection will soon be closed for a service upgrade. Please reconnect.",
"connId": "a4d3ae55"
}
行情频道 exchangeos-tickers#
推送单个 spot 或 perp 产品的最新成交、最优买卖盘及 24 小时行情;字段变更时推送。
{
"op": "subscribe",
"args": [
{
"channel": "exchangeos-tickers",
"assetId": "1234"
}
]
}
| 字段 | 类型 | 说明 |
|---|---|---|
assetId | String | 产品资产 ID。 |
lastPx | String | 最新成交价。 |
lastPxUsd | String | 最新成交价的 USD 估值;无法计算时返回空字符串。 |
lastSz | String | 最新成交数量。 |
askPx / askSz | String | 最优卖价与最优卖量。 |
bidPx / bidSz | String | 最优买价与最优买量。 |
open24h | String | 24 小时开盘价。 |
high24h / low24h | String | 24 小时最高价与最低价。 |
vol24h | String | 24 小时成交量。 |
volCcy24h | String | 24 小时成交额。 |
sodUtc0 / sodUtc8 | String | UTC+0 / UTC+8 当日开盘价。 |
ts | String | 推送时间,Unix epoch 毫秒。 |
{
"arg": {
"channel": "exchangeos-tickers",
"assetId": "1234"
},
"data": [
{
"assetId": "1234",
"lastPx": "97520.5",
"lastPxUsd": "97320.5",
"lastSz": "0.0012",
"askPx": "97521",
"askSz": "1.5234",
"bidPx": "97520",
"bidSz": "2.3041",
"open24h": "96800",
"high24h": "98100.3",
"low24h": "96210.5",
"volCcy24h": "582310412.56",
"vol24h": "5980.23",
"sodUtc0": "96950",
"sodUtc8": "97010.2",
"ts": "1710249600000"
}
]
}
成交频道 exchangeos-trades#
推送指定产品的最近成交。服务端最多每 100 ms 推送一次,每个聚合段最多 20 笔原始成交。只有区块、assetId、价格、方向相同且成交 ID 连续的成交才会被聚合。
{
"op": "subscribe",
"args": [
{
"channel": "exchangeos-trades",
"assetId": "1234"
}
]
}
| 字段 | 类型 | 说明 |
|---|---|---|
assetId | String | 产品资产 ID。 |
fId | String | 聚合段第一笔成交 ID。 |
lId | String | 聚合段最后一笔成交 ID。 |
px | String | 成交价格。 |
sz | String | 聚合后的成交数量。 |
side | String | 主动成交方向:buy 或 sell。 |
ts | String | 推送时间,Unix epoch 毫秒。 |
{
"arg": {
"channel": "exchangeos-trades",
"assetId": "2"
},
"data": [
{
"assetId": "2",
"fId": "1512",
"lId": "1512",
"px": "1",
"sz": "10",
"side": "buy",
"ts": "1785516597767"
}
]
}
成交 K 线频道 exchangeos-candle{bar}#
推送成交 K 线,数据变更时推送。将 {bar} 替换为实际粒度。
支持粒度:1m、5m、15m、1H、4H、1D。预测市场整合场景还可能支持 3m、30m、2H、6H、12H、1W、1M,以实际开通的粒度为准。
{
"op": "subscribe",
"args": [
{
"channel": "exchangeos-candle1H",
"assetId": "1234"
}
]
}
data[] 的每个元素为固定长度的 9 元素字符串数组:
| 索引 | 字段 | 说明 |
|---|---|---|
0 | ts | K 线开始时间,Unix epoch 毫秒。 |
1 | open | 开盘价。 |
2 | high | 最高价。 |
3 | low | 最低价。 |
4 | close | 收盘价。 |
5 | vol | 成交量。 |
6 | volCcy | 成交量币种口径数据。 |
7 | volCcyQuote | 计价币种成交额口径数据。 |
8 | confirm | 0:未完结;1:已完结。 |
{
"arg": {
"channel": "exchangeos-candle1H",
"assetId": "1234"
},
"data": [
[
"1710000000000",
"50000",
"51000",
"49500",
"50500",
"1234.5",
"617250000",
"617250000",
"0"
]
]
}
标记价格 K 线频道 exchangeos-mark-price-candle{bar}#
推送指定产品的标记价格 K 线,不包含成交量或成交额。
支持粒度:1s、1m、5m、15m、1H、4H、1D。
{
"op": "subscribe",
"args": [
{
"channel": "exchangeos-mark-price-candle1s",
"assetId": "2"
}
]
}
data[] 的每个元素为:
| 索引 | 字段 | 说明 |
|---|---|---|
0 | ts | K 线开始时间,Unix epoch 毫秒。 |
1 | open | 开盘标记价格。 |
2 | high | 最高标记价格。 |
3 | low | 最低标记价格。 |
4 | close | 当前或最终收盘标记价格。 |
5 | confirm | 0:未完结;1:已完结。 |
未完结 K 线会重复推送。客户端应以 channel + assetId + ts 作为唯一键,并以最新数据覆盖旧数据。
{
"arg": {
"channel": "exchangeos-mark-price-candle1s",
"assetId": "2"
},
"data": [
[
"1785912897000",
"1.0298",
"1.0298",
"1.0298",
"1.0298",
"0"
]
]
}
指数行情频道 exchangeos-index-tickers#
推送指数最新价格与 24 小时统计。价格发生变化时最快每秒推送一次;无变化时每分钟至少推送一次。
{
"op": "subscribe",
"args": [
{
"channel": "exchangeos-index-tickers",
"assetId": "1234"
}
]
}
| 字段 | 类型 | 说明 |
|---|---|---|
assetId | String | 指数对应的资产 ID。 |
idxPx | String | 最新指数价格。 |
open24h | String | 24 小时开盘价。 |
high24h / low24h | String | 24 小时最高价与最低价。 |
sodUtc0 / sodUtc8 | String | UTC+0 / UTC+8 当日开盘价。 |
ts | String | 推送时间,Unix epoch 毫秒。 |
{
"arg": {
"channel": "exchangeos-index-tickers",
"assetId": "1234"
},
"data": [
{
"assetId": "1234",
"idxPx": "64972.1",
"high24h": "65500",
"low24h": "64200",
"open24h": "64800",
"sodUtc0": "64900",
"sodUtc8": "64950",
"ts": "1781701360808"
}
]
}
指数 K 线频道 exchangeos-index-candle{bar}#
推送指数 OHLC K 线,不包含成交量。
支持粒度:1m、5m、15m、1H、4H、1D。
{
"op": "subscribe",
"args": [
{
"channel": "exchangeos-index-candle1H",
"assetId": "1234"
}
]
}
data[] 的每个元素为 [ts, open, high, low, close, confirm]。
{
"arg": {
"channel": "exchangeos-index-candle1H",
"assetId": "1234"
},
"data": [
[
"1710000000000",
"50000",
"51000",
"49500",
"50500",
"0"
]
]
}
资金费率频道 exchangeos-funding-rate#
推送永续合约当前预测资金费率及下一次结算信息,默认每 5 秒推送一次。该频道不返回 fundingTime;如需查询该字段,请使用 REST GET /market/funding-rate。
{
"op": "subscribe",
"args": [
{
"channel": "exchangeos-funding-rate",
"assetId": "2"
}
]
}
| 字段 | 类型 | 说明 |
|---|---|---|
assetId | String | 永续合约资产 ID。 |
fundingRate | String | 当前预测资金费率。 |
nextFundingTime | String | 下一次结算时间,Unix epoch 毫秒。 |
settlementInterval | String | 结算周期。 |
minFundingRate / maxFundingRate | String | 资金费率下限与上限。 |
fundingSwitch | Boolean | 是否启用资金费率。 |
{
"arg": {
"channel": "exchangeos-funding-rate",
"assetId": "2"
},
"data": [
{
"assetId": "2",
"fundingRate": "-0.0042",
"nextFundingTime": "1785916800000",
"settlementInterval": "1",
"minFundingRate": "-0.015",
"maxFundingRate": "0.015",
"fundingSwitch": true
}
]
}
产品频道 exchangeos-instruments#
按产品类型批量订阅。首次与任意产品参数变化时,服务端推送该 instType 的完整产品列表。支持 spot 与 perp,不支持预测市场产品线。
触发场景包括:产品状态变化、priceDecimals 或 sizeDecimals 变更、listTime 或 expTime 变更。产品正式下架前约 30 分钟会推送变更。
{
"op": "subscribe",
"args": [
{
"channel": "exchangeos-instruments",
"instType": "perp"
}
]
}
| 字段 | 类型 | 说明 |
|---|---|---|
instType | String | spot 或 perp。 |
assetId | String | 产品资产 ID。 |
settleTokenId | String | 结算币种 ID;spot 可能为空字符串。 |
priceDecimals | String | 价格精度位数。 |
sizeDecimals | String | 数量精度位数。 |
state | String | 产品状态,例如 live。 |
listTime | String | 上线时间,Unix epoch 毫秒。 |
expTime | String | 下线或到期时间;无值时为空字符串。 |
upcChg | Array | 待生效的参数变更列表。 |
upcChg[].param | String | priceDecimals 或 sizeDecimals。 |
upcChg[].newValue | String | 生效后的新值。 |
upcChg[].effTime | String | 参数生效时间,Unix epoch 毫秒。 |
ts | String | 推送时间,Unix epoch 毫秒。 |
参数变更会经历两个阶段:预告期中顶层字段仍是旧值,upcChg 提供新值和生效时间;生效后顶层字段变为新值,upcChg 为空数组。
{
"arg": {
"channel": "exchangeos-instruments",
"instType": "perp"
},
"data": [
{
"instType": "perp",
"assetId": "5678",
"settleTokenId": "0",
"priceDecimals": "1",
"sizeDecimals": "3",
"state": "live",
"listTime": "1710000000000",
"expTime": "",
"upcChg": [
{
"param": "priceDecimals",
"newValue": "2",
"effTime": "1710086400000"
}
],
"ts": "1710000000000"
}
]
}
持仓总量频道 exchangeos-open-interest#
推送永续合约持仓总量;有更新时每 3 秒推送一次。
{
"op": "subscribe",
"args": [
{
"channel": "exchangeos-open-interest",
"assetId": "1234"
}
]
}
| 字段 | 类型 | 说明 |
|---|---|---|
assetId | String | 永续合约资产 ID。 |
oiCcy | String | 持仓量。 |
oiUsd | String | 持仓量的 USD 估值。 |
ts | String | 推送时间,Unix epoch 毫秒。 |
{
"arg": {
"channel": "exchangeos-open-interest",
"assetId": "1234"
},
"data": [
{
"assetId": "1234",
"oiCcy": "22161.13",
"oiUsd": "1939251795.54",
"ts": "1710249600000"
}
]
}
限价频道 exchangeos-price-limit#
推送产品的最高买价 buyLmt 与最低卖价 sellLmt。无首推;限价带发生变化时最快每秒推送一次,无变化时不推送。首次配置 price band 会触发推送。没有有效限价带时,相关字段返回空字符串,而非 "0"。
{
"op": "subscribe",
"args": [
{
"channel": "exchangeos-price-limit",
"assetId": "1234"
}
]
}
| 字段 | 类型 | 说明 |
|---|---|---|
assetId | String | 产品资产 ID。 |
buyLmt | String | 允许的最高买入限价;无值时为空字符串。 |
sellLmt | String | 允许的最低卖出限价;无值时为空字符串。 |
ts | String | 推送时间,Unix epoch 毫秒。 |
{
"arg": {
"channel": "exchangeos-price-limit",
"assetId": "1234"
},
"data": [
{
"assetId": "1234",
"buyLmt": "52000",
"sellLmt": "48000",
"ts": "1710249600000"
}
]
}
深度频道#
exchangeos-books#
完整订单簿频道。首次推送完整快照 action: "snapshot",后续推送增量 action: "update"。
{
"op": "subscribe",
"args": [
{
"channel": "exchangeos-books",
"assetId": "1234"
}
]
}
每个档位为 [price, size, orderCount]。增量消息中 size: "0" 表示删除该价格档位。
| 字段 | 类型 | 说明 |
|---|---|---|
asks / bids | Array | 卖盘或买盘档位列表。 |
ts | String | 推送时间,Unix epoch 毫秒。 |
prevSeqId | Integer | 上一序列号。 |
seqId | Integer | 当前序列号。 |
客户端必须校验序列连续性:第一条 update 的 prevSeqId 必须等于快照 seqId;之后每条 update.prevSeqId 必须等于上一条 seqId。不连续时应重新订阅。60 秒无变化时,服务端可能发送 seqId == prevSeqId 的心跳帧。
{
"arg": {
"channel": "exchangeos-books",
"assetId": "1234"
},
"action": "update",
"data": [
{
"asks": [
["8477", "415", "3"]
],
"bids": [
["8476", "0", "0"]
],
"ts": "1710249600000",
"prevSeqId": 123455,
"seqId": 123456
}
]
}
exchangeos-books5#
推送前 5 档完整订单簿快照。盘口变化时推送,不具有增量语义,无需序列校验。
{
"op": "subscribe",
"args": [
{
"channel": "exchangeos-books5",
"assetId": "1234"
}
]
}
{
"arg": {
"channel": "exchangeos-books5",
"assetId": "1234"
},
"data": [
{
"asks": [
["8477", "415", "3"],
["8478", "7", "1"]
],
"bids": [
["8476", "256", "4"],
["8475", "101", "2"]
],
"assetId": "1234",
"ts": "1710249600000",
"seqId": 123456
}
]
}
exchangeos-bbo-tbt#
推送买一、卖一各一档的完整 BBO 快照,不是增量更新。BBO 变化时最快每 100 ms 推送一次;100 ms 窗口内的多次变化会合并。盘口无变化时,服务端约每 60 秒保底推送一次。
{
"op": "subscribe",
"args": [
{
"channel": "exchangeos-bbo-tbt",
"assetId": "1234"
}
]
}
{
"arg": {
"channel": "exchangeos-bbo-tbt",
"assetId": "1234"
},
"data": [
{
"asks": [
["8477", "415", "3"]
],
"bids": [
["8476", "256", "4"]
],
"assetId": "1234",
"ts": "1710249600000",
"seqId": 123457
}
]
}
预估永续结算价格频道 exchangeos-estimated-price#
该频道用于产品下架时推送预估结算价格。订阅成功后会推送当前快照;价格更新采用约 200 ms 的最小聚合窗口,同一 assetId 在窗口内仅推送最新值。无有效预估价格时,settlePx 返回空字符串。
价格无变化时不发送周期性行情心跳;连接保活使用公共 WebSocket 的 ping / pong。expTime、settleAt、status、settlePx、settleType 或其他公开字段变更时,服务端会推送完整对象。当前原始接口示例仅明确定义以下字段。
{
"op": "subscribe",
"args": [
{
"channel": "exchangeos-estimated-price",
"assetId": "9102"
}
]
}
| 字段 | 类型 | 说明 |
|---|---|---|
assetId | String | 永续合约资产 ID。 |
name | String | 产品名称。 |
marketType | String | 市场类型,例如 perp。 |
expTime | String | 预计下架或到期时间,Unix epoch 毫秒。 |
settlePx | String | 预估结算价格;尚无有效价格时为空字符串。 |
ts | String | 推送时间,Unix epoch 毫秒。 |
{
"arg": {
"channel": "exchangeos-estimated-price",
"assetId": "9102"
},
"data": [
{
"assetId": "9102",
"name": "UNI-USD-PERP",
"marketType": "perp",
"expTime": "1751990400000",
"settlePx": "6.4182",
"ts": "1751988600123"
}
]
}
- 公有WebSocket通用规范连接地址连接与心跳规则WebSocket 操作请求限流空闲断线与心跳数据类型约定订阅(subscribe)取消订阅(unsubscribe)通知消息(event = notice)行情频道 exchangeos-tickers成交频道 exchangeos-trades成交 K 线频道 exchangeos-candle{bar}标记价格 K 线频道 exchangeos-mark-price-candle{bar}指数行情频道 exchangeos-index-tickers指数 K 线频道 exchangeos-index-candle{bar}资金费率频道 exchangeos-funding-rate产品频道 exchangeos-instruments持仓总量频道 exchangeos-open-interest限价频道 exchangeos-price-limit深度频道exchangeos-booksexchangeos-books5exchangeos-bbo-tbt预估永续结算价格频道 exchangeos-estimated-price
