/changelog.rss if you’d like to stay ahead of breaking changes.
You can reference the pending API spec under the “version” dropdown menu at the top left. When the actual API is upgraded to this new version, you will see the version marked as “Stable” in the drop-down menu and become the new default on the landing page.
This changelog is a work in progress. As always, we welcome any feedback in our Discord #dev channel!
Recent Updates
Jan 22, 2026
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
January 29, 2026Jan 21, 2026
The This will amend the order identified by
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_idfields by using only theorder_idfrom the URL path - If you provide an
updated_client_order_id, the order can be found by the exchange and theclient_order_idupdated just onorder_idalone
POST /trade-api/v2/portfolio/orders/{order_id}/amend
order_id without requiring client_order_id fields.Release date: January 28, 2026Jan 29, 2026
Release date:
January 29, 2026Jan 29, 2026
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
GET /portfolio/order_groupsGET /portfolio/order_groups/{order_group_id}
contracts_limit and contracts_limit_fp.Release date: January 29, 2026Jan 22, 2026
Added
*_fp fixed-point contract count fields in the WebSocket AsyncAPI spec and examples
(orderbook, ticker, trades, fills, positions, communications). See the AsyncAPI spec.Release date: January 22, 2026Jan 21, 2026
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.
Jan 20, 2026
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
January 28, 2026Jan 21, 2026
Added manual trigger support for order groups.New endpoint:
PUT /portfolio/order_groups/{order_group_id}/trigger
January 22, 2026Jan 16, 2026
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, 2026Jan 16, 2026
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_priceto enable continuous price charting
GET /series/{series_ticker}/markets/{ticker}/candlesticks
January 22, 2026Jan 15, 2026
Added See Fixed-Point Contracts for migration details.Release date:
*_fp string fields for contract counts across REST API requests and responses.Example order response:Jan 22, 2026Jan 13, 2025
RFQ creator IDs will be exposed only after the RFQ is closed/executes. Accordingly the RFQ creator ID is removed
entirely from related websocket messages that are created before this point (RFQCreated, QuoteCreated).Release date:
Jan 15, 2025Jan 13, 2025
Settlement value on component legs are now reported when pulling MVEs.Release date:
January 13, 2025Jan 12, 2026
Added sharding support to the No breaking changes: When these parameters are omitted, all messages are received as before. Existing integrations are unaffected.
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)
market_ticker using consistent hashing. Clients can run multiple connections with different shard_key values to distribute load while ensuring complete coverage.Validation:shard_factormust be > 0 when providedshard_keymust be >= 0 and <shard_factorshard_keyrequiresshard_factorto be set
Jan 9, 2026
New endpoints for managing subaccounts within a user’s portfolio.New endpoints:
POST /portfolio/subaccounts- Create a new subaccountGET /portfolio/subaccounts/balances- Get balances for all subaccountsPOST /portfolio/subaccounts/transfer- Transfer funds between subaccountsGET /portfolio/subaccounts/transfers- Get paginated history of subaccount transfers
client_transfer_id for idempotency.Jan 9, 2025
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.
January 9, 2025.Jan 6, 2026
Added optional
volume field to Series responses showing total contracts traded across all events in the series.Affected endpoints:GET /series- Addedinclude_volumequery parameter (default:false)GET /series/{series_ticker}- Addedinclude_volumequery parameter (default:false)
include_volume=true, the response includes the volume field with the total contracts traded.Release date: January 15, 2026Jan 6, 2026
Cent-denominated price fields will be removed from Market responses.Affected endpoints:
GET /marketsGET /markets/{ticker}GET /eventsGET /events/{ticker}
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*_dollarsequivalents (e.g.,yes_bid_dollars)tick_size→ Useprice_level_structureandprice_ranges
January 15, 2026Jan 5, 2026
The deprecated fields
category and risk_limit_cents will be removed from Market responses.Affected endpoints:GET /marketsGET /markets/{ticker}
January 8, 2026Dec 22, 2025
Search endpoints now accept lowercase query parameters for improved flexibility and consistency.Release date:
December 22, 2025Dec 19, 2025
Added
settlement_ts field to GET /markets and GET /markets/{ticker} responses.Release date: December 25, 2025Dec 16, 2025
The
Market response object now documents all possible status values: initialized, inactive, active, closed, determined, disputed, amended, finalized.Dec 13, 2025
In
GET /markets, markets that have been paused by an administrator will be available under new the paused status filter.Dec 11, 2025
GET /portfolio/settlements will return each settled position’s Event Ticker.
Release Date: December 18, 2025Dec 18, 2025
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, 2025Dec 5, 2025
GET /portfolio/positions will only return unsettled positions. For fetching settled market positions, switch to GET /portfolio/settlements.Release date: December 11, 2025Dec 2, 2025
Breaking Change:
GET /events excludes multivariate eventsRelease date: December 4, 2025Dec 1, 2025
Release date:
December 4, 2025Dec 1, 2025
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, 2025Nov 29, 2025
GET /live_data/{type}/milestone/{milestone_id} and GET /live_data/batch now returns milestone_id in the response.Release date: December 4, 2025Nov 23, 2025
Updates to filtering in
GET /markets- Inactive markets during tradable hours will returned in the
openselector. - Inactive markets during tradable hours no longer appear in the
closedselector. - Restricting to a single status filter allowed per request (previously announced).
November 27, 2025Nov 21, 2025
Subpenny fields
yes_bid_dollars and no_bid_dollars available on the Get Quote API. Affected endpoints:GET /communications/quotesGET /communications/quotes/{quote_id}
Nov 27, 2025
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, 2025Nov 21, 2025
Breaking changes to order expiration and immediate-or-cancel (IoC) handling:
-
Past expiration timestamps now rejected: Orders with
expiration_tsin the past will be rejected with error “Expiration timestamp must be in the future” instead of being automatically converted to IoC orders. -
IoC + expiration_ts combination rejected: Orders cannot specify both
time_in_force: "immediate_or_cancel"andexpiration_ts. This will be rejected at the API level with error “Cannot specify both immediate_or_cancel and expiration_ts”. - IoC orders no longer support expiration: The IoC order type is now independent and does not accept an expiration timestamp.
expiration_ts values to indicate IoC behavior, you must now explicitly set time_in_force: "immediate_or_cancel" instead.Expected release: TBDNov 20, 2025
‘Pending’ is being removed from the status enum on ordersExpected release:
November 27, 2025Nov 14, 2025
POST /portfolio/orders/batched will now be generally available. Advanced API access is no longer a prerequisite.Release date: November 20, 2025Nov 14, 2025
Added
created_time to GET /markets && GET /market responses.Release date: November 20, 2025Nov 11, 2025
Breaking changes planned to
GET /markets endpoint for performance reasons:
Timestamp filters will be mutually exclusive from other timestamp filters and certain status filters.| Compatible Timestamp Filters | Additional Status Filters |
|---|---|
| min_created_ts, max_created_ts | unopened, open, empty |
| min_close_ts, max_close_ts | closed, empty |
| min_settled_ts, max_settled_ts | settled, empty |
Nov 11, 2025
Added new timestamp filters for the
GET /markets endpoint:min_created_tsmax_created_tsmin_settled_tsmax_settled_ts
Nov 7, 2025
GET /portfolio/positionswill no longer returnresting_orders_countin both theevent_positionsandmarket_positionsfield.- The
resting_order_countfilter onGET /portfolio/positionswill no longer be supported. Requests specifying this filter will return a 400 error.
November 13, 2025Nov 13, 2025
GET /portfolio/settlements now returns the sum of trade fees paid by the user on a settled market position.Nov 6, 2025
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=truenow properly respectlimit=200instead of being capped at 100
Nov 6, 2025
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).Nov 6, 2025
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 /eventswill EXCLUDE multivariate events upon the next release (November 13th). Please use the new endpoint!
GET /marketsnow supportsmve_filterparameter:"only"- Returns only multivariate events"exclude"- Excludes multivariate events- No parameter - Returns all events (default behavior)
November 6th, 2025Oct 24, 2025
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"
Oct 20, 2025
The Backward Compatible:
GET /portfolio/orders endpoint’s event_ticker parameter now supports filtering by multiple events using comma-separated values.Example usage:- Single event ticker queries continue to work as before
- Multiple event tickers return orders from all specified events
Oct 19, 2025
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.Oct 16, 2025
The
GET /events endpoint now supports an optional flag, with_milestones, that includes all milestones related to the returned events.Expected release: October 16, 2025Oct 14, 2025
The order returned by create order is now the same model as the model returned by get order.
Oct 13, 2025
The
GET /v2/incentive_programs and GET /incentive_programs endpoints now return a series_ticker field for each incentive program.Expected release: October 13, 2025Oct 10, 2025
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/eventsGET /trade-api/v2/events/:event_tickerGET /trade-api/v2/marketsGET /trade-api/v2/markets/:ticker
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, 2025Oct 13, 2025
Fixed the After (fixed):This change may affect integrations that relied on space-separated tags. Please update to use comma-separated tags only.
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
tagsquery 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
Oct 8, 2025
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 /milestonesGET /structured_targetsGET /multivariate_event_collectionsGET /seriesGET /api_keysPOST /api_keys
/milestones/) will now receive a 301 redirect to the version without the trailing slash, which is the opposite of the previous behavior.Oct 9, 2025
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/ordersGET /trade-api/v2/markets/trades
Oct 9, 2025
Fields have been added to all RFQ and quote messages to support subpenny pricing via the dollar normalized price fields.
For more info reference:
Oct 7, 2025
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.Oct 1, 2025
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, 2025Sep 25, 2025
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, 2025Sep 25, 2025
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.
Oct 1, 2025.Sep 22, 2025
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.
Sep 21, 2025
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
Sep 25, 2025
Specifying Expected enforce date:
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:Sep 25, 2025Sep 18, 2025
WebSocket connections per user are limited by usage tier. The default limit begins at 200 and increases based on API usage tier.
Sep 18, 2025
A new WS channel is being introduced for streaming information related to pre-trade communications (RFQs and quotes).
Sep 15, 2025
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.
Sep 15, 2025
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.
Sept 11, 2025
The TypeScript SDK is now available through NPM! Install with
npm install kalshi-typescript.Documentation and examples available at docs.kalshi.comSep 11, 2025
Added new public API endpoint for forecast percentiles history:
GET /forecast_percentiles_history- Get percentile history of a event forecast
Sep 10, 2025
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)
Sep 9, 2025
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.
Sep 9, 2025
Both the individual and batch
GET events endpoints now also return available_on_brokers which indicates that they are available on intermediate platforms/ brokers.Sep 6, 2025
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.
Aug 31, 2025
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.Sep 2, 2025
The market payload has been updated to include two new fields that describe markets which are part of Multivariate Events.
Sep 2, 2025
The market payload has been updated to include two new fields that describe markets which are part of Multivariate Events.
Aug 21, 2025
The MVE payload has been expanded to support more flexible structures. Several fields that are now redundant are deprecated, but not yet removed.
Aug 21, 2025
The Settlements API now includes the settlement value for a yes contract.
Aug 21, 2025
The get_milestones endpoint now uses case-insensitive matching for the category parameter, resolving inconsistent filtering behavior between “Sports” and “sports”.
Aug 14, 2025
Filtering events by close ts and series by tags supported in the API.
Aug 13, 2025
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)
- 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
Aug 13, 2025
The error messages when an incorrect API signature is passed have been improved
Aug 9, 2025
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.Aug 8, 2025
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
Aug 1, 2025
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 byevent_ticker(optional): Event ticker to filter by
market_tickers and event_ticker in the request.July 31, 2025
We are migrating our API documentation to a new platform:
- RSS feed moved from
https://trading-api.readme.io/changelog.rsstohttps://docs.kalshi.com/changelog/rss.xml - Documentation site
trading-api.readme.iois now deprecated - New documentation home:
https://docs.kalshi.com - Historical changelog entries will not be backfilled to the new RSS feed
July 31, 2025
The GetEventMetadata endpoint has been expanded to include settlement sources.
July 29, 2025
The GetApiVersion endpoint has been removed. API versioning will not be available for the time being.