Arbitrage
Arbitrage is a set of prices on every outcome of a market whose implied probabilities add up to under 100%, usually from different bookmakers or an exchange.
The test is one line of arithmetic. Take the best price on each outcome, wherever it is offered, and add up one divided by each. A total under 1 means stakes sized in proportion to those shares come back the same whichever outcome happens. A single bookmaker's own market normally totals more than 1, because its margin is built in.
Take a tennis match priced 2.10 on one player at one bookmaker and 2.05 on the other at a second. One divided by each gives 47.62% and 48.78%, 96.40% in all. Of 100 units, 49.40 on the first player and 50.60 on the second return the same amount whichever player wins.
The second form sets a bookmaker against an exchange. When a bookmaker's back price sits far enough above the exchange's lay price to cover the commission, backing at one and laying at the other ends the same either way. Back 10 units at 3.2 and lay at 3.1 at 2% commission (use your own rate), and the lay stake is 10 × 3.2 ÷ 3.08 = 10.39 units. The two legs then settle to the same figure whichever way the selection goes.
Arbitrage on real markets is rare and short-lived. Prices move between one bet and the next, a bookmaker can accept less than the stake asked for or void a bet under its own rules, and a lay may match only in part. A tool that shows a set of prices like this rechecks every leg on the bookmaker's own page first.
In the OddsRelay feed
OddsRelay's feed carries the prices and leaves the arithmetic to the tool, with no arbitrage field and no derived route. On the matched feeds each outcome's back[] lists every bookmaker's price for that selection, best first, so back[0].price on each outcome of a market is the input to the sum, and lay[0].price beside it is the exchange side. GET /v2/odds/raw lists every bookmaker and exchange quoting an event, selections no exchange prices included, with each exchange's back_price and lay_price and no commission applied. Each bookmaker keeps its own outcome labels on raw, so a tool lines the selections up itself.
Every price in the sum has to stand at the same moment. meta.processed_at is the response's time, meta.last_seen gives each bookmaker's last read per sport, and every product has a maximum update time of 10–20 s. The feed is pre-match, and lay[].available shows how much money each lay price holds.
Try it on your own key
Every plan includes every feed. Sign up free and call any of them.