Every prediction, downloadable
“Every prediction on the record” only means something if you can check the record yourself. This is the complete dataset behind JetLag XI — the same files the tournament cron wrote, published verbatim. Re-score the model, audit the calibration report, or build your own charts.
Predictions were logged the moment each result landed, using pre-match Elo — then committed to git and never edited. Snapshots were written once per day by the same cron. Nothing here was cleaned up, re-run, or back-filled after outcomes were known. The one exception is documented in the report: Elo ratings were frozen at their June 8 seeds all tournament.
License: free for any use — analysis, articles, coursework — with attribution to jetlagxi.com.
Match predictions — the record itself
match-predictions.json · 44 KB ↓One entry per match, 104 total. Each was logged by the score-fetch cron the first time it saw the final result, using the Elo ratings as they stood before kickoff — then never edited. This is the file every accuracy number on this site is computed from.
matchId · date · group · teamA/teamB · eloA/eloB · predictedWinner · predictedWinnerProb · score · actualWinner · higherEloWon · higherEloAvoidedDefeat · recordedAt
Daily prediction snapshots
snapshots.json · 685 KB ↓The full Monte Carlo state of all 48 teams, captured once per UTC day from June 12 (the morning after the opener) through July 20 — 39 snapshots bundled into one file. This is the data behind the title-odds curves: you can reconstruct how any team's championship, advancement, or group-winner probability moved as real results landed.
per snapshot: date · generatedAt · teams[48] — each with code · group · ownElo · pTopOfGroup · pSecond · pThird · pFourth · pAdvance · pReachR16/QF/SF/Final · pChampion · expectedPoints · expectedGD
Calibration report data
report.json · 8 KB ↓The computed numbers behind the calibration report: headline scorecard, per-confidence-band hit rates, tournament-level Brier scores vs. base-rate baselines, threshold claims, the five biggest misses, the penalty-shootout record, and the daily title-odds curves for six teams.
outcomes · headline · bands · tournamentBrier · rocClaims · misses · pk · curves · snapshotCount
Fixtures & final scores
fixtures.json · 23 KB ↓All 104 matches — group letter (or knockout round), date, local kickoff, venue, and final score. Knockout shootout wins are encoded as winner +1 on the extra-time score; the three shootout matches are ids 74, 75, and 96.
id · group · date · kickoffLocal · venueId · teamA/teamB · score
Venues
venues.json · 5 KB ↓The 16 host stadiums: coordinates, altitude, time zone, roof type, and June–July climate normals. The inputs to the travel and heat models.
per venue: city · country · stadium · lat/lon · altitudeM · timezone · roof · junJulHighC · junJulHumidityPct
Team strength (Elo seeds)
team-strength.json · 2 KB ↓The Elo ratings that seeded the model (refreshed June 8 from eloratings.net, frozen for the tournament — a documented limitation) plus approximate squad market values.
elo · squadValueM (both keyed by FIFA 3-letter code)
The model's five most confident misses, straight from the record:
curl -s https://www.jetlagxi.com/data/match-predictions.json \
| jq -r '[.matches[] | select(.higherEloAvoidedDefeat == false)]
| sort_by(-.predictedWinnerProb) | .[:5]
| .[] | "\(.predictedWinner) (\(.predictedWinnerProb*100|floor)%) lost: \(.teamA) \(.score[0])-\(.score[1]) \(.teamB)"'
# KOR (77%) lost: RSA 1-0 KOR
# ECU (76%) lost: CIV 1-0 ECU
# PAN (73%) lost: GHA 1-0 PAN
# GER (66%) lost: GER 4-5 PAR (shootout, encoded +1)
# AUS (65%) lost: AUS 3-5 EGYFound something interesting — or something wrong? Say so publicly; the whole point of the record is that it can be checked.