Skip to main content

API Key Setup

FIX API keys use the same RSA key pair as the REST API. Generate a 2048-bit RSA key pair and register the public key in your account profile. The resulting API Key ID (UUID) is your SenderCompID.

Logon (35=A)

The initiator sends a Logon message. The acceptor responds with either a Logon (success) or Logout (failure).
Do not send SenderSubID<50> on Logon. Kalshi rejects it with a Logout; send operator identity per message instead — on NewOrderSingle, OrderCancelRequest, or OrderCancelReplaceRequest.

Required Fields

Optional Fields

Signature Generation

The RawData field must contain a PSS RSA signature of the pre-hash string:
SendingTime in SignatureThe SendingTime in the PreHashString must match exactly the value in field 52 of the Logon message. Format: YYYYMMDD-HH:MM:SS.mmm.SendingTime must be within 30 seconds of the server’s current time, or the message will be rejected with SessionRejectReason<373>=10.

Reconnecting

Use one active FIX connection per API key. If Logon is rejected, inspect Text (58) in the Logout (35=5) response:
  • already exists: check for another connection using the same key before retrying.
  • rate limit exceeded or FIX logon service busy; retry with backoff: retry with exponential backoff and jitter.
  • Authentication, permission, or invalid-field errors: correct the issue before retrying.
Avoid overlapping reconnect attempts. Generate a fresh SendingTime and signature for each attempt, and follow the sequence-number and retransmission rules below.

Heartbeat & Sequence Numbers

Message Retransmission

Message retransmission (ResendRequest, SequenceReset) is only supported on KalshiRT and KalshiPT.
For all other sessions, ResetSeqNumFlag<141> in the Logon message must always be Y or the Logon will be rejected.
The drop copy session provides an alternative way to query for missed execution reports. For a real-time streaming feed, see Listener Sessions.

ResendRequest (35=2)

KalshiRT and KalshiPT only. Lookback window limited to 24 hours (or up to 72 hours if MessageRetentionPeriod was set on Logon).

Logout (35=5)

Either side may initiate a Logout. The counterparty responds with a Logout, and the transport connection is terminated. If CancelOrdersOnDisconnect=Y was set on Logon, all open orders are canceled.