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
| Bookmaker | Elabet (Greece) |
|---|---|
| Company key | elabet |
| Files | 6: site_{live,pregame}_elabet_{soccer,basketball,tennis}.json |
| Pre-match coverage | Soccer about 9 days ahead; basketball about 2 days; tennis about 1 day |
| Refresh | Live about every 1–3 s, pre-match about every 4–7 s |
| Odds format | Decimal (price, up to 4 decimals) |
| Cross-bookmaker id | None — match on team names and startDate |
| Schema | Linked tables: events[] → marketIds → markets[] → oddIds → odds[]; competitorIds → competitors[]. Live adds champs, categories, sports |
| Markets | "1x2", "Total", "Double chance", "Handicap", "Draw no bet", "GG/NG" |
| 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 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.
| File | What's inside | Refresh |
|---|---|---|
site_live_elabet_soccer.json | Live soccer with score and match clock; league and country tables included | ≈1–3 s |
site_live_elabet_basketball.json | Live basketball | ≈1–3 s |
site_live_elabet_tennis.json | Live tennis | ≈1–3 s |
site_pregame_elabet_soccer.json | Pre-match soccer — 1x2, totals, double chance, handicap, draw no bet, GG/NG | ≈4–7 s |
site_pregame_elabet_basketball.json | Pre-match basketball | ≈4–7 s |
site_pregame_elabet_tennis.json | Pre-match tennis | ≈4–7 s |
Pre-match markets by sport
| Sport | Markets |
|---|---|
| Soccer | 1x2, totals, double chance, handicap, draw no bet, GG/NG |
| Basketball | Winner, spread and total, including overtime |
| Tennis | Winner, 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.
| Value | Live files | Pre-match files |
|---|---|---|
| Event id | events[].id | events[].id |
| Name | events[].name ("Home vs. Away") | same |
| Teams | events[].competitorIds → competitors[].name | same |
| League | events[].champId → champs[].name | events[].champId (no names table) |
| Country / region | events[].catId → categories[].name | events[].catId |
| Sport | events[].sportId (66 football, 67 basketball, 68 tennis) | same |
| Start time | events[].startDate (ISO) | same |
| Market | events[].marketIds → markets[].name | same |
| Line | markets[].sv (e.g. 2.5) | same |
| Selection, price | markets[].oddIds → odds[].name, .price (typeId 1/2/3 = home/draw/away in 1x2) | same |
| Status | odds[].oddStatus: 0 on open prices; we don't document 7 | same |
| Live score | events[].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"
}
]
}
- site_live_elabet_soccer.sample.json — trimmed to a few events
- site_pregame_elabet_soccer.sample.json — trimmed to a few events
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.
| 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. - Pre-match files carry
champIdbut nochampstable, so league names are only in the live files. - In the "1x2" market use
odds[].typeId(1 home, 2 draw, 3 away):nameholds the team name, not 1/X/2. - No Betradar id — match across bookmakers on team names and start time.
Get Elabet odds API access
- RapidAPI — Elabet odds listing
- Zyla API Hub — Elabet odds listing
- JoJ API — Elabet 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 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.