Skip to Content
Usage ExamplesWebsockets

WebSockets

The Nord application provides real-time data streaming via WebSocket connections.

[!NOTE] Full API Reference: See REST API WebSockets for detailed message schemas and Python examples.

Stream Types

StreamUse Case
candle@{symbol}:{resolution}Chart candlestick data
trades@{symbol}Live trade feed
deltas@{symbol}Orderbook updates
account@{account_id}Account activity (fills, orders)

Candle Data Streaming

const nordUrl = "wss://zo-mainnet.n1.xyz"; const symbol = "SOLUSD"; const resolution = "1"; // 1 minute candles const socket = new WebSocket(`${nordUrl}/ws/candle@${symbol}:${resolution}`); interface CandleUpdate { res: string; mid: number; t: number; o: number; h: number; l: number; c: number; v?: number; } socket.onmessage = (event) => { const candle: CandleUpdate = JSON.parse(event.data); console.log(`OHLC: ${candle.o} / ${candle.h} / ${candle.l} / ${candle.c}`); };

Trade Stream

const socket = new WebSocket("wss://zo-mainnet.n1.xyz/ws/trades@BTCUSD"); interface TradeMessage { trades: { market_symbol: string; trade_id: number; price: number; base_size: number; taker_side: "bid" | "ask"; time: string; }; } socket.onmessage = (event) => { const { trades }: TradeMessage = JSON.parse(event.data); const side = trades.taker_side === "bid" ? "BUY" : "SELL"; console.log(`${side} ${trades.base_size} @ $${trades.price.toFixed(2)}`); };

Orderbook Deltas

const socket = new WebSocket("wss://zo-mainnet.n1.xyz/ws/deltas@BTCUSD"); interface DeltaMessage { delta: { market_symbol: string; update_id: number; bids: [number, number][]; // [price, size] asks: [number, number][]; }; } // Local orderbook state const orderbook = { bids: new Map<number, number>(), asks: new Map<number, number>() }; socket.onmessage = (event) => { const { delta }: DeltaMessage = JSON.parse(event.data); delta.bids.forEach(([price, size]) => { size === 0 ? orderbook.bids.delete(price) : orderbook.bids.set(price, size); }); delta.asks.forEach(([price, size]) => { size === 0 ? orderbook.asks.delete(price) : orderbook.asks.set(price, size); }); };

Account Updates

const accountId = 42; // Your Nord account ID const socket = new WebSocket(`wss://zo-mainnet.n1.xyz/ws/account@${accountId}`); interface AccountMessage { account: { account_id: number; update_id: number; fills: Record<string, { order_id: number; quantity: number; price: number }>; places: Record<string, { market_id: number; side: string; price: number; current_size: number }>; cancels: Record<string, unknown>; balances: Record<string, { token_id: number; amount: number }>; }; } socket.onmessage = (event) => { const { account }: AccountMessage = JSON.parse(event.data); Object.values(account.fills).forEach(fill => { console.log(`Order ${fill.order_id} filled: ${fill.quantity} @ $${fill.price}`); }); Object.entries(account.places).forEach(([id, order]) => { console.log(`Order ${id}: ${order.side} ${order.current_size} @ $${order.price}`); }); Object.keys(account.cancels).forEach(id => { console.log(`Order ${id} cancelled`); }); };

Multi-Stream Connection

Subscribe to multiple streams in one connection:

const streams = "trades@BTCUSD&deltas@BTCUSD&account@42"; const socket = new WebSocket(`wss://zo-mainnet.n1.xyz/ws/${streams}`); socket.onmessage = (event) => { const data = JSON.parse(event.data); if ("trades" in data) { // Handle trade } else if ("delta" in data) { // Handle orderbook update } else if ("account" in data) { // Handle account update } };
Last updated on