Order Entry Messages

Overview

Kalshi treats all orders as bids or asks for Yes contracts. Selling Yes is equivalent to buying No contracts. All orders are fully cash-collateralized.
A resting offer to purchase Yes contracts at 4 cents could match with another participant willing to purchase No contracts for 96 cents.

New Order Single (35=D)

Submit a new order to the exchange.

Required Fields

TagNameDescriptionType/Values
11ClOrderIDClient order identifier (idempotency)UUID
38OrderQtyNumber of contractsInteger
40OrdTypeOrder typeLimit<2>
54SideBuy/Sell Yes contractsBuy<1>, Sell<2>
55SymbolMarket tickerString (e.g., “EURUSD-23JUN2618-B1.087”)
44PricePrice per contract in cents (1-99)Integer

Optional Fields

TagNameDescriptionValues
59TimeInForceOrder expirationDay<0>, GTC<1>, IOC<3>, GTD<6>
18ExecInstExecution instructionsPostOnly<6>
126ExpireTimeRequired if TimeInForce=GTDUTC Timestamp
453NoPartyIDsNumber of parties (for sub-accounts)1
448PartyIDSub-account identifierUUID
452PartyRoleParty roleCustomer Account<24>
2964SelfTradePreventionTypeSelf-trade preventionTakerAtCross<1>, Maker<2>
526SecondaryClOrdIDOrder group IDUUID
8=FIXT.1.1|9=200|35=D|34=5|52=20230809-12:34:56.789|49=your-api-key|56=KalshiNR|
11=550e8400-e29b-41d4-a716-446655440000|38=10|40=2|54=1|55=HIGHNY-23DEC31|44=75|
59=1|10=123|

Execution Report (35=8)

Notifications about order status changes, fills, and rejections.

Key Fields

TagNameDescriptionWhen Present
6AvgPxCalculated average price of all fills on this orderAlways
11ClOrderIDClOrderId identifier provided by the initiator on the last message that made any change to the order this execution report refers toAlways
14CumQtyTotal number of contracts filled in this order so farAlways
17ExecIDUnique sequenced identifier for this report messageAlways
31LastPxPrice of this (last) fill in centsTrade only
32LastQtyNumber of contracts bought or sold in this reportTrade only
37OrderIDUnique identifier for the order in the Kalshi exchange. Please use this ID when referencing the order for supportAlways
38OrderQtyTotal number of contracts currently in the order. OrderQty = CumQty + LeavesQtyAlways
39OrdStatusConveys the current status of the order. This should be read as the status after the event causing this execution report to be sentAlways
41OrigClOrdIDClOrdID(11) of the previous non-rejected order stateReplaced/Canceled
44PricePrice per contract in centsWhen applicable
54SideYes or No for the original orderAlways
55SymbolMarket ticker for the orderAlways
58TextHuman-readable description of the result of the execution reportWhen applicable
60TransactTimeTimestamp for the event that triggered this execution reportAlways
103OrdRejReasonSpecifies the rejection reason in case ExecType = RejectedRejected only
126ExpireTimeSpecifies the expiration timestamp for the order if TimeInForce is Good Till Date. This will return 11:59pm ET if TimeInForce is DayWhen applicable
150ExecTypeConveys the reason why this execution report was sentAlways
151LeavesQtyRemaining number of contracts that remains open for further execution on this orderAlways

Execution Types (150)

  • New<0>: Order accepted
  • Trade<F>: Order filled (partial or complete)
  • Canceled<4>: Order canceled
  • Replaced<5>: Order modified
  • Rejected<8>: Order rejected
  • Expired<C>: Order expired
  • Pending New<A>: Order pending acceptance
  • Pending Cancel<6>: Cancel pending
  • Pending Replace<E>: Modification pending

Order Status (39)

  • New<0>: Active order, no fills
  • Partially Filled<1>: Some quantity filled
  • Filled<2>: Completely filled
  • Canceled<4>: Canceled (may have partial fills)
  • Pending Cancel<6>: Cancel pending
  • Rejected<8>: Order rejected
  • Pending New<A>: Order pending acceptance
  • Expired<C>: Time in force expired
  • Pending Replace<E>: Modification pending

Side Values (54)

  • Buy<1>: Yes
  • Sell<2>: No

Order Rejection Reasons (103)

  • Unknown symbol<1>
  • Exchange closed<2>
  • Order exceeds limit<3>
  • Too late to enter<4>
  • Duplicate order<6>
  • Unsupported order characteristic<11>
  • Other<99>

Position and Fee Information

When ExecType=Trade:
TagNameDescription
704LongQtyNet Yes position after trade
705ShortQtyNet No position after trade
136NoMiscFeesNumber of fees
137MiscFeeAmtTotal fees in dollars
138MiscFeeCurrCurrency (USD)
139MiscFeeTypeExchange Fees<4>
891MiscFeeBasisFee unit (always ABSOLUTE<0>)
880TrdMatchIDUnique trade identifier
1057AggressorIndicatorTaker/Maker flag

Collateral Changes

TagNameDescription
1703NoCollateralAmountsNumber of collateral changes
1704CurrentCollateralAmountDelta in cents
1706CollateralTypeBALANCE or PAYOUT

Party Information

Party fields from the original order request are echoed back in ExecutionReports:
TagNameDescription
453NoPartyIDsNumber of parties (for sub-accounts)
448PartyIDSub-account identifier
452PartyRoleCustomer Account<24>
Party fields are only included when the order is placed under a sub-account. These fields help track orders across different sub-accounts or FCM clients.

Text Field Values

The Text field (Tag 58) provides human-readable descriptions for various execution scenarios. Example values:
  • "insufficient funds"
  • "self-trade prevention"
  • "position limit exceeded"
  • "order group cancel"
  • "immediate or cancelled"

Order Cancel Request (35=F)

Cancel all remaining quantity of an existing order.

Required Fields

TagNameDescription
11ClOrderIDUnique cancel request ID
41OrigClOrdIDClOrdID of order to cancel
54SideMust match original order
55SymbolMust match original order

Optional Fields

TagNameDescription
37OrderIDExchange order ID
38OrderQtyMust match current total quantity
Cancel requests are processed synchronously. You’ll receive either an ExecutionReport with ExecType=Canceled or an OrderCancelReject.

Order Cancel/Replace Request (35=G)

Modify an existing order without canceling it.

Supported Modifications

  • OrderQty: Can increase or decrease quantity
  • Price: Can change limit price

Required Fields

TagNameDescription
11ClOrderIDUnique modification request ID
41OrigClOrdIDPrevious ClOrdID
38OrderQtyNew total quantity
40OrdTypeLimit<2>
54SideMust match original
55SymbolMust match original

Optional Fields

TagNameDescription
37OrderIDExchange order ID
44PriceNew price (if changing)
If OrderQty equals filled quantity, the order will be canceled. If less than filled quantity, the request will be rejected.

Order Cancel Reject (35=9)

Sent when a cancel or replace request cannot be processed.
TagNameDescription
11ClOrderIDID from failed request
37OrderIDExchange order ID
39OrdStatusCurrent order status
41OrigClOrdIDOriginal order’s ClOrdID
102CxlRejReasonRejection reason code
434CxlRejResponseToCancel<1> or Replace<2>

Rejection Reasons (102)

  • Too late to cancel<0>: Order already filled
  • Unknown order<1>: Order not found
  • Other<99>: See Text field

Mass Cancel Request (35=q)

Cancel all orders for the trading session.
TagNameDescription
11ClOrderIDUnique request ID
530MassCancelRequestTypeCancel for session<6>

Mass Cancel Report (35=r)

Response to mass cancel request.
TagNameDescription
11ClOrderIDRequest ID
37OrderIDOperation ID
531MassCancelResponseSuccess<6> or Rejected<0>
532MassCancelRejectReasonIf rejected
Individual ExecutionReports will follow for each canceled order.

Best Practices

  1. Order Management
    • Use unique ClOrdIDs for each message
    • Store OrderID for support references
    • Track order state locally
  2. Self-Trade Prevention
    • Default: TakerAtCross (taker canceled)
    • Alternative: Maker (resting order canceled)
  3. Time in Force
    • Day orders expire at 11:59 PM ET
    • Use IOC for immediate execution
    • GTD requires ExpireTime
  4. Error Handling
    • Monitor OrdRejReason in rejections
    • Check Text field for details
    • Implement retry logic appropriately