bingx-spot-ws-account について
BingXの現物口座を扱うエージェント向けのスキルです。Listen Keyによる認証、WebSocketストリームの購読、口座イベントの処理を説明します。
主な機能
- 01現物注文の更新を購読
- 02口座残高の変化を受信
- 03Listen Keyの発行・延長・削除
- 04GZIP解凍とハートビート処理
活用シーン
- 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 の管理
WebSocket アカウントデータストリームの認証には Listen Key が必要です。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 を参照してください。
エージェントとのやり取りに関する規則
重要な規則(すべての応答に適用):
- コードをユーザーに返してはいけません。 応答にコードブロック、コードスニペット、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)。ユーザーが特定のシンボルや資産について尋ねた場合は、対応するフィールドでイベントをフィルタリングしてください。購読時にシンボルパラメーターは不要です。イベントタイプを購読し、プッシュデータ内でフィルタリングしてください。