Skip to navigation

Ticker

Last price plus derived trailing 1h/24h statistics off the rolling-stats fold — the latest-image lane: subscribing pushes the current image immediately when the instrument has ever traded (a never-traded instrument acks live and its first image arrives with its first trade), updates re-render on trades (conflated per tier) and once per elapsed stream minute — the decay edge for quiet instruments; an active topic just gets one extra image at the edge — so on-screen windows decay with the stream’s consumed event-time frontier — never wall clock: under catch-up tickers slide at replay speed, a stalled stream halts decay and fires the frontier-lag alarm. seq/seqTs are fact provenance (the last trade folded — unchanged on decay re-renders); asOf is the frontier at render and advancing alone marks a frame as decay, not data.

URL wss://marketdata.immix.xyz/

Topic ticker.{symbol}

Topic parameterDescription
symbolrefdata’s canonical symbol, e.g. OKX@BTC/USDT

Request parameters

ParameterTypeRequiredDescription
opstringYessubscribe
reqIdstringNoclient correlation id, echoed verbatim on the ack
paramsobjectYes
> topicsarray of stringsYesthe dotted topic string, e.g. trade.OKX@BTC/USDT or candlestick.OKX@BTC/USDT.ONE_MINUTE.250ms

Response parameters

ParameterTypeRequiredDescription
opstringYesOne of auth, subscribe, unsubscribe, error.
reqIdstringNo
successbooleanYes
errorstringNoOne of auth_required, invalid_token, unknown_op, malformed, too_many_topics.
topicsarray of objectsNoanswers ride in request order — the correlator for entries whose topic could not compose (error rows echo the composed topic best-effort, absent parts empty)
> topicstringYes
> statestringYeslive: data flows now (latest-image lanes — tob, mark, funding, oi, ticker — answer live whether or not an image is held yet; the first image flows on arrival). syncing (book topics): the gateway holds no synced book yet — the snapshot is pushed unprompted the moment it syncs, at latest one connector restate interval. error on a plain (string-topic) row, no code: the topic composed nothing, and it never arms retroactively. Either the channel is outside the vocabulary or the tier suffix is outside the configured set (an unrecognized suffix reads as part of the symbol) — correct the topic — or the symbol is unknown to the gateway’s refdata fold (derivative symbols are refdata’s ccxt spelling BASE/QUOTE:SETTLE, e.g. OKX@BTC/USDT:USDT — there is no :SWAP form) — resubscribe once refdata holds the instrument. Composite rows: live iff every enabled source book is synced, stated within the topic’s output scales, AND every required FX pair is current (the full image pushes immediately); syncing otherwise, kept by the first tick at which the composite becomes computable — a source out for precision is named by a degraded frame at that tick, since syncing alone does not say it; a composite error row carries code. One of live, syncing, error, unsubscribed, not_subscribed.
> priceScaleintegerNocomposite live/syncing rows only — the resolved output price scale (max over all configured sources’ reference records, disabled included), bounding the fractional digits any price on the topic can carry; never padding. It holds until a status rescaled frame on the topic restates it
> qtyScaleintegerNocomposite rows only — the resolved output qty scale; as priceScale
> codestringNocomposite error rows only — the closed vocabulary clients parse; every validation failure maps to exactly one code. One of unknown_channel, bad_name, bad_tier, tier_required, name_in_use, unknown_instrument, duplicate_source, mixed_base_asset, unit_mismatch, bad_normalisation, bad_depth, bad_ladder, too_many_sources, budget_exceeded, malformed.
> messagestringNosupplementary human text naming the offending source or field — never something a client parses

Push data parameters

ParameterTypeRequiredDescription
eventstringYesticker
topicstringYes
seqstringYesprovenance global sequence, as a decimal string
seqTsstringYesprovenance sequencerTs, epoch-ns as a decimal string
dataobjectYes
> lastPxstringYesthe last traded price ever folded, an exact decimal string in shortest form at the scale the read-out holds it at — carried across quiet windows
> pctChange1hstring, nullableYes(lastPx − window open) / window open as an exact ratio at 4 decimals (-0.0132 = -1.32%), half-up, never through floating point; “0” for a warm window with no in-window trades; null while the window warms
> pctChange24hstring, nullableYes
> volume1hstring, nullableYesbase units, an exact decimal string in shortest form at the read-out’s quantity scale; null while the window warms
> volume24hstring, nullableYes
> turnover1hstring, nullableYesthe window’s quote notional in quote units, an exact decimal string at priceScale + qtyScale — 128-bit sums, never through floating point. Contract-aware: spot is the price × quantity sum verbatim; a linear contract (FUTURES, PERPETUAL_SWAP, QUANTO_*) is that sum times the instrument’s contractMultiplier, rounded half-even at the same scale; an inverse contract is volume × contractValue. Null while the window warms, and null — never 0, never the raw sum — when the rule cannot value the shape (an unstated multiplier or contract value, an option, an index).
> turnover24hstring, nullableYesthe same rule over the 24h window
> high24hstring, nullableYesthe 24h in-window high, an exact decimal string in shortest form at the read-out’s price scale; the carried last price when the warm window has no trades; null while warming
> low24hstring, nullableYes
> windowCompletebooleanYesthe 24h window’s completeness flag
> asOfstringYesthe consumed event-time frontier at render, epoch-ns as a decimal string — advances on decay re-renders while seq/seqTs stand still

Behaviour

Per-window completeness rides nullability (each window’s derived fields are null until that window’s history exists post-cold-start; windowComplete is the 24h flag); a warm window with no in-window trades is flat — zero sums, ratio “0”, extremes carried from the last trade.