v3.3.0
Adds a complete FIX protocol subsystem (FIXT.1.1 / FIX50SP2) for both the
prediction and perps products. Additive release: no changes to the existing REST,
WebSocket, or Perps surfaces.
Added
- FIX engine (
kalshi.fix) — a hand-rolled, async-first FIX client for both
products:FixClient(prediction) andMarginFixClient(margin, in
kalshi.perps.fix), re-exported from the top-levelkalshipackage alongside
FixConfig,FixEnvironment, andFixSessionType. Covers five session types —
order entry (NR/RT), drop copy, market data, post-trade settlement (prediction),
and RFQ (prediction), plus order-group management over the order-entry session —
on a session state machine with
RSA-PSS logon (reusing the REST key), heartbeat / test-request liveness,
sequence tracking with gap-fill / resend on the retransmission sessions, and
AWS-style full-jitter reconnect. (Epic #402.) - Typed FIX messages — Pydantic v2 models for every Kalshi FIX message across
order entry, order groups, market data, RFQ/quoting, drop copy, and market
settlement, withDollarDecimal/FixedPointCountmoney types (no float
drift) and a central inbound dispatch viadecode_app_message. FixOrderBook— aggregated order-book reconstruction from market-data
snapshots + incrementals;SettlementReassembler— paginated
settlement-report reassembly.FixSession.on_decode_errorhook +decode_app_message_strict— surface a
registered-but-malformed inbound message instead of silently dropping it (#432).- FIX documentation — new
docs/fix.mdguide, plus FIX coverage in the
README, errors, authentication, configuration, environment-variables, and the
API reference. - FIX dictionary drift test —
specs/kalshi-fix-dictionary.xmlchecked in
with a model↔dictionary drift test, the FIX analogue of the REST contract-drift
suite (#437).
Fixed
- Documentation accuracy pass:
fcm.positions_all()is now documented (the FCM
page previously stated it did not exist); theportfolioreads document their
subaccountparameter; themarkets.is_block_tradeversion note is corrected
to SDK v3.1.0; theOrderPriceandMultiplierDecimaltypes are documented;
and the docs landing page's WebSocket channel count is corrected to 11.