Methodology

Honest about what we do and don't do.

Data sources

Polymarket prices come from the public Gamma API (gamma-api.polymarket.com) — see the live Polymarket sports markets. Kalshi prices come from the public Trade API (api.elections.kalshi.com) — browse the underlying Kalshi markets. We poll both endpoints server-side every 12 seconds, cache the response, and serve it to your browser on a 15-second refresh.

How we price a market

For Polymarket we use the lastTradePrice, falling back to the first outcomePrice. For Kalshi we take the mid of yes_bid and yes_ask when both are positive, otherwise the last trade price. A market with a price ≤ 1¢ is treated as illiquid and hidden — never displayed as "0¢".

How we pair Kalshi and Polymarket

Each match is keyed by kickoff date plus a normalized version of both team names (lowercase, no punctuation, "FC/AFC/Club" stripped, longest two meaningful tokens). When the two books agree on date and teams, we attach Kalshi's home/draw/away prices to the same match row.

"Best bets" ranking

The "Best Bets" sections rank matches by the higher of the two home-win prices, after filtering out illiquid (≤1¢) markets. That surfaces the games where the market has the strongest conviction — not the games most likely to be profitable bets.

What we don't do

  • Make up missing data. If a book has no price, the cell is empty.
  • Re-order matches based on affiliate payouts.
  • Inject editorial picks above the prediction-market price.
  • Track you across sites for advertising.

Corrections

Spot a wrong pairing or a stale price? The Kalshi and Polymarket APIs are the source of truth — if their prices change, ours do too on the next refresh. For pairing errors (same teams, different countries), reach out and we'll patch the normalizer.

FAQ

How do you convert contract prices into probabilities?

A contract that settles at $1 trades between $0 and $1, so its price is read directly as an implied probability — 62c means a 62% market-implied chance.

How do you pair the same match across two venues?

Matches are matched on competition, kickoff time and both team names, then verified against the venues" own market titles before being shown side by side.

What happens when a market has no volume?

We hide it. An untraded quote is not a real price, and showing it would misrepresent the market.

How often is the data refreshed?

Roughly every 15 seconds while markets are open. Each page shows how long ago its data was updated.

Sources