Open/high/low/close/volume bars for one or many markets.
OHLCV time series for markets on Kalshi or Polymarket. Pass 1 to 50Documentation Index
Fetch the complete documentation index at: https://docs.oddpool.com/llms.txt
Use this file to discover all available pages before exploring further.
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.
market_id list, 1 to 50 entries. Kalshi tickers (e.g. KXFEDDECISION-26JUN-H0) or Polymarket condition IDs (0x…).last.last.<int><unit> where unit is h | d | w | m. Examples: 30d, 12h, 4w, 6m. Mutually exclusive with from/to.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.
| 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. |
| Code | Reason |
|---|---|
400 | market_ids empty, more than 50 ids, both last and from/to set, invalid interval, or invalid window. |