Kalshi market structure, hierarchy, types, orderbook mechanics, and settlement. Use when reasoning about market data, series/event/market relationships, price-probability mechanics, or implementing code that works with Kalshi markets.
Reference for understanding Kalshi market fundamentals, data model, and mechanics.
For trading mechanics (order types, fees, positions), see kalshi_trading skill.
For SDK implementation details, see kalshi_python_sdk skill.
Kalshi organizes markets in a three-level hierarchy:
Series → Events → Markets
| Level | Description | Ticker Example |
|---|---|---|
| Series |
| Category of related events |
KXNCAAF (NCAA Football) |
| Event | Specific occurrence within a series | KXNCAAF-26 (Game on date) |
| Market | Individual contract within an event | KXNCAAF-26-DUKE-F (Duke wins) |
Key relationships:
event_ticker to fetch all markets for a gameseries_ticker to fetch all events in a categoryEvery Kalshi market is a binary YES/NO question with two contract types:
| Contract | Pays if | Settlement |
|---|---|---|
| YES | Event occurs | $1.00 |
| NO | Event does NOT occur | $1.00 |
Price-Probability Equivalence:
Contract Price (dollars) = Implied Probability
Example:
YES at $0.70 → 70% implied probability event occurs
NO at $0.30 → 30% implied probability event does NOT occur
Total: $0.70 + $0.30 = $1.00
Edge Detection: If your estimated probability differs from market price, this represents potential edge:
Edge = Your Probability - Market Price
| Type | Example Question |
|---|---|
| Moneyline | "Will Duke beat UNC?" |
| Spread | "Will Duke win by more than 5 points?" |
| Total | "Will the total score be over 140?" |
| Player Props | "Will Player X score 20+ points?" |
| Category | Examples |
|---|---|
| Weather | Temperature thresholds, hurricane landfalls |
| Crypto | Bitcoin price targets |
| Political | Election outcomes |
| Entertainment | Spotify streams, Netflix viewership |
Combos combine multiple positions into a single market:
Example combo resolution:
3-leg combo, one leg voids at $0.70:
Payout = $0.70 × $1.00 × $1.00 = $0.70 per contract
When markets within an event are mutually exclusive (e.g., "Who will win?"):
The orderbook displays resting orders (unfilled limit orders):
| Side | Meaning |
|---|---|
| YES Bids | Highest price buyers will pay for YES contracts |
| YES Asks | Lowest price sellers will accept for YES contracts |
| NO Bids | Highest price buyers will pay for NO contracts |
| NO Asks | Lowest price sellers will accept for NO contracts |
Relationship: YES bids correspond to NO asks (and vice versa) since buying YES = selling NO.
| Metric | Definition | Significance |
|---|---|---|
| Spread | Ask - Bid | Liquidity cost; narrow = liquid |
| Mid Price | (Bid + Ask) / 2 | Fair value estimate |
| Microprice | Depth-weighted mid | Better fair value when depth is asymmetric |
| Depth | Contracts available at price levels | Capacity for fills without slippage |
| Imbalance | (Bid depth - Ask depth) / Total | Directional pressure indicator |
YES Side:
5,010 contracts to BUY at $0.74 (best ask)
75,000 contracts to SELL at $0.71 (best bid)
Spread: $0.74 - $0.71 = $0.03 (3 cents)
| Status | Description | Trading |
|---|---|---|
open | Market accepting orders | Yes |
active | Market actively trading | Yes |
closed | Trading halted, awaiting settlement | No |
settled | Outcome determined, payouts complete | No |
API Quirk: Filtering by status="open" returns markets with status="active" in responses.
| Field | Description |
|---|---|
open_time | When trading begins |
close_time | When trading ends (may differ from expiration) |
expiration_time | When the event outcome is determined |
Markets typically close at or before event start. Settlement occurs after the event concludes and official results are confirmed.
Settlement is final - outcomes are not subject to appeals once determined.
| Field | Type | Description |
|---|---|---|
ticker | string | Unique market identifier |
event_ticker | string | Parent event identifier |
series_ticker | string | Parent series identifier |
title | string | Human-readable market question |
subtitle | string | Additional context |
status | string | Current lifecycle status |
| Field | Type | Description |
|---|---|---|
yes_bid | int | Best bid for YES (cents) |
yes_ask | int | Best ask for YES (cents) |
no_bid | int | Best bid for NO (cents) |
no_ask | int | Best ask for NO (cents) |
last_price | int | Last trade price (cents) |
| Field | Type | Description |
|---|---|---|
volume | int | Total contracts traded |
volume_24h | int | 24-hour volume |
open_interest | int | Outstanding contracts |
| Field | Type | Description |
|---|---|---|
result | string | Settlement outcome (yes, no, or null) |
floor_strike | float | Lower bound for ranged markets |
cap_strike | float | Upper bound for ranged markets |
| Pitfall | Correct Approach |
|---|---|
| Confusing event vs market tickers | event_ticker groups markets; ticker is individual contract |
Expecting "open" status from API | API returns "active" for tradeable markets |
| Mixing price scales | API uses cents (int); conceptually prices are dollars |
| Assuming immediate settlement | Settlement can take hours; varies by event type |
| Ignoring spread in calculations | Always account for bid-ask spread in edge estimates |
| Treating all markets as independent | Check for mutually exclusive relationships within events |