Real-time bid, ask, last, and volume for subscribed markets or match groups. Works for any market we ingest - matched cross-platform groups and single-platform markets alike - plus any live market in the Kalshi catalog by its market ticker.
Overview
Use case: Power live dashboards, price alerts, and cross-venue comparisons without polling REST.
Requirements
- Available with a Dev, Pro, or Enterprise API key.
- Subscribe with market_ids (any platform-native id we ingest, or the REST-style platform:market_id composite, e.g. kalshi:KXMENWORLDCUP-26-FR) and/or group_ids (matched cross-platform groups).
- Wildcard subscriptions are not supported - specify at least one id.
- Requires an authenticated WebSocket session (same as all channels).
Send
| Field | Type | Required | Notes |
|---|---|---|---|
| action | string | yes | Must be "subscribe" for this section. |
| channel | string | yes | Must be "prices". |
| market_ids | string[] | optional | Market scope; can be combined with group_ids. |
| group_ids | number[] | optional | Group scope; expands to markets linked to each group. |
| event_ids | number[] | unsupported | Ignored / not used by this channel. |
| wildcard | behavior | not available | At least one supported id list should be provided. |
Receive
Data messages use the standard envelope: channel, type, ts, data. Types for this channel include: price_update.
After subscribed, you receive a price_update per resolved market that already has a cached tick (same shape as streaming updates). Markets we know about but haven't ticked yet stay subscribed silently and deliver on the next tick - no snapshot, no warning. A warning with code UNKNOWN_ID is only emitted when an id is neither in our ingestion universe nor in the live Kalshi catalog (typo, retired market, or an event ticker - subscribe with the market ticker, e.g. KXODIMATCH-26JUL160800INDENG-IND, not its event ticker). Kalshi catalog markets outside our tracked set get a snapshot immediately and begin streaming live ticks within a few seconds of the first subscribe.
Explicit Kalshi ticker subscriptions also use the dedicated Kalshi feed. Keep subscribing to prices and handling price_update: prices remain numeric cents, and the subscription counts toward the usual limits. kalshi_prices remains available for decimal-dollar ticker messages and Enterprise all-market subscriptions.
For these Kalshi subscriptions, KALSHI_STREAM_INTERRUPTED means prices are stale. After KALSHI_STREAM_READY, refresh current prices through REST before relying on the stream again. Updates are not replayed. Partial ticks retain fields from the current session, while explicit nulls clear fields. A reconnect starts a new baseline. Group-only subscriptions continue to use the general price feed.
Data fields (inside data)
| Field | Type | Description |
|---|---|---|
| market_id | string | Platform-native market identifier. |
| source | string | e.g. kalshi, polymarket, opinion. |
| group_id | int? | Match group id when the market is linked across platforms. Omitted for single-platform markets. |
| yes_bid / yes_ask | number | YES side best bid and ask in cents (0 to 100). |
| no_bid / no_ask | number | NO side best bid and ask in cents (0 to 100). |
| last_price | number | Last traded price in cents (0 to 100). |
| volume | number | Reported volume. |
| ts | number | Unix seconds: source time for direct Kalshi ticker updates, otherwise the cached timestamp when present. |






