MoviOdds Docs
API docs Sports Bet Builder Python moviodds.com

Free bet365 Soccer odds API

Every bet365 soccer market, pre-match and in-play, as JSON over REST and WebSocket. No key, no sign-up.

Overview

MoviOdds serves only bet365's soccer prices. You get every market bet365 lists for a match, from the same GET /odds endpoint and WebSocket used for every sport. Every league bet365 prices: top divisions, lower leagues, cups, youth, women's football and esoccer.

Leagues

Every league bet365 lists, including:

Markets

Full Time Result is group 40 before kickoff and 1777 in play. Once a match is live, 40 and the other pre-match markets stay suspended at their last price and stop updating. Every price carries its group_id and group_name; grid markets also carry the team in side and the market in line.

Quickstart

curl --compressed "https://moviodds.com/odds?sport=soccer"
curl --compressed "https://moviodds.com/odds?sport=soccer&in_play=1"
import requests

data = requests.get("https://moviodds.com/odds", params={"sport": "soccer"}, timeout=30).json()
for match in data["matches"]:
    print(match["league"], "|", match["home"], "v", match["away"], "|", len(match["quotes"]), "prices")

Sample response

A real /odds?sport=soccer match, trimmed to a few prices:

{
  "matches": [
    {
      "id": "201317399",
      "sport": "soccer",
      "home": "Real Sociedad B",
      "away": "Granada",
      "league": "Spain Segunda",
      "kickoff_utc": "2026-10-04T12:00:00Z",
      "in_play": false,
      "market_count": 32,
      "quotes": [
        {
          "fixture_id": "201317399",
          "group_id": "40",
          "group_name": "Full Time Result",
          "label": "Real Sociedad B",
          "odds_dec": 2.55,
          "odds_frac": "31/20",
          "sel_id": "2642491"
        },
        {
          "fixture_id": "201317399",
          "group_id": "40",
          "group_name": "Full Time Result",
          "label": "Draw",
          "odds_dec": 3.2,
          "odds_frac": "11/5",
          "sel_id": "2642492"
        },
        {
          "fixture_id": "201317399",
          "group_id": "40",
          "group_name": "Full Time Result",
          "label": "Granada",
          "odds_dec": 2.75,
          "odds_frac": "7/4",
          "sel_id": "2642495"
        },
        …
      ]
    }
  ]
}

Live prices

In-play soccer prices are pushed over the WebSocket within about a second of bet365 changing them. Connect to wss://moviodds.com/ws and send {"op":"subscribe"} to receive every price change (WebSocket guide). Add stats=1 and live matches also come with their stats, xG, possession, shots and corners. See the API docs for loading the board and applying updates, and every sport for the other 23.

FAQ

Is the bet365 Soccer odds API free?

Yes. GET /odds needs no sign-up and no key. Limits are 300 requests per minute and 25 WebSocket connections per IP.

Are these really bet365 odds?

Yes, exclusively bet365's own prices, pre-match and in-play. MoviOdds is an independent project and is not affiliated with bet365.

Do you have live soccer odds?

Yes. Live matches carry in_play: true. In-play soccer prices are pushed over the WebSocket within about a second of bet365 changing them.

Which markets are included?

Every market bet365 prices for a match. Each price carries its group_id and group_name so you can filter.

Do you have historical odds, closing lines and results?

Yes. /history?fi=<match> returns every recorded price move, /closing?fi=<match> each selection's closing line (its last price before kickoff), and /results finished matches with their final score. See historical odds, closing lines and the API docs.