arbplay

Bwin Odds API

The ArbPlay Bwin odds API serves Bwin's own JSON over HTTPS in six files: live and pre-match for soccer, basketball and tennis. Every price comes in decimal, fractional and American form, and pre-match soccer reaches about 2 weeks ahead. Live odds refresh about every 1–3 seconds, pre-match about every 4–7.

The data comes from Bwin's Greek website.

Key facts

Bwin odds API at a glance.
BookmakerBwin (Greece)
Company keybwin
Files6: site_{live,pregame}_bwin_{soccer,basketball,tennis}.json
Pre-match coverageSoccer about 2 weeks ahead; basketball and tennis also list long-dated fixtures
RefreshLive about every 1–3 s, pre-match about every 4–7 s
Odds formatDecimal (odds), fractional (numerator/denominator) and americanOdds
Cross-bookmaker idBetradar match id: addons.betRadar (a number) — on most soccer fixtures and many basketball and tennis ones
Schemafixtures[] → soccer optionMarkets[].options[]; basketball and tennis games[].results[]
MarketsSoccer: "Match Result", "Total Goals", "Double Chance", "Both Teams To Score"…; basketball "Money Line", "Handicap", "Totals"; tennis "Match Winner"
AccessRapidAPI, Zyla API Hub or JoJ API listing, or a direct X-API-Key from ArbPlay

Files and what's inside

Every file is Bwin's own JSON, served unchanged inside the API envelope. Refresh: live files about every 1–3 s, pre-match files about every 4–7 s.

FileWhat's insideRefresh
site_live_bwin_soccer.jsonLive soccer fixtures with scoreboard≈1⁠–⁠3 s
site_live_bwin_basketball.jsonLive basketball (games[])≈1⁠–⁠3 s
site_live_bwin_tennis.jsonLive tennis (games[])≈1⁠–⁠3 s
site_pregame_bwin_soccer.jsonPre-match soccer (optionMarkets[]) — match result, total goals lines, double chance, BTTS, combos≈4⁠–⁠7 s
site_pregame_bwin_basketball.jsonPre-match basketball (games[])≈4⁠–⁠7 s
site_pregame_bwin_tennis.jsonPre-match tennis (games[])≈4⁠–⁠7 s

Pre-match markets by sport

SportMarkets
SoccerMatch result, total goals, double chance, both teams to score, first team to score, result + total goals and result + BTTS
BasketballMoney line, handicap and totals for the match, the first half and the first quarter
TennisMatch winner, set winners, total games, games handicap

Every bookmaker compared: sports and markets per bookmaker.

Field map: where each value lives

Paths start at data.fixtures[].

ValuePath
Fixture idfixtures[].id (e.g. 2:7883155)
Namename.value ("Home - Away")
Teamsparticipants[].name.value + properties.type HomeTeam/AwayTeam (soccer)
Competitioncompetition.name.value
Country / regionregion.name.value
Sportsport.name.value
Start timestartDate (ISO)
Market (soccer)optionMarkets[].name.value; line in attr
Selection, price (soccer)options[].sourceName.value (1/2), draw flagged in parameters.optionTypes → price.odds
Market (basketball, tennis)games[].name.value → results[].name.value, .odds
Betradar idaddons.betRadar (number; not on every fixture)
StatusisOpenForBetting; soccer optionMarkets[] / options[].status, basketball and tennis games[] / results[].visibility: Visible or Suspended
Live score (live files)scoreboard

Real sample

An abridged record from site_pregame_bwin_soccer.json: real values, most fields left out so the structure is readable. The downloads below keep every field.

{
  "fixtures": [
    {
      "id": "2:7870485",
      "name": {
        "value": "Floresta EC CE - Santa Cruz FC Recife PE"
      },
      "startDate": "2026-09-26T20:00:00Z",
      "competition": {
        "name": {
          "value": "Brasileiro Serie C"
        }
      },
      "region": {
        "name": {
          "value": "Brazil"
        }
      },
      "participants": [
        {
          "name": {
            "value": "Floresta EC CE"
          },
          "properties": {
            "type": "HomeTeam"
          }
        },
        {
          "name": {
            "value": "Santa Cruz FC Recife PE"
          },
          "properties": {
            "type": "AwayTeam"
          }
        }
      ],
      "optionMarkets": [
        {
          "name": {
            "value": "Match Result"
          },
          "options": [
            {
              "name": {
                "value": "Floresta EC CE"
              },
              "sourceName": {
                "value": "1"
              },
              "price": {
                "odds": 2.7,
                "numerator": 17,
                "denominator": 10,
                "americanOdds": 170
              },
              "parameters": {
                "optionTypes": [
                  "Max"
                ]
              }
            },
            {
              "name": {
                "value": "X"
              },
              "price": {
                "odds": 2.45,
                "numerator": 29,
                "denominator": 20,
                "americanOdds": 145
              },
              "parameters": {
                "optionTypes": [
                  "Draw"
                ]
              }
            },
            {
              "name": {
                "value": "Santa Cruz FC Recife PE"
              },
              "sourceName": {
                "value": "2"
              },
              "price": {
                "odds": 2.85,
                "numerator": 37,
                "denominator": 20,
                "americanOdds": 185
              },
              "parameters": {
                "optionTypes": [
                  "Max"
                ]
              }
            }
          ]
        }
      ]
    }
  ]
}

Each download is a complete GET /v1/data/{filename} response cut down to a few events, with every id reference still resolving. All samples are listed in samples/index.json.

Extract match-result (1X2) odds in Python

This function is tested against the samples on this page. Pass it the parsed JSON response.

def match_result(payload):
    """(event, 1, X, 2) rows from a bwin soccer file (live or pre-match)."""
    rows = []
    for fixture in payload["data"].get("fixtures", []):
        for market in fixture.get("optionMarkets", []):
            if market["name"]["value"] == "Match Result":
                odds = {}
                for option in market["options"]:
                    # the draw carries no sourceName; it is flagged in parameters.optionTypes
                    if "Draw" in option.get("parameters", {}).get("optionTypes", []):
                        odds["X"] = option["price"]["odds"]
                    else:
                        odds[option["sourceName"]["value"]] = option["price"]["odds"]
                rows.append((fixture["name"]["value"], odds.get("1"), odds.get("X"), odds.get("2")))
    return rows

Fetch Bwin odds

With a direct key

# 1. which files can this key read?
curl -sS --compressed -H "X-API-Key: YOUR_API_KEY" \
  https://api.arbplay.app/v1/files

# 2. download one file (JSON envelope: company, file, updated_at, data)
curl -sS --compressed -H "X-API-Key: YOUR_API_KEY" \
  https://api.arbplay.app/v1/data/site_pregame_bwin_soccer.json -o site_pregame_bwin_soccer.json
import requests  # pip install requests

resp = requests.get(
    "https://api.arbplay.app/v1/data/site_pregame_bwin_soccer.json",
    headers={"X-API-Key": "YOUR_API_KEY"},  # gzip is negotiated automatically
    timeout=60,
)
resp.raise_for_status()
payload = resp.json()
print(payload["updated_at"], payload["file"])
for event, home, draw, away in match_result(payload):  # the function above
    print(f"{event}: {home} / {draw} / {away}")
// Node 18+ (server-side: the API sends no CORS headers)
const res = await fetch("https://api.arbplay.app/v1/data/site_pregame_bwin_soccer.json", {
  headers: { "X-API-Key": process.env.ARBPLAY_API_KEY },
});
if (!res.ok) throw new Error(`${res.status} ${(await res.json()).detail}`);
const { company, file, updated_at, data } = await res.json();
console.log(file, "updated", updated_at);

Through a marketplace

On RapidAPI, Zyla API Hub or JoJ API you call the marketplace's gateway with that marketplace's key. The two endpoints and the JSON they return are the same; copy the base URL and path from the listing.

MarketplaceYour key goes inBase URL and full path
RapidAPIX-RapidAPI-Key and X-RapidAPI-HostEndpoints tab of the listing
Zyla API HubAuthorization: Bearer <access key>Code sample on the listing
JoJ APIX-JoJAPI-Key (or Authorization: Bearer)Code sample on the listing

Freshness, gaps and caveats

  • Refresh: live files about every 1–3 s, pre-match files about every 4–7 s. Every response carries updated_at and a Last-Modified header; send If-Modified-Since to get 304 Not Modified when nothing changed.
  • The draw option in "Match Result" has no sourceName; it is flagged by parameters.optionTypes: ["Draw"].
  • Live soccer participants also lists players (properties.type: "Player"); filter on HomeTeam and AwayTeam.
  • Option names use a decimal comma ("Over 1,5"); read the line from the market's attr instead.
  • Not every fixture carries addons.betRadar; match the rest across bookmakers on participant names and start time.

Get Bwin odds API access

Plans and quotas are set on each marketplace listing. More in the API reference and the API hub.

Frequently asked questions

Is this the official Bwin API?

No. ArbPlay is independent and is not affiliated with or endorsed by Bwin or its operator. It collects the odds Bwin publishes on its public website and serves them unchanged as JSON for informational use. ArbPlay does not place bets.

Which Bwin files can I download?

Six: site_live_bwin_soccer.json, site_live_bwin_basketball.json, site_live_bwin_tennis.json and the matching site_pregame_bwin_*.json files. Call GET /v1/files to list the files your key can read.

How often are Bwin odds updated?

During active hours live files are rewritten about every 1 to 3 seconds and pre-match files about every 4 to 7 seconds. Every response carries updated_at and a Last-Modified header, and If-Modified-Since returns 304 when nothing changed.

What odds formats does Bwin return?

Every price has decimal odds (odds), a fractional price (numerator and denominator) and americanOdds. Soccer uses optionMarkets[].options[]; basketball and tennis use games[].results[].

Can I match Bwin events with other bookmakers?

Yes, for most fixtures. Many carry a Betradar match id in addons.betRadar, a number. Stoiximan, Novibet, Superbet and OPAP expose the same id, so you can join on it; for fixtures without one, match on participant names and startDate.

How do I get access to the Bwin odds API?

Subscribe to the Bwin listing on RapidAPI, Zyla API Hub or JoJ API and call it with that marketplace's key; plans and quotas are set on each listing. For a direct key to https://api.arbplay.app (header X-API-Key), contact ArbPlay.

ArbPlay is independent and not affiliated with or endorsed by Bwin or its operator. Odds are collected from publicly available bookmaker odds and served unchanged for informational use; ArbPlay does not place bets. 21+.
Other bookmakers: Stoiximan · Novibet · Fonbet · Superbet · Elabet · OPAP. Machine-readable: /openapi.json · /llms.txt. Guide: Greek bookmaker odds API.

Build on Bwin odds

RapidAPI · Zyla API Hub · JoJ API · direct key