> ## 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.ohlcv_hourly

> Kalshi hourly OHLCV candles — per-market open/high/low/close/volume with VWAP and trade count.

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.ohlcv_hourly` table provides hourly OHLCV (Open-High-Low-Close-Volume) candles per Kalshi market. Grain: one row per `(hour, market_id, outcome)`. Kalshi candles are built on the Yes side (No can be derived as `1 - Yes`). Hours without trades are a **flat bar at the carried close** (volumes zeroed) and are flagged via `is_forward_filled`.

**A settled series pins at its settlement-hour bar** — the actual settlement time, clamped to the scheduled expiration; most Kalshi markets settle well before expiration. Settlement lands on that bar as the hour's final tick: `close` pins to the 1/0 result, `high`/`low` widen to include it, `open` keeps the last traded price. Void and scalar results are not pinned. The spine keeps running to the scheduled expiration: forward-filled bars after the settlement hour are flat at the settled value, and real post-settlement trade bars keep their actual OHLC — mirroring [`polymarket_polygon.ohlcv_hourly`](/data-catalog/curated/prediction-markets/polymarket/ohlcv_hourly).

<Note>
  `market_outcome` is **point-in-time per bar**: `unresolved` strictly before the settlement hour, the settled result from that bar onward. Bars are relabeled at most once, on the first daily build after the settlement is delivered; historical bars do not get retroactively relabeled to the final result. [`kalshi.market_details`](/data-catalog/curated/prediction-markets/kalshi/market_details) stays the authoritative source for a market's *current* state.
</Note>

## Table Schema

| Column              | Type        | Description                                                                                                                                                                                                                 |
| ------------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `block_month`       | `DATE`      | UTC month partition derived from `hour`                                                                                                                                                                                     |
| `hour`              | `TIMESTAMP` | UTC hour bucket for the candle                                                                                                                                                                                              |
| `market_id`         | `VARCHAR`   | Kalshi market ticker                                                                                                                                                                                                        |
| `market_name`       | `VARCHAR`   | Market question text                                                                                                                                                                                                        |
| `outcome`           | `VARCHAR`   | Always `Yes` for Kalshi                                                                                                                                                                                                     |
| `yes_outcome_name`  | `VARCHAR`   | Human-readable label of the Yes side                                                                                                                                                                                        |
| `category`          | `VARCHAR`   | Market category                                                                                                                                                                                                             |
| `open`              | `DOUBLE`    | First trade price in the hour. No-trade hours are a flat bar at the carried close (the settled value after the settlement hour). On the settlement-hour bar it keeps the last traded price — settlement pins only the close |
| `high`              | `DOUBLE`    | Highest trade price in the hour. No-trade hours are a flat bar at the carried close. On the settlement-hour bar, widened to include the settled result                                                                      |
| `low`               | `DOUBLE`    | Lowest trade price in the hour. No-trade hours are a flat bar at the carried close. On the settlement-hour bar, widened to include the settled result                                                                       |
| `close`             | `DOUBLE`    | Last trade price in the hour. Carried forward through no-trade hours. Pinned to the settled result (1/0) from the settlement-hour bar onward, then flat until the scheduled expiration                                      |
| `vwap`              | `DOUBLE`    | Volume-weighted average price. NULL when no trades                                                                                                                                                                          |
| `volume_contracts`  | `DOUBLE`    | Total contracts traded in the hour                                                                                                                                                                                          |
| `volume_usd`        | `DOUBLE`    | Total USD notional in the hour                                                                                                                                                                                              |
| `trade_count`       | `BIGINT`    | Number of trades in the hour                                                                                                                                                                                                |
| `market_end_time`   | `TIMESTAMP` | Market expiration time. Stamped per row at write: rows older than the merge window keep the value they were written with; `kalshi.market_details` carries the current expiration                                            |
| `market_outcome`    | `VARCHAR`   | The market's state **at this hour** (point-in-time): `unresolved` on every bar strictly before the settlement hour, then the settled result (`yes`, `no`, `scalar`) from that bar onward                                    |
| `event_market_name` | `VARCHAR`   | Parent event title                                                                                                                                                                                                          |
| `is_forward_filled` | `BOOLEAN`   | TRUE when the bar has no trades and was carried forward                                                                                                                                                                     |
| `_updated_at`       | `TIMESTAMP` | When this row was last written by the pipeline                                                                                                                                                                              |

## Table sample

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

## Query performance

`block_month` is the partition key. Always include a `block_month` or `hour` filter for time-series queries.

## Example query

```sql theme={null}
-- Hourly price path for a single market
SELECT
  hour,
  open,
  high,
  low,
  close,
  volume_contracts
FROM kalshi.ohlcv_hourly
WHERE market_id = 'KXNHLGAME-26MAY03MINCOL-MIN'
  AND block_month >= DATE '2026-05-01'
ORDER BY hour
```
