Kalshi · AsyncAPI Specification
Kalshi WebSocket Streaming API
Version 2.0.0
Real-time WebSocket streaming feed for the Kalshi CFTC-regulated event contracts exchange. Publishes orderbook updates, public trades, market tickers, user orders, user fills, market positions, market and event lifecycle notifications, RFQ communications, and order group updates. All subscriptions are multiplexed over a single authenticated WebSocket connection using JSON command frames (cmd: subscribe / unsubscribe / update_subscription). Authenticated channels (fill, user_orders, market_positions, communications, order_group_updates) require API key authentication during the WebSocket handshake.
View Spec
View on GitHub
Prediction MarketsEvent ContractsExchangeCFTCTradingMarketsAsyncAPIWebhooksEvents
Channels
/
publish
sendClientCommandSend a command frame (subscribe, unsubscribe, update_subscription).
Single multiplexed WebSocket endpoint. Clients send subscribe / unsubscribe / update_subscription commands and receive channel messages and acknowledgements over the same connection.
Messages
✉
SubscribeCommand
Subscribe Command
Subscribe to one or more channels.
✉
UnsubscribeCommand
Unsubscribe Command
✉
UpdateSubscriptionCommand
Update Subscription Command
Add or remove markets from an existing subscription, or fetch a snapshot.
✉
SubscribedAck
Subscribed Acknowledgement
✉
ErrorMessage
Error
✉
OrderbookSnapshot
Orderbook Snapshot
Full orderbook snapshot for a market (orderbook_delta channel).
✉
OrderbookDelta
Orderbook Delta
Incremental orderbook update.
✉
Ticker
Market Ticker
Market price, volume, and open interest update.
✉
Trade
Public Trade
Public trade execution notification.
✉
Fill
User Fill
Notification of a fill on one of your orders (authenticated).
✉
UserOrder
User Order
Real-time order created/updated notification (authenticated).
✉
MarketPosition
Market Position
Real-time per-market position update (authenticated).
✉
MarketLifecycleV2
Market Lifecycle v2
Market state transitions and lifecycle events.
✉
EventLifecycle
Event Lifecycle
Event creation notification.
✉
EventFeeUpdate
Event Fee Update
Event-level fee override updates.
✉
MultivariateMarketLifecycle
Multivariate Market Lifecycle
Lifecycle notifications for multivariate markets.
✉
MultivariateLookup
Multivariate Lookup (Deprecated)
Legacy multivariate lookup notification. Deprecated - predates RFQs and should not be used for new integrations.
✉
Communications
Communications (RFQ / Quotes)
Real-time RFQ (Request for Quote) and quote lifecycle events (authenticated). Message types: RFQCreated, RFQDeleted, QuoteCreated, QuoteAccepted, QuoteExecuted.
✉
OrderGroupUpdates
Order Group Updates
Lifecycle and limit-tracking updates for order groups (authenticated).
Servers
wss
production
external-api-ws.kalshi.com
Production Kalshi WebSocket endpoint.
AsyncAPI Specification
asyncapi: '2.6.0'
info:
title: Kalshi WebSocket Streaming API
version: '2.0.0'
description: >-
Real-time WebSocket streaming feed for the Kalshi CFTC-regulated event
contracts exchange. Publishes orderbook updates, public trades, market
tickers, user orders, user fills, market positions, market and event
lifecycle notifications, RFQ communications, and order group updates. All
subscriptions are multiplexed over a single authenticated WebSocket
connection using JSON command frames (cmd: subscribe / unsubscribe /
update_subscription). Authenticated channels (fill, user_orders,
market_positions, communications, order_group_updates) require API key
authentication during the WebSocket handshake.
contact:
name: Kalshi
url: https://docs.kalshi.com/api-reference
license:
name: Kalshi Developer Agreement
url: https://kalshi.com/developer-agreement
servers:
production:
url: external-api-ws.kalshi.com
protocol: wss
description: Production Kalshi WebSocket endpoint.
security:
- apiKey: []
defaultContentType: application/json
channels:
/:
description: >-
Single multiplexed WebSocket endpoint. Clients send subscribe /
unsubscribe / update_subscription commands and receive channel messages
and acknowledgements over the same connection.
publish:
operationId: sendClientCommand
summary: Send a command frame (subscribe, unsubscribe, update_subscription).
message:
oneOf:
- $ref: '#/components/messages/SubscribeCommand'
- $ref: '#/components/messages/UnsubscribeCommand'
- $ref: '#/components/messages/UpdateSubscriptionCommand'
subscribe:
operationId: receiveServerMessage
summary: Receive channel messages and control replies from Kalshi.
message:
oneOf:
- $ref: '#/components/messages/SubscribedAck'
- $ref: '#/components/messages/ErrorMessage'
- $ref: '#/components/messages/OrderbookSnapshot'
- $ref: '#/components/messages/OrderbookDelta'
- $ref: '#/components/messages/Ticker'
- $ref: '#/components/messages/Trade'
- $ref: '#/components/messages/Fill'
- $ref: '#/components/messages/UserOrder'
- $ref: '#/components/messages/MarketPosition'
- $ref: '#/components/messages/MarketLifecycleV2'
- $ref: '#/components/messages/EventLifecycle'
- $ref: '#/components/messages/EventFeeUpdate'
- $ref: '#/components/messages/MultivariateMarketLifecycle'
- $ref: '#/components/messages/MultivariateLookup'
- $ref: '#/components/messages/Communications'
- $ref: '#/components/messages/OrderGroupUpdates'
components:
securitySchemes:
apiKey:
type: httpApiKey
name: KALSHI-ACCESS-KEY
in: header
description: >-
API key authentication is performed during the WebSocket handshake.
Authenticated channels (fill, user_orders, market_positions,
communications, order_group_updates) require a valid Kalshi API key
with Ed25519 request signatures as described in the REST API reference.
messages:
SubscribeCommand:
name: SubscribeCommand
title: Subscribe Command
summary: Subscribe to one or more channels.
payload:
type: object
required: [id, cmd, params]
properties:
id:
type: integer
description: Client-assigned command id, starting at 1.
cmd:
type: string
enum: [subscribe]
params:
type: object
required: [channels]
properties:
channels:
type: array
description: >-
Channels to subscribe to. Supported channels:
orderbook_delta, ticker, trade, fill, user_orders,
market_positions, market_lifecycle_v2, event_lifecycle,
multivariate_market_lifecycle, multivariate, communications,
order_group_updates.
items:
type: string
enum:
- orderbook_delta
- ticker
- trade
- fill
- user_orders
- market_positions
- market_lifecycle_v2
- event_lifecycle
- multivariate_market_lifecycle
- multivariate
- communications
- order_group_updates
market_ticker:
type: string
market_tickers:
type: array
items:
type: string
send_initial_snapshot:
type: boolean
description: Request initial snapshot on the ticker channel.
use_yes_price:
type: boolean
description: Use yes-side pricing format for orderbook_delta.
shard_factor:
type: integer
minimum: 1
maximum: 100
description: Shard fanout factor for communications channel.
shard_key:
type: integer
description: Shard key (0 <= shard_key < shard_factor).
UnsubscribeCommand:
name: UnsubscribeCommand
title: Unsubscribe Command
payload:
type: object
required: [id, cmd, params]
properties:
id:
type: integer
cmd:
type: string
enum: [unsubscribe]
params:
type: object
required: [sids]
properties:
sids:
type: array
items:
type: integer
description: Server-assigned subscription ids to unsubscribe.
UpdateSubscriptionCommand:
name: UpdateSubscriptionCommand
title: Update Subscription Command
summary: Add or remove markets from an existing subscription, or fetch a snapshot.
payload:
type: object
required: [id, cmd, params]
properties:
id:
type: integer
cmd:
type: string
enum: [update_subscription]
params:
type: object
required: [sid, action]
properties:
sid:
type: integer
action:
type: string
enum: [add_markets, delete_markets, get_snapshot]
market_tickers:
type: array
items:
type: string
SubscribedAck:
name: SubscribedAck
title: Subscribed Acknowledgement
payload:
type: object
properties:
id:
type: integer
type:
type: string
enum: [subscribed]
msg:
type: object
properties:
channel:
type: string
sid:
type: integer
ErrorMessage:
name: ErrorMessage
title: Error
payload:
type: object
properties:
id:
type: integer
type:
type: string
enum: [error]
msg:
type: object
properties:
code:
type: integer
msg:
type: string
OrderbookSnapshot:
name: OrderbookSnapshot
title: Orderbook Snapshot
summary: Full orderbook snapshot for a market (orderbook_delta channel).
payload:
type: object
properties:
type:
type: string
enum: [orderbook_snapshot]
sid:
type: integer
seq:
type: integer
msg:
type: object
properties:
market_ticker:
type: string
market_id:
type: string
format: uuid
yes_dollars_fp:
type: array
description: YES side price levels [price_in_dollars, contract_count_fp].
items:
type: array
no_dollars_fp:
type: array
description: NO side price levels [price_in_dollars, contract_count_fp].
items:
type: array
OrderbookDelta:
name: OrderbookDelta
title: Orderbook Delta
summary: Incremental orderbook update.
payload:
type: object
properties:
type:
type: string
enum: [orderbook_delta]
sid:
type: integer
seq:
type: integer
msg:
type: object
properties:
market_ticker:
type: string
market_id:
type: string
format: uuid
price_dollars:
type: string
delta_fp:
type: string
description: Fixed-point contract delta (2 decimals).
side:
type: string
enum: [yes, no]
client_order_id:
type: string
subaccount:
type: integer
ts_ms:
type: integer
Ticker:
name: Ticker
title: Market Ticker
summary: Market price, volume, and open interest update.
payload:
type: object
properties:
type:
type: string
enum: [ticker]
sid:
type: integer
msg:
type: object
properties:
market_ticker:
type: string
market_id:
type: string
format: uuid
price_dollars:
type: string
yes_bid_dollars:
type: string
yes_ask_dollars:
type: string
volume_fp:
type: string
open_interest_fp:
type: string
dollar_volume:
type: integer
dollar_open_interest:
type: integer
yes_bid_size_fp:
type: string
yes_ask_size_fp:
type: string
last_trade_size_fp:
type: string
ts_ms:
type: integer
Trade:
name: Trade
title: Public Trade
summary: Public trade execution notification.
payload:
type: object
properties:
type:
type: string
enum: [trade]
sid:
type: integer
msg:
type: object
properties:
trade_id:
type: string
format: uuid
market_ticker:
type: string
yes_price_dollars:
type: string
no_price_dollars:
type: string
count_fp:
type: string
taker_side:
type: string
enum: [yes, no]
taker_outcome_side:
type: string
enum: [yes, no]
taker_book_side:
type: string
enum: [bid, ask]
ts_ms:
type: integer
ts:
type: integer
description: Deprecated, seconds.
Fill:
name: Fill
title: User Fill
summary: Notification of a fill on one of your orders (authenticated).
payload:
type: object
properties:
type:
type: string
enum: [fill]
sid:
type: integer
msg:
type: object
properties:
trade_id:
type: string
format: uuid
order_id:
type: string
format: uuid
market_ticker:
type: string
is_taker:
type: boolean
side:
type: string
enum: [yes, no]
yes_price_dollars:
type: string
count_fp:
type: string
fee_cost:
type: string
action:
type: string
enum: [buy, sell]
ts_ms:
type: integer
post_position_fp:
type: string
purchased_side:
type: string
enum: [yes, no]
outcome_side:
type: string
enum: [yes, no]
book_side:
type: string
enum: [bid, ask]
client_order_id:
type: string
subaccount:
type: integer
UserOrder:
name: UserOrder
title: User Order
summary: Real-time order created/updated notification (authenticated).
payload:
type: object
properties:
type:
type: string
enum: [user_order]
sid:
type: integer
msg:
type: object
properties:
order_id:
type: string
format: uuid
ticker:
type: string
status:
type: string
enum: [resting, canceled, executed]
side:
type: string
enum: [yes, no]
outcome_side:
type: string
enum: [yes, no]
yes_price_dollars:
type: string
fill_count_fp:
type: string
remaining_count_fp:
type: string
created_ts_ms:
type: integer
MarketPosition:
name: MarketPosition
title: Market Position
summary: Real-time per-market position update (authenticated).
payload:
type: object
properties:
type:
type: string
enum: [market_position]
sid:
type: integer
msg:
type: object
properties:
user_id:
type: string
market_ticker:
type: string
position_fp:
type: string
position_cost_dollars:
type: string
realized_pnl_dollars:
type: string
fees_paid_dollars:
type: string
position_fee_cost_dollars:
type: string
volume_fp:
type: string
subaccount:
type: integer
MarketLifecycleV2:
name: MarketLifecycleV2
title: Market Lifecycle v2
summary: Market state transitions and lifecycle events.
payload:
type: object
properties:
type:
type: string
enum: [market_lifecycle_v2]
sid:
type: integer
msg:
type: object
required: [event_type, market_ticker]
properties:
event_type:
type: string
enum:
- created
- activated
- deactivated
- close_date_updated
- determined
- settled
- price_level_structure_updated
- metadata_updated
market_ticker:
type: string
open_ts:
type: integer
close_ts:
type: integer
determination_ts:
type: integer
settled_ts:
type: integer
result:
type: string
settlement_value:
type: string
is_deactivated:
type: boolean
price_level_structure:
type: string
enum: [linear_cent, deci_cent, tapered_deci_cent]
floor_strike:
type: string
yes_sub_title:
type: string
additional_metadata:
type: object
EventLifecycle:
name: EventLifecycle
title: Event Lifecycle
summary: Event creation notification.
payload:
type: object
properties:
type:
type: string
enum: [event_lifecycle]
sid:
type: integer
msg:
type: object
required: [event_ticker, title, subtitle, collateral_return_type, series_ticker]
properties:
event_ticker:
type: string
title:
type: string
subtitle:
type: string
collateral_return_type:
type: string
enum: [MECNET, DIRECNET, '']
series_ticker:
type: string
strike_date:
type: string
strike_period:
type: string
EventFeeUpdate:
name: EventFeeUpdate
title: Event Fee Update
summary: Event-level fee override updates.
payload:
type: object
properties:
type:
type: string
enum: [event_fee_update]
sid:
type: integer
msg:
type: object
properties:
event_ticker:
type: string
fee_type_override:
type: string
enum: [quadratic, quadratic_with_maker_fees, flat]
nullable: true
fee_multiplier_override:
type: string
nullable: true
MultivariateMarketLifecycle:
name: MultivariateMarketLifecycle
title: Multivariate Market Lifecycle
summary: Lifecycle notifications for multivariate markets.
payload:
type: object
properties:
type:
type: string
enum: [multivariate_market_lifecycle]
sid:
type: integer
msg:
type: object
required: [event_type, market_ticker]
properties:
event_type:
type: string
enum:
- created
- activated
- deactivated
- close_date_updated
- determined
- settled
- price_level_structure_updated
- metadata_updated
market_ticker:
type: string
open_ts:
type: integer
close_ts:
type: integer
result:
type: string
determination_ts:
type: integer
settlement_value:
type: string
settled_ts:
type: integer
is_deactivated:
type: boolean
price_level_structure:
type: string
enum: [linear_cent, deci_cent, tapered_deci_cent]
floor_strike:
type: string
yes_sub_title:
type: string
MultivariateLookup:
name: MultivariateLookup
title: Multivariate Lookup (Deprecated)
summary: >-
Legacy multivariate lookup notification. Deprecated - predates RFQs and
should not be used for new integrations.
payload:
type: object
properties:
type:
type: string
enum: [multivariate_lookup]
sid:
type: integer
msg:
type: object
properties:
collection_ticker:
type: string
event_ticker:
type: string
market_ticker:
type: string
selected_markets:
type: array
items:
type: object
properties:
event_ticker:
type: string
market_ticker:
type: string
side:
type: string
enum: [yes, no]
Communications:
name: Communications
title: Communications (RFQ / Quotes)
summary: >-
Real-time RFQ (Request for Quote) and quote lifecycle events
(authenticated). Message types: RFQCreated, RFQDeleted, QuoteCreated,
QuoteAccepted, QuoteExecuted.
payload:
type: object
properties:
type:
type: string
enum:
- rfq_created
- rfq_deleted
- quote_created
- quote_accepted
- quote_executed
sid:
type: integer
msg:
type: object
properties:
id:
type: string
quote_id:
type: string
rfq_id:
type: string
order_id:
type: string
client_order_id:
type: string
creator_id:
type: string
quote_creator_id:
type: string
rfq_creator_id:
type: string
market_ticker:
type: string
event_ticker:
type: string
mve_collection_ticker:
type: string
mve_selected_legs:
type: array
items:
type: object
contracts_fp:
type: string
target_cost_dollars:
type: string
rfq_target_cost_dollars:
type: string
yes_bid_dollars:
type: string
no_bid_dollars:
type: string
accepted_side:
type: string
enum: [yes, no]
contracts_accepted_fp:
type: string
created_ts:
type: integer
deleted_ts:
type: integer
executed_ts:
type: integer
OrderGroupUpdates:
name: OrderGroupUpdates
title: Order Group Updates
summary: Lifecycle and limit-tracking updates for order groups (authenticated).
payload:
type: object
properties:
type:
type: string
enum: [order_group_updates]
sid:
type: integer
seq:
type: integer
msg:
type: object
properties:
event_type:
type: string
enum: [created, triggered, reset, deleted, limit_updated]
order_group_id:
type: string
contracts_limit_fp:
type: string
ts_ms:
type: integer