Skip to content

BlogMatched betting data

What is an oddsmatcher? The data behind it, explained

OddsRelay · · Updated · 5 min read

An oddsmatcher lists bookmaker back prices beside exchange lay prices for the same selection, sorted so the closest match comes first. The rating and qualifying loss it shows are arithmetic on those prices.

What is an oddsmatcher?

An oddsmatcher is a search tool for matched bettors. You back a selection at a bookmaker to meet an offer's terms, then lay the same selection on an exchange so the two bets roughly cancel. The cost of a match is the gap between the two prices, so the closer they sit, the less the offer costs to take.

It shows each match as a ranked line with the event, the selection, the bookmaker and its price, the exchange and its price, and the money available to lay. Filters narrow it by sport, bookmaker, odds range or kick-off time. The data underneath decides whether that ranking can be trusted.

The data an oddsmatcher runs on

Each line needs three facts about one selection at one moment. The bookmaker's back price. The exchange's lay price. And available, the money on offer at that lay price. They have to describe the same event, market and selection.

Here is one outcome from a matched board, trimmed to a single back and lay offer. The shape is the real /v2 one.

Example · one outcome from GET /v2/odds/standard (trimmed)

{
  "event_id": "or_evt_917dd44bce05",
  "sport_key": "soccer_epl",
  "commence_time": "2026-09-20T14:00:00Z",
  "home_team": "Arsenal",
  "away_team": "Chelsea",
  "markets": [{
    "key": "h2h",
    "outcomes": [{
      "name": "Arsenal",
      "back": [{ "bookmaker": "william_hill", "price": 2.9, "link": null }],
      "lay":  [{ "exchange": "betfair_exchange", "price": 3.0, "available": 175, "link": null }]
    }]
  }]
}

That is all the feed sends for this outcome: source prices and the lay stake on offer. There is no score in it. The rating and the qualifying loss come next, and you work them out.

How is an oddsmatcher rating worked out?

The usual rating is the back price divided by the lay price, times 100. With a back of 2.9 and a lay of 3.0 it comes to about 96.7. At 100 the two prices are level. Below it, the gap between them is the cost of the match, and the further below, the more it costs.

Example · your code, computing the rating from a back and lay price

const back = 2.9;  // bookmaker back price
const lay = 3.0;   // exchange lay price
const rating = (back / lay) * 100; // 96.67

A rating is a sorting key and nothing more. This version ignores exchange commission. Some tools build commission in, which is why two of them can show different ratings for the same prices.

What is qualifying loss?

Qualifying loss is what the back bet and the lay bet cost together, before any free bet or bonus is counted. The two bets rarely cancel exactly, because the prices differ and the exchange charges commission on a winning lay. The standard lay stake balances both outcomes so the loss is the same whichever way the event goes.

Example · your code, qualifying loss at your own commission rate

const back = 2.9, lay = 3.0;
const stake = 10;         // back stake
const commission = 0.02;  // your exchange commission rate
const layStake = (stake * back) / (lay - commission);     // 9.73
const ifBackWins = stake * (back - 1) - layStake * (lay - 1); // -0.46
const ifLayWins = layStake * (1 - commission) - stake;        // -0.46

On a 10-unit stake, this match loses about 0.46 either way. That is the price of unlocking the offer. Change the commission to your own rate and the figure moves, which is the reason it belongs in your code: only you know the rate you pay. The qualifying loss and ratings guide goes further, and the oddsmatcher widget shows both figures.

Lay liquidity decides what is usable

A close price is worthless if the exchange cannot take your lay. The available figure is the money waiting at that lay price. In the example, 175 is enough to lay the 9.73 stake several times over. If it were 4, most of the lay would go unmatched or fill at a worse price, and the qualifying loss above would no longer hold.

OddsRelay's matched boards are liquidity-gated, so a lay offer needs a minimum amount of money behind it to be paired at all. Your own stake size is a different threshold, so filter on available as well.

The response says how old a price can be

Freshness is a property of the data you hold. Every reply carries meta.processed_at, the time the board was built. A matched envelope also carries meta.last_seen, the last read per venue and sport, so the current time minus it is an upper bound on a price's age. Show that age next to each line and your users can judge it for themselves. Every product on sale meets a maximum update time of 10–20 s. The freshness guide covers the fields, and the conditional requests guide shows how to poll without re-downloading an unchanged board.

Consumer oddsmatchers and a developer feed

A consumer oddsmatcher is a website a matched bettor logs into. A developer feed is an API that your own product reads. For one person placing bets, the consumer tool is the right shape. For a team building an oddsmatcher, a comparison page or an alerting tool, it does not help, because those tools are generally sold as screens to read rather than as data to license.

Consumer oddsmatcherDeveloper data feed
PairingDone, shown on screenDone, delivered as back and lay offers
Rating and qualifying lossShown by the toolYour arithmetic, at your commission rate
FiltersThe tool's own screen filtersSports, bookmakers, exchanges, markets and a kick-off window, set in the request

That pairing is the hard part (what oddsmatcher-ready means). Matching one team name across dozens of bookmakers and the exchanges is where a home-built oddsmatcher spends most of its effort. OddsRelay covers 140+ bookmakers, 60+ of them live in the UK & Ireland, bet365 included, paired against Betfair, Smarkets, Matchbook and BETDAQ. How to build an oddsmatcher walks through what is left for you to write.

Where to go next

Check which bookmakers and exchanges are live on the coverage page, and read the board shapes in the API reference. When you want to query the feed yourself, request access.