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.
- id
- slug
- competition
- competition_key
- home_team
- away_team
- home_team_id
- away_team_id
- home_logo
- away_logo
- predicted_score
- predicted_score_probability
- expected_goals_home
- expected_goals_away
- home_win
- draw
- away_win
- over_2_5
- over_1_5
- over_3_5
- btts
- top_scorelines
- kickoff
- generated_at
- prediction_cutoff
- training_data_cutoff
- prediction_mode
- frozen_after_kickoff
- model_version
- game_id
- round
- season
- status
- result_home_goals
- result_away_goals
- result_outcome
- rescheduled_game_id
- rescheduled_kickoff
- venue
- rho
- game_pick_market
- game_pick_selection
- game_pick_label
- game_pick_probability
- game_pick_strength
- game_pick_threshold
- home_elo_pre
- away_elo_pre
- elo_diff
- lineups_confirmed
- xi_source
- home_formation
- away_formation
- home_xi
- away_xi
- forecast_xi
- confirmed_xi
- missing_players_home
- missing_players_away
- home_last5
- away_last5
- prelineup_home_win
- prelineup_draw
- prelineup_away_win
- prelineup_expected_goals_home
- prelineup_expected_goals_away
- prelineup_predicted_score
- prelineup_predicted_score_probability
- prelineup_generated_at
- prelineup_prediction_cutoff
- prelineup_prediction_mode
- market_1x2_source
- market_1x2_scraped_at
- market_1x2_n_bookmakers
- market_1x2_home
- market_1x2_draw
- market_1x2_away
- market_1x2_implied_home
- market_1x2_implied_draw
- market_1x2_implied_away
- market_over_25_source
- market_over_25_scraped_at
- market_over_25_n_bookmakers
- market_over_25_over
- market_over_25_under
- market_over_25_implied_over
- market_over_25_implied_under
- market_btts_source
- market_btts_scraped_at
- market_btts_n_bookmakers
- market_btts_yes
- market_btts_no
- market_btts_implied_yes
- 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.