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": [] }
}