New Order Single (35=D)
Used to submit a new order to the Exchange.FCM customer-account identifiers
For FCM customer accounts (PartyRole<452>=24), send the full subtrader identifier in PartyID<448>: <fcm_user_id>_<suffix>. The prefix is the FCM’s 36-character UUID, followed by an underscore (_) delimiter and a suffix of 1–16 case-sensitive ASCII alphanumeric characters (A-Z, a-z, 0-9). The full identifier is at most 53 characters, including the delimiter.
For example: 550e8400-e29b-41d4-a716-446655440000_customer1.
Order Cancel and Order Cancel/Replace requests must use the same full identifier as the original order. Execution Reports return the full customer-account identifier unchanged in the PartyRole=24 entry, including the UUID prefix, underscore, and suffix. A PartyRole=12 entry instead contains the operator identifier captured from SenderSubID<50>.
SenderSubID<50> is captured on an ordinary NewOrderSingle and, per action, on OrderCancelRequest and OrderCancelReplaceRequest; it is ignored on RFQ quote acceptance. The operator on a NewOrderSingle sticks to the order: fills and other lifecycle reports emit it as the PartyRole=12 party. Cancel and Cancel/Replace acknowledgements instead emit the operator sent on that request — the operator who performed the action — falling back to the order’s creating operator when the request carried none. Do not send tag 50 on Logon: Kalshi rejects that Logon.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
Order Cancel Request (35=F)
Cancel all remaining quantity of an existing order.Execution Report (35=8)
Sent by the exchange to reflect order state changes.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)
- Replaced<5>: Order modified via Cancel/Replace
- 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
By default, expiry-style system cancellations are reported as Canceled<4>.
If Logon tag 21012 (UseExpiredOrdStatus)=Y, expiry-style system cancellations (CloseCancel and OrderExpiryCancel) are reported as Expired<C>.
If Logon tag 21012 (UseExpiredOrdStatus)=Y, expiry-style system cancellations (CloseCancel and OrderExpiryCancel) are reported as Expired<C>.
Order Rejection Reasons (103)
- Unknown symbol<1>
- Exchange closed<2>
- Order exceeds limit<3>
- Too late to enter<4>
- Duplicate order<6>
- Stale order<8>
- Unsupported order characteristic<11>
- Incorrect quantity<13>
- 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 - the gateway could not confirm whether the order was applied (exchange unreachable, request timed out, or interrupted after the order may have been accepted). Reconcile the order’s state, or retry with the same ClOrdID. Maps to OrdRejReason “Other”
- INTERNAL_ERROR - 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. 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”
- EXCEEDED_ORDER_GROUP_RISK_LIMIT - maps to OrdRejReason “Order exceeds limit”
- INSUFFICIENT_BALANCE - maps to OrdRejReason “Order exceeds limit”
- EXCHANGE_PAUSED - maps to OrdRejReason “Exchange closed”
- TRADING_PAUSED - maps to OrdRejReason “Exchange closed”
- INVALID_ORDER - maps to OrdRejReason “Unsupported order characteristic”
- ORDER_GROUP_NOT_FOUND - 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”
- EVENT_CONTRACT_DAILY_CAP_EXCEEDED - the customer account’s remaining event contract daily cap cannot cover this order.
UseCapReservation(21032) sessions only. Maps to OrdRejReason “Order exceeds limit” - EVENT_CONTRACT_DAILY_CAP_NOT_FOUND - the customer account has no daily cap configured, so the cap lane cannot accept orders for it.
UseCapReservation(21032) sessions only. Maps to OrdRejReason “Unknown account” - ORDER_AMEND_IN_PROGRESS - a previous amend for this order has not settled yet.
UseCapReservation(21032) sessions only. Maps to CxlRejReason “Broker” - ORDER_ATTRIBUTES_MISMATCH - Symbol or Side does not match the resting order.
UseCapReservation(21032) sessions only. Maps to CxlRejReason “Unknown order” - 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 ExecutionType “Canceled”
- 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”
- EXPIRED - maps to OrdRejReason “Stale order” (RFQ quote had expired when the order arrived)
OrderCancelReject (35=9)
Exchange-side amend and cancel failures are returned as OrderCancelReject (35=9), not ExecutionReport.Position and Fee Information
When ExecType=Trade:Collateral Changes
Collateral Return Breakdown
When Logon tag21027 (SplitCollateralReturn) is set to Y, Execution Reports with ExecType=Trade include:
Both values are informational subsets of the
BALANCE collateral change — they describe components within the total balance delta, not additional amounts.
Party Information
ExecutionReports independently include the customer account when applicable and at most one operator entry (Executing Trader<12>). Which operator appears depends on the report type: fills and other order-lifecycle reports (expiration, IOC cancellation, and similar) carry the operator captured at order creation, while Cancel and Cancel/Replace acknowledgements carry the operator sent on the acting request, falling back to the creation operator when that request carried none. When both a customer-account entry and an operator entry are present, the customer-account entry comes first.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. Only available on KalshiNR (NewOrderMode) sessions.Mass Cancel Report (35=r)
Response to mass cancel request.Individual ExecutionReports will follow for each canceled order.