Skip to main content
You can subscribe to the RSS changelog at /changelog/rss.xml if you’d like to stay ahead of breaking changes. This changelog is a work in progress. As always, we welcome any feedback in our Discord #dev channel! This changelog covers Kalshi’s REST, WebSocket, and FIX APIs across both the Predictions and Margin exchanges. Use the entry tags to filter by API surface (REST, WebSocket, FIX) or exchange (Predictions, Margin). FIX API changes, previously tracked on a separate page, now live here under the FIX tag.
RESTPredictionsMargin
Attempts to create an order group after reaching the 25,000-group limit will be rejected.Before the change window, existing order groups above the 25,000-group limit will be cancelled.Affected endpoints:
  • POST /trade-api/v2/portfolio/order_groups/create
  • POST /trade-api/v2/margin/order_groups/create
RESTPredictions
GET /incentive_programs now excludes incentive programs whose market belongs to a hidden event, matching the visibility of the events themselves.
RESTPredictions
Added GET /historical/positions — an authenticated endpoint for querying settled positions archived to the historical database. Supports ticker and event_ticker filtering with cursor pagination.Positions are archived per whole event: a settled event’s positions move to the historical database together and are never split between this endpoint and GET /portfolio/positions. Use this endpoint for positions older than the new market_positions_last_updated_ts cutoff returned by GET /historical/cutoff. See Historical Data for details.
WebSocketPredictionsMargin
Subaccount-restricted API keys, previously denied at session start, can now open WebSocket sessions. Private channels are scoped to the key’s locked subaccount — fill, user_orders, market_positions, order_group_updates, communications, and orderbook_delta (fill, user_orders, order_group_updates, and orderbook_delta on the Margin exchange) — so a restricted key sees exactly what a full-account key sees, minus every sibling subaccount.
  • orderbook_delta still delivers the full book; only the own-order annotation (subaccount, client_order_id) is withheld when a resting order belongs to a sibling subaccount.
  • communications still broadcasts every RFQ (public by design, so makers can quote them); only quotes, acceptances, and executions are scoped.
Full-account keys are unaffected. No new fields are introduced.
FIXPredictions
An API key restricted to a single subaccount (created via POST /api_keys with subaccount), previously rejected at logon, can now log on to an RfqMode FIX session and run the maker quote lifecycle: Quote (35=S), QuoteConfirm (35=U7), and QuoteCancel (35=Z).Every quote is pinned to the key’s subaccount: on Quote (35=S), an omitted AllocAccount<79> defaults to it and a mismatching value is rejected; QuoteConfirm and QuoteCancel act only on that subaccount’s quotes; fills attribute to it. You can run one restricted key per subaccount with concurrent RFQ sessions — a quote acceptance routes to the session that created the quote.Creating an RFQ (35=R) and AcceptQuote (35=UA) remain unavailable to restricted keys. Unrestricted keys are unchanged.
WebSocketPredictions
Authenticated WebSocket clients can subscribe to the new pyth_value channel to receive deduplicated Pyth prices by underlying ticker. The channel supports filtering, dynamic subscription updates, and discovery of recently streamed underlyings.
FIXPredictionsMargin
FIX Tag 2446 (AggressorSide) is now supported on 35=X (Incremental Refresh) with MDEntryType=2 (Trade).
RESTPredictions
REST now supports looking up a quote within a specific RFQ by passing both the RFQ ID and quote ID in the path. The quote must belong to the requested RFQ; otherwise, the endpoint returns 404 Not Found.The quote-ID-only lookup endpoint remains supported for now, but is deprecated. Use the RFQ-scoped lookup endpoint instead.Affected endpoints:
  • GET /trade-api/v2/communications/rfqs/{rfq_id}/quotes/{quote_id}
  • GET /trade-api/v2/communications/quotes/{quote_id}
RESTPredictions
GET /trade-api/v2/exchange/announcements has been removed from the Predictions REST API. Exchange schedule remains available through GET /trade-api/v2/exchange/schedule.Affected endpoints:
  • GET /trade-api/v2/exchange/announcements
RESTPredictions
The following deprecated fields have been removed from the Predictions REST API schema:
  • Market.response_price_units
  • Market.fractional_trading_enabled
  • MarketPosition.resting_orders_count
Market.price_level_structure, Market.price_ranges, and the fixed-point count and dollar fields remain the canonical replacements.
RESTMargin
GET /trade-api/v2/margin/orders now includes an order_reason field when order_source is system. The field is liquidation for liquidation orders and take_profit_stop_loss for take-profit/stop-loss orders. User-placed orders continue to omit order_reason.Affected endpoints:
  • GET /trade-api/v2/margin/orders
RESTWebSocketPredictions
Seven new price_level_structure values are being introduced: center_whole_edge_half_cent, center_whole_edge_quint_cent, center_half_edge_half_cent, center_half_edge_quint_cent, center_half_edge_deci_cent, center_quint_edge_quint_cent, and center_quint_edge_deci_cent. Naming follows center_{center}_edge_{edge}_cent, where whole = 1¢, half = 0.5¢, quint = 0.2¢, and deci = 0.1¢. Edge bands are $0.00–$0.10 and $0.90–$1.00; the center band is $0.10–$0.90. Existing values (linear_cent, tapered_deci_cent, deci_cent) are unchanged.There are no new fields and no new decimal precision. The source of truth for a market’s valid prices remains the price_ranges array on the market object ({ start, end, step } bands in fixed-point dollars) — consume it dynamically per market rather than keying logic off the price_level_structure label. Structure changes are delivered on the existing market_lifecycle_v2 WebSocket channel via the existing price_level_structure_updated event, which includes the updated price_ranges. When a market moves to a finer tick, resting orders are preserved and carried over to the new grid.Rollout: pilot markets switch to the new structures the week of July 27, 2026, scheduled to avoid disrupting actively-trading markets, with expansion to higher-volume markets the week of August 3, 2026.
RESTPredictions
Multivariate lookup history endpoints are fully deprecated.
RESTMargin
Each position returned by GET /trade-api/v2/margin/risk and GET /trade-api/v2/margin/positions now includes an is_portfolio flag. When it is true, the position is hedged within a portfolio, so its per-position risk metrics cannot be attributed to it individually and are not reported — on /margin/risk that means maintenance_margin_required, position_leverage, and estimated_liquidation_price, and on /margin/positions that means margin_used and the derived roe. When it is false, those per-position values are populated as before.Affected endpoints:
  • GET /trade-api/v2/margin/risk
  • GET /trade-api/v2/margin/positions
RESTPredictionsMargin
API keys can use write::trade to grant access to order, order-group, and RFQ/quote write endpoints without granting transfer-write access. Parent write keys continue to grant broad write access, including trade and transfer child scopes.
WebSocketPredictions
The market_lifecycle_v2 channel now emits an optional price_ranges array alongside price_level_structure on created and price_level_structure_updated events. Each entry is a { start, end, step } band in fixed-point dollars describing the market’s valid prices — the same data returned on the REST market object.This lets consumers read a market’s valid-price grid directly from the event, with no follow-up REST call when a market’s tick size / structure changes. The field is only present on events that carry a price_level_structure.Affected channel:
  • market_lifecycle_v2 (created, price_level_structure_updated events)
RESTMargin
GET /trade-api/v2/margin/positions now omits margin_used (and the derived roe) for a portfolio-margin position that shares its asset class with other positions in the same subaccount. Margin for those positions is computed jointly for the group and is not attributable to a single market. margin_used stays populated for gross markets and for single-position (lone) portfolio markets.Affected endpoints:
  • GET /trade-api/v2/margin/positions
RESTMargin
Effective immediately, GET /trade-api/v2/margin/risk no longer populates per-market maintenance margin, leverage, or estimated liquidation price unless the data is for a subaccount with a single position or for a gross margin market.Affected endpoints:
  • GET /trade-api/v2/margin/risk
RESTPredictions
GET /trade-api/v2/exchange/status now returns two additional fields:
  • intra_exchange_transfers_active — whether intra-exchange transfers are currently permitted.
  • exchange_index_statuses — a per-index breakdown with one entry per exchange index. Each entry carries exchange_index, exchange_active, trading_active, and intra_exchange_transfers_active.
Affected endpoints:
  • GET /trade-api/v2/exchange/status
RESTPredictions
GET /trade-api/v2/portfolio/subaccounts/balances now returns one balance per exchange index. Each entry includes an exchange_index field, so a subaccount with funds on multiple indexes appears as multiple entries rather than a single combined row.Affected endpoints:
  • GET /trade-api/v2/portfolio/subaccounts/balances
FIXPredictions
On AcceptQuote (35=UA), when a quote can no longer be accepted the AcceptQuoteStatus (35=UC) reject (AcceptQuoteStatus<21025>=1) now reports a specific reason in Text<58> rather than a generic message — notably NOT_FOUND when the quote was cleared by a server roll/restart (or is otherwise unknown) and EXPIRED when it was cancelled or has expired — so RFQ creators can distinguish a flushed quote from a genuine cancellation.Affected FIX messages:
  • AcceptQuote (35=UA)
FIXPredictions
Previously, some OrderCancelReplaceRequest (35=G) and OrderCancelRequest (35=F) failures came back as an OrderCancelReject (35=9) with Text<58>=INTERNAL_ERROR, even though the exchange had cleanly rejected the request for a specific reason. The most common case was replacing an order with a price the market does not accept, for example a sub-tick price on a market that does not support fractional prices.These rejects now report the underlying reason in Text<58>, with a corresponding CxlRejReason<102>:
  • Invalid price (off-tick, out-of-band, $0, or $1): Text<58>=INVALID_PRICE, CxlRejReason<102>=99 (Other)
  • Unknown market: Text<58>=MARKET_NOT_FOUND, CxlRejReason<102>=99 (Other)
  • Duplicate client order ID: Text<58>=ORDER_ALREADY_EXISTS, CxlRejReason<102>=6 (Duplicate ClOrdID)
A rejected cancel or replace does not change the original order; it continues to rest unchanged. Clients that branched on Text<58>=INTERNAL_ERROR for these cases should switch to reading the specific reason text.
RESTFIXPredictions
Effective immediately, RFQ quotes are no longer guaranteed to remain queryable unless they have reached a post-acceptance state: accepted, confirmed, or executed. Open quotes and cancelled quotes may still be returned on a best-effort basis, but clients should not treat them as durable records. If an open quote is cleared during a server roll or restart, it should be treated as effectively cancelled and no longer actionable, even if there is no queryable cancelled quote record. Later requests for that quote may return 404 Not Found.Clients should store the RFQ ID returned for each RFQ and include it alongside the quote ID when performing quote actions. REST now supports RFQ-scoped quote action endpoints using rfq_id as a path parameter:
  • DELETE /trade-api/v2/communications/rfqs/{rfq_id}/quotes/{quote_id}
  • PUT /trade-api/v2/communications/rfqs/{rfq_id}/quotes/{quote_id}/accept
  • PUT /trade-api/v2/communications/rfqs/{rfq_id}/quotes/{quote_id}/confirm
The existing quote-ID-only action endpoints remain supported for now, but are deprecated. Use the RFQ-scoped action endpoints instead:
  • DELETE /trade-api/v2/communications/quotes/{quote_id}
  • PUT /trade-api/v2/communications/quotes/{quote_id}/accept
  • PUT /trade-api/v2/communications/quotes/{quote_id}/confirm
For FIX, quote actions now accept optional RfqId<21023> together with QuoteId<117> on QuoteCancel (35=Z), QuoteConfirm (35=U7), and AcceptQuote (35=UA). When RfqId<21023> is provided, the quote must belong to that RFQ; when it is omitted, the exchange will continue to resolve the RFQ from QuoteId<117> on a best-effort basis.We expect rfq_id / RfqId<21023> to become required for quote actions in a future migration, but this requirement will not take effect within the next 7 days. Start sending the RFQ ID now to avoid future migration work.Affected endpoints:
  • GET /trade-api/v2/communications/quotes
  • GET /trade-api/v2/communications/quotes/{quote_id}
  • GET /trade-api/v2/communications/rfqs/{rfq_id}/quotes/{quote_id}
  • DELETE /trade-api/v2/communications/quotes/{quote_id}
  • PUT /trade-api/v2/communications/quotes/{quote_id}/accept
  • PUT /trade-api/v2/communications/quotes/{quote_id}/confirm
  • DELETE /trade-api/v2/communications/rfqs/{rfq_id}/quotes/{quote_id}
  • PUT /trade-api/v2/communications/rfqs/{rfq_id}/quotes/{quote_id}/accept
  • PUT /trade-api/v2/communications/rfqs/{rfq_id}/quotes/{quote_id}/confirm
Affected FIX messages:
  • QuoteCancel (35=Z)
  • QuoteConfirm (35=U7)
  • AcceptQuote (35=UA)
RESTPredictions
Qualification requirements for all tiers has been halved.
FIXPredictions
FIX order entry now supports ExDestination<100> for exchange index selection. NewOrderSingle (35=D) and OrderCancelRequest (35=F) may use ExDestination=-1 to auto-route by market ticker.ExecutionReport ExecID<17> values for non-default exchange indexes include the exchange index as clock;event;exchange_index.Note: exchange index 0 is currently the only exchange index available in production.
FIXPredictions
FIX RFQ Quote (35=S) creation now supports ExecInst<18>=6 (ParticipantDontInitiate) to request post-only quote behavior.
RESTPredictions
GET /trade-api/v2/communications/quotes/{quote_id} will cost 2 tokens per request, matching the non-default cost for quote create and delete.Affected endpoints:
  • GET /trade-api/v2/communications/quotes/{quote_id}
RESTPredictions
GET /trade-api/v2/communications/quotes no longer supports filtering by market_ticker or event_ticker, effective immediately. Requests should filter quotes by user, RFQ, status, or update time instead.Affected endpoints:
  • GET /trade-api/v2/communications/quotes
RESTPredictions
Closed RFQs and cancelled quotes returned by the communications APIs will be retained for 7 days after their last update, reduced from the previous 14-day retention window.Affected endpoints:
  • GET /communications/rfqs
  • GET /communications/quotes
RESTFIXPredictions
You can now restrict an API key to a single sub-account when you create it. Pass subaccount (0-63) to POST /api_keys or POST /api_keys/generate. A restricted key may only read and trade on that one sub-account: requests that target another sub-account are rejected, and the key cannot transfer funds between sub-accounts or create sub-accounts. Restricted keys can use supported REST and FIX order-entry or market-data sessions; they cannot open WebSocket, FIX listener, drop-copy, RFQ, or retransmission sessions. GET /api_keys returns each key’s subaccount (absent when the key is unrestricted). Omit subaccount to create an unrestricted key; existing keys are unaffected.Affected endpoints:
  • POST /api_keys
  • POST /api_keys/generate
  • GET /api_keys
RESTPredictions
The events API now returns settlement_sources on each event, mirroring the field already available on series. Each entry has a name and url identifying an official source used to determine the event’s markets.Affected endpoints:
  • GET /events
  • GET /events/{event_ticker}
WebSocketPredictions
metadata_updated events on the market_lifecycle_v2 channel now include strike_type and cap_strike (plus custom_strike for custom/structured markets) alongside floor_strike. Consumers can reconstruct a market’s full strike range directly from the push — e.g. a between band needs both floor and cap, and less markets are cap-only — without a follow-up fetch against the eventually-consistent read model.metadata_updated is now also emitted when a market’s cap_strike or strike_type changes; previously only floor_strike and yes_sub_title changes triggered it.
FIXPredictions
FIX RFQ Quote (35=S) notifications sent to RFQ creators now include the quoter’s public communications ID in NoPartyIDs with PartyRole=35 (Liquidity Provider).
FIXPredictionsMargin
FIX market data incremental refreshes now include trades as MDEntryType<269>=2. See FIX docs for more information.
RESTPredictions
Legacy /portfolio/orders mutation endpoints will be deprecated sometime between June 18 and June 25. Once deprecated, calls to these endpoints will return Please switch to the V2 endpoints with a link to the V2 order API reference.Use the V2 event-order endpoints:Affected endpoints:
  • POST /trade-api/v2/portfolio/orders
  • DELETE /trade-api/v2/portfolio/orders/{order_id}
  • POST /trade-api/v2/portfolio/orders/{order_id}/decrease
  • POST /trade-api/v2/portfolio/orders/batched
  • DELETE /trade-api/v2/portfolio/orders/batched
  • POST /trade-api/v2/portfolio/orders/{order_id}/amend
RESTPredictions
GET /trade-api/v2/events now supports a tickers query parameter to filter the response to a comma-separated list of event tickers.Affected endpoints:
  • GET /trade-api/v2/events
Each position returned by GET /trade-api/v2/margin/positions now includes a subaccount field with the subaccount number that holds it (0 for primary, 1-63 for subaccounts).Affected endpoints:
  • GET /trade-api/v2/margin/positions
RESTPredictionsMargin
API keys can use read::block_trade_accept and write::block_trade_accept to grant narrow block-trade proposal viewing and acceptance permissions without granting broad account read or write access. Use read::portfolio_balance for narrow balance checks. Parent scopes still grant broad access, so standard read and write keys continue to work.Affected endpoints:
  • GET /trade-api/v2/communications/block-trade-proposals
  • POST /trade-api/v2/communications/block-trade-proposals/{block_trade_proposal_id}/accept
  • GET /trade-api/v2/portfolio/balance
WebSocketPredictions
Sanity limits enforced on orderbook subscriptions:
  • Max 500k market subscriptions per session.
  • Max 10k/s commands per second enforced.
RESTPredictions
GET /trade-api/v2/communications/quotes now supports min_ts and max_ts query parameters to restrict results to quotes last updated within a time window, formatted as Unix Timestamps.Also fixes cursor pagination on this endpoint: previously, paging through a large set of quotes could end early and silently drop most of the results.Affected endpoints:
  • GET /trade-api/v2/communications/quotes
RESTPredictionsMargin
New endpoint: GET /trade-api/v2/account/api_usage_level/volume_progress reports your trailing 30d volume and the earn/keep volume goals for each volume-based API usage tier.
RESTMargin
Perps margin market responses now include mark prices and their timestamps.Affected endpoints:
  • GET /trade-api/v2/margin/markets
  • GET /trade-api/v2/margin/markets/{ticker}
RESTPredictionsMargin
Users can now self-promote to the Advanced API tier by calling POST /trade-api/v2/account/api_usage_level/upgrade.Affected endpoints:
  • POST /trade-api/v2/account/api_usage_level/upgrade
RESTMargin
GET /trade-api/v2/margin/fee_tiers now returns active maker and taker fee rates for each eligible margin market instead of zeroing the response.Affected endpoints:
  • GET /trade-api/v2/margin/fee_tiers
RESTWebSocketMargin
Perps market data now includes dollar notional companions for lifetime volume, 24h volume, and open interest contract-count fields. Perps candlesticks also include a period-specific volume notional field. These fields are additive and preserve the existing contract-count fields.Affected endpoints and channels:
  • GET /trade-api/v2/margin/markets
  • GET /trade-api/v2/margin/markets/{ticker}
  • GET /trade-api/v2/margin/markets/{ticker}/candlesticks
  • WebSocket margin_ticker
RESTMargin
Margin market responses now report tick_size.Affected endpoints:
  • GET /trade-api/v2/margin/markets
  • GET /trade-api/v2/margin/markets/{ticker}
RESTFIXPredictions
RFQs will support fractional contract quantities beginning with the June 11, 2026 release. API clients will be able to create RFQs with positive contracts_fp values in 0.01-contract increments, and quote responses may include fractional values in fixed-point quantity fields such as yes_contracts_offered_fp and no_contracts_offered_fp.FIX RFQ flows may also carry fractional quantities in OrderQty(38), BidSize(134), and OfferSize(135) on QuoteRequest (35=R), Quote (35=S), and QuoteStatusReport (35=AI) messages.Affected endpoints and FIX flows:
  • POST /communications/rfqs
  • GET /communications/rfqs
  • GET /communications/quotes
  • FIX QuoteRequest (35=R), Quote (35=S), and QuoteStatusReport (35=AI)
RESTPredictionsMargin
We’re introducing automated API rate-limit tiers: Premier, Paragon, and Prime are now earned automatically from your trailing trading volume (and can still be granted manually). Each tier is backed by a grant, which you can view in the new grants array of GET /trade-api/v2/account/limits.See Rate Limits and Tiers for the thresholds and how grants work.Live Thursday, June 11, 2026.Affected endpoints:
  • GET /trade-api/v2/account/limits
  • GET /trade-api/v2/account/limits/perps
RESTPredictions
Legacy /portfolio/orders mutation and batch endpoint rate-limit token costs will be 10x the corresponding V2 /portfolio/events/orders endpoint costs. The V2 endpoint costs are unchanged.Switch to the V2 event-order endpoints to keep full write rate-limit access for these workflows:Affected endpoints:
  • POST /trade-api/v2/portfolio/orders - cost 50 to 100
  • DELETE /trade-api/v2/portfolio/orders/{order_id} - cost 10 to 20
  • POST /trade-api/v2/portfolio/orders/{order_id}/amend - cost 50 to 100
  • POST /trade-api/v2/portfolio/orders/{order_id}/decrease - cost 50 to 100
  • POST /trade-api/v2/portfolio/orders/batched - cost 50 to 100
  • DELETE /trade-api/v2/portfolio/orders/batched - cost 10 to 20
RESTWebSocketPredictions
When a post-only order would cross the book, the last_update_reason field is now reported as PostOnlyCrossCancel instead of Decrease.Affected surfaces:
  • GET /portfolio/orders
  • GET /portfolio/order/{orderId}
  • orderbook_delta WebSocket channel
FIXPredictions
FIX API v1.0.31
  • ExecutionReports (35=8) for post-only orders canceled because they would cross now carry a Text (58) reason of POST_ONLY_CROSS
FIXPredictions
FIX API v1.0.30
  • Starting Thursday, June 4, 2026, the FIX API ExecutionReport (35=8) rejection Text (58) distinguishes rejects where the order’s outcome is unconfirmed from rejects where the order was definitely not applied
    • EXCHANGE_UNAVAILABLE now means the gateway could not confirm whether the order was applied (the exchange was unreachable, the request timed out, or it was interrupted after the order may have been accepted). Reconcile the order’s state, or retry with the same ClOrdID
    • INTERNAL_ERROR is a new value for a reject from a healthy exchange that could not be mapped to a specific reason. The order was not applied, so it is safe to fix and resubmit
    • Previously both cases returned EXCHANGE_UNAVAILABLE
RESTPredictionsMargin
API keys can now use write::transfer to grant access only to transfer-scoped write endpoints without granting the broad write parent scope. Parent scopes still grant broad access, so write continues to grant all write endpoint groups, including transfer-scoped writes.
RESTPredictions
Legacy /portfolio/orders mutation and batch endpoint rate-limit token costs will be 5x the corresponding V2 /portfolio/events/orders endpoint costs. The V2 endpoint costs are unchanged.Affected endpoints:
  • POST /trade-api/v2/portfolio/orders - cost 15 to 50
  • DELETE /trade-api/v2/portfolio/orders/{order_id} - cost 3 to 10
  • POST /trade-api/v2/portfolio/orders/{order_id}/amend - cost 15 to 50
  • POST /trade-api/v2/portfolio/orders/{order_id}/decrease - cost 15 to 50
  • POST /trade-api/v2/portfolio/orders/batched - cost 15 to 50
  • DELETE /trade-api/v2/portfolio/orders/batched - cost 3 to 10
RESTPredictions
Public V2 trade responses now include is_block_trade, which identifies trades matched off-book as block trades. The same endpoints now support an optional is_block_trade query parameter; omit it to return all trades, set it to true for only block trades, or set it to false for only non-block trades.Affected endpoints:
  • GET /trade-api/v2/markets/trades
  • GET /trade-api/v2/historical/trades
FIXPredictions
FIX API v1.0.29
  • Added market lifecycle support on the KalshiMD session via Security Status messages
    • SecurityStatusRequest (35=e) subscribes (263=1) or unsubscribes (263=2) a single Symbol<55>
    • SecurityStatus (35=f) streams SecurityTradingStatus<326> changes: 3=resume (activated), 2=trading halt, 100=Kalshi determined, 101=Kalshi settled
    • Changes-only: no initial snapshot is sent on subscribe
    • For more info see Market Data
RESTPredictions
Starting Thursday, May 28, 2026, GET /portfolio/balance returns balance_dollars, the member’s available balance as a fixed-point dollar string, alongside the existing integer-cent balance field. This precision change applies only to direct members of the exchange: direct member balances are aligned to centi-cent ($0.0001, or 0.01c) precision. The legacy balance field truncates any sub-cent amount, so use balance_dollars for exact values.See Fee Rounding for balance alignment and rounding mechanics.
FIXPredictions
FIX API v1.0.28
  • Added market data support on the dedicated KalshiMD session
    • Subscriptions are identified by Symbol<55>
    • MarketDataRequest (35=V) requests order book snapshots (263=0) or snapshot-plus-updates subscriptions (263=1); cancel with 263=2 (symbols in 55, or none to cancel all)
    • MarketDataSnapshotFullRefresh (35=W) returns the full aggregated book; MarketDataIncrementalRefresh (35=X) streams subsequent level changes
    • MarketDataRequestReject (35=Y) is sent when a request cannot be accepted
    • For more info see Market Data
FIXPredictions
FIX API v1.0.27
  • Starting Thursday, May 28, 2026, direct member BALANCE collateral changes on ExecutionReport (35=8) may be emitted with four decimal places
RESTPredictions
Effective Monday, May 25, 2026, rate-limit token costs for legacy /portfolio/orders mutation and batch endpoints are increased. The V2 /portfolio/events/orders endpoints are unchanged.Affected endpoints:
  • POST /trade-api/v2/portfolio/orders - cost 10 to 15
  • DELETE /trade-api/v2/portfolio/orders/{order_id} - cost 2 to 3
  • POST /trade-api/v2/portfolio/orders/{order_id}/amend - cost 10 to 15
  • POST /trade-api/v2/portfolio/orders/{order_id}/decrease - cost 10 to 15
  • POST /trade-api/v2/portfolio/orders/batched - cost 10 to 15
  • DELETE /trade-api/v2/portfolio/orders/batched - cost 2 to 3
RESTPredictions
In certain uncommon cases, responses from DELETE /trade-api/v2/portfolio/events/orders/{order_id} and POST /trade-api/v2/portfolio/events/orders/{order_id}/amend do not describe the order that was cancelled or amended — the order_id, client_order_id, and quantity fields (reduced_by_centicount, remaining_centicount, fill fields) in the response may not correspond to your request. The cancel or amend itself executes correctly against the intended order; only the response body is affected. Downstream order and position state are correct.As a result, the previously announced rate-limit cost bump on the legacy /portfolio/orders* endpoints is delayed until May 21.Affected endpoints:
  • DELETE /trade-api/v2/portfolio/events/orders/{order_id}
  • POST /trade-api/v2/portfolio/events/orders/{order_id}/amend
FIXPredictions
FIX API v1.0.26
  • Added SplitCollateralReturn (21027) Logon flag
    • With Logon flag 21027=Y, Execution Reports with ExecType=Trade include two new tags:
      • SingleMarketCollateralReturn (21030): collateral freed from reducing/closing a position in a single market
      • RangedMarketCollateralReturn (21031): collateral freed from MECNET/DIRECNET netting across a market group
    • Both values are in dollars and only present when non-zero
    • These are informational subsets of the existing BALANCE collateral change — they describe components within the total balance delta
    • Without 21027, Execution Reports remain unchanged (existing behavior)
RESTPredictions
POST /trade-api/v2/portfolio/events/orders/{order_id}/decrease now accepts reduce_by (fixed-point contract count) in addition to reduce_to. Exactly one of the two must be provided.
RESTPredictions
Subaccount creation now supported for all direct members with advanced API access.
WebSocketPredictionsMargin
The WebSocket docs now include the current public error code list with each code’s name, message, description, and user-error classification.WebSocket error code 25 is now returned as Subscription buffer overflow when a subscription’s event buffer overflows during a message burst. When this happens, subscribe to a smaller subset of data, or ensure that your connection read throughput is optimized.See the WebSocket error messages section for the full list.
RESTPredictions
Cancelled quotes are now automatically deleted 14 days after cancellation. Previously, only quotes associated with closed RFQs were cleaned up. This applies to all cancelled quotes regardless of their parent RFQ status.Affected endpoint: GET /communications/quotes.
RESTMargin
GET /trade-api/v2/margin/fee_tiers now returns maker_fee_rates and taker_fee_rates. Each is a map from market ticker to the fee rate as a decimal fraction of notional (e.g. 0.0008 = 0.08% = 8 bps). Compute the expected fee directly as notional * rate.The previous maker_fee_tiers and taker_fee_tiers tier-name maps have been removed from the response.Affected endpoints:
  • GET /trade-api/v2/margin/fee_tiers
WebSocketPredictions
The metadata_updated event on the market_lifecycle_v2 WebSocket channel now includes yes_sub_title as a top-level field when a market’s yes subtitle changes.Affected channels:
  • market_lifecycle_v2
FIXPredictions
FIX API v1.0.25
  • BidSize (134) and OfferSize (135) conditionally offered on QuoteStatusReport (35=AI).
RESTPredictions
CreateOrderGroup now returns subaccount, the subaccount number that owns the created order group. The value is 0 for the primary account and 1-63 for subaccounts.Affected endpoint: POST /portfolio/order_groups/create.
RESTPredictions
Added rfq_user_filter to GetQuotes for filtering by quotes in response to RFQs created by the authenticated user.Affected endpoint: GET /communications/quotes.
FIXPredictions
FIX API v1.0.24
  • OrderGroupResponse (UOH) now echoes AllocAccount (tag 79), with 79=0 for the primary account and 79=1-63 for subaccounts
RESTWebSocketPredictions
Order, Fill, and Trade responses now include two new normalized direction fields. Each carries the full directional bit on its own — combining action with side is no longer required to know what the user is positioned for. The two fields encode the same bit in two vocabularies: bid is equivalent to yes, ask is equivalent to no.
  • outcome_side (yes | no) — the outcome the user profits from. Buy-yes and sell-no produce yes; buy-no and sell-yes produce no.
  • book_side (bid | ask) — same bit in book vocabulary.
Affected REST responses (svc-api2):
  • Order (GetOrders, GetOrder, GetHistoricalOrders, and order-write responses)
  • Fill (GetFills, GetFillsHistorical)
  • Trade (public) — fields are named taker_outcome_side and taker_book_side to match the existing taker_side
Affected WebSocket channels (svc-apiexternal-ws):
  • user_orders
  • fill
  • tradetaker_outcome_side and taker_book_side
outcome_side describes directional exposure only; it does not change the order’s price. An order at price p with outcome_side=no is matched by an order at the same price p with outcome_side=yes — both parties trade at the same price, just on opposite directions.Existing action, side, is_yes, purchased_side, and taker_side fields are now marked deprecated. outcome_side and book_side are the canonical way to determine order/trade direction going forward. The legacy fields will not be removed before May 28, 2026 — please migrate to the new fields when integrating against these endpoints.See the Order direction reference page for the full migration table and equivalence rules.
RESTWebSocketPredictionsMargin
Added the dedicated external Trade API hosts to the docs and examples:
  • Production REST: https://external-api.kalshi.com/trade-api/v2
  • Production WebSocket: wss://external-api-ws.kalshi.com/trade-api/ws/v2
  • Demo REST: https://external-api.demo.kalshi.co/trade-api/v2
  • Demo WebSocket: wss://external-api-ws.demo.kalshi.co/trade-api/ws/v2
Existing shared hosts remain supported for compatibility. Request signing is unchanged: sign the full request path from the API root, without the hostname or query string.
WebSocketPredictions
The market_lifecycle_v2 WebSocket channel now supports a new event type metadata_updated. Initially this will only be triggered by a floor strike update, but may expand to more fields in the future. The message contains the updated floor_strike as a top-level field.Affected channels:
  • market_lifecycle_v2
RESTPredictions
Added post_only as an option when creating a quote. If the quote is marked post-only, it will never take resting orders on the book or be subject to a taker fee: it will be automatically cancelled at the normal execution if it were to match with a resting order.
RESTPredictions
Added GET /trade-api/v2/portfolio/deposits and GET /trade-api/v2/portfolio/withdrawals endpoints.
  • Query deposit/withdrawal history for the authenticated user
  • Cursor-based pagination via limit and cursor parameters
New endpoints:
  • GET /trade-api/v2/portfolio/deposits
  • GET /trade-api/v2/portfolio/withdrawals
RESTWebSocketPredictions
V2 order mutating endpoints now include a ts_ms field carrying the matching engine’s wall-clock timestamp at which the request was processed, as Unix epoch milliseconds:
  • POST /trade-api/v2/portfolio/events/orders
  • DELETE /trade-api/v2/portfolio/events/orders/{order_id}
  • POST /trade-api/v2/portfolio/events/orders/{order_id}/decrease
  • POST /trade-api/v2/portfolio/events/orders/{order_id}/amend
  • POST /trade-api/v2/portfolio/events/orders/batched
  • DELETE /trade-api/v2/portfolio/events/orders/batched
The order_group_updates WebSocket channel payload now includes a ts_ms field with the same matching-engine timestamp, matching the pattern already used by trades, fill, user_orders, and orderbook_delta.
FIXPredictions
FIX API v1.0.23
  • Quote (35=S) now accepts RestRemainder (21015)
    • Set 21015=Y to rest the quote remainder after execution
    • Omitting the tag or setting 21015=N preserves the existing behavior
RESTPredictions
Added user_filter=self to filter RFQs and quotes by the authenticated user. Existing creator user ID filters remain supported temporarily but are considered deprecated.
RESTPredictions
The deprecated tick_size field on Market response objects has been deprecated since Jan 5, 2026 and will be removed on May 7, 2026.Use price_level_structure and price_ranges[].step to determine each market’s valid tick sizes.Affected responses:
  • Market response objects returned by REST API v2 endpoints
RESTPredictionsMargin
Beginning Apr 30, 2026, GET /trade-api/v2/account/limits returns a nested object per bucket with refill_rate (tokens added per second) and bucket_capacity (max tokens the bucket can hold). When the bucket has no burst headroom, bucket_capacity equals refill_rate — i.e. one second of budget.
See Rate Limits and Tiers for budget semantics.Affected endpoints:
  • GET /trade-api/v2/account/limits
FIXPredictions
FIX API v1.0.22
  • Added AlwaysEmitNewBeforeTrade (21026) Logon flag
    • With Logon flag 21026=Y, the gateway always emits a standalone New<0> execution report before any Trade<F> report, even when an order takes liquidity in the same matching cycle as its placement
    • Without 21026, the New ack continues to be folded into the first Trade report when both events arrive in the same batch (existing behavior)
    • Useful for clients whose state machines require an explicit 39=0 ack before they can issue replaces against the order
RESTPredictionsMargin
Added a public endpoint to inspect the routes whose configured token cost differs from the default 10-token cost.The response includes default_cost for context and lists only the endpoints that do not use that default cost.Affected endpoints:
  • GET /trade-api/v2/account/endpoint_costs
RESTPredictionsMargin
Write endpoints now allow brief bursts above your per-second budget — when your client is running below its steady rate, the unused capacity accumulates and can be spent in a single pulse. See Rate Limits and Tiers for details.
RESTPredictions
New endpoints:
  • POST /trade-api/v2/portfolio/events/orders — create
  • DELETE /trade-api/v2/portfolio/events/orders/{order_id} — cancel
  • POST /trade-api/v2/portfolio/events/orders/{order_id}/amend — amend
  • POST /trade-api/v2/portfolio/events/orders/{order_id}/decrease — decrease
  • POST /trade-api/v2/portfolio/events/orders/batched — batch create
  • DELETE /trade-api/v2/portfolio/events/orders/batched — batch cancel
We recommend all clients switch over. The existing /portfolio/orders* endpoints will be marked deprecated no earlier than May 21, 2026. Rate-limit costs on the legacy /portfolio/orders* endpoints may also increase starting May 14, 2026 — migrate to the V2 endpoints to avoid disruption.
RESTPredictionsMargin
Rolling out a new token-cost rate-limit system with separate read and write budgets and a new Paragon tier. All existing tiers get at least as much headroom as before and no client changes are required. See Rate Limits and Tiers for full details.In the coming weeks, single-query read endpoints will be priced below the default cost.
WebSocketPredictions
Added get_snapshot action to update_subscription on the orderbook_delta WebSocket channel.Sends an orderbook_snapshot response for the requested markets without adding them to the subscription or affecting the existing delta stream.
Only market_tickers is supported (not market_ticker, market_id, or market_ids).Affected channel:
  • orderbook_delta
FIXPredictions
FIX API v1.0.21
  • OrderGroupRequest (UOG) now accepts AllocAccount (tag 79) to scope the operation to a subaccount
    • Applies to all five actions: Create, Reset, Delete, Trigger, Update
    • Omit or set 79=0 to operate on the primary account
    • An OrderGroupID created under one subaccount cannot be managed without the matching AllocAccount on the follow-up request
  • OrderGroupResponse (UOH) now echoes OrderGroupContractsLimit (tag 20132) on Create and Update responses
RESTWebSocketPredictions
The fractional_trading_enabled field on Market and EventChildMarket responses is deprecated. It no longer carries information:
  • Market and EventChildMarket responses now support fractional trading unconditionally — the field is always true.
The fractional_trading_updated event on the market_lifecycle_v2 WebSocket channel is removed, since the underlying state can no longer change.The fractional_trading_enabled field will be removed in a future release after a separate pre-announcement that includes the exact removal date. Clients relying on this field should stop reading it; treat every active market returned by these responses as fractional.
RESTPredictions
Added occurrence_datetime to API v2 market responses.This field returns the recorded datetime when the underlying event occurred, when that value is available.Affected endpoints:
  • GET /trade-api/v2/markets
  • GET /trade-api/v2/markets/:ticker
  • GET /trade-api/v2/events
  • GET /trade-api/v2/events/:event_ticker
WebSocketPredictions
Added new millisecond Unix timestamp fields to non-margin WebSocket messages while keeping the existing seconds and RFC3339 timestamp fields unchanged for now.
The older timestamp fields are now deprecated in the AsyncAPI documentation:
These deprecated fields will be removed in a future API version only after a separate pre-announcement that includes the exact removal date.Affected WebSocket channels:
  • ticker: added ts_ms
  • trade: added ts_ms
  • fill: added ts_ms
  • orderbook_delta: added optional ts_ms
  • user_order: added created_ts_ms, last_updated_ts_ms, and expiration_ts_ms
RESTPredictions
Added series_ticker filtering to GET /trade-api/v2/historical/markets.This filter follows the existing historical markets behavior and is mutually exclusive with the other primary historical filters (tickers, event_ticker, and mve_filter).Affected endpoints:
  • GET /trade-api/v2/historical/markets
RESTPredictions
Removed client_order_id from GET /portfolio/fills and GET /portfolio/fills/historical responses.Affected endpoints:
  • GET /trade-api/v2/portfolio/fills
  • GET /trade-api/v2/portfolio/fills/historical
RESTPredictions
Added GET /trade-api/v2/markets/orderbooks endpoint.
  • Accepts a list of market tickers via tickers query parameter (up to 100)
  • Returns one orderbook per requested ticker
Affected endpoints:
  • GET /trade-api/v2/markets/orderbooks
RESTWebSocketPredictions
Effective April 2, 2026This release removes the last remaining legacy fields:
  • Removed yes_total_cost and no_total_cost (integer cents) from GET /portfolio/settlements. Use yes_total_cost_dollars and no_total_cost_dollars.
  • Removed yes_price_fixed and no_price_fixed (string aliases) from GET /portfolio/fills. Use yes_price_dollars and no_price_dollars.
  • Removed position_cost, realized_pnl, fees_paid, and position_fee_cost (integer centi-cents) from the market_positions WebSocket channel. Use the _dollars equivalents.
RESTWebSocketFIXPredictions
  • The subaccount field is now returned on WebSocket quote_accepted and quote_executed messages when the quote or RFQ was placed from a subaccount.
  • The REST Quote object now includes creator_subaccount and rfq_creator_subaccount fields, visible to the respective party.
RESTPredictions
Fixed GET /markets and GET /markets/{ticker} so custom_strike["Multivariate Event Ticker"] returns the actual multivariate event ticker instead of the MVE collection ticker.
WebSocketPredictions
Added a new multivariate_market_lifecycle WebSocket channel for multivariate event (MVE) markets.This channel emits MVE lifecycle messages for:
  • created
  • activated
  • deactivated
  • close_date_updated
  • determined
  • settled
The existing market_lifecycle_v2 channel continues to exclude KXMVE-prefixed tickers.Affected channels:
  • multivariate_market_lifecycle
  • market_lifecycle_v2
RESTPredictions
  • Trade.created_time and MarketPosition.last_updated_ts are now required in the OpenAPI contract.
  • Deprecated compatibility fields on Market and Settlement remain available, but are no longer marked as required.
  • Fixed schema inconsistencies where Trade.price and EventPosition.resting_orders_count were listed as required without defined properties.
  • Added semantic deprecation markers for deprecated fields such as EventData.category and MarketPosition.resting_orders_count.
WebSocketPredictions
Two new event types added to the market_lifecycle_v2 WebSocket channel:
  • fractional_trading_updated: emitted when a market’s fractional trading setting is changed. Includes fractional_trading_enabled (boolean).
  • price_level_structure_updated: emitted when a market’s price level structure is changed. Includes price_level_structure (string, e.g. "linear_cent", "deci_cent", "tapered_deci_cent").
Additionally, the created event now includes fractional_trading_enabled and price_level_structure fields.Affected channel:
  • market_lifecycle_v2
RESTPredictions
When pulling quotes, two new fields return the computed quote size (measured in contracts) derived from the specified prices and the requested notional size in the RFQ.
RESTWebSocketPredictions
  • The following legacy fields are temporarily restored to allow additional migration time. Their _dollars equivalents remain the recommended fields:
    • market_positions WebSocket: position_cost, realized_pnl, fees_paid, position_fee_cost
    • GET /portfolio/settlements: yes_total_cost, no_total_cost
  • yes_bid_size_fp and yes_ask_size_fp are now correctly populated on nested market responses (GET /events/{ticker}).
RESTPredictions
  • Fill responses now expose yes_price_dollars and no_price_dollars to align with the API-wide _dollars naming convention. Legacy yes_price_fixed and no_price_fixed remain available for now but are deprecated.
  • GET /portfolio/settlements now exposes yes_total_cost_dollars and no_total_cost_dollars in fixed-point dollars.
  • Legacy settlement cent fields yes_total_cost and no_total_cost remain available for now because these _dollars fields were added late in the fixed-point migration, but clients are recommended to migrate now.
See Fixed-Point Migration for the recommended field mappings.
RESTWebSocketPredictions
  • Legacy integer count fields (with _fp equivalents) and integer cents price fields (with _dollars equivalents) will be removed from all REST and WebSocket response payloads on March 12, 2026
  • Fractional trading will be enabled on 10 additional markets on March 12
  • Subpenny pricing goes live on 2 markets on March 9: KXGREENLAND-29 (deci_cent) and KXGDPNOM-RUS26 (tapered_deci_cent)
See Fixed-Point Migration for details.
RESTPredictions
Selected portfolio response _dollars fields now emit up to 6 decimal places, using micro_cent source values from upstream portfolio protos.Affected endpoints:
  • GET /portfolio/orders
  • GET /portfolio/orders/{order_id}
  • GET /portfolio/fills
  • GET /portfolio/positions
RESTPredictions
Added GET /historical/trades — a public endpoint for querying all trades archived to the historical database. Supports the same filters as GET /markets/trades.Use this endpoint for trades that occurred before the trades_created_ts cutoff returned by GET /historical/cutoff. See Historical Data for details.
WebSocketPredictions
  • Added is_yes (boolean) to the user_orders WebSocket channel
  • side (string "yes"/"no") remains available for compatibility
RESTWebSocketPredictions
  • Legacy integer count fields (with _fp equivalents) and integer cents price fields (with _dollars equivalents) will be removed on March 12, 2026
  • Fractional trading will roll out per-market starting the week of March 9, 2026; check fractional_trading_enabled on Market responses
  • On fractional-enabled markets, legacy integer fields may be truncated; migrate to _fp and _dollars to avoid data loss
Docs: Fixed-Point Migration and Fee Rounding.
FIXPredictions
FIX API v1.0.20
  • Added OrderExpiryCancel support for expired status mapping in execution reports
    • With Logon flag 21012=Y, both CloseCancel and OrderExpiryCancel emit ExecType(150)=C and OrdStatus(39)=C
    • Without 21012, behavior remains Canceled<4> for compatibility
FIXPredictions
FIX API v1.0.19
  • SettlementPrice (730) precision extended in MarketSettlementReport
    • SettlementPrice will continue to be in cents but may have up to two decimal places (e.g. 30.60 instead of 30)
    • This enables sub-cent settlement values to be represented without truncation
  • MiscFeeAmt (137) now reports actual settlement fees in MarketSettlementReport
    • Previously hardcoded to zero; now reflects the real settlement fee for each position
RESTPredictions
Market responses now include:
  • yes_bid_size_fp: total contract size of orders to buy yes at the best bid price
  • yes_ask_size_fp: total contract size of orders to sell yes at the best ask price
Affected endpoints:
  • GET /markets
  • GET /markets/{ticker}
RESTPredictions
New endpoints for managing netting settings on individual subaccounts:
  • GET /portfolio/subaccounts/netting: returns the netting enabled status for all subaccounts
  • PUT /portfolio/subaccounts/netting: updates the netting enabled status for a specific subaccount (pass subaccount_number and enabled in the request body)
Use subaccount_number=0 for the primary account or 163 for numbered subaccounts. New subaccounts inherit the primary account’s netting setting at creation time.
RESTWebSocketPredictions
Fractional share trading is now available for testing in the demo environment on the following markets:
  • KXUCL-26-ARS
  • KXUCL-26-AJA
Legacy fields will be deprecated on March 5, 2026:
  • Integer count fields with an _fp equivalent will no longer be returned. See Fixed-Point Contracts for migration details.
  • Integer cents price fields (e.g., yes_bid, no_ask, last_price) will no longer be returned. Their _dollars equivalents are already available. See Subpenny Pricing for details.
More information will be forthcoming on how fee rounding works with fractional contracts.
WebSocketPredictions
The market_lifecycle_v2 WebSocket channel now includes a settlement_value field (fixed-point dollar string) on market_determined events, indicating the settlement price of the market.Expected release date: February 26, 2026
RESTPredictions
GET /portfolio/balance now accepts an optional subaccount query parameter, consistent with other portfolio endpoints (orders, fills, positions, settlements).
  • Omitted or subaccount=0: returns balance and portfolio value for the primary account (default)
  • subaccount=N: returns balance and portfolio value for that specific subaccount
RESTPredictions
The liquidity and liquidity_dollars fields on Market responses are deprecated and will return 0.Affected endpoints:
  • GET /markets
  • GET /markets/{ticker}
  • GET /events
  • GET /events/{ticker}
  • GET /events/multivariate
RESTWebSocketPredictions
The deprecation timeline for non fixed-point count fields has been pushed back. Fields that have a _fp equivalent will continue to be returned via API until at least February 26, 2026.See Fixed-Point Contracts for updated migration details.
RESTPredictions
Kalshi now partitions exchange data into live and historical tiers. Historical data must be accessed via the new historical API endpoints. The GET /historical/cutoff endpoint returns the cutoff timestamps that define this boundary.Cutoff timestamps and what they mean:
  • market_settled_ts — partitioned by market settlement time. Markets and their candlesticks that settled before this timestamp are only available via GET /historical/markets and GET /historical/markets/{ticker}/candlesticks.
  • trades_created_ts — partitioned by trade fill time. Fills that occurred before this timestamp are only available via GET /historical/fills.
  • orders_updated_ts — partitioned by order cancellation or execution time. Orders canceled or fully executed before this timestamp are only available via GET /historical/orders. Resting (active) orders are unaffected and always appear in GET /portfolio/orders.
New endpoints:
  • GET /historical/cutoff — returns the market, trade, and order cutoff timestamps
  • GET /historical/markets — settled markets older than the cutoff
  • GET /historical/markets/{ticker} — single historical market by ticker
  • GET /historical/markets/{ticker}/candlesticks — candlestick data for historical markets
  • GET /historical/fills — trade fills older than the cutoff
  • GET /historical/orders — canceled/executed orders older than the cutoff
Impacted live endpoints:
  • GET /markets, GET /markets/{ticker} — settled markets older than market_settled_ts will not appear
  • GET /events with with_nested_markets=true — nested markets older than market_settled_ts will not be included
  • GET /series/{series_ticker}/markets/{ticker}/candlesticks, GET /markets/candlesticks — candlestick data is tied to the market; historical markets’ candlesticks must be fetched from GET /historical/markets/{ticker}/candlesticks
  • GET /markets/trades, GET /portfolio/fills — fills older than trades_created_ts will not appear
  • GET /portfolio/orders — completed/canceled orders older than orders_updated_ts will not appear (resting orders are unaffected)
FIXPredictions
FIX API v1.0.18
  • Execution report precision extended for fractional shares
    • On qty fields, Kalshi will return at least a scale of 2 instead of 0.
    • E.g. on a trade which executes for 10 contracts, Kalshi will return CumQty: 14=10.00 as opposed to 14=10
    • Despite the change in precision, the numerical value will remain unchanged for now because fractional trading is not yet enabled on any market.
    • Affected fields: LastQty, CumQty, LeavesQty
RESTPredictions
POST /portfolio/orders removed type; type=market is no longer offered.
WebSocketPredictions
The market_lifecycle_v2 WebSocket channel no longer emits lifecycle messages for multivariate event (MVE) markets and events. All events and markets with KXMVE ticker prefix are now filtered from all lifecycle message types on this channel.Affected channel:
  • market_lifecycle_v2
WebSocketPredictions
The ticker_v2 WebSocket channel has been removed. This was an undocumented experimental channel intended as a v2 iteration of the ticker channel but was rolled back due to user feedback.Users should continue using the standard ticker channel for real-time market updates, which includes top-of-book prices, sizes, and last trade information.Removed channel:
  • ticker_v2
WebSocketPredictionsMargin
  • ticker channel now provides high precision time field.
  • skip_ticker_ack subscription-level flag supports skipping market tickers sent in the OK message following a channel update.
RESTPredictions
Market response payloads now include fractional_trading_enabled consistently across event and market data surfaces.Affected endpoints:
  • GET /events
  • GET /events/{event_ticker}
  • GET /markets
  • GET /markets/{ticker}
RESTPredictions
The GET /incentive_programs endpoint now returns a market_id field containing the market’s unique identifier for each incentive program.Affected endpoint:
  • GET /incentive_programs
WebSocketPredictions
Added user_orders WebSocket channel to stream real-time order updates (created, updated, canceled, executed) for the authenticated user. Supports optional market_tickers filter and dynamic update_subscription commands to add or remove markets.New channel:
  • user_orders
RESTPredictions
GET /portfolio/order_groups and GET /portfolio/order_groups/{order_group_id} now accept an optional subaccount query parameter. When provided, results are filtered to that specific subaccount. When omitted, results are returned across all subaccounts.Affected endpoints:
  • GET /portfolio/order_groups
  • GET /portfolio/order_groups/{order_group_id}
RESTPredictions
The POST /communications/rfqs endpoint now accepts an optional subaccount parameter to create RFQs on behalf of a subaccount. The GET /communications/rfqs endpoint now accepts an optional subaccount query parameter to filter RFQs by subaccount.Affected endpoints:
  • POST /communications/rfqs
  • GET /communications/rfqs
RESTPredictions
Order queue position returns queue_position_fp representing the quantity of shares preceeeding the given order. Note: the new field is 0-indexed, e.g. the first order in the queue returns 0.00.Affected endpoints:
  • GET /portfolio/orders/queue_positions
  • GET /portfolio/orders/{order_id}/queue_position
WebSocketPredictionsMargin
The ticker and margin_ticker WebSocket channels now include top-of-book sizes and last trade size:
  • yes_bid_size_fp / bid_size_fp — number of contracts at the best bid price
  • yes_ask_size_fp / ask_size_fp — number of contracts at the best ask price
  • last_trade_size_fp — number of contracts in the most recent trade
Size changes (even without price changes) now trigger ticker updates. All size fields are fixed-point strings supporting fractional contracts.Affected channels:
  • ticker
  • margin_ticker
RESTPredictions
Order responses now include subaccount_number (0 for primary, 1-63 for subaccounts) for direct users.Affected endpoints:
  • GET /portfolio/orders
  • GET /portfolio/orders/{order_id}
RESTPredictions
The subaccount query parameter behavior has been updated for orders, fills, and settlements. When subaccount is omitted, results are returned across all subaccounts for the authenticated direct member. When subaccount is provided (including 0 for primary), results are filtered to that specific subaccount.Affected endpoints:
  • GET /portfolio/orders
  • GET /portfolio/fills
  • GET /portfolio/settlements
RESTWebSocketPredictions
See Fixed-Point Contracts for updated migration details.
WebSocketPredictions
Fill WebSocket messages now include fee_cost as a fixed-point dollars string.Affected channel:
  • fill
RESTPredictions
The following endpoints now accept an optional subaccount parameter:Order operations:
  • DELETE /portfolio/orders/{order_id} - Cancel order
  • POST /portfolio/orders/{order_id}/amend - Amend order
  • POST /portfolio/orders/{order_id}/decrease - Decrease order
Order group operations:
  • POST /portfolio/order_groups - Create order group
  • PUT /portfolio/order_groups/{order_group_id}/limit - Update order group limit
  • PUT /portfolio/order_groups/{order_group_id}/trigger - Trigger order group
  • DELETE /portfolio/order_groups/{order_group_id} - Delete order group
RESTPredictions
Batch cancel now supports per-order subaccounts while remaining backwards compatible with the existing ids payload.Batch cancel:
  • POST /portfolio/orders/batched/cancel
  • New request shape: orders: [{ order_id, subaccount? }] (subaccount defaults to 0)
  • Legacy ids array is still accepted and maps to subaccount 0
RESTPredictions
Added target_cost_dollars (and rfq_target_cost_dollars on quotes) as a fixed-point dollar string to RFQ and Quote responses. The CreateRFQ endpoint now accepts target_cost_dollars as an alternative to target_cost_centi_cents.The target_cost_centi_cents and rfq_target_cost_centi_cents fields are now deprecated.Affected endpoints:
  • POST /communications/rfqs
  • GET /communications/rfqs
  • GET /communications/rfqs/{rfq_id}
  • GET /communications/quotes
  • GET /communications/quotes/{quote_id}
RESTPredictions
The subaccount balance field will be represented as a fixed-point dollars string instead of a centicent integer.Affected endpoint:
  • GET /portfolio/subaccounts/balances
RESTPredictions
The exhange fee_cost will be made available on the Fills API starting January 28, 2026.Affected endpoint:
  • GET /portfolio/fills
RESTPredictions
Added more specific error codes for order validation failures. These replace the generic invalid_order response in certain cases:New error codes:
  • invalid_order_size - Order quantity is invalid
  • available_balance_too_low - Insufficient available balance for the order
  • order_id_and_client_order_id_mismatch - OrderID does not match ClOrdID on amend/cancel
  • order_side_mismatch - Order side mismatch on amend/cancel
  • order_ticker_mismatch - Market ticker mismatch on amend/cancel
Affected endpoints:
  • POST /portfolio/orders
  • POST /portfolio/orders/{order_id}/amend
  • DELETE /portfolio/orders/{order_id}
RESTPredictions
The POST /communications/quotes endpoint now accepts an optional subaccount parameter to create quotes on behalf of a subaccount.Affected endpoint:
  • POST /communications/quotes
RESTPredictionsMargin
New endpoint which provides authorized user their api tier and corresponding read and write limits.New endpoint:
  • GET /account/limits
Release date: January 28, 2026
WebSocketPredictions
Added order_group_updates WebSocket channel to stream order group lifecycle updates (created, triggered, reset, deleted, limit_updated). Payloads include contracts_limit_fp for created and limit_updated events.New channel:
  • order_group_updates
Release date: January 29, 2026
RESTPredictions
The client_order_id and updated_client_order_id fields in amend order requests are now optional.Behavior changes:
  • You can now amend orders without providing client_order_id fields by using only the order_id from the URL path
  • If you provide an updated_client_order_id, the order can be found by the exchange and the client_order_id updated just on order_id alone
Affected endpoint:
  • POST /trade-api/v2/portfolio/orders/{order_id}/amend
Example:
This will amend the order identified by order_id without requiring client_order_id fields.Release date: January 28, 2026
Release date: January 29, 2026
RESTPredictions
Added an endpoint to update the contracts limit for an order group (rolling 15-second window). If the updated limit would immediately trigger the group, all orders in the group are canceled and the group is triggered.New endpoint:
  • PUT /portfolio/order_groups/{order_group_id}/limit
Response updates:
  • GET /portfolio/order_groups
  • GET /portfolio/order_groups/{order_group_id}
Both now include contracts_limit and contracts_limit_fp.Release date: January 29, 2026
WebSocketPredictions
Added *_fp fixed-point contract count fields in the WebSocket AsyncAPI spec and examples (orderbook, ticker, trades, fills, positions, communications). See the WebSocket reference.Release date: January 22, 2026
RESTPredictions
Added updated_time to Market responses and min_updated_ts filter to GET /markets, which filters for only markets updated later than the provided unix ts.Affected endpoints:
  • GET /markets/{ticker}
  • GET /markets.
RESTPredictions
Currently, a market settled to a scalar result will return "" in the market_result field. Starting in the next release, this value will read "scalar" instead.Affected endpoints:
  • GET /markets/{ticker}
  • GET /markets
Release date: January 28, 2026
RESTPredictions
Added manual trigger support for order groups.New endpoint:
  • PUT /portfolio/order_groups/{order_group_id}/trigger
Release date: January 22, 2026
RESTPredictions
Maker RFQ client order IDs now use the format quote:<hash>:<quote_id>, where hash is an 8-character hash segment and the maker’s quote ID is added as a suffix.Release date: January 22, 2026
RESTPredictions
Added include_latest_before_start parameter to the single market candlesticks endpoint for price continuity.When set to true, prepends a synthetic candlestick that:
  • Uses the close price from the most recent candlestick before start_ts
  • Sets previous_price to enable continuous price charting
Affected endpoint:
  • GET /series/{series_ticker}/markets/{ticker}/candlesticks
Release date: January 22, 2026
RESTPredictions
Added *_fp string fields for contract counts across REST API requests and responses.Example order response:
See Fixed-Point Contracts for migration details.Release date: Jan 22, 2026
RESTPredictions
Settlement value on component legs are now reported when pulling MVEs.Release date: January 13, 2025
WebSocketPredictions
Added sharding support to the communications WebSocket channel for high-throughput RFQ/quote consumers.New subscription parameters:
  • shard_factor (int): Number of shards to divide messages across (e.g., 4)
  • shard_key (int): Which shard this connection receives (0 to shard_factor-1)
Messages are sharded by market_ticker using consistent hashing. Clients can run multiple connections with different shard_key values to distribute load while ensuring complete coverage.Validation:
  • shard_factor must be > 0 when provided
  • shard_key must be >= 0 and < shard_factor
  • shard_key requires shard_factor to be set
Example subscription:
No breaking changes: When these parameters are omitted, all messages are received as before. Existing integrations are unaffected.
RESTPredictions
New endpoints for managing subaccounts within a user’s portfolio.New endpoints:
  • POST /portfolio/subaccounts - Create a new subaccount
  • GET /portfolio/subaccounts/balances - Get balances for all subaccounts
  • POST /portfolio/subaccounts/transfer - Transfer funds between subaccounts
  • GET /portfolio/subaccounts/transfers - Get paginated history of subaccount transfers
Note: Transfers require a unique client_transfer_id for idempotency.
RESTPredictions
On GET /markets, responses may bear is_provisional: true, indicating that the market will be removed from the API if it has no activity by settlement time.Notes:
  • Historical and existing markets are unaffected, this change only applies going forward.
  • A market will never transition into the provisional state if it was not created as provisional.
Expected release date: January 9, 2025.
RESTPredictions
Added optional volume field to Series responses showing total contracts traded across all events in the series.Affected endpoints:
  • GET /series - Added include_volume query parameter (default: false)
  • GET /series/{series_ticker} - Added include_volume query parameter (default: false)
When include_volume=true, the response includes the volume field with the total contracts traded.Release date: January 15, 2026
RESTPredictions
Cent-denominated price fields will be removed from Market responses.Affected endpoints:
  • GET /markets
  • GET /markets/{ticker}
  • GET /events
  • GET /events/{ticker}
Fields to be removed:
  • response_price_units, notional_value, yes_bid, yes_ask, no_bid, no_ask, last_price, previous_yes_bid, previous_yes_ask, previous_price, liquidity → Use *_dollars equivalents (e.g., yes_bid_dollars)
  • tick_size → Use price_level_structure and price_ranges
Release date: January 15, 2026
RESTPredictions
The deprecated fields category and risk_limit_cents will be removed from Market responses.Affected endpoints:
  • GET /markets
  • GET /markets/{ticker}
Release date: January 8, 2026
RESTPredictions
Search endpoints now accept lowercase query parameters for improved flexibility and consistency.Release date: December 22, 2025
RESTPredictions
Added settlement_ts field to GET /markets and GET /markets/{ticker} responses.Release date: December 25, 2025
RESTPredictions
The Market response object now documents all possible status values: initialized, inactive, active, closed, determined, disputed, amended, finalized.
RESTPredictions
In GET /markets, markets that have been paused by an administrator will be available under new the paused status filter.
RESTPredictions
GET /portfolio/settlements will return each settled position’s Event Ticker. Release Date: December 18, 2025
RESTPredictionsMargin
API keys now support a scopes field. Valid scopes are read and write. Keys default to full access if not specified. All existing API keys will have both scopes.Release date: December 18, 2025
RESTPredictions
GET /portfolio/positions will only return unsettled positions. For fetching settled market positions, switch to GET /portfolio/settlements.Release date: December 11, 2025
RESTPredictions
Breaking Change: GET /events excludes multivariate eventsRelease date: December 4, 2025
RESTPredictions
Release date: December 4, 2025
RESTPredictions
DELETE /portfolio/orders/batched is now generally available. Advanced API access is no longer required. (The Nov 14th update only applied to POST.)Release date: December 4, 2025
FIXPredictions
FIX API v1.0.17
  • BREAKING CHANGE: Tag reorganization for improved compatibility
    • QuoteConfirmStatus now uses tag 21010 (currently supporting both 297 and 21010)
    • SkipPendingExecReports now uses tag 21011 (currently accepting both 21003 and 21011)
    • Tag 297 designated for standard QuoteStatus field
    • Tag 21003 designated for ResendEventCount field
    • Clients should update to use new tags; legacy support will be removed in future version
FIXPredictions
FIX API v1.0.16
  • Added MaxExecutionCost (21009) NewOrderSingle flag.
RESTPredictions
GET /live_data/{type}/milestone/{milestone_id} and GET /live_data/batch now returns milestone_id in the response.Release date: December 4, 2025
RESTPredictions
Updates to filtering in GET /markets
  • Inactive markets during tradable hours will returned in the open selector.
  • Inactive markets during tradable hours no longer appear in the closed selector.
  • Restricting to a single status filter allowed per request (previously announced).
Release date: November 27, 2025
RESTPredictions
Subpenny fields yes_bid_dollars and no_bid_dollars available on the Get Quote API. Affected endpoints:
  • GET /communications/quotes
  • GET /communications/quotes/{quote_id}
RESTPredictions
Adds new endpoint GET /markets/candlesticksRetrieve candlestick data for multiple markets in a single API call. Supports up to 10,000 candlesticks total across all requested markets.Expected release: November 27, 2025
RESTPredictions
Breaking changes to order expiration and immediate-or-cancel (IoC) handling:
  1. Past expiration timestamps now rejected: Orders with expiration_ts in the past will be rejected with error “Expiration timestamp must be in the future” instead of being automatically converted to IoC orders.
  2. IoC + expiration_ts combination rejected: Orders cannot specify both time_in_force: "immediate_or_cancel" and expiration_ts. This will be rejected at the API level with error “Cannot specify both immediate_or_cancel and expiration_ts”.
  3. IoC orders no longer support expiration: The IoC order type is now independent and does not accept an expiration timestamp.
Migration guide: If you were previously using past expiration_ts values to indicate IoC behavior, you must now explicitly set time_in_force: "immediate_or_cancel" instead.Expected release: TBD
FIXPredictions
FIX API v1.0.15
  • Added PreserveOriginalOrderQty (21008) Logon flag to maintain original OrderQty across all execution reports
RESTPredictions
‘Pending’ is being removed from the status enum on ordersExpected release: November 27, 2025
RESTPredictions
POST /portfolio/orders/batched will now be generally available. Advanced API access is no longer a prerequisite.Release date: November 20, 2025
RESTPredictions
Added created_time to GET /markets && GET /market responses.Release date: November 20, 2025
RESTPredictions
Breaking changes planned to GET /markets endpoint for performance reasons: Timestamp filters will be mutually exclusive from other timestamp filters and certain status filters.
RESTPredictions
Added new timestamp filters for the GET /markets endpoint:
  • min_created_ts
  • max_created_ts
  • min_settled_ts
  • max_settled_ts
RESTPredictions
  • GET /portfolio/positions will no longer return resting_orders_count in both the event_positions and market_positions field.
  • The resting_order_count filter on GET /portfolio/positions will no longer be supported. Requests specifying this filter will return a 400 error.
Expected release: November 13, 2025
RESTPredictions
GET /portfolio/settlements now returns the sum of trade fees paid by the user on a settled market position.
RESTPredictions
Fixed two issues with the GET /events endpoint’s limit parameter:
  • Default increased: The default limit is now 200 (previously 100) to return more results per page
  • Parameter: Requests with with_nested_markets=true now properly respect limit=200 instead of being capped at 100
RESTPredictions
The GET /portfolio/positions endpoint now includes total_cost_shares, which tracks the total number of shares traded on an event (including both YES and NO contracts).
RESTPredictions
Added comprehensive support for multivariate events (combos) with new API endpoints and enhanced filtering:New Endpoint and deprecation of multivariate events in GetEvents endpoint
  • GET /events/multivariate - Retrieve multivariate events with filtering by series and collection ticker.
  • GET /events will EXCLUDE multivariate events upon the next release (November 13th). Please use the new endpoint!
Enhanced Market Filtering:
  • GET /markets now supports mve_filter parameter:
    • "only" - Returns only multivariate events
    • "exclude" - Excludes multivariate events
    • No parameter - Returns all events (default behavior)
Expected release: November 6th, 2025
RESTPredictions
Fixed batch order creation to return proper error details when post-only orders cross the market. The response now includes:
  • Error code: "invalid order"
  • Error details: "post only cross"
This makes the batch endpoint consistent with single order creation and provides clear feedback on why post-only orders were rejected.
RESTPredictions
The GET /portfolio/orders endpoint’s event_ticker parameter now supports filtering by multiple events using comma-separated values.Example usage:
Backward Compatible:
  • Single event ticker queries continue to work as before
  • Multiple event tickers return orders from all specified events
RESTPredictions
Fixed missing fields in Quote responses: rfq_target_cost_centi_cents, rfq_creator_order_id, and creator_order_id are now properly included in all Quote-related endpoints.
RESTPredictions
The GET /events endpoint now supports an optional flag, with_milestones, that includes all milestones related to the returned events.Expected release: October 16, 2025
RESTPredictions
The order returned by create order is now the same model as the model returned by get order.
RESTPredictions
The GET /v2/incentive_programs and GET /incentive_programs endpoints now return a series_ticker field for each incentive program.Expected release: October 13, 2025
RESTPredictions
The price_level_structure field has been moved from the event level to the market level. Each market now has its own price_level_structure field.Affected endpoints:
  • GET /trade-api/v2/events
  • GET /trade-api/v2/events/:event_ticker
  • GET /trade-api/v2/markets
  • GET /trade-api/v2/markets/:ticker
Note: The price_level_structure field on event objects is now deprecated and will be removed. Please use the field on individual market objects instead.Expected release date: Oct 15th, 2025
RESTPredictions
Fixed the GET /series endpoint’s tags parameter to properly support tags containing spaces. Previously, the parameter would split on both commas AND spaces, breaking searches for tags like “Rotten Tomatoes”.Breaking Change:
  • The tags query parameter now only splits on commas (,), not spaces
  • Tags with spaces (e.g., “Rotten Tomatoes”) now work correctly
  • Multiple tags must be comma-separated: ?tags=Rotten Tomatoes,Television
Before (broken):
After (fixed):
This change may affect integrations that relied on space-separated tags. Please update to use comma-separated tags only.
RESTPredictions
Fixed routing inconsistency where certain collection endpoints required trailing slashes, causing unnecessary 301 redirects for requests without them.Endpoints now returning 200 for requests without trailing slash (previously returned 301):
  • GET /milestones
  • GET /structured_targets
  • GET /multivariate_event_collections
  • GET /series
  • GET /api_keys
  • POST /api_keys
Note: Requests with trailing slashes (e.g., /milestones/) will now receive a 301 redirect to the version without the trailing slash, which is the opposite of the previous behavior.
RESTPredictions
Subpenny fields have been added to orders (taker_fees_dollars, maker_fees_dollars), as well as to public trades (yes_price_dollars, no_price_dollars).Endpoints affected:
  • GET /trade-api/v2/portfolio/orders
  • GET /trade-api/v2/markets/trades
WebSocketPredictions
Fields have been added to all RFQ and quote messages to support subpenny pricing via the dollar normalized price fields. For more info reference:
RESTPredictions
Enhanced the existing GET /portfolio/balance endpoint to include a portfolio_value field that provides the total portfolio value (available balance plus current market value of all positions), both in cents.
RESTPredictions
The GET /series/fee_changes endpoint now returns user-facing fee type names (quadratic, quadratic_with_maker_fees, flat) instead of internal fee structure names. This change also applies to CustomerIO notifications for scheduled series fee updates.Expected release: October 1, 2025
FIXPredictions
FIX API v1.0.14
  • Added support for subpenny pricing across multiple FIX messages
  • For more info see Subpenny Pricing
WebSocketPredictions
Repeated subscriptions on the same WebSocket call will no longer error. If passing the same market tickers as before, no action will be taken. If passing new market tickers, they will be added to your existing subscription.Additionally, the user may supply WS Command list_subscriptions to view their existing subscriptions.Expected release: October 1, 2025
RESTPredictions
For optimization purposes, partial fills generated by self-crossing FoK orders are not rolled back. If a FoK order self-crosses, order execution proceeds based on self_trade_prevention_type:
  • taker_at_cross: the taker is canceled, execution stops. Any partial fills are executed.
  • maker: the maker is canceled, execution continues. After execution, remaining taker quantity is canceled. Any fills are executed.
This fixes a bug where partially filled FoK orders with Maker STP entered into the book after self-crossing. Expected enforced date: Oct 1, 2025.
RESTWebSocketPredictions
User seeking a simple way to determine the direction of their fill should reference purchased_side. Both BUY YES or SELL NO result in purchased_side = YES. The addition of this field is the first step in standardizing the fills WebSocket and REST endpoints, which have different conventions for the interpretation ‘side’ and ‘user_action’.Expected Enforce Date: deprecation date for existing fields not yet scheduled.
RESTPredictions
Added new public API endpoint for getting all of a series’ scheduled fees:
  • GET /series/fee_changes - Get a series’ fee changes. If query string parameter show_historical is set to true, ALL fee changes previous and upcoming will be shown. If set to false, only upcoming fee changes will be shown
RESTPredictions
Specifying order_type is no longer required and only limit type orders will be supported. Price must be supplied based on the underlying market structure. Example usage:
Expected enforce date: Sep 25, 2025
WebSocketPredictions
WebSocket connections per user are limited by usage tier. The default limit begins at 200 and increases based on API usage tier.
WebSocketPredictions
A new WS channel is being introduced for streaming information related to pre-trade communications (RFQs and quotes).
RESTPredictions
Additional metadata is being added to RFQs on multivarate events (MVEs) that break down their component parts explicitly. Market payloads are also being expanded with these new optional fields that are filled only for MVE markets.
RESTPredictions
Added new public API endpoint for event candlesticks:
  • GET /candlesticks - Get candlesticks for all markets associated with an event. If the # of candlesticks exceeds 5000, paginate the results and return an adjustedEndTs which should be used as the start_ts for your next request.
RESTPredictions
The TypeScript SDK is now available through NPM! Install with npm install kalshi-typescript.Documentation and examples available at docs.kalshi.com
RESTPredictions
Added new public API endpoint for forecast percentiles history:
  • GET /forecast_percentiles_history - Get percentile history of a event forecast
RESTPredictions
Added new public API endpoint for incentive programs (not yet live):
  • GET /incentive_programs - List incentive programs with filtering options (by market ticker, active status, payout status)
WebSocketPredictions
Subpenny pricing fields have been added to WebSocket messages. Any message bearing price in cents will now also bear an equivalent fixed-point dollars field.For more info, see Subpenny Pricing.
RESTPredictions
Both the individual and batch GET events endpoints now also return available_on_brokers which indicates that they are available on intermediate platforms/ brokers.
RESTPredictions
The python SDK is being generated from our OpenAPI spec and is available through pip with pip install kalshi-python. Docs for the new SDK are available on docs.kalshi.com/python-sdk.
RESTPredictions
Subpenny pricing fields have been added to APIs involving price, fees, and money in general. E.g. next to a field called "price": 12 (representing 12 cents), you will also see "price_dollars": "0.1200", which is a string bearing a fixed-point representation of money accuate to at 4 decimal points.For now, this change is read-only, meaning that the minimum allowable tick size for orders is still 1c. Eventually, we will introduce sub-penny pricing on orders. For now, please prepare for an eventual migration to the higher granularity price representation.For more info, see Subpenny Pricing.
RESTPredictions
The market payload has been updated to include two new fields that describe markets which are part of Multivariate Events.
RESTPredictions
The market payload has been updated to include two new fields that describe markets which are part of Multivariate Events.
RESTPredictions
The MVE payload has been expanded to support more flexible structures. Several fields that are now redundant are deprecated, but not yet removed.
RESTPredictions
The Settlements API now includes the settlement value for a yes contract.
RESTPredictions
The get_milestones endpoint now uses case-insensitive matching for the category parameter, resolving inconsistent filtering behavior between “Sports” and “sports”.
FIXPredictions
FIX API v1.0.13
  • Added Order Group management messages (UOG/UOH)
  • Support for automatic order cancellation with contracts limits
  • Create, Reset, and Delete operations for order groups
RESTPredictions
Filtering events by close ts and series by tags supported in the API.
RESTPredictions
The batch order endpoints are now available to all API users in the demo environment:Affected Endpoints:
  • POST /portfolio/orders/batched (BatchCreateOrders)
  • DELETE /portfolio/orders/batched (BatchCancelOrders)
Changes:
  • Basic tier users can now access batch endpoints in demo environment
  • Production environment remains unchanged - Advanced tier or higher still required
  • Rate limits still apply based on user tier
This change enables developers to test batch order functionality without needing Advanced tier access in the demo environment.
RESTPredictions
The error messages when an incorrect API signature is passed have been improved
RESTPredictions
The OpenAPI specification for the Kalshi API is now available at https://docs.kalshi.com/openapi.yaml. This allows developers to easily generate client libraries and integrate with the API using OpenAPI-compatible tools.
WebSocketPredictions
Added client_order_id field to orderbook delta WebSocket messages. This field appears only when you caused the orderbook change and contains the client_order_id of your order that triggered the delta.WebSocket Message Enhancement:
  • New field: client_order_id (string, optional)
  • Present only when the authenticated user’s order causes the orderbook change
  • Contains the client-provided order ID of the triggering order
See the WebSocket documentation for implementation details.
RESTPredictions
Added GET /portfolio/orders/queue_positions endpoint for retrieving queue positions of multiple resting orders.Request Parameters:
  • market_tickers (optional): Array of market tickers to filter by
  • event_ticker (optional): Event ticker to filter by
Note: You must specify one of market_tickers and event_ticker in the request.
We are migrating our API documentation to a new platform:
  • RSS feed moved from https://trading-api.readme.io/changelog.rss to https://docs.kalshi.com/changelog/rss.xml
  • Documentation site trading-api.readme.io is now deprecated
  • New documentation home: https://docs.kalshi.com
  • Historical changelog entries will not be backfilled to the new RSS feed
Please update your bookmarks and RSS subscriptions.
RESTPredictions
The GetEventMetadata endpoint has been expanded to include settlement sources.
RESTPredictions
The GetApiVersion endpoint has been removed. API versioning will not be available for the time being.
FIXPredictions
FIX API v1.0.12
  • Added support for ListenerSession Logon flag for KalshiNR/KalshiRT
  • Added support for ReceiveSettlementReports Logon flag for KalshiRT
  • Deprecated SecurityGroup
FIXPredictions
FIX API v1.0.11
  • Removed Required from OrderQty on Cancel 35=F
  • Added PostOnly to Create 35=D
FIXPredictions
FIX API v1.0.10
  • Removed deprecated event settlement message type
  • Added ListenerSession and SkipPendingExecReports flag to Logon message type