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.
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:
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
Collect
We poll Polymarket, Kalshi and Novig continuously on the schedule your plan allows.
Normalize
Prices, outcomes and identifiers are converted into one schema, so a Kalshi price and a Polymarket price become directly comparable numbers.
Match
Markets asking the same underlying question are resolved to a single eventID, regardless of how each platform words or identifies them.
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.
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:
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.
| Plan | Delivery | Refresh | Suited to |
|---|---|---|---|
| Signal (free) | REST | 5 minutes | Prototyping and testing an idea |
| Edge | REST | Sub-minute | Dashboards and personal scanners |
| Alpha | REST | Fastest available | Production monitoring at volume |
| Custom | WebSocket | Push on update | Higher-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 direct | One API | |
|---|---|---|
| Integrations | One per platform | One |
| Schemas | A different shape each time | One normalized response |
| Odds formats | Convert them yourself | Consistent across platforms |
| Event matching | Your own logic, maintained forever | Done before you receive the data |
| Pipelines to run | One per source | One connection |
| Platform API changes | You find out when it breaks | Absorbed 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.
Need WebSocket push for higher-frequency alerting? Talk to us about a custom plan.