> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dune.com/llms.txt
> Use this file to discover all available pages before exploring further.

# kalshi.market_details

> Kalshi market reference table — one row per market with lifecycle status, settlement, strike structure, resolution rules, parlay legs, and event and series metadata.

export const TableSample = ({tableName, tableSchema}) => <>
    <div className="hidden dark:block">
      <iframe src={`https://dune.com/embeds/3419983/5785629?table_schema_t6f0df=${tableSchema}&table_name_t6f0df=${tableName}&darkMode=true`} style={{
  width: '100%',
  height: '500px',
  border: 'none',
  marginTop: '10px'
}} />
    </div>
    <div className="dark:hidden">
      <iframe src={`https://dune.com/embeds/3419983/5785629?table_schema_t6f0df=${tableSchema}&table_name_t6f0df=${tableName}`} style={{
  width: '100%',
  height: '500px',
  border: 'none',
  marginTop: '10px'
}} />
    </div>
  </>;

The `kalshi.market_details` table is the Kalshi market reference table. Grain: one row per Kalshi market (`market_id`, Kalshi's ticker). It covers every single market Kalshi has listed, traded or not, plus every parlay with at least one fill in `kalshi.market_trades`. Use it to look up a market's question, strike structure, lifecycle status, settlement outcome and payout, resolution rules, parlay legs, and parent event and series metadata including fee terms.

The table holds lifecycle and reference data only. Prices, volume and trades live in [`kalshi.ohlcv_hourly`](/data-catalog/curated/prediction-markets/kalshi/ohlcv_hourly) and [`kalshi.market_trades`](/data-catalog/curated/prediction-markets/kalshi/market_trades); join them on `market_id`. An untraded single market has no trades or candles.

<Note>
  `status` is derived from Kalshi's market lifecycle events, falling back to the market snapshot and the open and close times. `settlement_value_usd` is the authoritative settlement signal: a binary `result` that contradicts the payout is corrected to match it.
</Note>

## Table Schema

| Column | Type | Description |
| - | - | - |
| `market_id` | `VARCHAR` | Unique market identifier, one binary contract (e.g. `KXBTCD-26APR04-T99499.99`). Kalshi calls this the ticker |
| `event_id` | `VARCHAR` | Parent event: the group of markets resolving off the same underlying occurrence. Kalshi calls this the event ticker |
| `market_type` | `VARCHAR` | Market type (e.g. `binary`) |
| `title` | `VARCHAR` | Market question text |
| `subtitle` | `VARCHAR` | Market subtitle |
| `yes_sub_title` | `VARCHAR` | Label for the Yes outcome. For threshold and range markets it reflects the strike |
| `no_sub_title` | `VARCHAR` | Label for the No outcome |
| `created_time` | `TIMESTAMP` | When the market was created |
| `updated_time` | `TIMESTAMP` | When the market was last updated upstream |
| `open_time` | `TIMESTAMP` | When trading opened |
| `close_time` | `TIMESTAMP` | When trading closes. Reflects later changes to the close date, so it can be well past the originally scheduled time |
| `latest_expiration_time` | `TIMESTAMP` | Latest possible expiration time |
| `expected_expiration_time` | `TIMESTAMP` | When the outcome is expected to be known. The scheduled boundary to use for markets that have not settled yet; usually much closer to actual settlement than `latest_expiration_time` |
| `settlement_ts` | `TIMESTAMP` | When the market settled, falling back to its determination time. NULL until the market resolves |
| `determination_ts` | `TIMESTAMP` | When the outcome was determined. Precedes settlement and is populated whenever `result` is |
| `status` | `VARCHAR` | Lifecycle state, in order of precedence: `finalized` (settled), `determined` (outcome known), `inactive` (deactivated), `closed` (past close time), `active` (open for trading), `initialized` (not yet open) |
| `result` | `VARCHAR` | Settlement outcome: `yes`, `no`, `void` (refund) or `scalar` (fractional payout). NULL until the market is determined. Binary results are reconciled to `settlement_value_usd` |
| `settlement_value_usd` | `DOUBLE` | Payout per contract at settlement, in USD. Authoritative: a `yes`/`no` result that contradicts it is corrected to match |
| `expiration_value` | `VARCHAR` | Expiration outcome value |
| `can_close_early` | `BOOLEAN` | Whether the market can close before expiration |
| `early_close_condition` | `VARCHAR` | Condition that triggers early close |
| `notional_value_dollars` | `DOUBLE` | Notional value of one contract in USD |
| `strike_type` | `VARCHAR` | Strike structure: `custom`, `greater`, `greater_or_equal`, `less`, `less_or_equal`, `between` or `structured` |
| `floor_strike` | `DOUBLE` | Lower bound for range and threshold markets |
| `cap_strike` | `DOUBLE` | Upper bound for range markets |
| `custom_strike` | `VARCHAR` | JSON blob with structured strike metadata (e.g. competitor ID, team ID) |
| `fractional_trading_enabled` | `BOOLEAN` | Whether fractional contract trading is enabled |
| `rules_primary` | `VARCHAR` | Primary resolution rules text |
| `rules_secondary` | `VARCHAR` | Secondary resolution rules text, covering edge cases and settlement sources |
| `settlement_timer_seconds` | `INTEGER` | Delay between determination and settlement, in seconds |
| `is_provisional` | `BOOLEAN` | Whether the market is provisional and may be withdrawn before opening |
| `primary_participant_key` | `VARCHAR` | Identifier of the market's primary participant (team, candidate or entity). Populated for only some markets |
| `price_ranges` | `VARCHAR` | JSON array describing the tradeable price grid (start, end, step) |
| `mve_collection_id` | `VARCHAR` | Multivariate event (MVE) collection grouping related events under one umbrella. NULL for non-MVE markets |
| `legs` | `VARCHAR` | JSON array of the parlay's legs, each with its event ticker, market ticker and required side. NULL for single markets |
| `leg_count` | `BIGINT` | Number of legs in the parlay. NULL for single markets |
| `is_parlay` | `BOOLEAN` | Whether this market is a multi-leg parlay. See `legs` and `leg_count` |
| `series_id` | `VARCHAR` | Recurring series the event belongs to; carries the category, tags, fee terms and cadence. Kalshi calls this the series ticker. Inferred from `event_id` when Kalshi published no event metadata |
| `event_title` | `VARCHAR` | Parent event title |
| `event_sub_title` | `VARCHAR` | Parent event subtitle |
| `collateral_return_type` | `VARCHAR` | How collateral is returned |
| `mutually_exclusive` | `BOOLEAN` | Whether event outcomes are mutually exclusive |
| `available_on_brokers` | `BOOLEAN` | Whether available via broker integrations |
| `product_metadata` | `VARCHAR` | JSON blob with additional product metadata |
| `category` | `VARCHAR` | Unified category shared across prediction market venues: `sports`, `crypto`, `politics`, `finance`, `technology`, `culture`, `weather`, `world`, `health`, `other`, or `mixed` for a parlay whose legs span several categories. A parlay takes its category from its legs rather than from its own series |
| `category_native` | `VARCHAR` | Kalshi's own coarse category, taken from the series and falling back to the event |
| `competition` | `VARCHAR` | Competition name from `product_metadata`, such as a sports league or a crypto asset |
| `strike_date` | `TIMESTAMP` | Strike/resolution date from event metadata |
| `strike_period` | `VARCHAR` | Strike period description from event metadata |
| `series_title` | `VARCHAR` | Human-readable series name |
| `series_tags` | `ARRAY(VARCHAR)` | Series topic tags. Finer-grained than `category_native` and the main input to `category` |
| `settlement_sources` | `VARCHAR` | JSON array of the series' settlement sources, each with a name and URL |
| `contract_terms_url` | `VARCHAR` | Link to the series' contract terms document |
| `frequency` | `VARCHAR` | Series recurrence cadence: `custom`, `one_off`, `annual`, `monthly`, `weekly`, `daily`, `hourly` or `fifteen_min` |
| `fee_type` | `VARCHAR` | Series fee model: `quadratic` (taker fees only), `quadratic_with_maker_fees` or `quadratic_with_combo_maker_fees` |
| `fee_multiplier` | `DOUBLE` | Series fee scalar applied on top of Kalshi's standard fee coefficients (`1.0` = standard rate). Used in `fee_usd` and `maker_fee_usd` on `kalshi.market_trades` |
| `source_updated_at` | `TIMESTAMP` | When the market's data last changed at Kalshi, across the market itself, its event, its series, its lifecycle events and its pricing snapshot |
| `_updated_at` | `TIMESTAMP` | When this row was last written by the pipeline |

## Table sample

<TableSample tableSchema="kalshi" tableName="market_details" />

## Example queries

```sql theme={null}
-- Single markets settled in the last 7 days, by category and result
SELECT
  category,
  result,
  COUNT(*) AS markets
FROM kalshi.market_details
WHERE status = 'finalized'
  AND settlement_ts >= NOW() - INTERVAL '7' DAY
  AND NOT is_parlay
GROUP BY 1, 2
ORDER BY 3 DESC
```

```sql theme={null}
-- Active sports markets by 7-day USD volume
SELECT
  md.market_id,
  md.event_title,
  md.title,
  SUM(t.amount_usd) AS volume_usd_7d
FROM kalshi.market_details md
JOIN kalshi.market_trades t
  ON t.market_id = md.market_id
WHERE md.status = 'active'
  AND md.category = 'sports'
  AND t.block_month >= DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1' MONTH
  AND t.created_time >= NOW() - INTERVAL '7' DAY
GROUP BY 1, 2, 3
ORDER BY 4 DESC
LIMIT 20
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.