NEW: Live arbitrage across 10+ prediction markets.Arbitrage →
← Index
StrategySep 16, 2026

Polymarket Kalshi Arbitrage Scanner (2026)

Polymarket Kalshi Arbitrage Scanner (2026)

The Short Answer

A Polymarket Kalshi arbitrage scanner matches equivalent contracts on both venues, prices a YES leg on one against a NO leg on the other, and checks whether their combined cost stays below the shared settlement payout after depth and fees. The difficult work is not subtracting two displayed probabilities. It is proving that both contracts settle the same way and pricing the full trade from live asks. Predictefy performs those checks through one cross-venue arbitrage surface and keeps unqualified gaps labeled as indicative differences.

Key Takeaways

  • A scanner must match resolution rules, dates and official settlement sources, not only similar titles.
  • The calculation uses the ask for each leg because a midpoint is not a price available to a buyer.
  • Depth is checked at the number of contracts you intend to trade, so size can change the result.
  • Both markets must be open and both books must contain real, non-synthetic asks.
  • Fees are applied before a candidate earns an arbitrage label.
  • Predictefy can filter its cross-venue surface to Polymarket and Kalshi through one API call or WebSocket subscription.

What is a Polymarket Kalshi arbitrage scanner?

It is a scanner built around one specific pair of venues. It continuously finds events listed on both Polymarket and Kalshi, aligns the outcomes and tests the two possible cross-venue combinations:

  • Buy YES on Polymarket and buy NO on Kalshi.
  • Buy YES on Kalshi and buy NO on Polymarket.

If the two contracts are equivalent, one side should settle at $1 per paired contract while the other settles at $0. A combined acquisition cost below $1 creates a gross difference. Whether that difference is usable depends on the live books, the size available, the fee schedules and the resolution match.

This is why a scanner needs more than a table of prices. The arithmetic takes one line. Establishing that the line describes a real pair takes most of the system.

Why can you not compare the displayed prices?

The number on a market card is often a midpoint or the last traded price. Neither is necessarily available now.

Suppose Polymarket displays 42 cents for YES and Kalshi displays 53 cents for NO. Adding those numbers gives 95 cents, which looks like a five-cent gross difference. But if the live asks are 45 cents and 56 cents, the two legs cost $1.01 before fees. The opportunity was created by the display, not the books.

A scanner therefore reads the asks directly and walks enough levels to fill the requested size. Ten contracts and one thousand contracts can receive different answers from the same pair because the larger order consumes more of the ladder.

How is the cross-venue calculation made?

For equivalent binary contracts, test both directions and keep the cheaper complete pair. Here is a hypothetical 100-contract example before fees.

LegLive askContractsCost
Polymarket YES$0.43100$43.00
Kalshi NO$0.53100$53.00
Combined$0.96100 pairs$96.00
Settlement payout if rules are equivalent$1.00100 pairs$100.00

The gross difference is $4.00, or four cents per pair. That is not the final result. The scanner still has to walk every required level, calculate both venues' applicable fees and confirm that the contract rules produce opposite outcomes in every relevant scenario.

How should the two markets be matched?

Similar wording is the starting point, not the verdict. The match needs four pieces of agreement.

Outcome. Both contracts must ask the same yes-or-no question. One cannot be a threshold while the other is a range or a different stage of the same event.

Cutoff. The deadlines must line up. A result known on Friday can differ from a result measured at month-end.

Settlement source. The official source used to resolve the contract should agree, or the rules must clearly lead to the same outcome.

Exceptional cases. Postponements, cancellations, recounts and replacement candidates can create different settlements even when the headlines look identical.

A scanner that cannot confirm the rule match should preserve the row as an indicative price difference. That keeps an interesting discrepancy visible without presenting it as a qualified trade.

What checks make an arbitrage row executable?

Predictefy applies every gate before its executable surface uses the arbitrage label.

GateRequired resultWhy it matters
BooksLive, non-synthetic asks on both legsReconstructed prices are not resting orders
StatusBoth markets openA closed leg cannot complete the pair
DepthFull requested size availableThe last contracts can cost more than the first
FeesVerified venue fee models appliedA gross difference can disappear after costs
ResolutionEquivalent rules confirmedDifferent settlement conditions create two separate bets
EdgePositive net result after every gateThe row must survive the entire calculation

Rows that miss a gate carry machine-readable reasons such as insufficient depth, a closed market, a synthetic book or unverified resolution equivalence. That makes the output useful for debugging and research without mixing it into the executable set.

How do you scan Polymarket and Kalshi with one API call?

Predictefy's router exposes the assessed cross-venue surface. The venue filter keeps rows touching Polymarket or Kalshi, while the contract count tells the engine how far to walk each book.

curl -s \
  "https://data.predictefy.com/api/router/fetchArbitrage?contracts=100&limit=100&executableOnly=true&venues=polymarket,kalshi&minEdge=0.02" \
  -H "Authorization: Bearer pk_live_YOUR_KEY"

contracts=100 prices one hundred paired contracts. executableOnly=true keeps rows that passed every gate. venues=polymarket,kalshi narrows the surface, and minEdge=0.02 requires at least two cents of net edge per paired contract. The arbitrage API is available with a free API key and monthly credit allowance.

For a continuously updating screen, the WebSocket uses the same filters:

{
  "op": "subscribeArbitrage",
  "executableOnly": true,
  "venues": ["polymarket", "kalshi"],
  "minEdge": 0.02
}

The stream sends a coherent snapshot when the subscription starts, followed by sequence-ordered updates. It is the live counterpart to the REST query, so a terminal can refresh its rows without polling every Polymarket and Kalshi book independently.

What does an empty scanner result mean?

It means no row passed the selected filters at that moment. That is a valid result, not a broken scanner.

There may be visible price differences whose books are too thin, whose fees consume the spread or whose rules are not equivalent. There may also be no difference above the chosen minimum edge. Lowering the threshold can expose more candidates, while removing executableOnly=true shows indicative rows with their rejection reasons.

The important distinction is between no candidate and no qualified result. A good scanner tells you which one occurred.

How should execution follow the scan?

Treat qualification and order placement as separate steps. Read the row, confirm the size and current timestamps, then build each venue leg against the exact market and outcome returned by the assessment.

Predictefy keeps signing client-side with your own venue credentials. Each venue order is explicit, and every write uses an idempotency key so retrying a request does not silently create a duplicate. Keeping the scan, build and submit steps distinct makes the state of both legs visible before funds move.

Frequently Asked Questions

What is a Polymarket Kalshi arbitrage scanner?

It is a tool that matches equivalent Polymarket and Kalshi contracts, then tests both YES and NO combinations using live order books. A qualified scanner checks asks, available depth, fees, market status and resolution rules before deciding whether the combined cost remains below the shared settlement payout.

How does Polymarket and Kalshi arbitrage work?

The basic trade buys YES on one venue and NO on the other when their combined executable cost is below $1. The contracts must settle as exact opposites. The gross difference then has to survive both fee schedules and remain available at the number of contracts being traded.

Why does the scanner use asks instead of displayed prices?

A buyer pays the ask, while a displayed price may be a midpoint or an older trade. Midpoints cannot be filled. Using the live asks, then walking enough order-book levels for the requested size, gives the actual acquisition cost of both legs rather than a convenient visual estimate.

Can I filter a scanner to only Polymarket and Kalshi?

Yes. Predictefy's REST arbitrage query accepts a venue filter, and its WebSocket subscription accepts a venues array. Setting those to Polymarket and Kalshi narrows the returned cross-venue rows while preserving the same depth, fee, status and resolution checks used by the complete surface.

Why does an arbitrage scanner sometimes show no results?

No result means nothing passed the selected gates at that moment. Visible gaps may have insufficient depth, incompatible resolution rules, closed markets or fees that remove the difference. A scanner should preserve those as indicative rows with reasons instead of promoting them into the executable result set.