markets.prices is a public markets-scoped channel. Authentication: none. Payload schema: RealtimeMarketsPricesPayload. Source status: derived. One subscription carries every market; send no marketId. The first frame after the accepted frame has kind: "snapshot": it replaces everything you held and holds the latest price of every market that has priced since this server process started (no frame is sent before the first price exists). A market missing from the snapshot has no price on this connection yet: show it as missing, never as a price. Every later frame has kind: "update" and holds only the markets whose price changed in that 250 ms window: the latest price per market, never an average, at most four frames a second, and no frame for a window in which nothing changed. Per market, keep the item with the higher journalSequence and ignore one that is equal or lower. Never order by epoch: it restarts at 1 when the venue restarts. receivedAtEpochMs says how old a price is, so use it to show a price as stale. Nothing is replayed: after a gap or a reconnect, subscribe again and start from the new snapshot.

Subscribe envelope

Send this exact JSON shape. requestId is required and there is no action field. The series field is not sent for this channel.

Accepted frame

The subscription is active only after a matching realtime-subscription-accepted/v1 frame arrives.

Data frame

The envelope is realtime-stream/v1; its payload validates against RealtimeMarketsPricesPayload.

Worked example

  1. Send the subscribe envelope with request id subscribe-markets-prices.
  2. Wait for the accepted frame with the same request id; receiving any other frame does not prove this subscription.
  3. Process the data frame at sequence 1 and validate its payload as RealtimeMarketsPricesPayload.