NEW: Live arbitrage across 10+ prediction markets.Arbitrage →
← Index
ArbitrageAug 21, 202614 min read

How to Find Cross-Platform Arbitrage Opportunities Between Kalshi and Polymarket

How to Find Cross-Platform Arbitrage Opportunities Between Kalshi and Polymarket

The Short Answer

To find cross-platform arbitrage between Kalshi and Polymarket, first identify contracts that settle on the same outcome, then compare the executable cost of buying YES on one venue and NO on the other. Test both directions, use live order-book asks rather than displayed probabilities, include venue fees, and calculate the result at the exact size you intend to trade. Predictefy simplifies the process by matching equivalent markets, normalizing both venues' order books, and exposing size-aware cross-venue arbitrage through one API and SDK.

Kalshi and Polymarket frequently list contracts tied to the same election, sports result, economic release, crypto event, or geopolitical outcome.

Those markets do not always agree on price.

Polymarket may offer the cheaper YES position while Kalshi offers the cheaper NO position. The reverse can also happen. When the combined executable cost is below the contracts' fixed combined payout after fees, a cross-platform arbitrage candidate exists.

The arithmetic is simple. The difficult parts are market matching, order-book normalization, fee handling, trade sizing, and revalidation.

Predictefy handles much of that fragmented infrastructure through one normalized prediction market layer, allowing traders and developers to focus on the opportunity rather than maintaining separate Kalshi and Polymarket integrations.

Key Takeaways

  • Test both routes: Polymarket YES plus Kalshi NO, and Kalshi YES plus Polymarket NO.
  • Only compare contracts whose deadlines, thresholds, settlement sources, and resolution rules align.
  • Use executable asks and volume-weighted prices rather than displayed probabilities or midpoints.
  • Kalshi and Polymarket expose different native order-book formats, which must be normalized before comparison.
  • Predictefy separates indicative price discrepancies from stricter executable-arbitrage qualification.
  • The requested trade size matters because an opportunity can exist for 25 contracts and disappear at 500.
  • Revalidate immediately before execution because neither venue guarantees the spread will remain open.

How Kalshi and Polymarket Arbitrage Works

Both platforms offer binary contracts whose payouts depend on whether an event occurs.

A cross-platform arbitrage strategy attempts to acquire complementary outcomes for less than their combined settlement payout.

Route A:
Polymarket YES ask
+ Kalshi NO ask
+ applicable fees
< $1.00

Route B:
Kalshi YES ask
+ Polymarket NO ask
+ applicable fees
< $1.00
What This Means

The scanner must calculate both directions. The cheaper route may use YES on Polymarket and NO on Kalshi, or it may use YES on Kalshi and NO on Polymarket. A fixed venue order would miss valid opportunities.

Suppose the executable prices are:

Polymarket YES: $0.42
Kalshi NO:      $0.54

Combined cost: $0.96
Combined payout: $1.00
Gross edge: $0.04
Gross ROI: 4.17%
What This Means

The two positions cost 96 cents and are intended to return $1 in total when one side resolves as the winner. The four-cent difference equals approximately 4.17% of deployed capital before fees, slippage, settlement differences, and execution risk.

The same calculation fails if the markets are not true complements.

A Polymarket contract asking whether a candidate wins an election is not equivalent to a Kalshi contract asking whether that candidate wins the popular vote. Likewise, a market resolving by December 31 is not automatically interchangeable with one that remains open through inauguration.

Requirement What Must Match
Underlying event Both contracts must concern the same real-world event.
Outcome The YES outcome on one venue must be the direct complement of the NO outcome on the other.
Threshold or stage Winning, qualifying, reaching a runoff, and winning a popular vote are different outcomes.
Deadline The contracts must use compatible cut-off and settlement periods.
Resolution source Both venues should rely on compatible evidence and official sources.
Edge cases Cancellations, replacements, recounts, postponements, and no-contest outcomes must be treated consistently.

Find Matching Markets Before Comparing Prices

Market matching is usually the hardest part of Kalshi and Polymarket arbitrage.

Titles alone are unreliable. One venue may use a short ticker-style question while the other uses a broader event page with multiple outcomes. Even when the wording appears identical, the detailed rules can differ.

Predictefy's matching engine groups equivalent cross-venue markets into clusters and exposes indicative price discrepancies between cluster members.

The discrepancy layer is useful for discovering where Kalshi and Polymarket disagree:

const discrepancies =
  await client.fetchDiscrepancies({
    live: true
  });

console.log(discrepancies);
What This Does

This asks Predictefy to recompute cross-venue discrepancies using live order-book mid-prices where supported. The results show where matched prediction markets disagree, but they remain indicative research signals rather than automatically executable trades.

Predictefy deliberately keeps this discovery layer separate from its executable-arbitrage layer.

Predictefy Surface Purpose Trade It Automatically?
Clusters and matched markets Identify contracts that may represent the same proposition. No
Live discrepancies Show where matched venues currently disagree on price. No
fetchArbitrage Assess complementary trade legs against live asks, depth, fees, status, and resolution equivalence. Candidate only, subject to your own risk and execution checks

Find the Match Before the Spread

Predictefy gives traders and developers one normalized layer for matching Kalshi and Polymarket markets before comparing prices. Explore current opportunities in the Predictefy Arbitrage Scanner, or use the cross-venue API to build your own scanner, alert system, or trading workflow.

Qualify Kalshi and Polymarket Arbitrage With Predictefy

Once matching markets have been identified, the next step is to price the actual trade.

Predictefy's TypeScript SDK exposes one typed client for venue-specific data and a router for cross-venue operations.

Install the official SDK:

npm install @predictefy/sdk
What This Does

This installs Predictefy's official TypeScript client. The package provides normalized Kalshi and Polymarket methods plus the cross-venue router used for arbitrage assessment.

Create an authenticated client:

import Predictefy from '@predictefy/sdk';

const client = new Predictefy({
  apiKey: process.env.PREDICTEFY_API_KEY
});
What This Does

This creates one Predictefy client using a server-side API key. The same client can access venue-scoped market data and router-level cross-platform operations.

Request executable cross-venue opportunities:

const opportunities =
  await client.router.fetchArbitrage({
    contracts: 100,
    executableOnly: true
  });
What This Does

This asks Predictefy to assess cross-venue arbitrage at a size of 100 contracts. Setting executableOnly: true keeps rows that passed the executable qualification rather than returning every indicative price discrepancy.

Keep only Kalshi–Polymarket pairs:

function isKalshiPolymarket(row) {
  const venues = [
    row.legs?.buyYes?.venue,
    row.legs?.buyNo?.venue
  ];

  return (
    venues.includes('kalshi') &&
    venues.includes('polymarket')
  );
}

const kalshiPolymarketArbs =
  opportunities.filter(isKalshiPolymarket);
What This Does

Predictefy's router can return opportunities involving multiple supported venues. This filter keeps only rows where one complementary leg is on Kalshi and the other is on Polymarket.

The REST equivalent is:

curl --request GET \
  --url 'https://data.predictefy.com/api/router/fetchArbitrage?contracts=100&executableOnly=true&limit=10' \
  --header 'Authorization: Bearer pk_live_YOUR_KEY'
What This Does

This calls the same size-aware arbitrage assessment without using the SDK. The request evaluates cross-venue clusters at 100 contracts and returns up to ten qualified rows.

Predictefy only applies the arbitrage label when every required gate passes.

Qualification Gate Why It Matters
Live non-synthetic asks The strategy needs actual buyable prices rather than reconstructed or indicative values.
Open market status Closed, stale, or past-deadline markets cannot form the intended trade.
Full requested depth Both books must contain enough liquidity for the requested number of contracts.
Verified fee models The spread must remain positive after the relevant venue costs are included.
Resolution equivalence Kalshi and Polymarket must settle the matched contracts on compatible terms.
Positive net edge The combined payout must exceed the modeled total acquisition cost.

Useful response fields include label, executable, contracts, the two trade legs, VWAP, fees, total cost, payout, net edge, ROI, freshness, and machine-readable rejection reasons.

Compare Order-Book Depth, Fees, and Trade Size

Kalshi and Polymarket do not expose their native books in the same format.

Polymarket assigns a separate token ID to each outcome and exposes resting bids and asks for that token.

Kalshi's native order-book response contains YES bids and NO bids. The opposite-side bids imply asks: the best YES ask equals $1 minus the best NO bid, while the best NO ask equals $1 minus the best YES bid.

Predictefy normalizes both venues into a consistent bids-and-asks structure.

Area Polymarket Native API Kalshi Native API Predictefy
Outcome identifier CLOB token ID for each YES or NO outcome Venue-native market or outcome identifier Normalized outcome ID passed through the venue client
Book representation Explicit bids and asks for each token YES and NO bid arrays with implied asks Consistent bids and asks
Price format Decimal probability-style prices Fixed-point dollar strings in native responses Normalized numeric probabilities from 0 to 1
Cross-venue matching Not provided Not provided Matched clusters and discrepancy infrastructure

You can inspect both normalized books through the same SDK:

const [polymarketBook, kalshiBook] =
  await Promise.all([
    client.polymarket.fetchOrderBook({
      outcomeId: 'POLYMARKET_OUTCOME_ID'
    }),
    client.kalshi.fetchOrderBook({
      outcomeId: 'KALSHI_OUTCOME_ID'
    })
  ]);

console.log(polymarketBook.asks);
console.log(kalshiBook.asks);
What This Does

This retrieves the Polymarket and Kalshi order books concurrently through Predictefy's normalized venue clients. Your strategy receives the same bids-and-asks structure instead of implementing separate parsing and ask-reconstruction logic for each platform.

Do not use the best ask as the price for the entire trade.

Suppose the cheaper YES leg has 20 contracts at 42 cents, 100 at 45 cents, and 500 at 48 cents. A 20-contract trade and a 500-contract trade have different average execution prices.

Ask Available Contracts What It Means
$0.42 20 The headline price only covers a small position.
$0.45 100 A medium trade begins paying a higher average price.
$0.48 500 A larger trade may consume enough depth to remove the arbitrage.

A practical strategy should test more than one size:

for (const contracts of [25, 100, 500]) {
  const rows =
    await client.router.fetchArbitrage({
      contracts,
      executableOnly: true
    });

  const matches =
    rows.filter(isKalshiPolymarket);

  console.log({
    contracts,
    opportunities: matches.length
  });
}
What This Does

This runs the same Kalshi–Polymarket arbitrage scan at three position sizes. An opportunity may qualify at 25 contracts but disappear at 500 once worse prices deeper in either order book are included.

Fees must also be evaluated dynamically.

Polymarket charges taker fees on certain market categories, while other categories may be fee-free. Kalshi states that fees can vary between markets and that maker fees may apply in some cases.

Do not use a universal zero-fee assumption for either platform.

Monitor, Revalidate, and Manage Execution Risk

A valid opportunity can disappear between detection and execution.

Predictefy exposes its cross-venue arbitrage surface over WebSocket through the SDK's watchArbitrage() helper.

const close = client.watchArbitrage(
  ({ frame }) => {
    const candidates =
      frame.rows.filter(isKalshiPolymarket);

    for (const row of candidates) {
      console.log({
        question: row.question,
        executable: row.executable,
        netEdge: row.netEdge,
        roi: row.roi,
        reasons: row.reasons
      });
    }
  },
  {
    onError: (error) =>
      console.error(
        error.code,
        error.message
      )
  }
);

// later:
// close();
What This Does

This listens to Predictefy's shared cross-venue arbitrage stream and filters each complete frame for Kalshi–Polymarket pairs. It avoids tightly polling the REST endpoint while preserving the executable status and rejection reasons for each candidate.

Before entering an order workflow, re-run the live assessment at the same trade size:

async function revalidate(candidate, contracts) {
  const latest =
    await client.router.fetchArbitrage({
      contracts,
      executableOnly: true
    });

  return latest.find((row) =>
    row.clusterId === candidate.clusterId &&
    isKalshiPolymarket(row)
  ) ?? null;
}
What This Does

This asks Predictefy to reassess the same matched market cluster immediately before execution. If the pair has disappeared, lost depth, or no longer passes the executable gates, the function returns null rather than allowing the bot to trade a stale signal.

The remaining risks should be managed explicitly.

Risk What Can Happen Control
Leg risk The first order fills while the second price moves or the second order fails. Use strict price bounds, small initial size, and predefined unwind rules.
Partial fills The account receives unequal YES and NO quantities. Track confirmed fills rather than submitted quantities.
Resolution mismatch The venues settle similar contracts differently. Review rules, deadlines, thresholds, and settlement sources before trading.
Fee changes A small gross edge disappears after current venue charges. Use verified per-market fee data and reject unverified fee models.
Capital lock-up Funds remain split across venues until settlement. Rank opportunities by settlement time as well as ROI.
Venue or account risk Outages, restrictions, or insufficient balances prevent execution. Check venue availability, account state, and balances before submitting orders.

Cross-platform prediction market arbitrage is therefore not automatically risk-free. The intended payoff can be covered once both compatible positions are successfully obtained, but the process of reaching that state carries execution, venue, and settlement risk.

Build Kalshi–Polymarket Arbitrage With Predictefy

Predictefy gives developers one API and SDK for normalized Kalshi and Polymarket data, matched markets, live order books, cross-venue discrepancies, and size-aware executable-arbitrage assessment. Start with the Predictefy SDK, or inspect current opportunities through the Prediction Market Arbitrage Scanner.

Frequently Asked Questions

How do I find arbitrage between Kalshi and Polymarket?

Identify contracts that settle on the same outcome, then calculate both complementary routes using executable asks: Polymarket YES plus Kalshi NO, and Kalshi YES plus Polymarket NO. Include fees and order-book depth at your intended size. Predictefy automates much of this workflow through matched markets and client.router.fetchArbitrage().

Which Predictefy endpoint finds Kalshi and Polymarket arbitrage?

Use GET /api/router/fetchArbitrage through REST or client.router.fetchArbitrage() in the TypeScript SDK. Pass the number of contracts you want assessed and use executableOnly=true when you only want rows that passed Predictefy's executable qualification.

Can Predictefy match equivalent Kalshi and Polymarket markets?

Yes. Predictefy groups equivalent cross-venue markets into clusters and exposes matched-market and discrepancy data. Those matches are useful for discovery, while the separate arbitrage assessment applies stricter live-depth, fee, market-status, and resolution-equivalence gates.

Why not compare the displayed probabilities on Kalshi and Polymarket?

Displayed probabilities or midpoints may not be executable. A trader needs the actual ask prices and enough order-book depth for the intended size. Predictefy's arbitrage assessment walks live asks at the requested number of contracts rather than assuming the top displayed price fills the full trade.

Can Predictefy normalize Kalshi and Polymarket order books?

Yes. Predictefy exposes a normalized bids-and-asks structure for supported venues. This removes the need to handle Polymarket's token-specific bid/ask books and Kalshi's native YES/NO bid arrays with implied asks in separate strategy branches.

Can I monitor Kalshi and Polymarket arbitrage in real time?

Yes. Predictefy's SDK exposes watchArbitrage(), backed by its cross-venue arbitrage WebSocket subscription. Filter each frame for rows whose two execution legs are Kalshi and Polymarket, then apply your own ROI, freshness, and risk rules.

Is Kalshi and Polymarket arbitrage guaranteed profit?

No. Predictefy can qualify whether the market data supports an executable opportunity at the assessed size, but separate venue orders are not atomic. One leg can fill while the other moves, fees can change, liquidity can disappear, and the two venues can resolve apparently similar contracts differently.

Conclusion

Finding cross-platform arbitrage between Kalshi and Polymarket requires more than identifying two prices that sum below $1.

The contracts must describe the same outcome. Their deadlines, thresholds, resolution sources, and edge-case rules must align. Both books need enough executable depth, and the spread must remain positive after current fees.

You can build separate Kalshi and Polymarket integrations, reconstruct their different order-book formats, create your own market matcher, and maintain the cross-venue qualification logic yourself.

Predictefy provides a shorter path.

Use matched markets and discrepancies to identify where the venues disagree. Use client.router.fetchArbitrage() to assess the complementary trade at the exact size you want. Use normalized order books when your strategy needs deeper inspection, and use watchArbitrage() for continuous monitoring.

Then keep your own strategy responsible for position sizing, capital limits, revalidation, and execution policy.

Predictefy handles the fragmented Kalshi and Polymarket infrastructure. Your strategy decides which qualified opportunities are worth pursuing.

This article is for general informational and engineering purposes and is not financial, investment, or legal advice.