Skip to main content
Last Updated: March 8, 2026
DateChangeDetails
March 9Subpenny pricing enabledKXGREENLAND-29 (deci_cent), KXGDPNOM-RUS26 (tapered_deci_cent)
March 12Fractional trading enabledKXJOBLESSCLAIMS-26MAR19, KXHOUHOMEVAL-26MAR19, KXDENHOMEVAL-26MAR19, KXSEAHOMEVAL-26MAR19, KXSDHOMEVAL-26MAR19, KXBOSHOMEVAL-26MAR19, KXUSHOMEVAL-26MAR19, KXCBDECISIONBRAZIL-26APR29, KXCBDECISIONJAPAN-26APR28, KXUE-AUS26APR
March 12Legacy integer fields removed from all API responsesSee removed fields

Overview

Kalshi has migrated from integer to fixed-point representation across all APIs. This involves two independent changes:
  1. Subpenny Pricing — price fields use fixed-point dollar strings (_dollars suffix)
  2. Fractional Contracts — contract count fields use fixed-point strings (_fp suffix)
Two fields on Market responses indicate which of these features are active for a given market:
FieldTypeDescription
price_level_structurestringPrice level structure defining price ranges and tick sizes
fractional_trading_enabledbooleanWhether fractional order sizes are accepted

Subpenny Pricing

Prices are represented as fixed-point dollar strings.
{
    "price_dollars": "0.1200"
}
  • *_dollars fields are fixed-point dollar strings with up to 4 decimal places (e.g., "0.1200")
  • When combined with fractional contract sizes, intermediate calculations can reach up to 6 decimal places (for example, in fee rounding math)
Subpenny pricing is offered on a per-market basis. The price_level_structure field on Market responses indicates which pricing tier is active, and the price_ranges array provides the exact valid price intervals and tick sizes for that market.

Price Level Structures

StructureRangesTick Size
linear_cent$0.00 – $1.00$0.01
tapered_deci_cent$0.00 – $0.10$0.001
$0.10 – $0.90$0.01
$0.90 – $1.00$0.001
deci_cent$0.00 – $1.00$0.001
tapered_deci_cent provides finer $0.001 (decicent) precision at the tails of the probability range — below $0.10 and above $0.90 — where small absolute price differences represent large relative changes in implied probability. The middle range uses standard $0.01 (cent) ticks. deci_cent applies $0.001 precision across the entire range. See the summary above for the initial subpenny-enabled markets.

Fractional Contracts

Contract count fields use fixed-point strings.
{
  "count_fp": "10.00"
}
  • *_fp fields are strings
  • Accept 0-2 decimal places on input (responses always emit 2 decimals)
  • In requests where both integer and _fp fields are provided, they must match
Check the fractional_trading_enabled field on Market responses to determine whether a given market supports fractional order sizes. See the summary above for the initial fractional-enabled markets. Even if you are not placing fractional orders, you may encounter fractional values in other parts of the API (for example, fills on fractional-enabled markets). One way to prepare is to internally multiply the _fp value by 100 and cast to an integer. For example, treating "1.55" as 155 units of 1c contracts allows continued use of integer arithmetic.

Fee Rounding

Both subpenny pricing and fractional contracts can produce sub-cent balance changes on fills. When this happens, the exchange applies a rounding fee to restore cent-alignment, and a fee accumulator issues rebates to prevent systematic overpayment. See Fee Rounding for the mechanics and worked examples.

Removed Legacy Fields

The following legacy integer fields are removed from outgoing REST and WebSocket messages in the fixed-point hard cut. Use the corresponding _fp or _dollars field instead. For the full updated specs, see openapi.yaml and asyncapi.yaml.

REST API (/trade-api/v2)

Market (GET /markets, GET /markets/{ticker}):
Removed fieldReplacement
yes_bidyes_bid_dollars
yes_askyes_ask_dollars
no_bidno_bid_dollars
no_askno_ask_dollars
last_pricelast_price_dollars
volumevolume_fp
volume_24hvolume_24h_fp
open_interestopen_interest_fp
notional_valuenotional_value_dollars
previous_yes_bidprevious_yes_bid_dollars
previous_yes_askprevious_yes_ask_dollars
previous_priceprevious_price_dollars
liquidityliquidity_dollars
settlement_valuesettlement_value_dollars
Order (GET /portfolio/orders, POST /portfolio/orders, PATCH /portfolio/orders/{order_id}, DELETE /portfolio/orders/{order_id}):
Removed fieldReplacement
yes_priceyes_price_dollars
no_priceno_price_dollars
fill_countfill_count_fp
remaining_countremaining_count_fp
initial_countinitial_count_fp
taker_fill_costtaker_fill_cost_dollars
maker_fill_costmaker_fill_cost_dollars
taker_feestaker_fees_dollars
maker_feesmaker_fees_dollars
Trade (GET /markets/{ticker}/trades):
Removed fieldReplacement
countcount_fp
priceyes_price_dollars / no_price_dollars
yes_priceyes_price_dollars
no_priceno_price_dollars
Fill (GET /portfolio/fills):
Removed fieldReplacement
countcount_fp
priceyes_price_fixed / no_price_fixed
yes_priceyes_price_fixed
no_priceno_price_fixed
MarketPosition / EventPosition (GET /portfolio/positions):
Removed fieldReplacement
positionposition_fp
total_tradedtotal_traded_dollars
market_exposuremarket_exposure_dollars
realized_pnlrealized_pnl_dollars
fees_paidfees_paid_dollars
total_costtotal_cost_dollars
total_cost_sharestotal_cost_shares_fp
event_exposureevent_exposure_dollars
Settlement (GET /portfolio/settlements):
Removed fieldReplacement
yes_countyes_count_fp
no_countno_count_fp
Candlestick (GET /markets/{ticker}/candlesticks):
Removed fieldReplacement
volumevolume_fp
open_interestopen_interest_fp
BidAskDistribution: open, close, high, lowopen_dollars, close_dollars, high_dollars, low_dollars
PriceDistribution: open, close, high, low, mean, previous, min, max*_dollars counterparts
Orderbook (GET /markets/{ticker}/orderbook):
Removed fieldReplacement
orderbook (legacy integer arrays)orderbook_fp (dollar-priced, fp-count arrays)
Queue Position (GET /portfolio/orders/{order_id}/queue_position):
Removed fieldReplacement
queue_positionqueue_position_fp
Cancel/Decrease Order (DELETE /portfolio/orders/{order_id}):
Removed fieldReplacement
reduced_byreduced_by_fp
OrderGroup (GET /portfolio/order_groups):
Removed fieldReplacement
contracts_limitcontracts_limit_fp
RFQ (GET /rfqs):
Removed fieldReplacement
contractscontracts_fp
target_cost_centi_centstarget_cost_dollars
Quote (GET /rfqs/{rfq_id}/quotes):
Removed fieldReplacement
contractscontracts_fp
yes_bidyes_bid_dollars
no_bidno_bid_dollars
rfq_target_cost_centi_centsrfq_target_cost_dollars
Series (GET /series):
Removed fieldReplacement
volumevolume_fp
IncentiveProgram (GET /exchange/incentive_programs):
Removed fieldReplacement
target_sizetarget_size_fp

WebSocket API

orderbook_snapshot:
Removed fieldReplacement
yes (integer arrays)yes_dollars_fp
no (integer arrays)no_dollars_fp
orderbook_delta:
Removed fieldReplacement
priceprice_dollars
deltadelta_fp
ticker:
Removed fieldReplacement
priceprice_dollars
yes_bidyes_bid_dollars
yes_askyes_ask_dollars
volumevolume_fp
open_interestopen_interest_fp
trade:
Removed fieldReplacement
yes_priceyes_price_dollars
no_priceno_price_dollars
countcount_fp
fill:
Removed fieldReplacement
yes_priceyes_price_dollars
countcount_fp
post_positionpost_position_fp
market_position:
Removed fieldReplacement
positionposition_fp
position_costposition_cost_dollars
realized_pnlrealized_pnl_dollars
fees_paidfees_paid_dollars
position_fee_costposition_fee_cost_dollars
volumevolume_fp
rfq_created / rfq_deleted:
Removed fieldReplacement
contractscontracts_fp
target_costtarget_cost_dollars
quote_created / quote_accepted:
Removed fieldReplacement
yes_bidyes_bid_dollars
no_bidno_bid_dollars
yes_contracts_offeredyes_contracts_offered_fp
no_contracts_offeredno_contracts_offered_fp
rfq_target_costrfq_target_cost_dollars
contracts_acceptedcontracts_accepted_fp