Skip to content

Quotes channel

/ws/quotes is a subscribe-only stream of marks. It exists so a client that needs a current price for many symbols doesn’t have to hold a full depth subscription for each one.

One Quote-Update per change, per venue and symbol:

{
"type": "Quote-Update",
"venue": "hyperliquid",
"symbol": "BTC",
"mid": "104213.5",
"bid": null,
"ask": null,
"last": null,
"source": "be_canonical",
"ts": "2026-05-24T18:30:00.000Z"
}

The mark is in mid, as a decimal string. bid, ask and last are reserved and always null today — take the inside quote from BBO-Update on /ws/market instead. ts is an ISO-8601 timestamp, not an epoch number. Futures and B3 symbols additionally carry marketStatus: "open" | "closed"; its absence means open.

Frame Purpose
Subscribe-Quote { venue, symbol } Start pushing one symbol.
Subscribe-Quotes-Bulk { items } Up to 200 { venue, symbol } pairs in one frame.
Unsubscribe-Quote { venue, symbol } Stop pushing one symbol.
Unsubscribe-All Drop every subscription on the socket.
Get-Quote { venue, symbol } One-shot read, no subscription.
Authenticate, Ping Optional handshake; heartbeat.

venue and symbol are separate fields — there is no venue:symbol string on the wire. Marks are public data, so no Authenticate frame is required; send one only to attach a scope to the connection.

You need Use
A price for a watchlist, a portfolio valuation, a PnL readout /ws/quotes
The book, the tape, or bar updates /ws/market

Valuing 200 positions over the quotes channel is one subscription set. Doing it over depth subscriptions is 200 books you don’t read.

The mark on this channel is the platform’s canonical price for a symbol — the same reference used for margin and for settling an internalised fill. Do not smooth or interpolate it before using it as a price of record; smooth it in your chart layer only.

?encoding=msgpack applies here too. It is worth taking on a large bulk subscription, where one frame per symbol adds up.