Skip to main content

New Order Single (35=D)

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.
Example New Margin Order

Order Cancel/Replace Request (35=G)

Used to modify an existing order without canceling it.

Supported Modifications

  • OrderQty: Increase or decrease the quantity. Increasing quantity forfeits queue priority.
  • Price: Change the limit price.
  • Expiry: Use Day (59=0) without 126 to expire at 11:59:59.999pm ET, set a future deadline with TimeInForce=GTD (59=6) and ExpireTime (126), or remove expiry with TimeInForce=GTC (59=1) and no 126. Expired deadlines, including the Unix epoch, are rejected.
Kalshi conventions for replace: Omitting both 59 and 126 preserves the order’s current expiry. This is a Kalshi-specific convention, rather than FIX’s Day default for omitted 59. To resend expiry explicitly, send 59=6 with the unchanged 126 for GTD, 59=0 without 126 for Day, or 59=1 without 126 for GTC. Send the current total OrderQty and price for an expiry-only amendment. Kalshi guarantees that an expiry-only amendment preserves FIFO queue position when price and quantity are unchanged.

Order Cancel Request (35=F)

Cancel all remaining quantity of an existing order.

Execution Report (35=8)

This message is sent by the exchange to reflect changes to an order’s state. Replaced reports confirm the resulting validity with TimeInForce=GTD (59=6) and the accepted ExpireTime (126), or TimeInForce=GTC (59=1) without 126 when there is no expiry. Kalshi stores Day orders as explicit deadlines, so their Replaced reports also use GTD with the end-of-day ET deadline; they do not echo the original Day value.

Order Status (39)

  • New<0>: Active order, no fills
  • Partially Filled<1>: Some quantity filled
  • Filled<2>: Completely filled
  • Canceled<4>: Canceled
  • 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
With default settings, expiry-style system cancellations are reported as Canceled<4>. If 21012 (UseExpiredOrdStatus)=Y, expiry-style system cancellations emit Expired<C>.

Order Rejection Reasons (103)

  • Unknown symbol<1>
  • Exchange closed<2>
  • Order exceeds limit<3>
  • Too late to enter<4>
  • Stale order<5>
  • Duplicate order<6>
  • Unsupported order characteristic<11>
  • Incorrect quantity<13>
  • Unknown account<15>
  • Other<99>

Execution Types (150)

  • New<0>
  • Trade<F>
  • Canceled<4>
  • Replaced<5>
  • Rejected<8>
  • Expired<C>
  • Pending New<A>
  • Pending Cancel<6>
  • Pending Replace<E>

Text Field Values (58)

Common values include:
  • EXCHANGE_UNAVAILABLE
  • INTERNAL_ERROR
  • MARKET_ALREADY_CLOSED
  • MARKET_INACTIVE
  • MARKET_NOT_FOUND
  • SELF_CROSS_ATTEMPT
  • ORDER_ALREADY_EXISTS
  • EXCEEDED_PER_MARKET_RISK_LIMIT
  • EXCEEDED_ORDER_GROUP_RISK_LIMIT
  • ORDER_GROUP_NOT_FOUND
  • FOK_INSUFFICIENT_VOLUME
  • POST_ONLY_CROSS
  • ORDER_GROUP_CANCEL
  • TAKER_CANCEL_FOR_SELF_TRADE_PREVENTION
  • MAKER_CANCEL_FOR_SELF_TRADE_PREVENTION
  • IMMEDIATE_OR_CANCELLED
  • REDUCE_ONLY

OrderCancelReject (35=9)

Exchange-returned amend and cancel failures are returned as OrderCancelReject (35=9), not ExecutionReport.

Position and Fee Information

When ExecType = Trade:

Collateral Changes

Party Information

Execution reports 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>
  • Unknown order<1>
  • Other<99>

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 follow for each cancelled order.