Kalshi GraphQL Reference
Kalshi's prediction-market exchange — binary YES/NO contracts on NBA games (winner, spread, and total markets) from the 2025-26 season onward, with event-driven price candles, the public trade tape, and on-exchange settlement results.
Every GraphQL type, relation, and argument — generated from the served schema, so it can never disagree with the API. Root fields take the same filters as REST; requests are metered by rows resolved, nested lists included.
Main
series
KalshiSeriesFamilies of related Kalshi binary markets organized around a common theme — all NBA game-winner markets, all NBA spread markets, all NFL totals markets, election markets, weather markets. Tracks series-level metadata and sync state.
Arguments (2)
firstIntPage size; clamped to the table's REST default/max limits.afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.
Columns (10) — full docs in the data dictionary
id: BigInt
series_ticker: String
title: String
category: String
league_code: String
contract_type: String
frequency: String
is_active: Boolean
created_at: String
updated_at: String
events
KalshiEventsA real-world event that anchors a set of Kalshi markets — for sports, a specific game or matchup; for politics, an election or vote; for finance, a price level on a target date. E.g., MEM@POR game-winner event has 2 markets (MEM wins, POR wins).
Required filters: one of
series_id | league_code | competition_id.Relations
markets[KalshiMarkets!]!kalshi.markets rows whoseevent_idreferences this row.competitionCompetitionThe sporting event this row prices, resolved through the cross-sport competition registry via (league_code, competition_id); null when the row is not linked to a game or tournament.
Arguments (5)
firstIntPage size; clamped to the table's REST default/max limits.afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.series_idIntFilter to events within a single Kalshi series (e.g., one row ofseries⇒ all KXNBAGAME events).competition_idIntFilter to events linked to a specific competition (cross-schema game or golf tournament; resolved during sync via league_code).league_codeStringFilter to all events for a league (e.g. league_code=nba) — the league-level entry point, mirroring polymarket.events.
Columns (16) — full docs in the data dictionary
id: BigInt
event_ticker: String
series_id: BigInt
competition_id: BigInt
title: String
category: String
status: String
league_code: String
game_date: String
home_team: String
away_team: String
league_game_id: String
market_count: Int
settled_at: String
created_at: String
updated_at: String
markets
KalshiMarketsAn individual binary contract on Kalshi — a YES/NO question with a defined resolution date and rule, priced between 0 and 100 cents. Stores latest known state (overwritten on sync).
Required filters: one of
event_id | competition_id.Relations
eventKalshiEventsThe kalshi.events row referenced byevent_id; null when unlinked.public_trades[KalshiPublicTrades!]!kalshi.public_trades rows whosemarket_idreferences this row.candles[KalshiCandles!]!kalshi.candles rows whosemarket_idreferences this row.
Arguments (5)
firstIntPage size; clamped to the table's REST default/max limits.afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.event_idIntFilter to all markets that belong to a single event (e.g., MEM@POR game-winner event ⇒ two markets, MEM wins and POR wins).series_idIntFilter to all markets in a single series (denormalized for direct queries).competition_idIntFilter to markets linked to a specific competition — all of its markets in one call.
Columns (24) — full docs in the data dictionary
id: BigInt
ticker: String
event_id: BigInt
series_id: BigInt
competition_id: BigInt
contract_type: String
title: String
subtitle: String
line: Float
status: String
result: String
yes_bid: Int
yes_ask: Int
last_price: Int
volume: Int
open_interest: Int
liquidity: Int
open_time: String
close_time: String
expiration_time: String
settled_at: String
created_at: String
updated_at: String
settlement_value: Int
Markets
market_statuses
KalshiMarketStatusesThe trading-status period log for each Kalshi market — one row per state change with start/end timestamps, recording when the market was open, closed, settled, etc. Sparse coverage — captured 2025-10 through 2026-02 for ~1,500 markets; not currently updating.
Required filters: one of
market_id.Arguments (3)
firstIntPage size; clamped to the table's REST default/max limits.afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.market_idIntFilter to status periods for a single Kalshi market by numeric id (resolves to ticker via JOIN to kalshi.markets).
Columns (7) — full docs in the data dictionary
id: BigInt
ticker: String
start_ts: String
end_ts: String
status: String
details: JSON
created_at: String
candles
KalshiCandlesOHLC candlestick price summaries for Kalshi markets — the open, high, low, and close prices over standard time bins (1 minute, 5 minute, 1 hour, 1 day), with traded volume per bin. Flattened columns (not JSON) for SQL queryability.
Required filters: one of
market_id.Relations
marketKalshiMarketsThe kalshi.markets row referenced bymarket_id; null when unlinked.
Arguments (4)
firstIntPage size; clamped to the table's REST default/max limits.afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.market_idIntFilter to candles for a single Kalshi market.period_intervalIntBin width in seconds. Currently every row is period_interval=1 (event-driven captures at up-to-1s resolution, irregular spacing) — resample client-side for fixed OHLC bins.
Columns (17) — full docs in the data dictionary
id: BigInt
market_id: BigInt
ticker: String
period_interval: Int
end_period_ts: Int
yes_bid_open: Int
yes_bid_high: Int
yes_bid_low: Int
yes_bid_close: Int
yes_ask_open: Int
yes_ask_high: Int
yes_ask_low: Int
yes_ask_close: Int
volume: Int
open_interest: Int
created_at: String
updated_at: String
public_trades
KalshiPublicTradesEvery executed trade on Kalshi — price, size, side (YES or NO), and timestamp, comprising the public market tape. Represents completed market trades across all users.
Required filters: one of
market_id.Relations
marketKalshiMarketsThe kalshi.markets row referenced bymarket_id; null when unlinked.
Arguments (3)
firstIntPage size; clamped to the table's REST default/max limits.afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.market_idIntFilter to trades on a single Kalshi market.
Columns (15) — full docs in the data dictionary
id: BigInt
trade_id: String
ticker: String
count: Int
count_fp: String
price: Float
yes_price: Int
no_price: Int
yes_price_dollars: String
no_price_dollars: String
taker_side: String
created_time: String
created_at: String
updated_at: String
market_id: BigInt