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:
| Parameter | Matches |
|---|---|
address | The deposit sender, a linked account address, the refund address, or the destination address, as on limitOrders. |
symbol | The 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.