Skip to main content
Subscribe inputs and receive frames for the unified trades WebSocket channel, crosswalked against the upstream AsyncAPI specs cached under schema/upstream/. Every source entry is one of three types — direct (taken from upstream), synthetic (constructed by OpenPX), or omitted (not exposed upstream).

Coverage

ExchangeDirectSyntheticOmitted
kalshi331
polymarket250

Subscribe payload

Fieldkalshi sourcepolymarket sourceNotes
market_id#/components/messages/subscribeCommand#/components/messages/subscriptionRequestkalshi: Kalshi auto-subscribes the trade channel alongside orderbook_delta on every subscribe(market_ticker) call. polymarket: Polymarket assets_ids[*]. The market channel emits last_trade_price for the asset; trades on the user channel surface as fills, not trades.
outcomeomittedsynthetickalshi: Trade frames carry side and taker_side; outcome (YES/NO) is implicit per Kalshi binary market. polymarket: Populated only when register_outcomes(yes_token, no_token) was called. Otherwise ActivityTrade.outcome is None.

Receive messages

Variantkalshi sourcepolymarket sourceNotes
Trade#/components/messages/trade#/components/messages/lastTradePricekalshi: Public Kalshi trade frame — exchange-side fills (any maker/taker pair). Mapped to ActivityTrade \{ source_channel: "kalshi_public_trade" \}. polymarket: Polymarket last_trade_price carries the most recent trade for an asset. Mapped to ActivityTrade \{ source_channel: "polymarket_last_trade_price" \}.

Session events

Variantkalshi sourcepolymarket sourceNotes
Connectedsyntheticsynthetic
Reconnectedsyntheticsynthetic
Laggedsyntheticsynthetic
Error#/components/messages/errorResponsesynthetic

Source specs

Tables are auto-generated from schema/mappings/. CI fails if any direct ref no longer resolves in the cached upstream AsyncAPI spec; the daily upstream-refresh PR surfaces drift here.