# 2Up odds data explained

> What 2Up odds data holds: each bookmaker's 2Up price on a football match beside the exchange match odds lay and its liquidity, with a reply from the board.

Published 12 October 2026

**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](https://oddsrelay.io/glossary/2up) 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](https://oddsrelay.io/blog/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_team` and `away_team` 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:

GET /v2/odds/2up · trimmed to one team · example:

```json
{
  "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_team` or `away_team`, so each side is one outcome, and its best 2Up price is the first offer in its `back` list.

`meta.processed_at` is when the board was built, and a full envelope also carries `meta.last_seen`, 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:

Your code: one 2Up pair before kick-off · example:

```js
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](https://oddsrelay.io/widgets/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 /v2/coverage` 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)](https://oddsrelay.io/blog/best-odds-guaranteed-explained) 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](https://oddsrelay.io/products/2up-feed) lists which bookmakers carry it.

## Narrowing a 2Up call

Every `sport_key` 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=soccer` on its own keeps the whole board. To narrow further, take an event's `competition_key`, one key per competition that never changes once served (`GET /v2/sports` lists them too): `sports=` with that key returns the whole competition, whatever each bookmaker calls it.

Request · one bookmaker, priced first · example:

```bash
curl --compressed -s -H "Authorization: Bearer $ODDSRELAY_KEY" \
  "https://api.oddsrelay.io/v2/odds/2up?region=uk&bookmakers=sky_bet&quote=true"
```

`quote=true` 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_at` moves each time the board is rebuilt, and `meta.last_seen` as venues are read. Either one changes the body and its `ETag` even when your events have not. With `format=bare` the reply is the `data` array alone. The board time moves to the `X-Processed-At` header and `meta.last_seen` 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](https://oddsrelay.io/docs/guides/conditional-requests) shows the loop, and the [matched-board filters guide](https://oddsrelay.io/docs/guides/matched-board-filters) lists every filter the board takes.

Football on the other boards is covered in [football odds data, explained](https://oddsrelay.io/blog/football-odds-data-explained), and the [racing and each-way guide](https://oddsrelay.io/blog/horse-racing-and-each-way-odds-data) 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=true` before you make them.

## Sources

- [Sky Bet Help: Football Rules, 2UP (one bookmaker's terms)](https://support.skybet.com/s/article/Football-Rules), checked 12 October 2026

18+ · OddsRelay supplies odds data only and takes no bets. Please gamble responsibly.

Source: https://oddsrelay.io/blog/2up-odds-data
