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.

Explore Historical Data PlansView the Data Schema →

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.

PlatformEarliest dataWhat is storedGranularityOutcomes
PolymarketJanuary 2026Opening odds, closing odds, resolved outcomeOpening and closingYes
KalshiJanuary 2026Opening odds, closing odds, resolved outcomeOpening and closingYes
NovigJanuary 2026Opening odds, closing odds, resolved outcomeOpening and closingYes

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.

eventIDUnified identifier — the same event on every platform resolves to this one ID
leagueID / sportIDCategory grouping, so you can filter to politics, economics, sports and so on
status.started / ended / finalizedWhere the market is in its lifecycle. finalized marks a settled result
oddIDWhich outcome a price belongs to, in {statID}-{statEntityID}-{periodID}-{betTypeID}-{sideID} form
fairOddsThe no-vig reference price across platforms
bookOddsThe price as quoted
byBookmakerEach platform's own price for that outcome, keyed by platform
Opening and closing oddsThe first and last recorded price for each outcome, per platform
Resolved outcomeWhich side settled true once the market finalized

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 integrationsOne API
IdentifiersDifferent on every platformOne eventID across all three
Response formatA different shape each timeOne normalized schema
IntegrationsOne per platformOne
Matching equivalent marketsYour own logic to build and maintainDone before you receive the data
Resolution fieldsNamed and structured differentlyOne consistent outcome structure
Ongoing maintenanceEvery platform's changes are yours to absorbOne connection to keep working

How to get it

  1. Create an account and get an API key.
  2. Choose the platforms you want with bookmakerID.
  3. Request settled markets with finalized=true.
  4. Store or analyse the normalized response.
  5. 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)EdgeAlpha
Historical accessNot includedLast 90 daysFull history to January 2026
Platforms3AllAll
Resolved outcomesYesYes
GranularityOpening and closingOpening and closing
DeliveryREST APIREST 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.

View PlansRequest a Data Sample