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 |