Market OHLCV
Historical bars
Market OHLCV
Open/high/low/close/volume bars for one or many markets.
GET
Market OHLCV
OHLCV time series for markets on Kalshi or Polymarket. Pass 1 to 50
Maximum window is 365 days per request.
market_ids per request; the response is always an array of wrapped objects (metadata + bars + window stats). Markets not in our snapshot pipeline are silently omitted — compare submitted vs returned market_ids to detect.
Probability values are 0–1 (e.g. 0.62 = 62%). Volume is contracts traded during the bar period. Underlying snapshot cadence is 6 hours; 1d / 1w / 1m intervals are aggregated server-side.
Bars go back to 2026-03-21 for both Kalshi and Polymarket. Markets that resolved before that date won’t have history; coverage continues to grow forward.
For one bar series per outcome under an event (FOMC dashboards, championship odds, etc.), see Event OHLCV.
Don’t have a market_id? Use Search markets or Search series.
Parameters
Comma-separated
market_id list, 1 to 50 entries. Kalshi tickers (e.g. KXFEDDECISION-26JUN-H0) or Polymarket condition IDs (0x…).Window start (ISO 8601), inclusive. Defaults to 30 days ago. Mutually exclusive with
last.Window end (ISO 8601), exclusive. Defaults to now. Mutually exclusive with
last.Window shorthand.
<int><unit> where unit is h | d | w | m. Examples: 30d, 12h, 4w, 6m. Mutually exclusive with from/to.Bar size. One of
6h (native cadence), 1d, 1w, 1m. Sub-6h granularity is not available — snapshot cadence is 6 hours.last=N includes the in-progress current bucket — last=14d&interval=1d returns ~15 bars (14 completed days + today’s partial). Trim the last bar if you only want completed periods.
Examples
One market, last 30 days
Multiple markets in one call
Realized volatility over the last 30 days
Standard deviation of daily intraday range, in probability points.Response
Field reference
| Field | Meaning |
|---|---|
bars[].ts | Bar-start timestamp. For native 6h, the actual snapshot timestamp; for aggregated intervals, the bucket start (2026-05-04T00:00:00Z for 1d, etc.). |
bars[].open / high / low / close | Probabilities in [0, 1]. Can be null for a bucket with no underlying snapshots (very thin markets or snapshot gaps); skip or forward-fill in chart code. |
bars[].volume | Contracts traded during the bar. Aggregated intervals (1d, 1w, 1m) sum across the underlying 6h snapshots. For per-period flow analysis, prefer interval=6h — aggregated volume can look uneven across consecutive bars. |
stats.window_* | Aggregates over the requested window, derived from the bars. |
stats.change_pct | (window_close - window_open) / window_open × 100. Percent (e.g. 5.56 = +5.56%). |
stats.change_1d / 7d / 30d | Probability-point deltas in [-1, +1] (e.g. 0.05 = +5pp). Anchored to the latest snapshot — they answer “where is this vs N days ago” regardless of from/to/last. They will not match change_pct even when your window length matches. |
Errors
| Code | Reason |
|---|---|
400 | market_ids empty, more than 50 ids, both last and from/to set, invalid interval, or invalid window. |