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.Tag | Name | Type | Required | Description |
---|---|---|---|---|
11 | ClOrderID | String | Y | Client 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:+=/]*$ |
18 | ExecInst | Char | N | Execution instruction flags. Supported values: 6 = Post Only |
38 | OrderQty | Integer | Y | Number of contracts to trade. |
40 | OrdType | Char | Y | Order type. Supported values: 2 = Limit |
44 | Price | Integer | Y | Price per contract in cents (1-99). |
54 | Side | Char | Y | Side of the order. Supported values: 1 = Buy (Yes contracts) 2 = Sell (No contracts) |
55 | Symbol | String | Y | Market ticker (e.g., “EURUSD-23JUN2618-B1.087”). |
59 | TimeInForce | Char | N | Specifies 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. |
126 | ExpireTime | UTCTimestamp | C | Required when TimeInForce=GTD. Specifies when the GTD order expires. |
448 | PartyID | UUID | N | Only applicable for FCM entities . Sub-account identifier. |
452 | PartyRole | Integer | N | Only applicable for FCM entities . Party role. Supported values: 24 = Customer Account |
453 | NoPartyIDs | Integer | N | Only applicable for FCM entities . Number of parties. Currently, only 1 is supported. |
526 | SecondaryClOrdID | UUID | N | Order group identifier. Please refer to the Order Groups tab for more information. |
2964 | SelfTradePreventionType | Char | N | Self-trade prevention mode. If unset, defaults to Taker At Cross. Supported values: 1 = Taker At Cross 2 = Maker |
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
Tag | Name | Type | Required | Description |
---|---|---|---|---|
11 | ClOrderID | String | Y | Unique modification request identifier. Must not match any existing ClOrderID. UUID format is preferred. Validation: • Maximum 64 characters • Only alphanumeric, ”+”, ”=”, ”_”, ”-”, and ”:” characters allowed • Pattern: ^[\-\w:+=/]*$ |
37 | OrderID | String | N | Order identifier provided by Kalshi Exchange. |
38 | OrderQty | Integer | Y | New 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. |
40 | OrdType | Char | Y | Order type. Supported values: 2 = Limit |
41 | OrigClOrdID | String | Y | ClOrderID of the order to modify. |
44 | Price | Integer | N | New price per contract in cents (1-99). Required if changing price. |
54 | Side | Char | Y | Must match the original order side. |
55 | Symbol | String | Y | Must match the original order symbol. |
448 | PartyID | UUID | N | Only applicable for FCM entities . Sub-account identifier. Must match the original order field value. |
452 | PartyRole | Integer | N | Only applicable for FCM entities . Party role. Must match the original order field value. Supported values: 24 = Customer Account |
453 | NoPartyIDs | Integer | N | Only 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.Tag | Name | Type | Required | Description |
---|---|---|---|---|
11 | ClOrderID | String | Y | Unique cancel request identifier. Must not match any existing ClOrderID. UUID format is preferred. Validation: • Maximum 64 characters • Only alphanumeric, ”+”, ”=”, ”_”, ”-”, and ”:” characters allowed • Pattern: ^[\-\w:+=/]*$ |
37 | OrderID | String | N | Order identifier provided by Kalshi Exchange. |
41 | OrigClOrdID | String | Y | ClOrderID of the order to cancel. |
54 | Side | Char | Y | Must match the original order side. |
55 | Symbol | String | Y | Must match the original order symbol. |
448 | PartyID | UUID | N | Only applicable for FCM entities . Sub-account identifier. Must match the original order field value. |
452 | PartyRole | Integer | N | Only applicable for FCM entities . Party role. Must match the original order field value. Supported values: 24 = Customer Account |
453 | NoPartyIDs | Integer | N | Only 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).Tag | Name | Type | Required | Description |
---|---|---|---|---|
6 | AvgPx | Decimal | Y | Calculated average price of all fills on this order. |
11 | ClOrderID | String | Y | ClOrderID provided by the initiator on the last message that made any change to the order. |
14 | CumQty | Integer | Y | Total number of contracts filled in this order so far. |
17 | ExecID | String | Y | Unique 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. |
31 | LastPx | Integer | C | Price of this (last) fill in cents. Present only for trade execution reports. |
32 | LastQty | Integer | C | Number of contracts bought or sold in this fill. Present only for trade execution reports. |
37 | OrderID | String | Y | Unique identifier for the order in the Kalshi Exchange. Use this ID when referencing the order for support. |
38 | OrderQty | Integer | Y | Total number of contracts currently in the order. OrderQty = CumQty + LeavesQty. |
39 | OrdStatus | Char | Y | Current status of the order after this event. See Order Status values below. |
41 | OrigClOrdID | String | C | ClOrderID of the previous non-rejected order state. Present for Replaced/Canceled orders. |
44 | Price | Integer | C | Price per contract in cents. |
54 | Side | Char | Y | Side of the original order. Values: 1 = Buy (Yes contracts) 2 = Sell (No contracts) |
55 | Symbol | String | Y | Market ticker for the order. |
58 | Text | String | N | Human-readable description of the execution report result. |
60 | TransactTime | UTCTimestamp | Y | Timestamp for the event that triggered this execution report. |
103 | OrdRejReason | Integer | C | Rejection reason. Present only when ExecType = Rejected. See Order Rejection Reasons below. |
126 | ExpireTime | UTCTimestamp | C | Order expiration timestamp. Returns 11:59pm ET for Day orders. |
150 | ExecType | Char | Y | Reason why this execution report was sent. See Execution Types below. |
151 | LeavesQty | Integer | Y | Remaining quantity open for further execution on this order. |
448 | PartyID | UUID | N | Only applicable for FCM entities . Sub-account identifier. |
452 | PartyRole | Integer | N | Only applicable for FCM entities . Party role. Supported values: 24 = Customer Account |
453 | NoPartyIDs | Integer | N | Only 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:Tag | Name | Description |
---|---|---|
704 | LongQty | Net Yes position after trade |
705 | ShortQty | Net No position after trade |
136 | NoMiscFees | Number of fees |
137 | MiscFeeAmt | Total fees in dollars |
138 | MiscFeeCurr | Currency (USD) |
139 | MiscFeeType | Exchange Fees<4> |
891 | MiscFeeBasis | Fee unit (always ABSOLUTE<0>) |
880 | TrdMatchID | Unique trade identifier |
1057 | AggressorIndicator | Taker/Maker flag |
Collateral Changes
Tag | Name | Description |
---|---|---|
1703 | NoCollateralAmounts | Number of collateral changes |
1704 | CurrentCollateralAmount | Delta in dollars |
1705 | CollateralType | BALANCE or PAYOUT |
Party Information
Party fields from the original order request are echoed back in ExecutionReports:Tag | Name | Description |
---|---|---|
453 | NoPartyIDs | Number of parties (for sub-accounts) |
448 | PartyID | Sub-account identifier |
452 | PartyRole | Customer 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.Tag | Name | Description |
---|---|---|
11 | ClOrderID | Unique request ID |
530 | MassCancelRequestType | Cancel for session<6> |
Mass Cancel Report (35=r)
Response to mass cancel request.Tag | Name | Description |
---|---|---|
11 | ClOrderID | Request ID |
37 | OrderID | Operation ID |
531 | MassCancelResponse | Success<6> or Rejected<0> |
532 | MassCancelRejectReason | If rejected |
Individual ExecutionReports will follow for each canceled order.