oddsrail

Notes on the venue APIs

A price gap across two venues is not an edge

Identical wording on Polymarket and Kalshi does not mean identical settlement. Most cross-venue gaps are a settlement difference, not free money.

Two markets on two venues, same wording, twelve points apart. It looks like arbitrage and it usually is not, because the price is not paying for the same event.

What actually differs

  • Resolution source. One settles on an official announcement, the other on a named data provider. In the window between them, both can be right and pay opposite ways.
  • Close time. An hour of difference is an hour in which the outcome can change.
  • Criteria text. The description is the contract on Polymarket. "Confirmed by" and "in the opinion of" are where disputes come from.
  • Structure. A multi-outcome market with negative risk does not behave like a plain binary, and the same words can hide it.
  • Dispute status. A market with an open UMA dispute has a price that already reflects a fight about what happened.

Naive matching makes it worse

Match on title similarity alone and you will pair unrelated markets and report a seventy point gap that is pure fiction. The honest answer to "find me cross-venue arbitrage" is usually "nothing qualifies", and a tool that never returns that answer is telling you what you want to hear.

What oddsrail does

compare_venues requires title similarity above a threshold and close dates within a week, and it usually returns nothing. settlement_audit then compares close times, resolution sources, dispute status and structure on live data and returns ok, caution or block with reasons. Only after a block-free audit is a difference worth calling an edge.

Found by driving the venues live, then encoded so an agent never rediscovers it. Reproduce every one of these with no keys: pip install oddsrail && python examples/footguns.py (source).

Try an agent that knows all six All notes