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
| Bookmaker | Bwin (Greece) |
|---|---|
| Company key | bwin |
| Files | 6: site_{live,pregame}_bwin_{soccer,basketball,tennis}.json |
| Pre-match coverage | Soccer about 2 weeks ahead; basketball and tennis also list long-dated fixtures |
| Refresh | Live about every 1–3 s, pre-match about every 4–7 s |
| Odds format | Decimal (odds), fractional (numerator/denominator) and americanOdds |
| Cross-bookmaker id | Betradar match id: addons.betRadar (a number) — on most soccer fixtures and many basketball and tennis ones |
| Schema | fixtures[] → soccer optionMarkets[].options[]; basketball and tennis games[].results[] |
| Markets | Soccer: "Match Result", "Total Goals", "Double Chance", "Both Teams To Score"…; basketball "Money Line", "Handicap", "Totals"; tennis "Match Winner" |
| Access | RapidAPI, 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.
| File | What's inside | Refresh |
|---|---|---|
site_live_bwin_soccer.json | Live soccer fixtures with scoreboard | ≈1–3 s |
site_live_bwin_basketball.json | Live basketball (games[]) | ≈1–3 s |
site_live_bwin_tennis.json | Live tennis (games[]) | ≈1–3 s |
site_pregame_bwin_soccer.json | Pre-match soccer (optionMarkets[]) — match result, total goals lines, double chance, BTTS, combos | ≈4–7 s |
site_pregame_bwin_basketball.json | Pre-match basketball (games[]) | ≈4–7 s |
site_pregame_bwin_tennis.json | Pre-match tennis (games[]) | ≈4–7 s |
Pre-match markets by sport
| Sport | Markets |
|---|---|
| Soccer | Match result, total goals, double chance, both teams to score, first team to score, result + total goals and result + BTTS |
| Basketball | Money line, handicap and totals for the match, the first half and the first quarter |
| Tennis | Match 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[].
| Value | Path |
|---|---|
| Fixture id | fixtures[].id (e.g. 2:7883155) |
| Name | name.value ("Home - Away") |
| Teams | participants[].name.value + properties.type HomeTeam/AwayTeam (soccer) |
| Competition | competition.name.value |
| Country / region | region.name.value |
| Sport | sport.name.value |
| Start time | startDate (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 id | addons.betRadar (number; not on every fixture) |
| Status | isOpenForBetting; 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"
]
}
}
]
}
]
}
]
}
- site_live_bwin_soccer.sample.json — trimmed to a few events
- site_pregame_bwin_soccer.sample.json — trimmed to a few events
- site_pregame_bwin_tennis.sample.json — match winner and set markets
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.
| Marketplace | Your key goes in | Base URL and full path |
|---|---|---|
| RapidAPI | X-RapidAPI-Key and X-RapidAPI-Host | Endpoints tab of the listing |
| Zyla API Hub | Authorization: Bearer <access key> | Code sample on the listing |
| JoJ API | X-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_atand aLast-Modifiedheader; sendIf-Modified-Sinceto get304 Not Modifiedwhen nothing changed. - The draw option in "Match Result" has no
sourceName; it is flagged byparameters.optionTypes: ["Draw"]. - Live soccer
participantsalso lists players (properties.type: "Player"); filter onHomeTeamandAwayTeam. - Option names use a decimal comma ("Over 1,5"); read the line from the market's
attrinstead. - Not every fixture carries
addons.betRadar; match the rest across bookmakers on participant names and start time.
Get Bwin odds API access
- RapidAPI — Bwin odds listing
- Zyla API Hub — Bwin odds listing
- JoJ API — Bwin odds listing
- Contact ArbPlay for a direct key to
https://api.arbplay.app - Before you buy: direct keys for several bookmakers, trial keys, rate limits and data rights
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.