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 matchingrealtime-subscription-accepted/v1 frame arrives.
Data frame
The envelope isrealtime-stream/v1; its payload validates against RealtimeMarketsPricesPayload.
Worked example
- Send the subscribe envelope with request id
subscribe-markets-prices. - Wait for the accepted frame with the same request id; receiving any other frame does not prove this subscription.
- Process the data frame at sequence
1and validate its payload asRealtimeMarketsPricesPayload.