Liga Portugal

Open data

Open data — Liga Portugal

Everything on the Liga Portugal pages comes from static JSON files served from this site. There is no API to protect, no key to request and no rate limit: they are files, and they are here.

If you build something with them, go ahead — all we ask is attribution to estimador.pt and a link back to the source page. And if you publish, tell us: we like seeing it.

Published files

The list below is generated from what is actually on the server at the moment this page was built.

Season 2026-27

current season

https://estimador.pt/data/football/liga-2026-27/

FileWhat it isSize
ask.json40 KB
ask_samples.json607 KB
cards.jsonManifest for the matchday share cards: which images exist, for which matchday, and what they are called.3 KB
contested_ratings.jsonContested possession: probability of winning aerial and ground duels, defenders and midfielders, pooled over a three-season career. Cells that failed a pre-registered gate carry ranking: null.81 KB
contrib_ratings.jsonAttacking contribution: goals plus assists per 90 above replacement, with interval, the move against the goals-only ranking, and the metric's distribution by position.28 KB
def_ratings.jsonDefenders: adjusted plus-minus on goals conceded. May carry diagnostics only, if the model finds the players are not separable from their team-mates.44 KB
game_fixtures.json123 KB
gk_channels.jsonThe three goalkeeper axes, published separately and never combined: cross intervention (separable), sweeping (a style), and shot-stopping (a properly-powered null over three seasons).22 KB
gk_ratings.jsonGoalkeepers: goals prevented against the xGOT of the shots faced, raw and modelled, per 90 minutes and with an interval. Also carries the out-of-sample validation and the shot-exclusion rules.23 KB
injuries.jsonInjuries and suspensions by club, with reason, expected return where known, and market value. A dated snapshot.4 KB
market_scorecard.jsonThe model evaluated against Pinnacle's closing line over 504 matches and eight seasons, with the paired standard error on every block.7 KB
mdNN.json
6 files (md00.json md05.json)
One matchday's forecast: simulated standings with title, top-three and relegation probabilities, attack and defence strengths, xPts, and the real table at that moment.107 KB
mdNN_scenarios.json
5 files (md01_scenarios.json md05_scenarios.json)
Conditional analysis for the same matchday: decisive fixtures, paths to the title and to survival, and probabilities conditioned on each result. These files are large.2.2 MB
narratives.json98 KB
players.jsonPlayer ranking from the Soccer Factor Model: goals above replacement per 90 minutes, with a credible interval and the change from last season.19 KB
players_detail.json146 KB
samples.jsonComplete seasons drawn from the Monte Carlo simulation — position, points and goal difference for every team in each drawn season, plus points quantiles.74 KB
social.json8 KB
squad_change.json47 KB

Season 2025-26

archived season

https://estimador.pt/data/football/liga-2025-26/

FileWhat it isSize
mdNN.json
19 files (md04.json md31.json)
One matchday's forecast: simulated standings with title, top-three and relegation probabilities, attack and defence strengths, xPts, and the real table at that moment.273 KB
mdNN_scenarios.json
9 files (md23_scenarios.json md31_scenarios.json)
Conditional analysis for the same matchday: decisive fixtures, paths to the title and to survival, and probabilities conditioned on each result. These files are large.1.5 MB
review.jsonThe review of a finished season: final table, per-team xPts, luck index, and how the probabilities the model published moved through the year.24 KB

The main fields

The matchday files (mdNN.json) are the starting point for almost everything. These are the fields that matter.

FieldWhat it is
table[]One entry per team: mean_pts, std_pts, mean_gd and the probabilities p_champion, p_top3, p_relegation, each with a _lo/_hi interval (Monte Carlo error).
actual_standings[]The real table at forecast time: played, points, gf, ga, gd.
xpts_table[]Expected points from each match's xG: xpts, xgf, xga, played. It does not use the model's parameters — an independent read.
team_strengths{}Attack and defence per team, on a log scale centred at zero. Positive defence values mean a worse defence.
position_probs{}Per team, the probability of finishing in each position, first to last. Sums to 1.
next_matchday{}The next matchday with p_home, p_draw and p_away for each fixture.
matchday_results[] / matches_remaining[]Matches already played in the current matchday, and those still to come (with kickoff where known).
season, matchday, model, n_sims, timestampMetadata: which season, which matchday, which model, how many simulations, and when it was generated (UTC, ISO 8601).

How to use it

There is no index: matchday files follow the mdNN.json pattern with two digits, and the most recent is the highest number. The current matchday is always the highest NN in the current season's directory.

# one matchday file (the latest is the highest NN)
curl -s https://estimador.pt/data/football/liga-2026-27/md01.json | jq '.table[0]'

# the 2025-26 final table and luck index
curl -s https://estimador.pt/data/football/liga-2025-26/review.json | jq '.luck[:3]'

Licence and attribution

Free to use, redistribute and transform, commercial use included, as long as the source is credited: “estimador.pt”, with a link to the corresponding page. The data is provided as is, with no warranty — these are probabilistic forecasts from a statistical model, and by definition they will be wrong some of the time.

Provenance

Results and match statistics (xG included) from SofaScore; Pinnacle closing odds via football-data.co.uk; injuries and market values from Transfermarkt. The probabilities come from a hierarchical Bayesian Poisson model fitted with PyMC and 50,000 Monte Carlo season simulations per publication.