Unreleased
Breaking
-
market_idparameter renamed tomarket_tickeracross the REST surface. Every trait method, request struct (OrderbookRequest,PriceHistoryRequest,TradesRequest,OrderbookHistoryRequest,MidpointRequest,UserTradesRequest,NewOrder,FetchOrdersParams), and unified output model (Order,Position,Fill,MarketTrade,Orderbook,OrderbookSnapshot,UserTrade) now usesmarket_tickerto make explicit that the value is a unified ticker (Kalshi market ticker / Polymarket slug) — never a numeric id. WebSocket layer keepsmarket_id(WsUpdate::{Snapshot,Delta,Clear},SessionEvent::BookInvalidated,ActivityTrade,ActivityFill) since the streamed value is the parent condition_id on Polymarket, not a ticker.FetchMarketsParams.tickersrenamed tomarket_tickersfor the same reason.Polymarket.neg_risk_market_idis unchanged (Polymarket-specific internal id). -
fetch_event,fetch_events,fetch_series,fetch_series_oneremoved; replaced byfetch_market_lineage(ticker) -> MarketLineage { market, event, series }. One call returns the market plus its parent event and series;eventandseriesareOption, so a dangling parent reference yieldsNonerather than failing the whole call. Kalshi pays 1–3 sequential round-trips (market → event → series); Polymarket pays 2 (the event payload embeds the parent series). -
EventandSeriesidentifier rename —id/slugcollapsed intoticker; Polymarket numeric REST ids move tonumeric_id. Matches the discipline already in place onMarket. Also:Event.series_id→Event.series_ticker;Event.market_ids→Event.market_tickers. Numeric event/series ids on Polymarket now live onnumeric_id(None on Kalshi). -
EventsRequestandSeriesRequestremoved along with the four trait methods;ExchangeInfoflagshas_fetch_event,has_fetch_events,has_fetch_series,has_fetch_series_onecollapsed intohas_fetch_market_lineage. -
fetch_marketremoved;fetch_marketsnow handles single- and multi-ticker lookups. Passtickers: ["…"](aVec<String>of Kalshi tickers or Polymarket slugs) for an explicit lookup — single round-trip, no pagination. Kalshi calls/markets?tickers=…; Polymarket calls/markets?slug=…&slug=…. -
FetchMarketsParams.series_idrenamed toseries_ticker. Slug-semantic on both venues. Kalshi continues to filter by series ticker upstream; Polymarket ignores this field for now and will gain support via a futureseries_numeric_idfield that maps to Polymarket’s numeric series id. -
FetchMarketsParams.event_tickeris slug-only on Polymarket. Numeric event ids are no longer accepted and will be supported via a futureevent_numeric_idfield. Kalshi event tickers are unchanged. -
Polymarket CLOB V2 + pUSD migration (cutover 2026-04-28 ~11:00 UTC) —
no V1 backward compatibility. The OpenPX Polymarket adapter now depends
on
polymarket_client_sdk_v2 = "=0.5.1"and signs orders against the V2 EIP-712 domain (version: "2"). The order struct dropsnonce,feeRateBps, andtaker; addstimestamp(ms),metadata(bytes32), andbuilder(bytes32). Trading collateral is now pUSD (not USDC.e); approvals + balance reads target0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB. V1 builder-promotion (HMAC headers on order signing) is removed; builder attribution moves into the signed order’sbuilderfield viaSdkConfig::builder().builder_code(...). RelayerPOLY_BUILDER_*HMAC headers are preserved for gasless tx auth (per the Polymarket migration guide). (#54)
Added
- core: 14 new unified
Exchangetrait methods scaffolded (defaultErr(NotSupported)); per-venue impls land in follow-up PRs. New surface:fetch_events,fetch_event,fetch_series,fetch_series_one,fetch_market_tags,fetch_orderbooks_batch,fetch_midpoint,fetch_midpoints_batch,fetch_spread,fetch_last_trade_price,fetch_open_interest,fetch_user_trades,cancel_all_orders,create_orders_batch. New models:Event,Series,SettlementSource,Tag,Spread,LastTrade,UserTrade. New request types:EventsRequest,SeriesRequest,MidpointRequest,UserTradesRequest,NewOrder. (#56) - core:
Exchange::fetch_server_time()returns each venue’s wall-clock asDateTime<Utc>for clock-skew correction in signing-sensitive paths.ExchangeInfogainshas_fetch_server_time: bool. (#26)
Fixed
- sdk: TypeScript
models.d.tswas a 13-line empty stub; the codegen now emits all 35+ interfaces (ExchangeInfo,Market,Fill,WsUpdate,OrderStatus, and more). (#34)
0.2.6 — 2026-04-24
Breaking
- Polymarket
Market.idis now thecondition_idhex string (e.g.0x311d0c4b…), not the numeric REST id. Callers that need the numeric id should readMarket.native_numeric_idinstead.
0.2.5 — 2026-04-23
Breaking
WsUpdate::Snapshot.market_idandDelta.market_idcarry the parent condition ID on Polymarket (not the CLOB token). Consumers keying bymarket_idexpecting a token should switch to the newasset_idfield.- Kalshi
fetch_marketscursor format changed. Old 0.2.3 cursors are rejected; restart pagination after upgrading.
Added
- New
WsUpdate::Clearvariant withInvalidationReasonfor per-market book invalidation on the same stream asSnapshot/Delta. - Reconnect parity across all exchanges.
Fixed
- Kalshi
fetch_marketsrewritten on/markets+/historical/markets.
0.2.0 — 2026-04-22
Breaking
- WebSocket surface rewritten. Per-token
orderbook_stream(token_id)andactivity_stream(token_id)are gone. Consumers now readws.updates()(multiplexedWsUpdate) andws.session_events()(connection-levelSessionEvent). - Both stream methods are take-once — calling either twice returns
None(Rust) or raises (Python/TS). WsUpdate::Rawremoved. Untyped escape-hatch variant retired.- Timestamps unified to
u64millis on the entire WS surface. - Python WS variants are real classes (
Snapshot,Delta,Trade,Fill,Connected,Reconnected,Lagged,BookInvalidated,SessionError) — not dicts.matchandisinstancework directly. tokio::sync::broadcastreplaced withasync-channelplus explicitLagged+BookInvalidatedsignaling.

