Schema reference
The WebSocket and the REST API use the same two objects: events and markets.
Event#
{
"id": 1640278226,
"sportId": 1,
"sport": "soccer",
"league": { "id": 1980, "name": "Kosovo - Superliga", "group": "Kosovo" },
"home": "FC Prishtina",
"away": "Malisheva",
"startTime": "2026-11-09T12:00:00Z",
"status": "started",
"live": true,
"parentId": 1640190112,
"units": "Regular",
"special": null,
"score": { "home": 1, "away": 0 },
"clock": 37
}
| Field |
Type |
Description |
id |
integer |
Event id. Stable for the life of the event. |
sportId / sport |
integer / string |
See sport ids. |
league |
object |
id, name, group (country or tour). |
home, away |
string |
Participant names. null for specials. |
startTime |
ISO 8601 UTC |
Scheduled start. |
status |
string |
pending, started, … as reported by the source. |
live |
boolean |
true for the in-play listing. |
parentId |
integer or null |
In-play events point to their prematch event. |
units |
string |
Regular, or e.g. Corners, Bookings for side-markets of the same match. |
special |
object or null |
For props/futures: category, description. Then participants lists the options. |
score |
object or null |
Live score when available. |
clock |
integer or null |
Live minute when available. |
Market#
{
"id": "1640278226:s;0;ou;2.5",
"eventId": 1640278226,
"key": "s;0;ou;2.5",
"type": "total",
"period": 0,
"side": null,
"line": 2.5,
"alternate": false,
"main": true,
"live": true,
"maxStake": 1500,
"cutoffAt": "2026-11-09T13:55:00Z",
"margin": 0.0244,
"outcomes": [
{ "name": "over", "american": -105, "decimal": 1.9524, "points": 2.5, "fair": 2.0, "fairProb": 0.5 },
{ "name": "under", "american": -105, "decimal": 1.9524, "points": 2.5, "fair": 2.0, "fairProb": 0.5 }
]
}
| Field |
Type |
Description |
id |
string |
eventId:key. Unique and stable — use it as your book key. |
key |
string |
Source market key: s;{period};{m|s|ou|tt};{line};{side}. |
type |
string |
moneyline, spread, total, team_total. |
period |
integer |
0 full game (incl. OT where the sport prices it), 1 first half / first period / first set, 2 second, … |
side |
string or null |
home / away for team totals. |
line |
number or null |
Handicap of the home side for spreads; the total for totals. |
alternate |
boolean |
true for alternative lines. |
main |
boolean |
The main moneyline, spread or total of a regular event. |
maxStake |
number or null |
Maximum risk stake the source accepts. Higher = more confidence. |
cutoffAt |
ISO 8601 or null |
When the market stops accepting bets. |
margin |
number |
Overround: sum of implied probabilities − 1. |
outcomes |
array |
See below. |
Outcome#
| Field |
Type |
Description |
name |
string |
home, away, draw, over, under, or a participant name for specials. |
american |
integer |
American odds as published. |
decimal |
number |
Decimal odds (4 dp). |
points |
number |
Handicap or total for this outcome (spreads, totals). |
participantId |
integer |
Specials only. |
fair |
number |
No-vig decimal price. |
fairProb |
number |
No-vig probability (multiplicative method). Outcomes of a market sum to 1. |
How fair prices are computed#
implied_i = 1 / decimal_i
margin = Σ implied_i − 1
fairProb_i = implied_i / Σ implied_j
fair_i = 1 / fairProb_i
Raw prices are always included, so you can apply a different method (power, Shin, additive) yourself.
Converting American ↔ decimal#
american > 0: decimal = 1 + american / 100
american < 0: decimal = 1 + 100 / |american|
Sport ids#
| id |
slug |
id |
slug |
| 1 |
soccer |
8 |
mma |
| 2 |
tennis |
9 |
boxing |
| 3 |
basketball |
10 |
volleyball-handball |
| 4 |
hockey |
11 |
esports |
| 5 |
american-football |
12 |
golf |
| 6 |
baseball |
13 |
cricket |
| 7 |
rugby |
|
|
Closing-line record#
Returned by /v1/closing endpoints:
{
"eventId": 1639922643, "sportId": 1,
"league": { "id": 217562, "name": "Mexico - Liga TDP" },
"home": "Atletico Huejutla", "away": "Bucaneros de Zitacuaro",
"startTime": "2026-11-07T22:00:00Z", "capturedAt": "2026-11-07T22:00:41Z",
"market": { "key": "s;0;m", "type": "moneyline", "period": 0, "line": null, "main": true, "margin": 0.041, "maxStake": 750, "outcomes": [] }
}