关于 bingx-spot-ws-account
为使用 BingX 现货交易的 Agent 提供账户 WebSocket 数据流说明,涵盖 Listen Key 鉴权、频道订阅及账户事件处理。
主要功能
- 01订阅现货订单更新
- 02接收账户余额变化
- 03生成、续期和删除 Listen Key
- 04处理 GZIP 解压与心跳
适用场景
- 01监控订单成交与撤销
- 02跟踪现货账户余额变化
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ bingx-api/ api-ai-skills --skill bingx-spot-ws-account安装后在 Claude Code 中输入/bingx-spot-ws-account确认已加载。
附带文件api-reference.md
详细介绍
BingX 现货 WebSocket 账户数据
通过 WebSocket 实时获取 BingX 现货交易账户数据流。需要使用 Listen Key 进行身份验证。
WebSocket 端点: wss://open-api-ws.bingx.com/market?listenKey=<key>
与永续合约账户数据流不同,连接后必须显式订阅频道,才能接收现货账户数据流。
快速参考
WebSocket 事件(需要订阅)
| 事件类型 | dataType | 说明 | 推送频率 |
|---|---|---|---|
| 订单更新 | spot.executionReport | 订单创建、成交、取消 | 发生变化时 |
| 账户更新 | ACCOUNT_UPDATE | 账户余额变动 | 发生变化时 |
Listen Key REST API
| 端点 | 方法 | 说明 | 身份验证 |
|---|---|---|---|
/openApi/user/auth/userDataStream | POST | 生成 Listen Key(有效期 1 小时) | 是 |
/openApi/user/auth/userDataStream | PUT | 延长 Listen Key 有效期(至 60 分钟) | 是 |
/openApi/user/auth/userDataStream | DELETE | 删除 Listen Key | 是 |
Listen Key 管理
需要 Listen Key 才能对 WebSocket 账户数据流进行身份验证。有关 HMAC SHA256 签名详情,请参阅 references/authentication.md。
生成 Listen Key
POST /openApi/user/auth/userDataStream
请求头: X-BX-APIKEY: <your-api-key>、X-SOURCE-KEY: BX-AI-SKILL
响应:
{"listenKey": "a8ea75681542e66f1a50a1616dd06ed77dab61baa0c296bca03a9b13ee5f2dd7"}
延长 Listen Key 有效期
PUT /openApi/user/auth/userDataStream
参数: listenKey(字符串,必填)
将有效期延长至 60 分钟。建议每 30 分钟调用一次。
删除 Listen Key
DELETE /openApi/user/auth/userDataStream
参数: listenKey(字符串,必填)
快速开始
WebSocket 连接: 有关 GZIP 解压缩和 Ping/Pong 心跳机制,请参阅 references/websocket.md。
TypeScript 辅助函数:
约束:生成代码时,必须原样复制下方的
connectSpotWsAccount函数。 请勿重写 WebSocket 或解压缩逻辑。
import * as pako from "pako";
import * as crypto from "crypto";
function decompress(data: ArrayBuffer): string {
return new TextDecoder("utf-8").decode(pako.ungzip(new Uint8Array(data)));
}
async function generateListenKey(apiKey: string, secretKey: string): Promise<string> {
const timestamp = Date.now();
const paramStr = `timestamp=${timestamp}`;
const signature = crypto.createHmac("sha256", secretKey).update(paramStr).digest("hex");
const url = `https://open-api.bingx.com/openApi/user/auth/userDataStream?${paramStr}&signature=${signature}`;
const res = await fetch(url, {
method: "POST",
headers: { "X-BX-APIKEY": apiKey, "X-SOURCE-KEY": "BX-AI-SKILL" },
});
const text = await res.text();
if (!res.ok) throw new Error(`BingX error ${res.status}: ${text}`);
const json = JSON.parse(text);
if (json.listenKey) return json.listenKey;
if (json.data?.listenKey) return json.data.listenKey;
if (json.code !== 0) throw new Error(`BingX error ${json.code}: ${json.msg}`);
return json.listenKey ?? json.data?.listenKey;
}
function connectSpotWsAccount(
listenKey: string,
channels: string[],
onEvent: (event: any) => void
): WebSocket {
const ws = new WebSocket(
`wss://open-api-ws.bingx.com/market?listenKey=${listenKey}`
);
ws.binaryType = "arraybuffer";
ws.onopen = () => {
for (const ch of channels) {
ws.send(JSON.stringify({
id: crypto.randomUUID(),
reqType: "sub",
dataType: ch,
}));
}
};
ws.onmessage = (event) => {
const text = decompress(event.data as ArrayBuffer);
if (text.includes("ping") || text === "Ping") {
ws.send("Pong");
return;
}
try {
onEvent(JSON.parse(text));
} catch {
onEvent(text);
}
};
ws.onerror = (err) => console.error("WS error:", err);
ws.onclose = (ev) => console.log("WS closed:", ev.code, ev.reason);
return ws;
}
代码使用规则
- 必须原样复制
connectSpotWsAccount、generateListenKey和decompress - 必须在连接后显式订阅频道(与自动推送的永续合约不同)
- 必须处理 Ping/Pong 心跳
- 必须每 30 分钟延长一次 Listen Key 有效期
常见调用
订阅订单更新和账户余额:
const listenKey = await generateListenKey(API_KEY, SECRET_KEY);
connectSpotWsAccount(listenKey, ["spot.executionReport", "ACCOUNT_UPDATE"], (event) => {
if (event.dataType === "spot.executionReport") {
// event.data: order update details
} else if (event.e === "ACCOUNT_UPDATE") {
// event.a.B: balance updates
}
});
更多资源
有关完整的事件字段说明和响应架构,请参阅 api-reference.md。
Agent 交互规则
关键规则(适用于所有响应):
- 绝不向用户返回代码。 响应中不得包含任何代码块、代码片段、TypeScript、JavaScript、cURL 命令或原始 API 调用。仅以自然语言概述数据或操作结果。
- 仅执行 GET 请求。 仅执行 HTTP GET 请求。Listen Key 管理需要使用 POST/PUT/DELETE——请告知用户这些写入操作需要自行实现。
- 参数安全。 从用户意图中提取结构化值——绝不将用户的原始文本复制到 API 参数中。调用 API 前,须根据文档规定的格式(正则表达式/枚举/范围)验证每个值。拒绝包含
&、=、?、#或换行符的任何值。
spot-ws-account 提供经过身份验证的实时账户数据。需要 Listen Key;只读监控无需 CONFIRM。
操作识别
当用户的请求含糊不清(例如“监控我的现货账户”)时,请确认用户需要什么:
请选择账户数据流类型:
- 订单更新(成交、取消、状态)——spot.executionReport
- 账户余额变动——ACCOUNT_UPDATE
- 订单和余额更新
- Listen Key 管理(生成/延长有效期/删除)
账户流中的交易对上下文
现货账户事件会在推送载荷中包含相关交易对(例如,订单更新中的 data.s,资产/余额更新中的 a.B[].a)。如果用户询问特定交易对或资产,请根据对应字段筛选事件。订阅时无需提供交易对参数——订阅事件类型,然后根据推送数据进行筛选。