arbplay

Elabet Odds API

The ArbPlay Elabet odds API serves Elabet's own JSON over HTTPS in six files: live and pre-match for soccer, basketball and tennis. Each file is a set of linked tables — events, markets, odds and competitors — and pre-match soccer reaches about 9 days ahead. Live odds refresh about every 1–3 seconds, pre-match about every 4–7.

Elabet is a Greek-licensed online bookmaker. The data comes from Elabet's Greek website.

Key facts

Elabet odds API at a glance.
BookmakerElabet (Greece)
Company keyelabet
Files6: site_{live,pregame}_elabet_{soccer,basketball,tennis}.json
Pre-match coverageSoccer about 9 days ahead; basketball about 2 days; tennis about 1 day
RefreshLive about every 1–3 s, pre-match about every 4–7 s
Odds formatDecimal (price, up to 4 decimals)
Cross-bookmaker idNone — match on team names and startDate
SchemaLinked tables: events[] → marketIds → markets[] → oddIds → odds[]; competitorIds → competitors[]. Live adds champs, categories, sports
Markets"1x2", "Total", "Double chance", "Handicap", "Draw no bet", "GG/NG"
AccessRapidAPI, Zyla API Hub or JoJ API listing, or a direct X-API-Key from ArbPlay

Files and what's inside

Every file is Elabet'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_elabet_soccer.jsonLive soccer with score and match clock; league and country tables included≈1⁠–⁠3 s
site_live_elabet_basketball.jsonLive basketball≈1⁠–⁠3 s
site_live_elabet_tennis.jsonLive tennis≈1⁠–⁠3 s
site_pregame_elabet_soccer.jsonPre-match soccer — 1x2, totals, double chance, handicap, draw no bet, GG/NG≈4⁠–⁠7 s
site_pregame_elabet_basketball.jsonPre-match basketball≈4⁠–⁠7 s
site_pregame_elabet_tennis.jsonPre-match tennis≈4⁠–⁠7 s

Pre-match markets by sport

SportMarkets
Soccer1x2, totals, double chance, handicap, draw no bet, GG/NG
BasketballWinner, spread and total, including overtime
TennisWinner, first set winner, game handicap, total games, set handicap

Every bookmaker compared: sports and markets per bookmaker.

Field map: where each value lives

Paths start at data. Every link is by id between the top-level tables.

ValueLive filesPre-match files
Event idevents[].idevents[].id
Nameevents[].name ("Home vs. Away")same
Teamsevents[].competitorIds → competitors[].namesame
Leagueevents[].champId → champs[].nameevents[].champId (no names table)
Country / regionevents[].catId → categories[].nameevents[].catId
Sportevents[].sportId (66 football, 67 basketball, 68 tennis)same
Start timeevents[].startDate (ISO)same
Marketevents[].marketIds → markets[].namesame
Linemarkets[].sv (e.g. 2.5)same
Selection, pricemarkets[].oddIds → odds[].name, .price (typeId 1/2/3 = home/draw/away in 1x2)same
Statusodds[].oddStatus: 0 on open prices; we don't document 7same
Live scoreevents[].score, .liveTime—

Real sample

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

{
  "events": [
    {
      "id": 17370847,
      "name": "USA vs. Peru",
      "startDate": "2026-09-26T20:30:00Z",
      "sportId": 66,
      "champId": 3645,
      "competitorIds": [
        47685,
        47671
      ],
      "marketIds": [
        1744370233,
        "…"
      ]
    }
  ],
  "markets": [
    {
      "id": 1744370233,
      "name": "1x2",
      "oddIds": [
        4538966680,
        4538966681,
        4538966682
      ]
    }
  ],
  "odds": [
    {
      "id": 4538966680,
      "typeId": 1,
      "name": "USA",
      "price": 1.4
    },
    {
      "id": 4538966681,
      "typeId": 2,
      "name": "X",
      "price": 4.0
    },
    {
      "id": 4538966682,
      "typeId": 3,
      "name": "Peru",
      "price": 8.5
    }
  ],
  "competitors": [
    {
      "id": 47685,
      "name": "USA"
    },
    {
      "id": 47671,
      "name": "Peru"
    },
    {
      "id": 47685,
      "name": "USA"
    }
  ]
}

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 an Elabet file: events -> markets -> odds by id."""
    data = payload["data"]
    markets = {m["id"]: m for m in data.get("markets", [])}
    odds = {o["id"]: o for o in data.get("odds", [])}
    rows = []
    for ev in data.get("events", []):
        for market_id in ev.get("marketIds", []):
            market = markets.get(market_id)
            if market and market["name"] == "1x2":
                # odd typeId: 1 = home, 2 = draw, 3 = away
                by_type = {odds[i]["typeId"]: odds[i]["price"] for i in market["oddIds"] if i in odds}
                rows.append((ev["name"], by_type.get(1), by_type.get(2), by_type.get(3)))
    return rows

Fetch Elabet 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_elabet_soccer.json -o site_pregame_elabet_soccer.json
import requests  # pip install requests

resp = requests.get(
    "https://api.arbplay.app/v1/data/site_pregame_elabet_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_elabet_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.
  • Pre-match files carry champId but no champs table, so league names are only in the live files.
  • In the "1x2" market use odds[].typeId (1 home, 2 draw, 3 away): name holds the team name, not 1/X/2.
  • No Betradar id — match across bookmakers on team names and start time.

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

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

Which Elabet files can I download?

Six: site_live_elabet_soccer.json, site_live_elabet_basketball.json, site_live_elabet_tennis.json and the matching site_pregame_elabet_*.json files. Call GET /v1/files to list the files your key can read.

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

How do I read Elabet's linked tables?

Start from an event, follow its marketIds into the markets table, then each market's oddIds into the odds table. competitorIds point into competitors. In the 1x2 market, odds typeId 1, 2 and 3 are home, draw and away.

How do I get access to the Elabet odds API?

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

Build on Elabet odds

RapidAPI · Zyla API Hub · JoJ API · direct key