Arbitrage & comparison

Build Cross-Platform Prediction Market Arbitrage Tools

Normalized prices from Polymarket, Kalshi and Novig through one integration, with the same underlying question already matched across all three. Build a scanner, an alerting system or a trading model without first building the plumbing underneath it.

To be clear about what this is: market data and comparison infrastructure. We do not flag arbitrage for you and we do not execute trades — your application decides what counts as an opportunity, and the platforms handle the trading.

Get Your Free API KeyView Sample Response →

Getting the prices is the easy part

Anyone can pull three endpoints. The work that actually takes the time is deciding whether two markets are the same question — because until you know that, two prices are just two numbers.

Every platform disagrees with the others on nearly everything structural:

Event identifiersA slug on Polymarket, a ticker on Kalshi, something else on Novig
Response schemaDifferent field names, different nesting, different types
Outcome labelsYes/No, Democratic/Republican, Over/Under — for the same question
Price formatDecimal probabilities on one platform, American odds on another
Market titlesWorded differently even when the question is identical
Status and resolutionDifferent fields, different names, different lifecycles
AuthPublic reads here, an API key there, signed requests elsewhere

And that mapping is not write-once. It drifts every time a platform renames a market, splits one question into several, or retires a contract mid-cycle.

What we do before you see the data

1

Collect

We poll Polymarket, Kalshi and Novig continuously on the schedule your plan allows.

2

Normalize

Prices, outcomes and identifiers are converted into one schema, so a Kalshi price and a Polymarket price become directly comparable numbers.

3

Match

Markets asking the same underlying question are resolved to a single eventID, regardless of how each platform words or identifies them.

4

Return

One request gives you every platform's price for the same outcome, side by side in one object.

What each response carries

Only fields that are consistently present. Note what is not here — no order book, no bid/ask, no liquidity figures. That shapes what you can honestly build, and the caveats section below is direct about it.

eventIDThe unified identifier. The same question on all three platforms returns this one ID
leagueID / sportIDCategory, so you can scope a scanner to politics, economics or sports
oddIDWhich outcome a price belongs to, consistent across platforms
fairOddsThe no-vig reference price — a useful baseline to measure divergence against
bookOddsThe price as quoted
byBookmakerEach platform's own price for that outcome, keyed by platform name
byBookmaker[…].availableWhether that platform is currently quoting the outcome at all
status.started / ended / finalizedWhere the market is in its lifecycle

One event, three platforms, one object

This is the shape that makes a scanner simple. Polymarket at +112, Kalshi at −102, Novig at +108 — the same outcome on the same question, already lined up. Comparing them is a field lookup, not a matching exercise.

Request

curl "https://api.predictionmarketapi.com/v2/events\
  ?apiKey=YOUR_API_KEY\
  &bookmakerID=polymarket,kalshi,novig\
  &oddsAvailable=true\
  &limit=10"

Response

{
  "success": true,
  "data": [
    {
      "eventID": "US_PRESIDENTIAL_ELECTION_2028",
      "leagueID": "US_POLITICS",
      "status": { "started": false, "ended": false },
      "odds": {
        "probability-home-game-ml-yes": {
          "oddID": "probability-home-game-ml-yes",
          "fairOdds": "+105",
          "bookOdds": "+108",
          "byBookmaker": {
            "polymarket": { "odds": "+112", "available": true },
            "kalshi":     { "odds": "-102", "available": true },
            "novig":      { "odds": "+108", "available": true }
          }
        }
      }
    }
  ]
}

fairOdds is the no-vig reference across platforms, which is usually a better baseline to measure divergence against than any single venue. The schema reference lists every field.

What people build with it

Cross-platform arbitrage scanners

Watch matched markets and flag gaps past whatever threshold you set. The matching is done; you write the comparison and the alerting, which is a weekend rather than a quarter.

Divergence alerts

Push to Discord, Slack or email when two platforms disagree by more than a few points on the same question. Most useful on markets where one venue is thin and slow to react.

Consensus probability models

Blend prices across platforms into a single reference number, then treat individual venues as noisy estimates of it. Deviation from consensus is often a better signal than raw divergence.

Historical divergence analysis

Study how often gaps appeared and how far markets moved between open and close, using settled markets rather than live ones.

Comparison dashboards

Show Polymarket, Kalshi and Novig side by side on the same question — the display most people actually want and nobody offers by default.

Signals inside a wider strategy

Use divergence as one input among several rather than a trade trigger on its own. Persistent disagreement often reflects genuinely different trader bases, not mispricing.

A price difference is not an arbitrage opportunity

This is the section most pages like this leave out, and it is the one that will save you the most time. A gap in the data is a candidate. Whether it is tradeable depends on things the API does not know:

DepthA price is the top of the book. There may be $50 available at it, or $50,000. We do not carry order book depth, so this has to be checked on the platform.
FeesTrading and withdrawal costs differ by platform and are not in the data. A three-point gap can be entirely eaten by them.
Position limitsSome venues cap position sizes, which can make a gap real but not worth trading.
Resolution criteriaTwo markets can ask what looks like the same question and settle on different terms. Always read both sets of rules before treating prices as equivalent.
TimingMarkets close at different times. A gap that exists now may not be tradeable on both sides by the time you act.
Capital in two placesBoth legs need funding on their own platform, at the same time, to lock a spread.
VoidsA cancelled or voided market on one side leaves you with a naked position on the other.

We can tell you where two platforms disagree on the same question. We cannot tell you whether you can trade it. Verifying contract terms, available liquidity and executable prices before acting is yours — and anyone selling you otherwise is overselling.

Matched on the question, not the wording

Title matching falls over immediately. “Will the Democratic nominee win in 2028?” and “2028 Presidential Election Winner — Democratic” are the same bet described two ways, while two markets with nearly identical titles can settle on different terms.

So matching works on the underlying question and returns one eventIDacross platforms. What that gives you is a reliable answer to “are these about the same thing?” — which is the hard part, and the part you would otherwise maintain forever.

What it is not is a guarantee that settlement terms are identical. Two venues can ask the same question and resolve it differently at the edges — an early call, a disputed result, a different cutoff. Before you trade a spread rather than just display it, read both sets of rules.

How fast the data moves

Update frequency matters more here than in almost any other use case. Gaps close as traders spot them, so a five-minute refresh will surface divergence that has already gone.

PlanDeliveryRefreshSuited to
Signal (free)REST5 minutesPrototyping and testing an idea
EdgeRESTSub-minuteDashboards and personal scanners
AlphaRESTFastest availableProduction monitoring at volume
CustomWebSocketPush on updateHigher-frequency alerting

Poll near-term markets often and distant ones rarely — best practices covers how to spend a quota sensibly, and WebSocket streaming replaces polling entirely on custom plans.

Three integrations, or one

Building directOne API
IntegrationsOne per platformOne
SchemasA different shape each timeOne normalized response
Odds formatsConvert them yourselfConsistent across platforms
Event matchingYour own logic, maintained foreverDone before you receive the data
Pipelines to runOne per sourceOne connection
Platform API changesYou find out when it breaksAbsorbed behind the same schema

If you only ever watch one platform, go direct — the Polymarket API guide shows how. Arbitrage is by definition a two-platform problem, which is where this stops being true.

Which plan a scanner needs

Plans are metered in entities, and one entity is one event — however many outcome markets sit under it. So an election carrying twelve candidate markets counts once, not twelve times, which makes scanners cheaper to run than people expect.

Rough sizing: events watched × polls per day × days per month. Watching 200 events every five minutes is roughly 1.7 million entity reads a month, which is Alpha territory. Watching 200 events once an hour is around 144,000 — comfortably Edge.

Start on the free Signal plan to prove the logic, then buy update frequency when you need it. Full plan limits are on the pricing page.

Where to start

The quickstart gets a first call working in a few minutes. Setup and authentication covers keys, the schema reference covers the response, and pagination covers pulling a lot of markets at once.

Questions

Does the API identify arbitrage opportunities for me?

No, and it is worth being blunt about that. The API supplies matched, normalized market data— every platform's price for the same outcome in one object. Your application applies its own arbitrage rules, fee assumptions and alert thresholds. There is no “arb” flag in the response, because whether a gap is worth trading depends on costs and constraints only you know.

Does the API execute trades?

No. This is market data and comparison infrastructure. Execution stays with the individual platforms, and you place trades through their own interfaces or trading APIs.

Does it include bid/ask prices or order book depth?

No. You get each platform's quoted price and whether it is currently available, not the book behind it. For a scanner that surfaces candidates this is enough; for sizing a position it is not, and you will need to check depth on the platform itself.

Can I compare Polymarket and Kalshi in one request?

Yes — that is the whole point. Pass both to bookmakerID and their prices for the same outcome come back under byBookmaker on one event, already matched.

How are equivalent markets matched?

On the underlying question rather than the title text, which is why the same election resolves to one eventID even where three platforms word it three ways. Treat it as a strong signal that two markets are about the same thing — not as a guarantee that their settlement terms are identical. Check the rules before trading a spread.

How often do prices update?

Every 5 minutes on the free Signal plan, sub-minute on Edge, and at the fastest available frequency on Alpha. WebSocket push is available on custom plans. For scanning, update frequency matters more than any other limit — gaps close quickly.

Is historical data available for backtesting?

Yes, though with a limit worth knowing: settled markets carry their opening odds, closing odds and outcome, back to January 2026 — not a tick-by-tick series. Historical coverage sets out exactly what is stored.

Can I test it before subscribing?

Yes. The free Signal plan covers all 3 live platforms with no card and no expiry — enough to prove your matching and comparison logic works before you pay for update frequency. Compare the plans.

Start building your scanner

Polymarket, Kalshi and Novig through one normalized integration, matched before you receive them. Spend the time on your strategy instead of your data pipeline.

Get Your Free API KeyRead the Quickstart

Need WebSocket push for higher-frequency alerting? Talk to us about a custom plan.