Skip to main content
Subscribe inputs and receive frames for the unified fills 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
kalshi321
polymarket240

Subscribe payload

Fieldkalshi sourcepolymarket sourceNotes
market_id#/components/messages/subscribeCommand#/components/messages/userSubscriptionRequestkalshi: Requires enable_user_fills=true on the Kalshi WS constructor (private fill channel auto-attaches to every subscribe(market_ticker)). polymarket: Polymarket markets[*] (condition_id) on the user channel. Auth is required: API key + secret + passphrase derived from the L1-signed CLOB credentials.
outcomeomittedsynthetickalshi: Fill frames carry side and the matched outcome; OpenPX reads it directly into ActivityFill.outcome. polymarket: Populated only when register_outcomes was called; otherwise None.

Receive messages

Variantkalshi sourcepolymarket sourceNotes
Fill#/components/messages/fill#/components/messages/tradekalshi: Authenticated Kalshi fill — mapped to ActivityFill \{ source_channel: "kalshi_user_fill", liquidity_role: Maker|Taker \}. polymarket: Polymarket user-channel trade event = a fill from the user’s perspective. Mapped to ActivityFill \{ source_channel: "polymarket_user_trade" \} with liquidity_role derived from trader_side.

Session events

Variantkalshi sourcepolymarket sourceNotes
Connectedsyntheticsynthetic
Reconnectedsyntheticsynthetic
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.