Historical data
Historical Prediction Market Data for Backtesting and Models
Opening odds, closing odds and resolved outcomes from Polymarket, Kalshi and Novig through one normalized API. Every finalized market since January 2026, with the same event identifiers the live feed uses.
Worth being clear up front: this is opening and closing prices plus outcomes, not a tick-by-tick series. That is enough for calibration work, outcome labelling and entry-versus-close analysis — and not enough for intraday execution modelling.
- ✓One normalized schema across Polymarket, Kalshi and Novig
- ✓Opening and closing odds for every finalized market
- ✓Resolved outcomes, ready to use as labels
- ✓The same event and market identifiers as the live feed
What is actually available, by platform
History begins when we started recording, not when each platform launched. There is no data before January 2026 for any source, and we would rather say so here than let you find out after subscribing.
| Platform | Earliest data | What is stored | Granularity | Outcomes |
|---|---|---|---|---|
| Polymarket | January 2026 | Opening odds, closing odds, resolved outcome | Opening and closing | Yes |
| Kalshi | January 2026 | Opening odds, closing odds, resolved outcome | Opening and closing | Yes |
| Novig | January 2026 | Opening odds, closing odds, resolved outcome | Opening and closing | Yes |
Coverage last reviewed 10 September 2026.
Fields on every historical record
The historical record uses the same schema as the live feed, so code written against one works against the other.
A real request, and what comes back
Ask for settled markets with finalized=true. Each platform's price for the same outcome arrives under byBookmaker on one event — already matched, which is the part you would otherwise be building yourself.
Request
curl "https://api.predictionmarketapi.com/v2/events\
?apiKey=YOUR_API_KEY\
&bookmakerID=polymarket,kalshi,novig\
&finalized=true\
&limit=100"Response
{
"success": true,
"data": [
{
"eventID": "US_PRESIDENTIAL_ELECTION_2028",
"leagueID": "US_POLITICS",
"sportID": "PREDICTION_MARKETS",
"status": {
"started": true,
"ended": true,
"finalized": true
},
"odds": {
"probability-home-game-ml-yes": {
"oddID": "probability-home-game-ml-yes",
"fairOdds": "+85",
"bookOdds": "+88",
"byBookmaker": {
"polymarket": { "odds": "+85", "available": true },
"kalshi": { "odds": "+88", "available": true },
"novig": { "odds": "+92", "available": true }
}
}
}
}
]
}Each outcome also carries its opening and closing value alongside the settled price. The schema reference lists every field an event returns.
What people build with it
Backtest against opening and closing prices
Replay finalized markets to test entry rules and probability thresholds. Because you get both the opening and the closing price, you can measure whether a market moved toward or away from the eventual result — the core question for any entry-timing strategy.
Train forecasting models on labelled outcomes
Every finalized market is a labelled data point: a price, and whether the thing happened. That is exactly the shape supervised learning wants, and it is hard to get anywhere else in a clean cross-platform form.
Measure how well markets are calibrated
Take every market that closed near 70% and check how many resolved true. Do it across thousands of markets and you have a calibration curve — the most direct test of whether prediction markets deserve the trust people place in them.
Compare how platforms priced the same event
The same event carries one eventID across all three platforms, so comparing Polymarket's close against Kalshi's on identical questions is a field lookup rather than a matching exercise. Persistent divergence is where cross-platform strategies come from. How the same matching works on live prices.
Chart expectations from open to close
Show how the market's view of an election, a rate decision or a match shifted between opening and settlement. Two points per market is enough for a movement chart across a whole category.
More ideas in five things you can build with a prediction market API.
Why take history from one API rather than three
Assembling this yourself means three integrations, three schemas, and your own logic for deciding that a Polymarket market and a Kalshi market are the same question — then keeping that logic correct as platforms rename and retire markets.
| Three direct integrations | One API | |
|---|---|---|
| Identifiers | Different on every platform | One eventID across all three |
| Response format | A different shape each time | One normalized schema |
| Integrations | One per platform | One |
| Matching equivalent markets | Your own logic to build and maintain | Done before you receive the data |
| Resolution fields | Named and structured differently | One consistent outcome structure |
| Ongoing maintenance | Every platform's changes are yours to absorb | One connection to keep working |
How to get it
- Create an account and get an API key.
- Choose the platforms you want with bookmakerID.
- Request settled markets with finalized=true.
- Store or analyse the normalized response.
- Track consumption on the /account/usage endpoint.
The quickstart walks through authentication and your first call, and best practices covers pulling large result sets without burning your quota.
Which plans include it
| Signal (free) | Edge | Alpha | |
|---|---|---|---|
| Historical access | Not included | Last 90 days | Full history to January 2026 |
| Platforms | 3 | All | All |
| Resolved outcomes | — | Yes | Yes |
| Granularity | — | Opening and closing | Opening and closing |
| Delivery | — | REST API | REST API |
Historical access starts on Edge — the free Signal plan covers live data only. Full per-plan limits are on the pricing page.
How the data is put together
We poll each platform's public API on the schedule your plan allows and record what comes back. A market's first recorded price becomes its opening odds and its last before settlement becomes its closing odds, so both are observations we made rather than figures a platform publishes.
Events are matched across platforms on the question being asked, not on titles, which is why the same election or rate decision resolves to one eventIDeven where the three platforms word it differently. A market is treated as finalized once the source platform settles it, and outcomes follow that platform's own resolution.
All timestamps are UTC. Where a platform did not carry a market, that platform is simply absent from byBookmakerrather than present with a null — so a missing key means “not offered there”, not “we failed to fetch it”.
What it will not do
Historical availability varies by platform and category, and some markets will have incomplete records — particularly around a platform being added, or where a market was voided rather than settled. There is nothing before January 2026 for any source.
There is no tick-level series, no order book depth and no bulk file export. If your project needs a specific platform, category, date range or granularity we have not described here, ask before you subscribe — we would rather tell you it is not a fit than take the money.
Questions about historical data
How far back does the historical data go?
To January 2026. That is when we began recording, so there is no data before it for any platform — including markets that existed on Polymarket or Kalshi earlier. Alpha includes everything from that date forward; Edge includes the last 90 days.
Does the dataset include every price movement?
No. Historical records carry the opening and closing odds for each outcome, not a tick-by-tick series. If you need every movement, that granularity lives in the live feed, where each update carries its own timestamp — so the usual approach is to record the live feed going forward and use history for settled markets.
Are in-play price changes retained historically?
Not as a series. In-play movement is visible on the live feed as it happens, but what persists into the historical record is the opening and closing price plus the outcome.
Can I get Polymarket and Kalshi history in one request?
Yes — that is the point of it. Pass both to bookmakerIDand each platform's price arrives under byBookmaker on the same event, already matched.
Is this suitable for backtesting?
For strategies that turn on entry price, closing price and outcome, yes. For anything needing intraday execution detail — order book depth, or precisely when a price moved — no, and you should know that before you subscribe rather than after.
Can I download it in bulk?
Delivery is through the REST API rather than a file export. Page through settled markets with cursor-based pagination and store what you need. Talk to us if a one-off bulk extract would suit your project better.
Which plan includes the full history?
Alpha. Edge covers a rolling 90 days, which is enough for recent-form work but not for a calibration study. Compare the plans.
Can I see a sample before subscribing?
Yes. Ask us for a sample covering the category and date range you care about, and we will send real records rather than a synthetic example.
Start building with historical prediction market data
Resolved outcomes and open-to-close prices from three platforms, without maintaining separate integrations or matching equivalent markets yourself.