Open data
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.
The list below is generated from what is actually on the server at the moment this page was built.
https://estimador.pt/data/football/liga-2026-27/
| File | What it is | Size |
|---|---|---|
| ask.json | — | 40 KB |
| ask_samples.json | — | 607 KB |
| cards.json | Manifest for the matchday share cards: which images exist, for which matchday, and what they are called. | 3 KB |
| contested_ratings.json | Contested 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.json | Attacking 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.json | Defenders: 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.json | — | 123 KB |
| gk_channels.json | The 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.json | Goalkeepers: 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.json | Injuries and suspensions by club, with reason, expected return where known, and market value. A dated snapshot. | 4 KB |
| market_scorecard.json | The 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.json | — | 98 KB |
| players.json | Player 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.json | — | 146 KB |
| samples.json | Complete 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.json | — | 8 KB |
| squad_change.json | — | 47 KB |
https://estimador.pt/data/football/liga-2025-26/
| File | What it is | Size |
|---|---|---|
| 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.json | The 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 matchday files (mdNN.json) are the starting point for almost everything. These are the fields that matter.
| Field | What 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, timestamp | Metadata: which season, which matchday, which model, how many simulations, and when it was generated (UTC, ISO 8601). |
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]'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.
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.