Dixon-Coles goal model · leagues · clubs · six confederations
Type two names. Nicknames and typos are fine — "kogalo", "man citi", "moroco". Everything derivable fills itself; anything that isn't, the app tells you.
Common ids: 39 Premier League · 140 LaLiga · 135 Serie A · 78 Bundesliga · 61 Ligue 1 · 94 Primeira Liga · 203 Super Lig · 207 Swiss Super League · 119 Superliga · 113 Allsvenskan · 71 Brasileirao · 128 Argentina · 253 MLS · 233 Egypt · 200 Botola · 288 South Africa. Free tier is 100 requests a day, so fetch the leagues you need and let them cache in the browser.
National-team ratings come from FIFA/Coca-Cola World Ranking points, not club form. The 20 July 2026 top-20 figures are verified; the rest are approximations consistent with recent positions.
Form is entered rather than pre-loaded. Supplying verified current form for 1,176 clubs is not something I can do honestly, and inventing it is exactly the failure mode this build exists to avoid.
Expected goals
Rows = home goals, columns = away. The modal score typically carries 9–16%.
More reliably predictable than 1X2, and usually less efficiently priced.
Goals per match and home advantage differ materially by confederation. CAF and CONMEBOL home advantage is genuinely larger than UEFA's — travel, altitude, pitch and crowd. ✓ marks a figure computed from a verified season source; the rest are documented approximations, tunable above.
Stored in this browser only. Enter results to measure whether the stated probabilities hold. Nothing else here tells you whether the model works.
Ratings come from entered form, exponentially decayed, normalised for venue and opposition, then shrunk toward the league mean. League position enters as a slow-moving prior. λ and μ feed a Dixon-Coles bivariate Poisson (ρ = −0.13), from which 1X2, scorelines, BTTS and over/under all derive. Market odds are capped at 10% of the blend.
League parameters and rosters were checked against sources in: . Local-language sources materially outperform English ones for CAF, CONMEBOL and AFC competitions.
A published artifact runs under a content-security policy that blocks every external network request. A fetch to api-sports.io, gnews.io or any other feed does not error visibly — it fails silently, and the page looks like it is working while showing nothing. Embedding an API-key field would therefore be worse than useless: it would imply live data that can never arrive. API-Football's free tier is also 100 requests a day, which does not cover 1,177 clubs.
So auto-fill works three ways instead, all free:
One honest limit on the snapshot: the results feed returns played/W/D/L/points but not goals for and against. Rather than invent scorelines to fit a record, ratings in that mode derive from points-per-game and table position, which are real. That is weaker than true goal data, and the app says which mode each side is using every time it predicts.
This self-hosted build adds a fourth source: a live API-Football fetch, under “Live data” in the paste panel. It is the one thing that cannot work inside a published artifact — the CSP blocks the request — but on your own server it does. Enter a key and a league id and standings import straight into the model. The key is stored only in your own browser and is never sent anywhere except api-sports.io.
Typing two names resolves them against all 1,176 clubs and 112 nations using aliases, prefix matching and token-level edit distance, then infers the competition: same league is domestic, different leagues in one confederation gives that confederation's premier club competition, different confederations gives the Club World Cup on neutral ground, and two nations give their continental tournament. League size, goal baseline, venue and strength coefficients follow automatically. A club entered against a national team is rejected rather than silently modelled.
What it cannot fill is recent form and league position, because no verified live feed for 1,176 clubs exists here. The app says so explicitly rather than predicting on blank defaults and letting the output look more grounded than it is.
A 1.20 attack rating in Bolivia's league is not a 1.20 in Argentina — each rating is calibrated to its own league's mean. Continental ties therefore rebase both sides using league strength coefficients, applied once and split via a square root. Applying the ratio to attack and defence separately squares the effect; during the build that bug gave Manchester City 4.28 expected goals against Gor Mahia, which the corrected formula puts at 2.57.
Competition goal baselines differ sharply and are set per tournament: the Champions League runs near 2.95 a game, the Copa Libertadores near 2.30, the CAF Champions League near 2.10. Using a domestic baseline for a continental tie is a systematic error. Neutral-venue finals drop home advantage to 1.00, and two-legged ties are resolved by summing both legs' score matrices — with level aggregates split 50/50, because shootouts are close to a coin flip and no model predicts them.
International mode uses FIFA/Coca-Cola World Ranking points rather than club form. The point gap converts to goal supremacy on a log scale, tanh-compressed so a very large mismatch saturates instead of driving the weaker side's expectation to zero. The first version had Kenya at 0.25 expected goals against Morocco, which is not a football outcome; compression puts it at 0.46.
Top-20 point totals are verified from the 20 July 2026 release, taken after Spain beat Argentina in the World Cup final. The rest are approximations. International predictions deserve wider error bars than club ones: teams play a handful of matches a year, squad availability swings results, and the ranking updates only four times annually.
Realistic ceiling for 1X2 is roughly 45–55%, and near chance on evenly-priced fixtures. Across a 17-leg accumulator even 50% per leg is about 1 in 131,000. Nothing in this tool changes that arithmetic.
© 2026 Gredictor Predictive AI · A Globesolute Company · Prediction of human behaviour can be wrong. Exercise caution.