bet365 closing line odds API
The last bet365 price before kickoff for every selection in a match, as JSON. Use it to measure closing line value (CLV). Free, no key.
What you get
GET /closing?fi=<match> returns every selection bet365 priced for a match, each with:
pre_close: its last price before kickoff (the closing line);last: its last recorded price, which for a finished match is the final in-play price.
It covers every market, from the match winner to spreads, totals, player props, corners and alternative lines. A single NFL game has over 4,000 selections with a close.
It works for all 24 sports we cover, for matches recorded since September 2026.
Request
curl "https://moviodds.com/closing?fi=201714836"
Get the match id from /odds before the game, or from /results after it. bet365 sometimes gives a match a new id when it goes live. Both ids work, and the response merges them: fixture_ids lists both and prematch_id names the one the close was taken from.
Sample response
A real response for LV Raiders v KC Chiefs (NFL, 4 October 2026, kickoff 20:25 UTC), trimmed to the money line:
{
"fixture_id": "201714836",
"fixture_ids": ["201714836", "202267109"],
"prematch_id": "201714836",
"kickoff_utc": "2026-10-04T20:25:00Z",
"kickoff_known": true,
"kickoff_estimated": false,
"pre_close_basis": "kickoff",
"closed": true,
"selection_count": 4347,
"selections": [
{
"group_id": "1441",
"group_name": "Money Line",
"sel_id": "59223451",
"label": "LV Raiders",
"pre_close": {"ts": "2026-10-04T20:21:01Z", "group_name": "Money Line", "label": "LV Raiders", "odds_dec": 1.434782608695652, "odds_frac": "7/16", "suspended": false}
},
{
"group_id": "1441",
"group_name": "Money Line",
"sel_id": "59223458",
"label": "KC Chiefs",
"pre_close": {"ts": "2026-10-04T20:21:01Z", "group_name": "Money Line", "label": "KC Chiefs", "odds_dec": 2.9, "odds_frac": "19/10", "suspended": false}
},
…
]
}
Each selection row, and the pre_close and last inside it, carry the same identity fields as /odds: group_name, label, and side, line, handicap and n2 on the markets that use them (for example a totals leg carries "side": "O", "line": "2.5"). So a row maps to a team, side and line on its own, with no second call to /odds. Fields are present only when they have a value. When bet365 reuses one market for successive periods and renames it (for example Next 10 Minutes (40:00 - 49:59) then (50:00 - 59:59)), you get one closing row per period name, told apart by group_name.
pre_close_basis tells you how the close was picked: kickoff (last price at or before the scheduled start), prematch-records (last price under the pre-match id, when the start time isn't known) or omitted (no pre-match close is reported, because we only saw the match in play or recorded no price before the scheduled start). When the basis is omitted the selections have no pre_close.
closed is false for a match that has not started yet. Its pre_close is then just the current pre-match price and will keep moving until kickoff, so wait for closed to turn true (the match has kicked off, gone in play, or finished) before you treat a pre_close as the settled close.
Measure your CLV
Closing line value is how the price you took compares with the close. Beating the close consistently is the standard sign of a winning bettor. Save the sel_id and price when you bet, then after kickoff:
import requests
closing = requests.get("https://moviodds.com/closing", params={"fi": "201714836"}, timeout=30).json()
close = {s["sel_id"]: s["pre_close"]["odds_dec"] for s in closing["selections"] if "pre_close" in s}
my_bets = [("59223458", 2.80)] # (sel_id, decimal price you took)
for sel, taken in my_bets:
print(sel, "took", taken, "closed", close[sel], "CLV %+.1f%%" % ((taken / close[sel] - 1) * 100))
59223458 took 2.8 closed 2.9 CLV -3.4%
To see how a price got to its close, pull its full timeline from historical odds.
FAQ
Is the bet365 closing line API free?
Yes. No sign-up and no key. /closing allows 120 requests per minute per IP.
What counts as the closing line?
The last price we recorded for a selection before the scheduled kickoff, taken from the pre-match market.
Which sports have closing lines?
All 24 we cover, including soccer, NFL, NBA, NHL, MLB, tennis, cricket and esports. Every market, including spreads, totals and player props.
How far back does it go?
Matches recorded since September 2026.
Are these really bet365 odds?
Yes, only bet365's own prices. MoviOdds is an independent project and is not affiliated with bet365.
More: historical odds · live WebSocket · all 24 sports · Python client · API docs