> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.immix.xyz/api-reference/market-data/index-price/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.immix.xyz/_mcp/server. # Index price **`Request — sent`** ```json title="Request — sent" { "op": "subscribe", "params": { "topics": [ "index.{pair}" ] } } ``` **`Response — received`** ```json title="Response — received" { "op": "subscribe", "success": true, "topics": [ { "topic": "index.{pair}", "state": "live" } ] } ``` **`Push data — received`** ```json title="Push data — received" { "event": "index", "topic": "index.{pair}", "seq": "", "seqTs": "", "status": "expired", "data": { "px": "", "methodology": "mid", "contributions": 0, "sourceTs": "" } } ``` Each frame is its shape, read off the contract: `` stands for a value, and a union shows its first form. **URL** `wss://marketdata.immix.xyz/` **Topic** `index.{pair}` | Topic parameter | Description | | --------------- | ------------------------------------- | | `pair` | BASE/QUOTE in refdata's asset tickers | ## Request parameters | Parameter | Type | Required | Description | | ---------- | ---------------- | -------- | ------------------------------------------------------------------------------------------------ | | `op` | string | Yes | `subscribe` | | `reqId` | string | No | client correlation id, echoed verbatim on the ack | | `params` | object | Yes | | | > `topics` | array of strings | Yes | the dotted topic string, e.g. trade.OKX\@BTC/USDT or candlestick.OKX\@BTC/USDT.ONE\_MINUTE.250ms | ## Response parameters | Parameter | Type | Required | Description | | -------------- | ---------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `op` | string | Yes | One of `auth`, `subscribe`, `unsubscribe`, `error`. | | `reqId` | string | No | | | `success` | boolean | Yes | | | `error` | string | No | One of `auth_required`, `invalid_token`, `unknown_op`, `malformed`, `too_many_topics`. | | `topics` | array of objects | No | answers ride in request order — the correlator for entries whose topic could not compose (error rows echo the composed topic best-effort, absent parts empty) | | > `topic` | string | Yes | | | > `state` | string | Yes | live: 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`. | | > `priceScale` | integer | No | composite 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 | | > `qtyScale` | integer | No | composite rows only — the resolved output qty scale; as priceScale | | > `code` | string | No | composite 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`. | | > `message` | string | No | supplementary human text naming the offending source or field — never something a client parses | ## Push data parameters | Parameter | Type | Required | Description | | ----------------- | ---------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `event` | string | Yes | `index` | | `topic` | string | Yes | | | `seq` | string | Yes | the envelope's global sequence, as a decimal string | | `seqTs` | string | Yes | | | `status` | string | No | `expired` present instead of data when the pair's value crossed the 30 s arrival window — no current price exists, indefinitely, until the domain publishes again (deliberately not "stale": the book channel's word means a bounded heal is coming) | | `data` | object | No | | | > `px` | string | Yes | the index price, an exact decimal at the schema's fixed 1e-8 scale | | > `methodology` | string, nullable | Yes | how the value was derived; override marks an operator price. One of `mid`, `bid`, `ask`, `simple_average`, `override`, `mirrored`. | | > `contributions` | integer | Yes | live venue contributions in the value; 0 for override | | > `sourceTs` | string, nullable | Yes | the freshest contributing exchange timestamp (a foreign clock); null for override facts, which have no market source | ## Behaviour Subscribing pushes the current image when one exists (ack "live"); a pair with no current price acks "syncing" — a promise satisfied by the first published fact, which for a pair the domain publishes arrives within one restate interval (5 s), and which for a pair the domain has filtered out or holds all-stale never resolves (the two are indistinguishable by the domain's own contract). A value expires 30 s after arrival: the gateway then pushes one \{"status":"expired"} marker and the topic falls silent until the domain publishes again. Venue-addressed forms (index.EXCHANGE\@SYMBOL) are RESERVED for the exchange-observed index datum and answer per-topic errors until it lands. > The internal index price, PAIR-addressed — a bare BASE/QUOTE with no @, e.g. index.BTC/USDT — the venue-less datum the indexprice domain computes and owns (methodology, contribution count and freshest source time ride every event; an operator override shows methodology "override" with contributions 0).