Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.adipredictstreet.com/llms.txt

Use this file to discover all available pages before exploring further.

Every server-to-client push uses the same canonical envelope:
{
  "type": "<event_type>",
  "sid": 12,
  "channel": "token_trade_matches",
  "id": "60550363974013526...",
  "serverTs": 1778783112456,
  "data": { ... }
}
FieldMeaning
typeConcrete event type (e.g. trade_matched, trade_settled, book_snapshot, platform_status)
sidConnection-local subscription id you got from the subscribed response
channelOne of the channel names from the catalog
idThe token / condition / vault / system id that matched (omitted on wallet-scoped channels — user_orders, user_fills)
serverTsServer wall-clock at frame emission, ms since epoch. Present on every outbound frame — including connected, ACKs, errors, and pong. Use as an authoritative ordering anchor between events arriving on the two transports (the REST companion is the X-Server-Time header).
seqMonotonic per-channel sequence number — present on book_snapshot / book_update / book_delta (matcher’s per-token counter). A jump greater than 1 on the same id means a frame was missed and the client should resync. Other event types omit it.
hashCanonical 16-hex SHA-256 prefix of the book state on book_snapshot / book_update. The same hash is returned by GET /api/markets/{symbol}/orderbook — clients can compare WS view against REST snapshot to detect drift. book_delta deliberately omits the hash (a delta is a transformation, not a state snapshot).
dataEvent-specific payload (see below). Public events carry tokenId + conditionId + outcomeIndex so clients can render by either identifier; resolve symbols through REST if needed. Timestamps in data are emitted as tsMs (number, ms since epoch).
Use sid to route inside your client; use id to identify which specific subscribed entity the event belongs to.

Event catalog

user_orders (/ws/user, no id)

typedata
order_placedexchange payload verbatim
order_cancelledexchange payload verbatim

user_fills (/ws/user, no id)

typedata
user_fillmatch-time notification (matcher) — { walletAddress, side: 'buy' | 'sell', tradeId, orderId, clientOrderId?, tokenId, conditionId, outcomeIndex, price, quantity, source: 'matcher', tsMs }. fee / txHash / blockNumber / on-chain orderHash are intentionally omitted; poll GET /api/me/trades for the post-settlement view with resolved fee. Full payload reference: user_fill.

vault_positions (/ws/user, ids = vault address[])

typedata
vault_position_balance_changed{ vaultAddress, tokenId, conditionId, outcomeIndex, balanceAfter, reason, txHash, blockNumber, tsMs } — emitted on any ERC-1155 mirror change for the vault
vault_position_split{ vaultAddress, conditionId, collateralToken, amount, txHash, blockNumber, tsMs }
vault_position_merged{ vaultAddress, conditionId, collateralToken, amount, txHash, blockNumber, tsMs }
vault_position_redeemed{ vaultAddress, conditionId, payouts, txHash, blockNumber, tsMs }payouts is an { [outcomeIndex]: amount } map; multi-outcome (neg-risk) redeems can pay both YES and NO in the same event
vault_position_balance_changed.reason is a 4-byte ASCII tag from the upstream chain producer. Known values: "OUTF" (output filled — trade-side credit), "INFL" (non-trade inflow), "SPLT" / "MERG" / "REDM" (split / merge / redeem), "XFER" (direct ERC-1155 transfer). The list is open-ended; treat unknown tags as a generic balance change.

token_trade_matches (/ws/market, id = tokenId)

typedata
trade_matched{ tokenId, conditionId, outcomeIndex, tradeId, price, quantity, side, source: "matcher", tsMs }
Fires the moment the matcher prints a trade — fastest tape feed.

token_trade_settlements (/ws/market, id = tokenId)

typedata
trade_settled{ tokenId, conditionId, outcomeIndex, orderHash, txHash, blockNumber, price, quantity, side, source: "chain", tsMs }
Fires when chain-watcher indexes the on-chain OrderFilled event for the matched trade. Use this for accounting-grade trade confirmations. Example:
{
  "type":    "trade_settled",
  "sid":     13,
  "channel": "token_trade_settlements",
  "id":      "12345...",
  "data": {
    "tokenId":      "12345...",
    "conditionId":  "0xabc...",
    "outcomeIndex": 0,
    "orderHash":    "0x84a930f9e902ae91...",
    "txHash":       "0xc01780b2c76494d8...",
    "blockNumber":  1234567,
    "price":        "0.52",
    "quantity":     "30",
    "side":         "buy",
    "source":       "chain",
    "tsMs":         1776949200000
  }
}

token_book (/ws/market, id = tokenId)

typedata
book_snapshot{ tokenId, conditionId, outcomeIndex, bids, asks, seq, tsMs } — initial state on subscribe (depth 100)
book_update{ tokenId, conditionId, outcomeIndex, seq, prevSeq, bids, asks, tsMs } — full top-of-book state at seq
book_delta{ tokenId, conditionId, outcomeIndex, seq, prevSeq, changes, tsMs } — diff against prevSeq; only emitted when the gateway has contiguous local book state
book_snapshot_failed{ tokenId, reason, tsMs } — snapshot fetch could not be completed (response to get_book_snapshot)
seq is monotonically increasing. After subscribe the server pushes one book_snapshot (depth 100), then book_update events. book_delta is emitted only when local book state is contiguous — the gateway will not emit a divergent delta on a missed frame. If your client sees a book_delta gap (delta.prevSeq != last_seen_seq) or no updates for a market you’d expect to be active, issue get_book_snapshot to force a fresh snapshot. See Reconnect — orderbook resync. Both book_snapshot and book_update envelopes carry a hash field (16-hex truncated SHA-256 over canonical (bids, asks) — price + quantity only, count excluded). The same hash function is applied to the REST orderbook response. A client that maintains its own book view can hash it the same way and compare against the envelope hash to detect drift between the WS-applied state and the authoritative server view. book_delta envelopes omit hash because applying a delta does not produce a state snapshot — instead, compare your post-apply local hash against the next book_update.hash.

token_ohlc (/ws/market, id = tokenId)

typedata
ohlc_update{ tokenId, conditionId, outcomeIndex, interval: "s5", time, open, high, low, close, volume, isClosed, tsMs }
Rolling 5-second candles emitted by the matcher whenever a trade prints inside the active window. isClosed: false while the bar is still accumulating; isClosed: true is the final tick of the bar.

condition_lifecycle (/ws/market, id = conditionId)

typedata
market_paused{ conditionId, txHash?, blockNumber?, tsMs } — fired once on the chain transition into a paused state
market_unpaused{ conditionId, txHash?, blockNumber?, tsMs } — fired once on the chain transition out of a paused state
market_resolved{ conditionId, resolution, payouts?, txHash?, blockNumber?, tsMs } — fired once when oracle resolves the condition
market_status{ conditionId, status, reason?, tsMs } — current authoritative status (catch-all). status is one of OPEN, PAUSED, RESOLVED, EXPIRED, etc.
market_paused / market_unpaused / market_resolved are chain-anchored transitions (one push per on-chain change, with txHash evidence). market_status is the current-state mirror — emitted on subscribe and on every status change. Route by what you need: audit trail → transitions; UI badge → market_status.

system (/ws/market, id = "platform_status")

typedata
platform_statuspassthrough payload from the platform-status producer
Example:
{
  "type": "platform_status",
  "sid": 15,
  "channel": "system",
  "id": "platform_status",
  "data": {
    "frozen": true,
    "reason": "scheduled-maintenance",
    "since": "2026-04-23T18:00:00Z",
    "etaUnfreeze": "2026-04-23T18:30:00Z"
  }
}