Skip to main content

Order Entry Messages

Overview

Kalshi treats all orders as bids or asks for Yes contracts. Selling Yes is equivalent to buying No contracts.

New Order Single (35=D)

Used to submit a new order to the Exchange.
TagNameTypeRequiredDescription
11ClOrderIDStringYClient order identifier for idempotency. Must not match any open orders.

UUID format is preferred.

Validation:
• Maximum 64 characters
• Only alphanumeric, ”+”, ”=”, ”_”, ”-”, and ”:” characters allowed
• Pattern: ^[\-\w:+=/]*$
18ExecInstCharNExecution instruction flags.

Supported values:
6 = Post Only
38OrderQtyIntegerYNumber of contracts to trade.
40OrdTypeCharYOrder type.

Supported values:
2 = Limit
44PriceIntegerYPrice per contract in cents (1-99).
54SideCharYSide of the order.

Supported values:
1 = Buy (Yes contracts)
2 = Sell (No contracts)
55SymbolStringYMarket ticker (e.g., “EURUSD-23JUN2618-B1.087”).
59TimeInForceCharNSpecifies how long the order remains in effect.

Supported values:
0 = Day (expires at 11:59:59.999pm ET)
1 = Good Till Cancel (GTC)
3 = Immediate Or Cancel (IOC)
4 = Fill Or Kill (FOK)
6 = Good Till Date (GTD)

Note: Day orders expire at 11:59:59.999pm ET. For GTD orders, any date in the past is treated as Immediate Or Cancel.
126ExpireTimeUTCTimestampCRequired when TimeInForce=GTD. Specifies when the GTD order expires.
448PartyIDUUIDNOnly applicable for FCM entities . Sub-account identifier.
452PartyRoleIntegerNOnly applicable for FCM entities . Party role.

Supported values:
24 = Customer Account
453NoPartyIDsIntegerNOnly applicable for FCM entities . Number of parties. Currently, only 1 is supported.
526SecondaryClOrdIDUUIDNOrder group identifier. Please refer to the Order Groups tab for more information.
2964SelfTradePreventionTypeCharNSelf-trade prevention mode. If unset, defaults to Taker At Cross.

Supported values:
1 = Taker At Cross
2 = Maker
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|

Order Cancel/Replace Request (35=G)

Used to modify an existing order without canceling it.

Supported Modifications

  • OrderQty: Increases or decreases the quantity of your order, note that increasing the quantity for the same point means forfeiting your queue position
  • Price: Changes the limit price of your order
TagNameTypeRequiredDescription
11ClOrderIDStringYUnique modification request identifier. Must not match any existing ClOrderID.

UUID format is preferred.

Validation:
• Maximum 64 characters
• Only alphanumeric, ”+”, ”=”, ”_”, ”-”, and ”:” characters allowed
• Pattern: ^[\-\w:+=/]*$
37OrderIDStringNOrder identifier provided by Kalshi Exchange.
38OrderQtyIntegerYNew total quantity for the order.

Note: If OrderQty equals filled quantity, the order will be canceled. If less than filled quantity, the request will be rejected.
40OrdTypeCharYOrder type.

Supported values:
2 = Limit
41OrigClOrdIDStringYClOrderID of the order to modify.
44PriceIntegerNNew price per contract in cents (1-99). Required if changing price.
54SideCharYMust match the original order side.
55SymbolStringYMust match the original order symbol.
448PartyIDUUIDNOnly applicable for FCM entities . Sub-account identifier. Must match the original order field value.
452PartyRoleIntegerNOnly applicable for FCM entities . Party role. Must match the original order field value.

Supported values:
24 = Customer Account
453NoPartyIDsIntegerNOnly applicable for FCM entities . Number of parties. Must match the original order field value. Currently, only 1 is supported.

Order Cancel Request (35=F)

Cancel all remaining quantity of an existing order.
TagNameTypeRequiredDescription
11ClOrderIDStringYUnique cancel request identifier. Must not match any existing ClOrderID.

UUID format is preferred.

Validation:
• Maximum 64 characters
• Only alphanumeric, ”+”, ”=”, ”_”, ”-”, and ”:” characters allowed
• Pattern: ^[\-\w:+=/]*$
37OrderIDStringNOrder identifier provided by Kalshi Exchange.
41OrigClOrdIDStringYClOrderID of the order to cancel.
54SideCharYMust match the original order side.
55SymbolStringYMust match the original order symbol.
448PartyIDUUIDNOnly applicable for FCM entities . Sub-account identifier. Must match the original order field value.
452PartyRoleIntegerNOnly applicable for FCM entities . Party role. Must match the original order field value.

Supported values:
24 = Customer Account
453NoPartyIDsIntegerNOnly applicable for FCM entities . Number of parties. Must match the original order field value. Currently, only 1 is supported.

Execution Report (35=8)

This message is sent by Kalshi Exchange back to clients to reflect changes to an order’s state (accepted, replaced, partially filled, filled or canceled).
TagNameTypeRequiredDescription
6AvgPxDecimalYCalculated average price of all fills on this order.
11ClOrderIDStringYClOrderID provided by the initiator on the last message that made any change to the order.
14CumQtyIntegerYTotal number of contracts filled in this order so far.
17ExecIDStringYUnique sequenced identifier for this report message.

Format: integer;integer pattern (e.g., “4;4”, “4;7”, “7;3”)

Monotonically increasing at the Exchange level. Returns “-1;-1” for PENDING execution reports.
31LastPxIntegerCPrice of this (last) fill in cents. Present only for trade execution reports.
32LastQtyIntegerCNumber of contracts bought or sold in this fill. Present only for trade execution reports.
37OrderIDStringYUnique identifier for the order in the Kalshi Exchange. Use this ID when referencing the order for support.
38OrderQtyIntegerYTotal number of contracts currently in the order. OrderQty = CumQty + LeavesQty.
39OrdStatusCharYCurrent status of the order after this event. See Order Status values below.
41OrigClOrdIDStringCClOrderID of the previous non-rejected order state. Present for Replaced/Canceled orders.
44PriceIntegerCPrice per contract in cents.
54SideCharYSide of the original order.

Values:
1 = Buy (Yes contracts)
2 = Sell (No contracts)
55SymbolStringYMarket ticker for the order.
58TextStringNHuman-readable description of the execution report result.
60TransactTimeUTCTimestampYTimestamp for the event that triggered this execution report.
103OrdRejReasonIntegerCRejection reason. Present only when ExecType = Rejected. See Order Rejection Reasons below.
126ExpireTimeUTCTimestampCOrder expiration timestamp. Returns 11:59pm ET for Day orders.
150ExecTypeCharYReason why this execution report was sent. See Execution Types below.
151LeavesQtyIntegerYRemaining quantity open for further execution on this order.
448PartyIDUUIDNOnly applicable for FCM entities . Sub-account identifier.
452PartyRoleIntegerNOnly applicable for FCM entities . Party role.

Supported values:
24 = Customer Account
453NoPartyIDsIntegerNOnly applicable for FCM entities . Number of parties. Currently, only 1 is supported.

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

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>
  • Unknown account<15>
  • Other<99>

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

Text Field Values (58)

Common values for the Text field in Execution Reports:
  • EXCHANGE_UNAVAILABLE - Catch-all for Exchange outage or unmapped errors, maps to OrdRejReason “Other”
  • MARKET_ALREADY_CLOSED - maps to OrdRejReason “Exchange closed”
  • MARKET_INACTIVE - maps to OrdRejReason “Exchange closed”
  • MARKET_NOT_FOUND - maps to OrdRejReason “Unknown symbol”
  • SELF_CROSS_ATTEMPT - maps to ExecutionType “Canceled”
  • SELF_CROSS_ATTEMPT_PARTIALLY_FILLED - maps to ExecutionType “Canceled”
  • ORDER_ALREADY_EXISTS - maps to OrdRejReason “Duplicate order”
  • INVALID_AMEND_QTY_FOR_ORDER - maps to OrdRejReason “Other”
  • CANNOT_UPDATE_FILLED_ORDER - maps to OrdRejReason “Too late to enter”
  • EXCEEDED_ORDER_GROUP_RISK_LIMIT - maps to OrdRejReason “Order exceeds limit”
  • INSUFFICIENT_BALANCE - maps to OrdRejReason “Other”
  • EXCHANGE_PAUSED - maps to OrdRejReason “Exchange closed”
  • TRADING_PAUSED - maps to OrdRejReason “Exchange closed”
  • INVALID_ORDER - maps to OrdRejReason “Unsupported order characteristic”
  • EXCEEDED_PER_MARKET_RISK_LIMIT - maps to OrdRejReason “Order exceeds limit”
  • EXCEEDED_SELL_POSITION_FLOOR - maps to OrdRejReason “Order exceeds limit”
  • NOT_FOUND - maps to OrdRejReason “Unknown symbol”
  • CUSTOMER_ACCOUNT_NOT_FOUND - maps to OrdRejReason “Unknown account”
  • PERMISSION_DENIED_FOR_CUSTOMER_ACCOUNT - maps to OrdRejReason “Unknown account”
  • FOK_INSUFFICIENT_VOLUME - maps to ExecutionType “Canceled”
  • POST_ONLY_CROSS - maps to OrdRejReason “Other”
  • ORDER_GROUP_CANCEL - maps to ExecutionType “Canceled”
  • TAKER_CANCEL_FOR_SELF_TRADE_PREVENTION - maps to ExecutionType “Canceled”
  • MAKER_CANCEL_FOR_SELF_TRADE_PREVENTION - maps to ExecutionType “Canceled”
  • IMMEDIATE_OR_CANCELLED - maps to ExecutionType “Canceled”

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 dollars
1705CollateralTypeBALANCE 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.

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.
I