2Up odds data explained
2Up odds data is a bookmaker's price on its 2Up market for a football match, paired with the exchange match odds lay on the same team and the liquidity available at that lay.
What is a 2Up offer, in data terms?
A 2Up offer is a football early payout. If the backed team goes two goals ahead, the bookmaker settles the bet as a winner, whatever the final score. In data terms that is one back price on the match result, quoted on the bookmaker's 2Up market. The 2Up glossary entry works a whole bet through.
The 2Up price is its own number. A bookmaker can quote a team at one price on its ordinary match odds and at another on its 2Up market, so a tool that reads the ordinary price shows the wrong back odds for the offer.
The trigger is not in the data. Whether a team went two up is known only once the match is under way, and the feed carries pre-match prices.
What does a 2Up tool need from a feed?
Beyond the back and lay pair itself, a 2Up tool reads three things from each reply:
- The liquidity at the lay price, so the tool can tell whether the lay stake it sizes would be matched at that price.
- A link to each venue's event page, which takes a user to the right fixture at the bookmaker and at the exchange.
- A time on the data, to show how old each price is.
The pairing is the part that is hard to keep right. One venue's "MK Dons" can be another's "Milton Keynes Dons", and the 2Up price has to land against the exchange lay for the same side. Matching bookmaker and exchange odds sets out the six things that must agree before a back and a lay are one pair. The board pairs the fixture and each side's lay before the reply reaches you, and home_ and away_ carry one name for each side.
One fixture from the 2Up board
Here is one team from one Championship fixture on the 2Up board, trimmed to two of its bookmakers and two of its exchanges:
{
"meta": {
"feed_type": "2up",
"region": "uk",
"odds_format": "decimal",
"processed_at": "2026-10-12T00:03:04.878Z"
},
"data": [{
"event_id": "or_evt_012f1bb7a64b",
"sport_title": "England Championship",
"commence_time": "2026-10-13T18:45:00Z",
"home_team": "Millwall",
"away_team": "Swansea",
"markets": [{
"key": "h2h",
"outcomes": [{
"name": "Millwall",
"back": [
{ "bookmaker": "7bet", "price": 2.55, "link": "https://7bet.co.uk/betting/football/england/championship/millwall-vs-swansea" },
{ "bookmaker": "10bet", "price": 2.5, "link": "https://www.10bet.co.uk/sports/football/events/33099368/millwall-v-swansea" }
],
"lay": [
{ "exchange": "smarkets", "price": 2.62, "available": 60.0, "link": "https://smarkets.com/sport/football/england-championship/2026/10/13/18-45/millwall-vs-swansea-city/45363774/" },
{ "exchange": "matchbook", "price": 2.62, "available": 43.7, "link": "https://www.matchbook.com/events/34565952921700023" }
]
}]
}]
}]
}back lists each bookmaker's 2Up price for Millwall, best first. lay lists each exchange's match odds lay on the same team, lowest first, and available is the liquidity at that price.
The pairing holds. Every outcome carries the same name as home_ or away_, so each side is one outcome, and its best 2Up price is the first offer in its back list.
meta.processed_ is when the board was built, and a full envelope also carries meta.last_, each venue's last read per sport.
There is no rating and no qualifying loss in the reply. Those are your code's arithmetic on the pair, at your own commission rate:
const outcome = event.markets[0].outcomes[0]; const back = outcome.back[0]; // best 2Up price in this outcome const lay = outcome.lay[0]; // lowest lay const commission = 0.02; // your exchange rate, as a fraction const stake = 10; const rating = (back.price / lay.price) * 100; const layStake = (stake * back.price) / (lay.price - commission); const ifTeamWins = stake * (back.price - 1) - layStake * (lay.price - 1); const ifTeamDoesNotWin = layStake * (1 - commission) - stake; const fitsTheLay = layStake <= lay.available;
On the pair above, the 7bet price of 2.55 against the Smarkets lay at 2.62 gives a rating of 97.3. The early payout itself stays out of these numbers, because no pre-match price says how likely a two-goal lead that is later lost would be. The 2Up calculator sizes the same lay, and it also shows the result if the team goes two up and then fails to win.
How the 2Up board differs from the standard board
The 2Up board shares the standard board's grammar, so a client typed for one reads the other. The differences:
| Standard board | 2Up board | |
|---|---|---|
| Back price | Each bookmaker's ordinary price | Each bookmaker's 2Up price |
| Bookmakers | Bookmakers whose price pairs with an exchange lay | Only bookmakers running a 2Up market on that fixture |
| Sports | Many sports and markets (keyless GET / lists them) | Football, market h2h only |
| Lay side | The exchange market for the same selection | The exchange match odds lay on the same team |
| Price of a call | Cut by the sports, markets and venues you name | The same whatever you filter |
That separate back price is what sets the 2Up board apart. The best odds guaranteed (BOG) board has the same shape, but its back prices are each bookmaker's ordinary win price, taken only from bookmakers offering BOG on that race.
Terms belong to each bookmaker
Each bookmaker decides which matches its 2Up offer covers and whether goals in extra time count, and it can change those terms. The feed carries prices, never eligibility, so a tool shows the bookmaker's own terms page beside the pair rather than a rule of its own.
The board follows the offer: when a bookmaker stops running it, its back prices leave the board. The 2Up feed page lists which bookmakers carry it.
Narrowing a 2Up call
Every sport_ on the 2Up board starts with soccer_. To keep the reply small, name one bookmaker or exchange, or send a kick-off window (commenceTimeFrom and commenceTimeTo). Every event here is football, so sports= on its own keeps the whole board. To narrow further, take an event's competition_, one key per competition that never changes once served (GET / lists them too): sports= with that key returns the whole competition, whatever each bookmaker calls it.
curl --compressed -s -H "Authorization: Bearer $ODDSRELAY_KEY" \ "https://api.oddsrelay.io/v2/odds/2up?region=uk&bookmakers=sky_bet"e=true"
quote= returns the call's token price and spends nothing. Drop it to fetch the board itself.
A filter leaves a 2Up call's token price unchanged. It still helps on a poll. Send each reply's ETag back as If-None-Match, and an unchanged body answers 304, which costs nothing.
In a full envelope, meta.processed_ moves each time the board is rebuilt, and meta.last_ as venues are read. Either one changes the body and its ETag even when your events have not. With format= the reply is the data array alone. The board time moves to the X-Processed-At header and meta.last_ is left out, so the body and its ETag change only when the events you asked for change. A narrow bare poll gets a 304 more often than the same poll as a full envelope. The conditional requests guide shows the loop, and the matched-board filters guide lists every filter the board takes.
Football on the other boards is covered in football odds data, explained, and the racing and each-way guide covers the racing boards that share this category.
Compare one weekend's 2Up prices with match odds
Pull one weekend's fixtures from the 2Up board and the same fixtures from the standard board, then set each bookmaker's 2Up price beside its ordinary one. Quote both calls with quote= before you make them.
Sources, checked 12 October 2026
Related posts
- Football odds data, explainedFootball markets, the keys that name them, and what one matched football price looks like.
- Best odds guaranteed (BOG) and your dataBOG pays the starting price when it beats the price you took. What that changes in a matched bet.
- Matching bookmaker and exchange oddsA back and a lay price pair up only when six things agree. Where venue rules pull them apart.
18+ · OddsRelay supplies odds data only and takes no bets. Please gamble responsibly.