StandX Perps WebSocket API List
The WebSocket API provides two streams: Market Stream for market data and user account updates, and Order Response Stream for asynchronous order creation responses.
⚠️ This document is under construction.
Connection Management
Both WebSocket streams implement the following connection management behavior:
Ping/Pong Mechanism
- Server Ping Interval: The server sends a WebSocket Ping frame every 10 seconds
- Client Response: Clients must respond with a Pong frame when receiving a Ping
- Timeout: If the server does not receive a Ping/Pong response within 5 minutes, the connection will be terminated with error:
{ "code": 408, "message": "disconnecting due to not receive Pong within 5 minute period" }
Note: Most modern browsers and WebSocket libraries automatically handle ping/pong frames, so you might not need to implement this manually. However, if your environment doesn’t support automatic ping/pong handling, you can proactively send ping frames to the server. Example using the npm ws library:
import WebSocket from "ws";
// ...
private ws: WebSocket;
//...
ping(): void {
this.lastPingTime = Date.now();
this.ws.ping();
console.log(`[${new Date().toISOString()}] Ping server`);
}Market Stream
Base Endpoint: wss://perps.standx.com/ws-stream/v1
Available Channels
[
// public channels
{ channel: "price", symbol: "<symbol>" },
{ channel: "depth_book", symbol: "<symbol>" },
// user-level authenticated channels
{ channel: "order" },
{ channel: "position" },
{ channel: "balance" },
{ channel: "trade" },
]Subscribe to Depth Book
- Request:
{ "subscribe": { "channel": "depth_book", "symbol": "BTC-USD" } } - Response:
{ "seq": 3, "channel": "depth_book", "symbol": "BTC-USD", "data": { "asks": [ ["121896.02", "0.839"], ["121896.32", "1.051"] ], "bids": [ ["121884.22", "0.001"], ["121884.52", "0.001"] ], "symbol": "BTC-USD" } }
Subscribe to Symbol Price
- Request:
{ "subscribe": { "channel": "price", "symbol": "BTC-USD" } } - Response:
{ "seq": 13, "channel": "price", "symbol": "BTC-USD", "data": { "base": "BTC", "index_price": "121890.651250", "last_price": "121897.95", "mark_price": "121897.56", "mid_price": "121898.00", "quote": "DUSD", "spread": ["121897.95", "121898.05"], "symbol": "BTC-USD", "time": "2025-08-11T07:23:50.923602474Z" } }
Authentication Request
Log in with JWT
- Request:
{ "auth": { "token": "<your_jwt_token>", "streams": [{ "channel": "order" }] } }
auth.streamsis Optional, which enables the user to subscribe to specific channels right after authentication.
- Response:
{ "seq": 1, "channel": "auth", "data": { "code": 200, "msg": "success" } }
User Orders Subscription
- Request:
{ "subscribe": { "channel": "order" } } - Response:
{ "seq": 35, "channel": "order", "data": { "avail_locked": "0", "cl_ord_id": "01K2C9H93Y42RW8KD6RSVWVDVV", "closed_block": -1, "created_at": "2025-08-11T10:06:37.182464902Z", "created_block": -1, "fill_avg_price": "121245.21", "fill_qty": "1.000", "id": 2547027, "leverage": "15", "liq_id": 0, "margin": "8083.013333334", "order_type": "market", "payload": null, "position_id": 15, "price": "121245.20", "qty": "1.000", "reduce_only": false, "remark": "", "side": "buy", "source": "user", "status": "filled", "symbol": "BTC-USD", "time_in_force": "ioc", "updated_at": "2025-08-11T10:06:37.182465022Z", "user": "bsc_0x..." } }
User Position Subscription
- Request:
{ "subscribe": { "channel": "position" } } - Response:
{ "seq": 36, "channel": "position", "data": { "created_at": "2025-08-10T09:05:50.265265Z", "entry_price": "121677.65", "entry_value": "2879988.1154631481396099405228", "id": 15, "initial_margin": "191999.219856667", "leverage": "15", "margin_asset": "DUSD", "margin_mode": "isolated", "qty": "23.669", "realized_pnl": "158.197103148", "status": "open", "symbol": "BTC-USD", "updated_at": "2025-08-10T09:05:50.265265Z", "user": "bsc_0x..." } }
User Balance Subscription
- Request:
{ "subscribe": { "channel": "balance" } } - Response:
{ "seq": 37, "channel": "balance", "data": { "account_type": "perps", "created_at": "2025-08-09T09:36:54.504639Z", "free": "906946.976225666", "id": "bsc_0x...", "inbound": "0", "is_enabled": true, "kind": "user", "last_tx": "", "last_tx_updated_at": 0, "locked": "0.000000000", "occupied": "0", "outbound": "0", "ref_id": 0, "token": "DUSD", "total": "923207.752500717", "updated_at": "2025-08-09T09:36:54.504639Z", "version": 0, "wallet_id": "bsc_0x..." } }
Order Response Stream
This WebSocket channel provides real-time order status updates for the new order API. Since order creation is asynchronous, this channel notifies clients about order responses, including ALO order rejections.
Base Endpoint: wss://perps.standx.com/ws-api/v1
Request Structure
All WebSocket requests follow this structure:
{
"session_id": "<uuid>",
"request_id": "<uuid>",
"method": "<method>",
"header": {
"x-request-id": "",
"x-request-timestamp": "",
"x-request-signature": ""
},
"params": "<json string>"
}Fields:
session_id: UUID that remains consistent throughout the sessionrequest_id: Unique UUID for each requestmethod: Operation to perform (auth:login,order:new,order:cancel)header: Required fororder:newandorder:cancelmethods (authentication headers)params: JSON-stringified parameters specific to the method
Methods
auth:login
Authenticate using JWT token.
Parameters:
{ "token": "<jwt>" }Example Request:
{
"session_id": "consistent-session-id",
"request_id": "unique-request-id",
"method": "auth:login",
"params": "{\"token\":\"your.jwt.token\"}"
}order:new
Create a new order. Parameters are the same as the HTTP API new_order payload.
order:cancel
Cancel an existing order. Parameters are the same as the HTTP API cancel_order payload.
Order Response Format
Success Response:
{
"code": 0,
"message": "success",
"request_id": "bccc2b23-03dc-4c2b-912f-4315ebbbb7e0"
}Rejection Response:
{
"code": 400,
"message": "alo order rejected",
"request_id": "1187e114-1914-4111-8da1-2aaaa86bb1b9"
}