Arena

How Arena compares prices across venues

How Arena compares prices across venues

How Arena compares the same bet across Kalshi, Novig and Polymarket, and when a paper trade takes another venue’s price. It describes what the code does today.

What this page covers

Arena lists each bet once, as an instrument with a permanent id (/docs/instruments), and Kalshi’s market is the reference for each one. Where Novig or Polymarket lists the same bet, Arena reads that venue’s public price too, shows it next to Kalshi’s, works out the gap between them, and can let a paper trade take that price.

Arena is paper trading. It sends no order to Kalshi, Novig or Polymarket and has no partnership with any of them. Every price Arena compares across venues names the venue it came from and when it was current.

How instruments are matched

By rules, never by price. Kalshi’s listings create every game and instrument, and another venue’s market can only attach to one that already exists. A Novig or Polymarket market attaches when all of these match:

  • the game, on Novig: the same two teams, home and away the same way round, starting within a set window of Kalshi’s current start time (48 hours in the NFL, less where teams meet on consecutive days);
  • the game, on Polymarket: the Polymarket event is already linked to Kalshi’s event for the same game, and where its outcomes name teams, they are that game’s two teams, in either order. A Polymarket event matched only by its teams and start time gets a confidence of 0.8, so it is never shown;
  • the teams: the venue’s spelling of each team must be one Arena has approved for that team. A new spelling is only proposed, and waits for a person;
  • the bet: the same market type (moneyline, spread or total), the full game, and the same line on the half-point grid;
  • the side: which of the venue’s outcomes pays when the instrument is YES (polarity, below).

A price never makes or breaks a match. Every Novig and Polymarket match starts as proposed: made by rule, not yet reviewed by a person, who can then approve it. As of September 27, 2026, no match has been reviewed, and the note on each price says so.

Arena shows a match next to Kalshi only when it is exact or differs from Kalshi’s contract in a named case (below), its confidence is at least 0.9, and the venue still lists the market.

Polarity

Each listing carries a polarity. 1 means holding that venue side pays when the instrument is YES, and -1 means it pays when the instrument is NO. Arena turns every price into the chance of the instrument’s YES before it shows it, so the venues line up.

  • Novig lists an NFL moneyline as one market with two outcomes. Both attach to the instrument “home team wins”: the home outcome with 1, the away outcome with -1.
  • A spread is stored as “subject wins by more than L”. A Novig spread with Miami at +3.5 at home attaches to KC -3.5: its KC outcome with 1, its MIA outcome with -1.
  • A total attaches Over with 1 and Under with -1.
  • Polymarket lists a soccer result as a Yes or No market on one outcome, such as the draw: Yes attaches with 1 and No with -1.

So a -1 listing’s price for its own side is 1 minus the instrument’s YES. On Novig, the ask on one outcome is 1 minus the best bid on the other outcome, which holds only when the market has exactly two outcomes. A three-outcome soccer market has no outcome that pays on “this club does not win”, so Arena never prices a NO side from one.

Fungibility: is it the same contract?

Each match records how far the venue’s contract settles the way Kalshi’s does.

exact
The two contracts settle the same way in every case, ties, postponements and voids included. Stored as identical and answered as exact. Kalshi’s own listings are exact. No Novig or Polymarket match is exact today.
condition_scope
The same bet, but one named case settles differently, and the note says which. A Novig NFL moneyline voids on a tie and Novig settles the void by its own rule, where Kalshi pays 50. A Novig spread or total differs only if the game is not completed. A Polymarket soccer market differs only if the game is postponed or cancelled. Polymarket’s NFL terms are not yet compared. Shown next to Kalshi with its note, and can take a paper fill.
non_fungible
Not the same bet. A Novig spread or total on a whole number, such as 3: a result exactly on the line voids on Novig, where Kalshi’s yes or no market resolves no. Arena keeps it on an instrument of its own, never shows it next to Kalshi and never fills a paper trade at its price.

Every Novig and Polymarket match today is condition_scope.

Coverage by league

What Arena lists and compares as of September 27, 2026. Every league is full-game moneylines, spreads and totals on half-point lines, added as Kalshi lists them, so a league out of season or a game far out can list few or none.

NFL
Kalshi, Novig and Polymarket.
College football (FBS)
Kalshi and Novig.
MLB
Kalshi and Novig. Polymarket stays off until a fault that paired some of its markets with the wrong game in a series is fixed.
NHL
Kalshi and Novig. Novig’s NHL moneylines and totals are shown with a note, but never take a paper fill until Arena has read Novig’s overtime and shootout terms.
NBA
Kalshi moneylines so far. No other venue is matched yet.
Premier League
Kalshi’s three moneylines per game (each club, and the draw), Novig and Polymarket.
Champions League
Set up. Instruments come once Kalshi lists the games.

One instrument’s comparison (the market page, arena quotes, arena gaps <instrument>) works in every league above. The ranked list of gaps (arena gaps with no argument, find_price_gaps with no ref) covers NFL games for now.

How each venue’s price is read

Kalshi
Its public market data, read by Arena’s server: the YES bid and ask and the contracts at each. Kalshi keeps one book per market, so its NO price is 1 minus its YES bid. The time shown is when Arena read it.
Novig
Its keyless public order book, which shows bids only, per outcome. The ask on one outcome is 1 minus the best bid on the other. Novig’s own cache can serve a book up to 5 seconds old, and Arena subtracts that age from the time it shows. Novig’s public prices can be 5 to 10 seconds old at the source. Each website server reads at most one Novig book a second, so a Novig price can show a refresh later. A routed trade reads its own. A Novig contract pays 1 cent, so 100 of them count as one $1 contract.
Polymarket
The public order book of its international exchange: bids and asks per outcome, in $1 shares, and the market’s smallest order. The book’s own time is its last change, so the time shown is when Arena read it.

Every price becomes the chance of the instrument’s YES. YES costs the venue’s YES ask, and NO costs 1 minus its YES bid.

A price at most 15 seconds old is fresh. An older price is shown with its age up to 60 seconds, then hidden. Only a fresh price can be marked Lowest or take a paper fill. An answer is at most about 10 seconds behind its sources, and the market page asks again every 15 seconds.

A venue that fails to answer, limits requests or has no orders is left out with a note that says why. It never holds up the other venues.

Fee assumptions

Paper fills on Arena charge no fee. Fees matter when comparing venues, because a real trader would pay them. Arena works out each venue’s taker fee from its published schedule, for buying at the displayed price:

Kalshi
0.07 × M × contracts × P × (1 - P), rounded up to the next cent. M is the series multiplier Kalshi publishes: 1 on most sports series, and 0.5 on MLB games, spreads and totals when Arena read them.
Novig
0.03 × P × (1 - P) per $1 contract on game lines, once the game is live, and nothing before it. Arena treats a game as live from 5 minutes before its start. Rounded half up to $0.00001. From Novig’s published schedule, not read market by market.
Polymarket
rate × shares × p × (1 - p), rounded up to $0.00001. The rate is read for each market from Polymarket’s market settings: 0.05 on sports markets with fees on, 0 on markets with fees off.

P is the price of the side bought, from 0 to 1. Arena counts taker fees only, with no maker fees or rebates. A venue can charge differently from Arena’s reading.

If a market’s setting cannot be read, Arena uses that venue’s highest published rate, and the pair is never labelled arbitrage.

Price gaps

For each side of an instrument, the gap is how far apart the venues’ prices are, in points: the highest price shown minus the lowest. One point is one cent on a $1 contract. The market page shows the larger of the two sides’ gaps, and marks each side’s lowest price when that price is fresh.

A gap compares displayed prices before fees. It does not mean a trade would make money.

The arbitrage label, after fees

A pair buys YES on one venue and NO on another. Exactly one of the two pays $1, so the pair is worth buying only if both cost less than $1 per contract after both venues’ taker fees for the size.

Arena labels a pair arbitrage only when all of these hold, after both venues’ taker fees:

  • the pair costs less than $1 per contract, fees included, for the size shown;
  • both contracts are exact matches of Kalshi’s, so they settle the same way;
  • a person has reviewed both matches;
  • both prices are at most 15 seconds old;
  • both venues show a size of at least 1 contract, and at least the venue’s smallest order, which Polymarket sets for each market;
  • both venues are ones a person in the US can use, unless you ask for every venue (below);
  • neither fee is a stand-in: each comes from the venue’s setting for this market or, for Novig, its published game-line schedule;
  • neither price is more than 10 points from Kalshi’s midpoint, and Kalshi shows one.

Any other pair is a price gap, not arbitrage, and lists every reason word for word. A pair whose contracts differ says “Not risk-free: rules differ.” and names the case. A label lapses as soon as either price is more than 15 seconds old.

A label says what Arena saw, for the size shown, at that moment. It is not risk-free: prices move, an order can fill at a worse price or not at all, a venue can charge a different fee, and a venue may not accept you.

As of September 27, 2026, every Novig and Polymarket match is condition_scope and none has been reviewed, so every pair shown is a price gap and is not labelled arbitrage.

A worked example

The arithmetic for one pair, with made-up prices on an NFL moneyline, not a real market:

made-up prices
KC ML, the game under way, 100 contracts. Made-up prices.

Kalshi      YES bid 0.55   YES ask 0.57   NO costs 1 - 0.55 = 0.45
Novig       YES bid 0.50   YES ask 0.52   NO costs 1 - 0.50 = 0.50

Gap on YES  0.57 - 0.52 = 5 points, lowest on Novig
Gap on NO   0.50 - 0.45 = 5 points, lowest on Kalshi

Pair        YES on Novig at 0.52 and NO on Kalshi at 0.45
Prices      100 x (0.52 + 0.45)                              $97.00
Kalshi fee  0.07 x 100 x 0.45 x 0.55 = 1.7325, rounded up     $1.74
Novig fee   0.03 x 100 x 0.52 x 0.48, the game is live       $0.7488
Cost        for 100 pairs, which pay $100                    $99.4888
Edge        $100 - $99.4888                                  $0.5112, 0.51 points

Other pair  YES on Kalshi at 0.57 and NO on Novig at 0.50 = 1.07 before fees, no edge

Before the game starts Novig charges no fee on game lines, so the same pair would cost $98.74 for 100 and the edge would be 1.26 points.

The label is a price gap, not arbitrage: a Novig NFL moneyline voids on a tie where Kalshi pays 50 (“Not risk-free: rules differ.”), and no person has reviewed the match. If both contracts were exact, both matches reviewed, both prices under 15 seconds old, both venues showing at least 100 contracts and both fees known, the same pair would carry the arbitrage label after fees: $0.51 on 100 pairs, as Arena saw it at that moment.

The same prices before the game, for a buy of YES with best-price routing: Novig’s ask of 0.52 is fresh, 4 points from Kalshi’s midpoint of 0.56, and below Kalshi’s ask of 0.57, but it is below Kalshi’s bid of 0.55. A price across Kalshi’s bid usually means one book is stale, so routing refuses it and the paper trade fills at Kalshi’s 57%, with that reason recorded. Had Novig’s ask been 0.56, inside Kalshi’s spread and 1 point below its ask, the trade would fill on Novig at 56% if Novig showed the contracts asked for. If the game then tied, that trade would settle at 50, as a trade filled on Kalshi does.

Who can use each venue

Kalshi
Open to US users, but it does not offer its sports contracts in every state.
Novig
A US exchange that checks each user’s location and is not open in every state.
Polymarket
The prices Arena reads come from Polymarket’s international exchange, which does not accept US persons. Polymarket’s US exchange is a separate market that Arena does not read.

So by default only Kalshi and Novig can pair for the arbitrage label after fees. --all-venues in the CLI and us_only=false on the MCP server let Polymarket pair too, and each such pair still carries Polymarket’s note. Arena does not check where you are.

Best-price routing does not check either. A paper fill can take Polymarket’s price even though a person in the US could not trade there, and the receipt names the venue.

Best-price paper routing

A paper trade that asks for it can fill at Novig’s or Polymarket’s price instead of Kalshi’s. The venue’s match must meet Arena’s rule for showing a match next to Kalshi, its price at most 15 seconds old, within 5 points of Kalshi’s midpoint and at least 1 point below Kalshi’s ask, with the contracts asked for shown at that price, before the game starts. A price at or below Kalshi’s bid is refused as a likely stale quote. Otherwise the trade fills at Kalshi’s price, with the reason recorded. Routing is for Arena Basic members. The full rule, sells and limit orders included, is on /docs/execution.

Routing’s checks differ from the ones for pairs above on purpose. A paper fill charges no fee, so routing compares prices without fees. It accepts a match that differs in a named case, because the trade still settles exactly as the Kalshi market settles and its receipt names the difference (below). And its band around Kalshi’s midpoint is 5 points where the pair rule’s is 10, because a paper fill should take a price close to one a trader could get.

  • Website: the order ticket’s “Best price”, the default, or “Kalshi only”. Best price shows a Review step, with where the trade would fill and why, before Confirm.
  • CLI 0.4.0: --venue best, the default, or --venue kalshi on arena buy and arena sell. --dry-run shows the venue first.
  • MCP server 0.4.0: route: "best", the default, or "kalshi" on place_trade and sell_trade, with dry_run: true for the preview.
  • iPhone app: sends no route, so its trades fill at Kalshi’s price until an app update.
  • A bot that models Kalshi’s book alone should pass --venue kalshi or route: "kalshi".

When a routed fill’s contract differs

A trade filled on Novig or Polymarket settles from the Kalshi market’s result, exactly as a trade filled on Kalshi does. Every difference Arena knows of today, and what happens:

Novig NFL moneyline, a tie
Novig voids the market and settles the void by its own rule, a fair price it sets or a refund, as the market says, where Kalshi pays 50. On Arena a tie settles a trade filled on Novig at 50, as Kalshi does. That is Arena’s rule for a Novig fill, not Novig’s price.
Other Novig markets, an unfinished game
Novig voids the market and settles the void by its own rule, a fair price it sets or a refund, as the market says, and Kalshi settles by its own rules. On Arena the trade settles the way the Kalshi market settles.
Polymarket NFL
Its tie, postponement and settlement terms are not yet compared with Kalshi’s. The trade settles the way Kalshi settles.
Polymarket soccer, a postponed or cancelled game
Polymarket keeps a postponed game open until it is played and settles a cancelled one by its own rule, where Kalshi pays a fair price. The trade settles the way Kalshi settles.
Novig NHL moneylines and totals
Novig’s overtime and shootout terms are not read yet, so these never take a paper fill.

The receipt’s rule note (ruleNote in the CLI, rule_note on the MCP server) states the rule for that fill, and selling the position says it again.

What Arena does not do

  • It sends no order to Kalshi, Novig or Polymarket. Every fill is a paper fill in Arena’s own records.
  • It has no partnership with Kalshi, Novig or Polymarket, and none of them reviews Arena’s matches or prices.
  • It charges no fee on paper fills and does not walk the book, so a paper fill can be better than a real order of that size would get.
  • It does not promise a price. A price shown, a gap and a paper fill are what a venue showed Arena at one moment.
  • It does not read Polymarket’s US exchange, and it does not check which venues you can use.
  • It is not a data feed. There is no download of other venues’ prices.
  • “Lowest” and “Best price” name the lowest price that passed Arena’s checks at that moment. They say nothing about a venue in general.