Skip to main content
Two frame types tell you when something about a subscription changes or a request fails: STATUS for subscription state transitions, and ERROR for rejected requests and failed subscriptions.

STATUS

state is one of: reason is an optional machine-readable hint. When one market-level event affects several subscriptions on your connection, you get one STATUS frame per affected subscriptionId. CLOSED ends and removes the subscription. It no longer appears in LIST or counts toward the per-connection limit.

ERROR

The addressing fields tell you what the error is about:
  • Active-subscription error carries subscriptionId, along with that subscription’s market and channel. It ends the subscription: the server removes it as it sends the error, so drop the id, and resubscribe if the code is worth retrying. This can follow a SUBSCRIBED ack, since the ack is sent before the upstream feed confirms the market.
  • Subscription-creation error carries market + channel (the subscription was never created, so there’s no id).
  • Connection-level error carries neither, just code, message, and the requestId you sent.

Error codes

Error codes are SCREAMING_SNAKE_CASE, as every enumerated value on this stream is, frame type names included. Retryable says whether resending the same request can ever succeed. No means resending is pointless: change the request, free up capacity, or stop. It does not always mean the situation is permanent, so the cell says which. The message on the Kalshi no-side refusal is:
the ‘no’ side isn’t supported for streaming: a Kalshi ticker addresses one YES-priced book, so subscribe with side ‘YES’ or omit it.