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
| Stream | Use 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