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.HL",
"mid": "104213.5",
"bid": null,
"ask": null,
"last": null,
"source": "be_canonical",
"ts": "2026-05-24T18:30:00.000Z"
}

symbol is the venue-suffixed ticker — the same canonical string GET /api/v1/symbols/{venue} returns, not the bare asset. Asking for BTC instead of BTC.HL is answered Result { ok: false, error: "mark_unavailable" }, because there is no mark cached under a symbol the platform does not use.

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. Get-Quote answers with the Quote-Update first and its Result { ok: true } after, so read the quote off the update rather than waiting for the ack to carry it; a symbol with no mark answers mark_unavailable and no update at all.

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.