Prediction Market Historical Data API (2026): OHLCV for Every Venue

The Short Answer
Polymarket and Kalshi both serve price history for free, but in different shapes: Polymarket returns timestamped price points per outcome token, and Kalshi returns OHLC candles per market. Polymarket's endpoint is GET https://clob.polymarket.com/prices-history with market, interval and fidelity. Kalshi's is GET /series/{series}/markets/{ticker}/candlesticks with 1-minute, 1-hour or 1-day periods, and older settled markets move to its /historical endpoints. The Predictefy API returns OHLCV candles for 15+ venues through one call, fetchOHLCV, at resolutions from 1 second to 1 day.
Key Takeaways
- Polymarket's
/prices-historyreturns{"history":[{"t":...,"p":...}]}price points for one outcome token, no key needed. - Kalshi's candlesticks need
start_ts,end_tsandperiod_intervalof 1, 60 or 1440 minutes, and include bid, ask, price and volume. - Kalshi splits data into live and historical tiers;
GET /historical/cutofftells you which endpoint holds a market. - Predictefy's
fetchOHLCVgives one candle shape for every venue, with 12 resolutions and up to 5,000 candles per call. - Each Predictefy candle says how it was built, so you can tell true candles from ones derived from price points.
What historical data do prediction market APIs provide?
Mostly price over time for each outcome, sometimes with volume and the bid and ask at each step. That is enough for charts, backtests, volatility studies and checking how a market reacted to news. Raw trade-by-trade history and full order book history are rarer and usually come from a data provider rather than the venue.
| Polymarket | Kalshi | Predictefy | |
|---|---|---|---|
| Endpoint | GET /prices-history | GET /series/{s}/markets/{t}/candlesticks | GET /api/{venue}/fetchOHLCV |
| Keyed by | Outcome token ID | Series and market ticker | outcomeId |
| Shape | Price points { t, p } | OHLC for price, bid and ask, plus volume and open interest | OHLCV candles |
| Granularity | interval window and fidelity in minutes | 1, 60 or 1440 minutes | 1s to 1d, 12 resolutions |
| Key needed | No | No | Yes, free tier available |
How do you get Polymarket and Kalshi price history?
This Node 18+ script pulls a week of history from each venue with no keys:
const day = 86400;
const now = Math.floor(Date.now() / 1000);
// Polymarket: price points for one outcome token
const [pm] = await (await fetch('https://gamma-api.polymarket.com/markets?limit=1&active=true&closed=false&order=volume24hr&ascending=false&liquidity_num_min=50000&end_date_min=2026-11-01')).json();
const token = pm.version === 'v2' ? pm.positionIds[0] : JSON.parse(pm.clobTokenIds)[0];
const { history } = await (await fetch(`https://clob.polymarket.com/prices-history?market=${token}&interval=1w&fidelity=60`)).json();
console.log('Polymarket', history.length, 'points, first', history[0], 'last', history.at(-1));
// Kalshi: hourly candles for one market over the last 7 days
const K = 'https://external-api.kalshi.com/trade-api/v2';
const { markets: [km] } = await (await fetch(`${K}/markets?status=open&limit=1&series_ticker=KXFEDDECISION`)).json();
const url = `${K}/series/KXFEDDECISION/markets/${km.ticker}/candlesticks?start_ts=${now - 7 * day}&end_ts=${now}&period_interval=60`;
const { candlesticks } = await (await fetch(url)).json();
const c = candlesticks.at(-1);
console.log('Kalshi', candlesticks.length, 'candles, last close', c.price.close_dollars ?? c.price.previous_dollars, 'yes ask close', c.yes_ask.close_dollars, 'volume', c.volume_fp);
// Kalshi: which endpoint holds older markets
console.log('Kalshi cutoff', (await (await fetch(`${K}/historical/cutoff`)).json()).market_settled_ts);
In our checks on 16 October 2026 it returned 166 hourly Polymarket price points for the week and 20 Kalshi hourly candles. Kalshi only prints a candle's price OHLC when trades happened in that hour; quiet hours carry previous_dollars instead, which the script falls back to. Its bid and ask OHLC (yes_bid, yes_ask) are filled either way. Kalshi's historical cutoff was 16 August 2026: markets settled before it are served from /historical/markets/{ticker}/candlesticks, not the live path. Since January 2026 Kalshi also accepts include_latest_before_start to prepend the last known price before your window.
For deeper guides per venue, see Polymarket historical data and Kalshi historical data.
How do you get OHLCV for every venue in one call?
Predictefy's fetchOHLCV returns the same candle shape for 15+ venues. Ask by outcomeId, pick a resolution, and optionally a start and end:
import Predictefy from '@predictefy/sdk';
const client = new Predictefy({ apiKey: process.env.PREDICTEFY_API_KEY });
const [market] = await client.kalshi.fetchMarkets({ limit: 1, status: 'active' });
const outcomeId = market.outcomes[0].outcomeId;
const candles = await client.kalshi.fetchOHLCV({ outcomeId, resolution: '1h', limit: 500 });
for (const c of candles) {
console.log(c.timestamp, c.open, c.high, c.low, c.close, c.volume, c.isTrueCandle);
}
This type-checks against @predictefy/sdk 1.0.0-beta.11. Swap client.kalshi for client.polymarket or any other venue and the loop is unchanged. Resolutions are 1s, 5s, 10s, 30s, 1m, 5m, 15m, 30m, 1h, 4h, 6h and 1d, with up to 5,000 candles per call at 5 credits. Each candle carries source, sourceType and isTrueCandle, so a backtest can tell a venue's own candle from one built out of price points.
How far back does Predictefy history go?
| Plan | Price | History window |
|---|---|---|
| Free | $0 | 7 days |
| Builder | $48.88 a month | 12 months |
| Pro | $149 a month | Unlimited, plus history replay |
History replay, on Pro and above, streams stored data such as book snapshots and trades in time order as NDJSON pages through GET /v1/history/replay, which is how you rerun a past session tick by tick. For bulk files rather than API calls, see where to get prediction market datasets.
What can you build with historical prediction market data?
- Backtests of entry and exit rules on resolved markets.
- Charts for any market on any venue with one candle format.
- Event studies of how prices moved around debates, data releases or injuries.
- Calibration checks of how often a 70% price actually resolved Yes.
Past prices do not predict future results, and a strategy that worked in a backtest can lose money live.
Frequently Asked Questions
How do I get Polymarket price history?
Call GET https://clob.polymarket.com/prices-history?market=TOKEN_ID&interval=1w&fidelity=60. It returns price points for one outcome token with no key.
Does Kalshi have a candlestick API?
Yes. GET /series/{series_ticker}/markets/{ticker}/candlesticks returns OHLC candles at 1-minute, 1-hour or 1-day periods. Older settled markets use the /historical candlesticks endpoint.
Is there one OHLCV API for all prediction markets?
Predictefy's fetchOHLCV returns the same candle shape for 15+ venues, at 12 resolutions from 1 second to 1 day.
How much history does the Predictefy Free plan include?
7 days. Builder at $48.88 a month includes 12 months, and Pro at $149 a month is unlimited and adds history replay.
What is Kalshi's historical cutoff?
The date before which settled markets move to Kalshi's historical endpoints. GET /historical/cutoff returns it; on 16 October 2026 it was 16 August 2026.