Skip to content
datasportsAPI

FixturesWin probability

Documentation

/

Type to filter the docs by title or path.

FixturesEndpoint 14 of 116

Win probability

GET

/v2/fixtures/{id}/win-probability

Plan
Pro + Business
Auth
Bearer dsa_live_…
Parameters
1 required · 1 optional
Returns
WinProbability

Win probabilities for a football fixture from DataSportsAPI’s in-house model: the pre-match estimate, the live home / draw / away split and the full curve.

The curve has a point at kick-off, one per minute, and an extra one straight after each goal or red card, each start or end of a period and each big missed chance (reason bigChance); every point is stamped with the UTC instant it refers to (at). Available on Pro and Business plans.

Plan access

Requires a Pro or Business plan; every other plan receives 403 endpoint_not_in_plan.

Worth knowing

  • This is an analytical indicator, not betting advice, and no bookmaker odds feed into it.
  • The model is at v3 (since 2026-10-25; v2 dated from 2026-10-22) and works openly as follows.
  • Pre-match expected goals for each side combine three inputs.
  • First, each team’s last 30 results in every competition, league and European cups alike, with each result weighted by how strong the opponent was.
  • Second, the team’s domestic league table — goals scored and conceded per game, pulled towards the league average.
  • Third, our league-strength coefficients, estimated from three seasons of European cup matches, so that teams from different leagues share one scale.
  • The result is then mixed with three more signals: the table of the current competition, which gains weight as it fills up (after two games of a European campaign overall strength still dominates; after 30 league games the table does), the latest five results, and home advantage, which is zero in a final.
  • On a backtest held out by season (over 8,000 league matches and 1,500 European ones) this beat v1 on both sets, with the biggest improvement in European ties and in the opening weeks of a season.
  • v3 adds one exception: when a league match involves a newcomer — a side that arrived in the competition by promotion or relegation, early in the season — only the current table and form are used, because the newcomer’s strength measured on its previous league’s scale distorted the estimate.
  • A fixture whose pre-match estimate was set under an earlier model stays on that model (v1 and v2 use the same in-play logic).
  • During play, each side’s remaining goals follow a Poisson distribution over the time left (added time included, with goals becoming more likely as the match progresses); the rate drops for a team reduced to ten men (and rises for its opponent) and is tilted for the following half hour by the previous ten minutes of attack momentum.
  • These constants were fitted on 1,080 completed matches from 12 competitions and validated on the subsequent season.
  • From v3 onwards the in-play result is calibrated — made slightly less confident, since the curve proved a little over-confident on that backtest — and this calibration ramps in across the first 15 minutes so that the kick-off point matches the pre-match estimate.
  • Live expected goals from the shot map are left out of the scoring rate, as they added nothing measurable on that backtest; a big missed chance does, however, still add a point to the curve.
  • home + draw + away = 1, and draw means the scores are level at the end, counting extra time but not a shoot-out.
  • Ahead of kick-off the response holds the pre-match estimate with an empty series; after the final whistle it holds 1 / 0 / 0 and the complete curve, which is stored for good.
  • The pre-match estimate is frozen as soon as the match begins.
  • Each point has an at timestamp for the match moment it stands for — the close of that minute, or the goal or whistle itself — read from the running match clock or, failing that, estimated from kick-off assuming a 15-minute half-time; Along the curve, at only ever goes up.
  • current.at records when the estimate was computed (for a finished match, the end of the match).
  • Points are saved once they are two minutes old and are never altered afterwards, so the curve reflects what the model said in the moment.
  • When polling, set since to your latest at minus two minutes (a late-listed event from the source can still add a point within the most recent two minutes) and overwrite your points after since with the response.
  • For push updates, Business fixture:{id} WebSocket channels receive a winProbability frame whenever any outcome shifts by one percentage point or more.

01Parameters

  • idpathRequired

    fixture id issued by DataSportsAPI, a positive integer

  • sincequeryOptional

    ISO-8601 timestamp with any offset; limits the curve to points whose at is later than it, for polling clients — current is returned regardless

02Request

The same call from the command line and each SDK. The SDK lines assume a client created with your key; left out, it is read from DATASPORTSAPI_API_KEY. Installing a client: SDKs & CLI.

curl -H "Authorization: Bearer dsa_live_…" \
    "https://api.datasportsapi.com/v2/fixtures/{id}/win-probability"

03Response

The top-level keys of the JSON body. Each object links to its full shape in the data reference.

data
WinProbability
meta
count (number of points in series), since (echoed when supplied)
Example response
{ "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 } }

04Errors

  • 403endpoint_not_in_plan

    returned to keys on the Free and Starter plans

  • 404not_supported

    the fixture is not a football match

Any key can also meet401unauthorized429rate_limited429quota_exceeded500internal_errorEvery error code