Fixtures

Win probability

GET/v2/fixtures/{id}/win-probabilityPro + Business

Our own win-probability model for a football fixture: the pre-match estimate, the current home / draw / away probabilities and the curve — a point at kick-off, every minute, and right after each goal, red card, period start / end and big missed chance (reason bigChance), each with the UTC instant it describes (at). Pro and Business plans.

An analysis indicator, not betting advice: no bookmaker odds go into it. Model v3 (since 2026-10-25; v2 since 2026-10-22), transparent: pre-match expected goals per side from both teams’ last 30 results in all competitions (domestic league and European cups, each against the opponent’s strength), their domestic league tables (goals for / against per game, shrunk towards the league average) and our league-strength coefficients, which put teams of different leagues on one scale — fitted on three seasons of European cup matches — then blended with the current competition’s own table as it fills up (a European campaign two games old leans on the teams’ overall strength, a league 30 games in on its table), the last five results and home advantage (none in a final). On our backtest (over 8,000 league and 1,500 European matches, held out by season) this beat v1 in both: most in European ties and early in a season. One exception, since v3: a league match with a newcomer (a side promoted or relegated into the competition, early in a season) uses the current table and form only — the newcomer’s strength on its old league’s scale misled the estimate. Fixtures whose pre-match estimate was fixed under an older model keep that model (v1 and v2 share the in-play part). In play, the goals still to come are Poisson for each side over the time left (added time included; goals get likelier as a match goes on), cut for a side down to ten men (and raised for its opponent), and tilted for the next half hour by the last ten minutes of attack momentum — constants fitted on 1,080 finished matches of 12 competitions and checked on the following season. Since v3 the in-play outcome is calibrated (made slightly less certain — the curve was a little over-confident on that backtest), phased in over the first 15 minutes so the kick-off point equals the pre-match estimate. The shot map’s live expected goals are not blended into the scoring rate — on that backtest they added nothing measurable — but a big missed chance still marks a point on the curve. home + draw + away = 1; draw means level on the scoreboard at the end (extra time counted, a shoot-out not). Not started: the pre-match estimate and an empty series; finished: 1 / 0 / 0 and the full curve, kept for good. The pre-match estimate is fixed once the match starts. History with time: every point carries at — the moment of the match it describes (the end of that minute, the goal, the whistle), measured from the running match clock, else estimated from the kick-off with a 15-minute half-time; non-decreasing along the curve; current.at is when the estimate was computed (the end of the match once finished). A point is stored once it is two minutes old and never changed after, so the curve shows what the model said at the time. Polling: pass since = your newest at minus two minutes (the newest two minutes can still gain a point the source lists late) and replace your points after since with the answer. Live updates: fixture:{id} WebSocket channels (Business) get a winProbability frame when an outcome moves at least one percentage point.

Parameters

id
pathrequired
our numeric id (positive integer)
since
query
an ISO-8601 instant (any offset): only the curve points whose at is after it — for clients that poll; current is always returned

Response

data
WinProbability
meta
count (points in series), since (when given)
errors
403 endpoint_not_in_plan — Free and Starter keys404 not_supported — not a football fixture

Every /v2 call can also answer the common errors.

Try it →
$ curl -H "Authorization: Bearer sk_live_…" \
    "https://api.sportsapi.app/v2/fixtures/{id}/win-probability"
Example
{ "data": { "fixtureId": 211521, "model": "v3", "updatedAt": "2026-10-18T16:02:11.000Z",
    "prematch": { "home": 0.4521, "draw": 0.2655, "away": 0.2824, "homeExpectedGoals": 1.52, "awayExpectedGoals": 1.13, "standings": true, "form": true, "allCompetitions": true, "domesticTables": true },
    "current": { "home": 1, "draw": 0, "away": 0, "minute": 90, "addedMinute": 4, "homeScore": 5, "awayScore": 0, "at": "2026-10-18T15:54:00.000Z" },
    "series": [ { "home": 0.4521, "draw": 0.2655, "away": 0.2824, "minute": 0, "addedMinute": null, "homeScore": 0, "awayScore": 0, "at": "2026-10-18T14:00:00.000Z", "reason": "kickoff" },
      { "home": 0.5983, "draw": 0.2388, "away": 0.1629, "minute": 4, "addedMinute": null, "homeScore": 1, "awayScore": 0, "at": "2026-10-18T14:03:30.000Z", "reason": "goal" }, …,
      { "home": 1, "draw": 0, "away": 0, "minute": 90, "addedMinute": 4, "homeScore": 5, "awayScore": 0, "at": "2026-10-18T15:54:00.000Z", "reason": "final" } ],
    "inputs": { "shotmap": true, "momentum": true, "events": true } },
  "meta": { "count": 104 } }