Skip to main content
E90

Public prediction data

Read-only JSON and CSV of the published probability ledger. Same rows on both endpoints; rebuild the site to refresh.

Endpoints

  • GET /api/predictions — JSON { count, predictions }.
  • GET /api/predictions.csv — flat CSV, one row per prediction, stable column order (94 columns).

Both are static at build. There are no query filters today: the dump is the full published file for Liga Portugal, La Liga, Premier League, Allsvenskan, Ligue 1, and Serie A. Coverage grows when a league’s official model is frozen.

Freeze and the ledger

Upcoming cards in the next seven days can be refit when a new league result lands, using only finished league matches before the cutoff. After kick-off the published probabilities do not move; only the score is joined. That is freeze: frozen_after_kickoff becomes true and Hit/Miss scoring can land on the match URL.

If a confirmed XI arrives before kick-off, a second snapshot can be stored. The pre-lineup freeze stays on the match page as “Before XI” and in prelineup_* columns. Misses stay visible. The dated public quote of walk-forward metrics is the scored ledger note.

Expected90 publishes probabilistic football forecasts based on statistical models. Predictions are not certainties.

Prediction fields

Every field on the website Prediction type is present in JSON. CSV keeps scalars and nested markets as columns; arrays and XI blocks are JSON strings in a single cell so a spreadsheet stays one row per match.

id
Stable website id for the row (league + slug).
slug
URL slug segment for the match page.
competition
Display name of the live league.
competition_key
Machine key for the competition (filters and paths).
home_team / away_team
Club names as published.
home_team_id / away_team_id
SofaScore team ids when known; otherwise null.
home_logo / away_logo
Crest paths served from the site.
predicted_score
Mode of the score grid (e.g. 1-1).
predicted_score_probability
Probability of that mode scoreline from the same grid.
expected_goals_home / expected_goals_away
Poisson means (λ) for each side; not a shot map.
home_win / draw / away_win
1X2 shares from the score grid; they sum to 1.
over_2_5 / over_1_5 / over_3_5
Totals lines from the same grid. over_1_5 and over_3_5 may be null on rows frozen before those lines shipped.
btts
Both teams to score; sum of scorelines with goals for both sides.
top_scorelines
Array of { score, p }. In CSV this column is a JSON string.
kickoff
Scheduled kick-off (ISO). Shown on site in Europe/Lisbon.
generated_at
When this published snapshot was written.
prediction_cutoff
Data cutoff used for the fit that produced this snapshot.
training_data_cutoff
Last finished league match allowed into training for this fit.
prediction_mode
How the row was produced (e.g. prelineup vs confirmed-lineup path).
frozen_after_kickoff
True once kick-off has passed and probabilities must not move.
model_version
Frozen official model id for the league.
game_id
Upstream fixture id when known.
round / season
League round number and season label.
status
upcoming | played | postponed. Postponed fixtures are kept but not board-listed.
result_home_goals / result_away_goals / result_outcome
Joined after the match. outcome is H, D, or A. Null while still open.
rescheduled_game_id / rescheduled_kickoff
Replacement fixture when a postponed game was rescheduled.
venue
Stadium name when known.
rho
Dixon-Coles low-score dependence parameter for the fit.
game_pick_*
Optional headline pick fields (market, selection, label, probability, strength, threshold). Empty when absent. Not a tip; a labelled share from the grid.
home_elo_pre / away_elo_pre / elo_diff
Pre-match Elo inputs used for the fit.
lineups_confirmed / xi_source
Whether SofaScore posted a confirmed XI, and which XI source fed the page.
home_formation / away_formation / home_xi / away_xi
Formations and player lists for the published XI path. Arrays are JSON in CSV.
forecast_xi / confirmed_xi
Structured XI blocks: forecast XI that fed probabilities, and confirmed XI when posted. JSON in CSV.
missing_players_home / missing_players_away
Out / doubtful / suspended lists. JSON in CSV (split by side).
home_last5 / away_last5
Recent form rows. JSON in CSV.
prelineup_*
Probability snapshot from before a confirmed-XI refit (“Before XI” on the match page). Empty when unused.
market_1x2_* / market_over_25_* / market_btts_*
Optional listed book snapshot (decimal prices and implied shares). Used only to show where the model disagrees with the price. Empty when no snapshot.

CSV column order

Headers are fixed. Older JSON without a field still exports; cells are empty.

  1. id
  2. slug
  3. competition
  4. competition_key
  5. home_team
  6. away_team
  7. home_team_id
  8. away_team_id
  9. home_logo
  10. away_logo
  11. predicted_score
  12. predicted_score_probability
  13. expected_goals_home
  14. expected_goals_away
  15. home_win
  16. draw
  17. away_win
  18. over_2_5
  19. over_1_5
  20. over_3_5
  21. btts
  22. top_scorelines
  23. kickoff
  24. generated_at
  25. prediction_cutoff
  26. training_data_cutoff
  27. prediction_mode
  28. frozen_after_kickoff
  29. model_version
  30. game_id
  31. round
  32. season
  33. status
  34. result_home_goals
  35. result_away_goals
  36. result_outcome
  37. rescheduled_game_id
  38. rescheduled_kickoff
  39. venue
  40. rho
  41. game_pick_market
  42. game_pick_selection
  43. game_pick_label
  44. game_pick_probability
  45. game_pick_strength
  46. game_pick_threshold
  47. home_elo_pre
  48. away_elo_pre
  49. elo_diff
  50. lineups_confirmed
  51. xi_source
  52. home_formation
  53. away_formation
  54. home_xi
  55. away_xi
  56. forecast_xi
  57. confirmed_xi
  58. missing_players_home
  59. missing_players_away
  60. home_last5
  61. away_last5
  62. prelineup_home_win
  63. prelineup_draw
  64. prelineup_away_win
  65. prelineup_expected_goals_home
  66. prelineup_expected_goals_away
  67. prelineup_predicted_score
  68. prelineup_predicted_score_probability
  69. prelineup_generated_at
  70. prelineup_prediction_cutoff
  71. prelineup_prediction_mode
  72. market_1x2_source
  73. market_1x2_scraped_at
  74. market_1x2_n_bookmakers
  75. market_1x2_home
  76. market_1x2_draw
  77. market_1x2_away
  78. market_1x2_implied_home
  79. market_1x2_implied_draw
  80. market_1x2_implied_away
  81. market_over_25_source
  82. market_over_25_scraped_at
  83. market_over_25_n_bookmakers
  84. market_over_25_over
  85. market_over_25_under
  86. market_over_25_implied_over
  87. market_over_25_implied_under
  88. market_btts_source
  89. market_btts_scraped_at
  90. market_btts_n_bookmakers
  91. market_btts_yes
  92. market_btts_no
  93. market_btts_implied_yes
  94. market_btts_implied_no

Related

  • Methodology — how the grid is built.
  • Results — walk-forward log loss, RPS, ECE.
  • llms.txt — machine-readable site map for agents.