JetLagXI
WC 2026 is complete — this site is the archive. The model continues for the 2026–27 season as Brier FC → brierfc.com
The archive · raw data

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.

Provenance

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

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)

Quick start

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 EGY

Found something interesting — or something wrong? Say so publicly; the whole point of the record is that it can be checked.

★ Tournament completeHow did the model actually do? Read the calibration report →