# bet365 historical odds: what the archive holds

> bet365 historical odds through an API: a past board, one event's price changes, closing lines and day files, and what the archive leaves out.

Published 1 November 2026

**You can get bet365 historical odds from OddsRelay's historical product, which keeps every bookmaker's prices since 17 October 2026: a past board, one event's price changes, closing lines and day files.**

[bet365 publishes no public odds API](https://oddsrelay.io/blog/is-there-a-bet365-api). The archive is our record of what the UK & Ireland raw feed served. It sits on the same base URL and the same key as the live feed, and [historical odds](https://oddsrelay.io/products/historical-odds) come with every self-serve plan.

## How far back do bet365 historical odds go?

OddsRelay's bet365 historical odds go back to 17 October 2026, and nothing earlier is sold. The newest day is the previous UTC day, because each day joins the archive overnight once it has ended. Ask for a date past that and the reply is a 400 `date_out_of_range`, with `latest` giving the newest you can ask for. Dates just before 17 October 2026 return no prices.

Which sports and markets you find follows bet365's entry on [the coverage page](https://oddsrelay.io/coverage) and [our bet365 data page](https://oddsrelay.io/bookmakers/bet365).

## Four calls, depending on the question

The board, event and closing calls take `bookmakers=bet365`. A day file holds every bookmaker, so your code keeps the rows where `bookmaker` is bet365.

| You need | Call | What comes back |
| --- | --- | --- |
| bet365's prices at one past moment | `GET /v2/historical/odds/raw` | A page of the board as it stood at `date`, in the same event objects as `/v2/odds/raw` |
| How one fixture's price moved | `GET /v2/historical/events/{id}/odds` | The prices at `from`, then a row each time an outcome's price moved or it left the board, up to 24 hours at a time. Each row names its `bookmaker` |
| Each outcome's day in one row | `GET /v2/historical/closing` | The events that kicked off on one UTC day, nested by bookmaker, market and outcome |
| A whole day in bulk | `GET /v2/historical/files` | A free list of gzipped CSV files per tier, sport and day. Each file holds every bookmaker and market, with a `bookmaker` column |

## One closing row sums up bet365's day to kick-off

A single row carries an outcome's open, close, range and number of moves, so you read bet365's day without walking its changes. Run this request with `quote=true` first. That returns the price of the call and spends nothing.

Request · bet365 football match odds for one day · example:

```bash
curl --compressed -H "x-api-key: $ODDSRELAY_KEY" \
  "https://api.oddsrelay.io/v2/historical/closing?region=uk&sports=soccer&date=2026-10-18&bookmakers=bet365&markets=h2h"
```

Each outcome in the reply looks like this one, made up for the example and trimmed of `inplay_seen` and the null exchange fields:

GET /v2/historical/closing · trimmed to one outcome · example:

```json
{
  "name": "Arsenal",
  "ord": 0,
  "open_at": "2026-10-18T00:00:00.000Z",
  "open_price": 2.2,
  "close_at": "2026-10-18T13:52:10.412Z",
  "close_price": 2.05,
  "high": 2.25,
  "low": 2.05,
  "moves": 4,
  "first_seen": "2026-10-18T00:00:00.000Z",
  "last_seen": "2026-10-18T14:00:01.240Z"
}
```

- `open_price` and `open_at` are the first price seen on the kick-off day (UTC), and that moment.
- `close_price` is the last price at or before kick-off. `close_at` is when that price was last set, which can be well before kick-off. An outcome that never moved can still show a time after 00:00 UTC, so read `moves` to see whether it did.
- `high`, `low` and `moves` cover the kick-off day (UTC) up to kick-off, so a price that drifted the week before shows only from that midnight.

For a move over several days, read the event call, one window at a time, or the `changes` day files.

## What the archive leaves out

OddsRelay's historical odds hold bookmaker prices only. Asking for an exchange with `exchanges=` is refused with a 403 `exchange_history_unavailable`, and the exchange fields on a closing row stay `null`. So a past bet365 price has no lay beside it here, even though the live matched boards pair the two.

There are no starting prices and no results either, so a tool that settles at the starting price needs another source. History carries no `competition_key` value, so there is none to filter on.

The recording can also have gaps. A past board says so with `complete: false`, and an event window lists them in `meta.gaps`, so check those before you treat a missing price as a bookmaker pulling it. A closing row carries no such flag. If you need something the archive does not hold, such as exchange prices, the record has to be your own, and [storing and versioning odds](https://oddsrelay.io/blog/how-to-store-and-version-odds-data) shows the tables.

## History spends the same tokens as the live feed

The board, event and closing calls are charged per page, and filters narrow what a page holds without changing its price. A day file is charged for each started megabyte, in full when the download starts. [Pricing](https://oddsrelay.io/pricing) lists all four prices.

On a paid plan, history is for personal use. A business using it, even in-house, or anyone publishing or reselling it, goes through [Enterprise](https://oddsrelay.io/enterprise).

## Read one day of bet365 closing lines

Quote the request above, then run it for a recent day. The free trial gives you 50,000 tokens for 14 days from sign-up, and a business can test on it too. The [historical odds guide](https://oddsrelay.io/docs/guides/historical-odds) has every field and error, and [what bet365 odds data you can get](https://oddsrelay.io/blog/bet365-odds-data-guide) covers its live prices.

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

Source: https://oddsrelay.io/blog/bet365-historical-odds
