arbplay

Superbet Odds API

The ArbPlay Superbet odds API serves Superbet's own JSON over HTTPS in six files: live and pre-match for soccer, basketball and tennis. Pre-match soccer is the deepest file we serve — Superbet's full market list, including player markets, for matches about 6 days ahead — and most events carry a Betradar id.

The data comes from Superbet's Greek website.

Key facts

Superbet odds API at a glance.
BookmakerSuperbet (Greece)
Company keysuperbet
Files6: site_{live,pregame}_superbet_{soccer,basketball,tennis}.json
Pre-match coverageSoccer about 6 days ahead; basketball and tennis about 2 days
RefreshLive about every 1–3 s, pre-match about every 4–7 s
Odds formatDecimal (price)
Cross-bookmaker idBetradar id: fixture.betradar_id — on most events
SchemaA list of events: event_id, fixture{…}, markets[].odds[]
File sizePre-match soccer is by far the largest file we serve (around 200 MB) — use gzip and If-Modified-Since
AccessRapidAPI, Zyla API Hub or JoJ API listing, or a direct X-API-Key from ArbPlay

Files and what's inside

Every file is Superbet'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_superbet_soccer.jsonLive soccer with every open market and in-play stats≈1⁠–⁠3 s
site_live_superbet_basketball.jsonLive basketball≈1⁠–⁠3 s
site_live_superbet_tennis.jsonLive tennis≈1⁠–⁠3 s
site_pregame_superbet_soccer.jsonPre-match soccer — Superbet's full market list, including player markets (around 200 MB)≈4⁠–⁠7 s
site_pregame_superbet_basketball.jsonPre-match basketball≈4⁠–⁠7 s
site_pregame_superbet_tennis.jsonPre-match tennis≈4⁠–⁠7 s

Pre-match markets by sport

SportMarkets
SoccerSuperbet's full market list: results, goals, handicaps, halves, corners and cards, plus player markets (scorers, assists, shots, cards) on some matches
BasketballWinner, handicap and total points including overtime, regulation-time 1X2 (Full Time), halves, quarters, race to X points, plus player points, rebounds, assists, 3-pointers and combinations on some games
TennisMatch and set winner, total games and sets, games handicap, correct score, tiebreaks, plus aces and double faults (match, per set, per player) on some matches

Every bookmaker compared: sports and markets per bookmaker.

Field map: where each value lives

Paths start at data[] (a list of events); live and pre-match share one shape.

ValuePath
Event idevent_id
Teams / namefixture.event_name ("Home·Away", U+00B7)
Tournamentfixture.tournament_id (id only, no name)
Sportfixture.sport_id (5 soccer, 4 basketball, 2 tennis)
Start timefixture.utc_date (ISO) or unix_date_millis
Marketmarkets[].name ("Full Time", "Total Goals", "Double Chance", "Handicap"…)
Selection, pricemarkets[].odds[].metadata.name (1, X, 2…), .price
Selection textodds[].metadata.info (e.g. "… to win the match")
Betradar idfixture.betradar_id (string)
Line, player, periododds[].metadata.specifiers (e.g. total, hcp, player, setnr, quarternr)
Statusodds[].status: 1 on open prices; we don't document 2. Also odds[].display
Live stats (live files)inplay_stats, inplay_stats_metadata

Real sample

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

[
  {
    "event_id": 14906621,
    "fixture": {
      "betradar_id": "72415574",
      "event_name": "Jablonec B·Hradec Kralove B",
      "sport_id": 5,
      "tournament_id": 40492,
      "utc_date": "2026-09-27T08:15:00Z"
    },
    "markets": [
      {
        "name": "Full Time",
        "odds": [
          {
            "price": 1.85,
            "metadata": {
              "name": "1",
              "info": "Jablonec B to win the match"
            }
          },
          {
            "price": 3.65,
            "metadata": {
              "name": "X",
              "info": "Draw result"
            }
          },
          {
            "price": 3.4,
            "metadata": {
              "name": "2",
              "info": "Hradec Kralove B to win the match"
            }
          }
        ]
      }
    ]
  }
]

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 Superbet soccer file (live or pre-match)."""
    rows = []
    for ev in payload["data"] or []:
        name = ev["fixture"]["event_name"].replace("·", " - ")  # "Home·Away"
        for market in ev.get("markets", []):
            if market["name"] == "Full Time":
                odds = {o["metadata"]["name"]: o["price"] for o in market["odds"]}
                rows.append((name, odds.get("1"), odds.get("X"), odds.get("2")))
    return rows

Fetch Superbet 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_superbet_soccer.json -o site_pregame_superbet_soccer.json
import requests  # pip install requests

resp = requests.get(
    "https://api.arbplay.app/v1/data/site_pregame_superbet_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_superbet_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.
  • There is no tournament name (only fixture.tournament_id) and no separate team fields — split fixture.event_name on the middle dot (·).
  • Pre-match soccer is around 200 MB uncompressed. Request it with Accept-Encoding: gzip, send If-Modified-Since, and poll it only as often as you need.

Get Superbet 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 Superbet API?

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

Which Superbet files can I download?

Six: site_live_superbet_soccer.json, site_live_superbet_basketball.json, site_live_superbet_tennis.json and the matching site_pregame_superbet_*.json files. Call GET /v1/files to list the files your key can read.

How often are Superbet 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.

Can I match Superbet events with other bookmakers?

Yes. Most events carry fixture.betradar_id. Stoiximan, Novibet, OPAP and Bwin expose the same Betradar match id, so you can join on it.

Why is the Superbet pre-match soccer file so large?

It carries Superbet's full market list for every match, including player markets — thousands of distinct markets. Request it gzip-compressed and poll it sparingly.

How do I get access to the Superbet odds API?

Subscribe to the Superbet 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 Superbet 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 · Elabet · OPAP · Bwin. Machine-readable: /openapi.json · /llms.txt. Guide: Greek bookmaker odds API.

Build on Superbet odds

RapidAPI · Zyla API Hub · JoJ API · direct key