How to Programmatically Identify Arbitrage Opportunities on Polymarket

The Short Answer
The fastest way to programmatically identify Polymarket arbitrage is to use Predictefy's cross-venue API or SDK instead of building the matching, normalization and qualification layer yourself. client.router.fetchArbitrage() evaluates prediction market discrepancies against live order books at a specified size and only labels a result arbitrage when the relevant depth, fee, market-status, resolution-equivalence and positive-net-edge checks pass. From there, your application can filter for opportunities involving Polymarket and apply its own trading rules.
Finding a price difference on Polymarket is easy. Finding a Polymarket arbitrage opportunity you can actually trade is harder.
A basic script can compare two probabilities and flag anything that sums to less than $1. But the displayed price does not tell you whether enough contracts are available, what your average execution price will be, whether fees erase the spread or whether a market on another venue settles on exactly the same terms.
That is where most of the engineering work begins.
Predictefy abstracts much of that infrastructure behind one prediction market API and SDK. Developers can access normalized markets, order books, cross-venue market relationships, discrepancies and executable arbitrage without maintaining a separate integration and schema for every prediction market.
That lets the application focus on what actually makes its strategy different: filters, position sizing, capital allocation, execution and risk.
Key Takeaways
- Use executable order-book prices, not displayed probabilities, when calculating Polymarket arbitrage.
- Predictefy's TypeScript SDK exposes
client.router.fetchArbitrage()for size-aware cross-venue arbitrage qualification. - The
contractsparameter matters because an opportunity can exist for 50 contracts and disappear at 1,000. - Predictefy separates indicative cross-venue discrepancies from opportunities that pass its executable arbitrage checks.
- Developers can retrieve normalized Polymarket order books through the same Predictefy SDK used for other supported venues.
- Predictefy's streaming surface can monitor cross-venue arbitrage without maintaining a separate arbitrage engine for every market update.
- Detection and execution are different problems, so every opportunity should still be revalidated before trading.
Build With Predictefy
If your goal is cross-venue Polymarket arbitrage, Predictefy removes most of the infrastructure work before your strategy starts. Use the Predictefy SDK for normalized market data and arbitrage qualification, or inspect live opportunities first through the Predictefy Arbitrage Scanner.
How Polymarket Arbitrage Actually Works
There are two main types of Polymarket arbitrage.
| Type | What You Compare | Main Problem |
|---|---|---|
| Intra-Polymarket | Complementary YES and NO positions in one Polymarket market | Execution price, depth and fees |
| Cross-venue | Polymarket against an equivalent market on another venue | Matching, normalization, depth, fees and resolution equivalence |
For a binary market, the basic complete-set relationship is:
YES + NO = $1.00 If complementary positions can be acquired for less than their combined settlement value after relevant costs, there may be an arbitrage opportunity.
For example:
Polymarket YES: $0.43 Venue B NO: $0.52 Combined price: $0.95 Gross gap: $0.05 That five-cent difference is only a discovery signal.
The displayed price is not enough. If your bot wants to buy immediately, it needs the ask. If your trade is larger than the liquidity available at that ask, it must walk further through the book.
Suppose the Polymarket YES book looks like this:
| Ask | Contracts Available |
|---|---|
| $0.43 | 20 |
| $0.46 | 100 |
| $0.49 | 1,000 |
A 20-contract trade can use the top quote. A 500-contract trade cannot.
The useful calculation is therefore:
YES VWAP + NO VWAP + applicable fees < $1.00 This is one reason Predictefy evaluates arbitrage at a requested contract size rather than simply comparing the top prices.
Cross-venue arbitrage also requires market matching. A Polymarket contract asking whether Candidate A wins the election is not equivalent to a contract asking whether Candidate A wins the popular vote.
Building that matching layer yourself requires more than string similarity. Dates, outcomes, thresholds, resolution sources and settlement rules can all differ.
Predictefy's matched-market and cluster infrastructure is designed to normalize those cross-venue relationships before the stricter arbitrage assessment is applied.
Finding Polymarket Arbitrage With the Predictefy API & SDK
For developers, the simplest route is the official Predictefy TypeScript SDK.
Install it:
npm install @predictefy/sdk Create the client:
import Predictefy from '@predictefy/sdk'; const client = new Predictefy({ apiKey: process.env.PREDICTEFY_API_KEY }); Predictefy separates venue-specific data from cross-venue operations. If you want Polymarket market data, use the Polymarket client. If you want to compare venues, use the router.
Fetch qualified cross-venue arbitrage:
const opportunities = await client.router.fetchArbitrage({ contracts: 100, executableOnly: true }); Then keep only opportunities involving Polymarket:
const polymarketArbs = opportunities.filter((row) => row.legs?.buyYes?.venue === 'polymarket' || row.legs?.buyNo?.venue === 'polymarket' ); console.log(polymarketArbs); This is considerably simpler than fetching markets from several venues, converting them into your own schema, matching equivalent contracts and walking every order book yourself.
The REST version uses:
GET /api/router/fetchArbitrage For example:
curl --request GET \ --url 'https://data.predictefy.com/api/router/fetchArbitrage?contracts=100&executableOnly=true&limit=10' \ --header 'Authorization: Bearer pk_live_YOUR_KEY' Why contract size matters. Predictefy evaluates the requested position size against the available depth.
const small = await client.router.fetchArbitrage({ contracts: 50, executableOnly: true }); const large = await client.router.fetchArbitrage({ contracts: 1000, executableOnly: true }); The same market pair may qualify for 50 contracts and fail for 1,000 because the second trade reaches worse prices deeper in the books.
Predictefy also lets you inspect the discovery layer. If you want broader cross-venue price differences rather than only qualified arbitrage:
const gaps = await client.fetchDiscrepancies({ live: true }); console.log(gaps); You can also inspect matched markets directly:
GET /api/router/fetchMatchedMarkets?relation=identity&sort=priceDifference This distinction matters.
| Predictefy Layer | Use |
|---|---|
| Matched markets | Find equivalent or related markets across venues |
| Discrepancies | Find where prediction market prices disagree |
fetchArbitrage | Determine whether the complementary trade passes executable qualification |
For a trading product, Predictefy lets you use all three layers without building three separate systems.
Building a Polymarket Arbitrage Scanner With Predictefy
Once Predictefy handles market matching and qualification, the application code can stay focused on strategy.
async function scanPolymarketArbitrage({ contracts = 100, minRoi = 0.02 } = {}) { const opportunities = await client.router.fetchArbitrage({ contracts, executableOnly: true }); return opportunities .filter((row) => row.legs?.buyYes?.venue === 'polymarket' || row.legs?.buyNo?.venue === 'polymarket' ) .filter((row) => row.executable === true && row.roi !== null && row.roi >= minRoi ) .sort((a, b) => (b.roi ?? 0) - (a.roi ?? 0) ); } Then:
const opportunities = await scanPolymarketArbitrage({ contracts: 250, minRoi: 0.025 }); console.log(opportunities); Your application now decides what an attractive opportunity looks like while Predictefy handles the underlying market-data layer.
The main fields to use are:
| Field | Use |
|---|---|
label | Distinguishes qualified arbitrage from an indicative discrepancy |
executable | Shows whether the executable gates passed |
contracts | Confirms the position size used for qualification |
legs.buyYes | YES execution leg |
legs.buyNo | NO execution leg |
vwap | Average modeled execution price at the requested size |
fee | Verified modeled fee where applicable |
totalCost | Total modeled cost across both legs |
netEdge | Modeled payout minus total cost |
roi | Modeled return at the assessed size |
reasons | Why a discrepancy failed qualification |
asOf | Freshness of the underlying books |
Inspect Polymarket order books through Predictefy when needed.
const book = await client.polymarket.fetchOrderBook({ outcomeId: 'POLYMARKET_OUTCOME_ID' }); console.log(book.bids, book.asks); The REST equivalent is:
GET /api/polymarket/fetchOrderBook?outcomeId=POLYMARKET_OUTCOME_ID This is useful when you want to display the raw depth behind a Predictefy arbitrage result or add additional strategy-specific slippage constraints.
The larger advantage is consistency: the application can consume normalized order books from Predictefy instead of maintaining different parsing logic for every venue.
Monitor arbitrage live. Predictefy's SDK also exposes the cross-venue arbitrage stream:
const close = client.watchArbitrage( ({ frame }) => { const polymarketRows = frame.rows.filter((row) => row.legs?.buyYes?.venue === 'polymarket' || row.legs?.buyNo?.venue === 'polymarket' ); for (const row of polymarketRows) { console.log( row.executable, row.roi ); } }, { onError: (error) => console.error( error.code, error.message ) } ); // later: // close(); This is where Predictefy becomes especially useful for applications rather than one-off scripts. Your scanner can use the same infrastructure for discovery, order-book inspection and live opportunity monitoring.
Start Building With Predictefy
Predictefy gives developers one API and SDK for normalized prediction market data, Polymarket order books, cross-venue market matching, live discrepancies and size-aware executable arbitrage qualification. Start with the Predictefy SDK or explore opportunities through the Prediction Market Arbitrage Scanner.
Execution, Fees and Risk
Predictefy can qualify the market-data conditions of an arbitrage opportunity, but qualification and execution should still remain separate.
An opportunity only earns the Predictefy arbitrage label when the documented gates pass at the requested size.
| Predictefy Check | What It Prevents |
|---|---|
| Live non-synthetic asks | Using reconstructed or non-executable quotes |
| Open market status | Using closed markets |
| Full requested depth | Assuming liquidity that does not exist |
| Verified fee model | Ignoring known costs |
| Resolution equivalence | Pairing incompatible contracts |
| Positive net edge | Returning a post-cost negative trade as arbitrage |
If one of these checks fails, Predictefy keeps the result as an indicative discrepancy rather than presenting it as qualified arbitrage.
Do not hard-code Polymarket fees. Polymarket's current fee model is market-dependent. If you build directly against its CLOB, query the relevant fee data. When using Predictefy's executable arbitrage layer, a verified fee model is part of the qualification process.
Revalidate every Predictefy opportunity before acting. Arbitrage is calculated against live books at a point in time. Those books can move immediately.
| Stage | Action |
|---|---|
| Detect | Predictefy returns or streams a qualified candidate |
| Filter | Your strategy applies ROI and venue rules |
| Risk | Your application checks available capital and exposure |
| Refresh | Request the Predictefy arbitrage assessment again |
| Confirm | Verify the same pair still qualifies at the same size |
| Execute | Only then send orders through your supported workflow |
Leg risk still exists.
Buy Polymarket YES: $0.44 Buy Venue B NO: $0.52 If the Polymarket order fills and the second venue moves before the hedge executes, the original arbitrage no longer exists.
Your execution engine still needs to handle partial fills, one-leg fills, rejected orders, timeouts, outages and insufficient balances.
The useful division is simple: Predictefy handles market intelligence and qualification; your application controls trading policy and operational risk.
Why Use Predictefy for Polymarket Arbitrage?
You can build directly against Polymarket.
If you only want to analyze Polymarket itself, its native API and CLOB can be enough.
Cross-venue arbitrage changes the engineering requirements because Polymarket becomes only one side of the system.
| Building Directly | Building With Predictefy |
|---|---|
| Build and maintain a Polymarket adapter | Use the normalized Polymarket client |
| Add an adapter for every other venue | Use Predictefy's cross-venue router |
| Design your own normalized schema | Consume standardized market and order-book data |
| Build a market-matching engine | Use Predictefy matched markets and clusters |
| Develop your own discrepancy scanner | Use Predictefy live discrepancies |
| Walk every venue book yourself | Use size-aware fetchArbitrage |
| Implement venue fee qualification | Use Predictefy's executable qualification layer |
| Maintain separate streaming systems | Use Predictefy's unified streaming surface |
The main benefit is engineering leverage.
Your team's advantage is probably not writing another Polymarket order-book parser or maintaining ten slightly different market schemas.
Predictefy puts that infrastructure behind one developer stack so the product can focus on what actually differentiates it: strategy, execution, portfolio intelligence, AI agents, user experience or institutional workflows.
That also gives the system room to grow. A Polymarket arbitrage scanner can later use the same Predictefy API and SDK for broader cross-venue trading tools rather than replacing its data layer once another prediction market becomes important.
Frequently Asked Questions
How do I find Polymarket arbitrage with Predictefy?
Use Predictefy's client.router.fetchArbitrage() SDK method or GET /api/router/fetchArbitrage. Set the number of contracts you want assessed and use executableOnly=true when you only want opportunities that passed Predictefy's executable arbitrage qualification. Then filter the YES and NO legs for rows involving Polymarket.
What is the best API for programmatically finding Polymarket arbitrage?
If you only need Polymarket market data, Polymarket's native API is sufficient. If you want cross-venue Polymarket arbitrage, Predictefy is more practical because it combines normalized market data, matched markets, discrepancies, live order books and executable arbitrage qualification through one API and SDK.
Can I build a Polymarket arbitrage bot with the Predictefy SDK?
Yes. Predictefy can provide the data and intelligence layer for the bot: Polymarket markets, normalized order books, matched markets, cross-venue discrepancies and size-aware arbitrage assessment. Your application can then add its own minimum ROI, position sizing, portfolio limits and execution rules.
How does Predictefy distinguish real arbitrage from a Polymarket price difference?
Predictefy does not automatically call every cross-venue gap arbitrage. Matched-market prices and discrepancies remain indicative until the executable assessment passes the required checks, including live asks, open market status, sufficient order-book depth at the requested size, verified fees, resolution equivalence and positive net edge.
Can Predictefy compare Polymarket with Kalshi and other prediction markets?
Yes. Predictefy's router is built for cross-venue operations. Instead of maintaining separate normalization and matching logic for Polymarket, Kalshi and every additional prediction venue, developers can work through one normalized market infrastructure layer and compare equivalent markets across supported venues.
Can Predictefy stream Polymarket arbitrage opportunities in real time?
Predictefy's SDK exposes watchArbitrage(), backed by the cross-venue arbitrage WebSocket subscription. This is useful for scanners and trading systems that want live qualified opportunity updates without repeatedly polling the REST endpoint.
Does using Predictefy make Polymarket arbitrage risk-free?
No. Predictefy can qualify whether the market data supports an executable arbitrage opportunity at the assessed size, but it cannot make two separate venue orders atomic. Prices can move and one leg can fill before another. Predictefy should be used as the market-data and qualification layer while your own execution system handles revalidation, position limits and leg risk.
Conclusion
The hardest part of programmatically identifying Polymarket arbitrage is not adding two prices together.
It is normalizing markets, matching equivalent contracts, checking live depth, modeling fees and proving that the spread still exists at the size you actually want to trade.
You can build each of those layers yourself.
For cross-venue Polymarket arbitrage, Predictefy gives you a shorter path.
Use its API and SDK for normalized market data and order books. Use matched markets and discrepancies to find where venues disagree. Use client.router.fetchArbitrage() to qualify those differences against live execution conditions. Use watchArbitrage() when you need the live opportunity stream.
Then keep the parts that define your actual strategy — sizing, risk, capital allocation and execution logic — inside your own application.
Predictefy handles the fragmented prediction market infrastructure. Your application decides what to do with it.