Skip to main content

Trading order update websocket

Connect to wss://quote.harbor.xyz/trading/fills to receive live snapshots of public limit orders. Browser clients may connect from any origin; the endpoint does not require cookies or credentials.

Each message describes the owner's order, with cumulative filled quantity, average execution price, and current status. Updates include partial fills, full fills, and cancellations, whether the order executed as maker or taker. No trade IDs, counterparty order IDs, or individual executions are sent.

The stream covers the same Harbor limit-order set as GET /api/v1/trading/limitOrders: signed trading and deposit-initiated limit orders, excluding swap orders and raw exchange market maker orders. No API key is required. The URL retains its original /trading/fills name.

Both query filters are optional and can be combined:

ParameterMatches
addressThe deposit sender, a linked account address, the refund address, or the destination address, as on limitOrders.
symbolThe exact market symbol, such as BTC-USDT.

Use your address to follow your own orders. Without filters, the connection receives all public order updates. These filters select public data; they are not authentication.

Example message:

{
"clientOrderId": "trd-example",
"symbol": "BTC-USDT",
"side": "sell",
"type": "limit",
"timeInForce": "gtc",
"qty": "1.0",
"price": "100.0",
"status": "open",
"filledQty": "0.25",
"averagePrice": "101.0",
"createdAt": "1782925100000000000",
"updatedAt": "1782925200000000000"
}

A partially filled GTC order remains open while its remainder can trade. Completion changes the status to filled; cancellation results in cancelled if nothing filled, or the terminal partially_filled status if some quantity filled before cancellation.

Messages reflect processed order state. clientOrderId identifies your order; replace its previous state with the new snapshot rather than adding filledQty. Quantities and prices are decimal strings. averagePrice is the cumulative execution value divided by filled quantity, or "0.0" before any fills. Timestamps are Unix nanosecond decimal strings for the order. Repeated snapshots are possible. REST can already contain a newer state if another update has arrived.

The websocket is live only: it sends no initial snapshot and stores no replay history. Connect first, fetch your orders through REST, then apply queued updates without replacing newer state with older updatedAt values. On every reconnect, repeat this reconciliation using GET /api/v1/trading/limitOrders, GET /api/v1/trading/limitOrder/{client_order_id}, or signed list_orders. Connections may close during service interruptions or if clients cannot keep up with updates. Reconcile after reconnecting. During an interruption, REST may return stale state; refresh it again after recovery.

Clients must process WebSocket ping frames and respond with pong frames (browsers do this automatically). Connection and rate limits apply. Reuse connections, retry rejected handshakes with backoff and jitter, and reconcile through REST after reconnecting.