Post-Jan 2026 Data Migration Guide · Team & Match xG
FBref alternative for team & match xG, shots and clean CSV / API pipelines
- What Football Charts replaces: If FBref's January 2026 Opta removal or Cloudflare 403 blocks broke your match-level or club-level pipelines (`worldfootballR`, `soccerdata`, Python/R Poisson & Dixon–Coles models, xG standings), we serve team & per-match xG in 25 leagues (second tiers included), shots, box shots, passes, corners & saves in 65 leagues, and results + first-goal minutes in 98 leagues via native CSV, Google Sheets and REST JSON.
- What we do NOT hold: We hold zero player-level scouting stats — no player xG/xA, progressive passes, shot-location coordinates or player percentile radars. If you scout individual players, pair StatsBomb Open Data or Understat with your workflow instead.
Side-by-side comparison for match & club modellers
| Capability | Football Charts | Scraping HTML tables (post-Jan 2026) | Big-5 xG sites (e.g. Understat) |
|---|---|---|---|
| Team & per-match xG | 25 leagues — Big 5 + Championship, 2. Bundesliga, LaLiga2, Serie B, Ligue 2, Eredivisie, Portugal, Brazil, MLS & more | Opta xG removed Jan 2026; historical xG pipelines broken | 5–6 European top flights only |
| Per-match shots, box shots, passes & cards | 65 leagues (34 home/away columns on CSV & JSON) | Fragile HTML tables; frequent HTTP 403 / Cloudflare blocks | Shots/xG only; no lower tiers or women’s leagues |
| Results, HT scores & exact 1st-goal minute | All 98 leagues in 46 countries back to 2020 | Rate-limited HTML scraping required | Top flights only |
| Delivery format | Official ?format=csv, Google Sheets =IMPORTDATA, JSON REST & MCP server (0.1s warm response) | HTML DOM parsing (BeautifulSoup / rvest) | Unofficial JS/HTML scraping |
| Player-level xG / xA / progressive passes | Not held (team & match grain only) | Basic non-Opta player logs | Player xG/xA in top 5 leagues |
| Free vs paid cost | Free league xG tables on web + Free 200/day key (2 seasons); €9/mo or €49 one-off Season Pass for 2020+ & per-match xG exports | Free in browser; automated scripts blocked | Free in browser; no official bulk API |
Replace fragile HTML scrapers with 3 lines of Python or R
Instead of maintaining HTML selectors and sleep timers that break mid-season, read clean UTF-8 CSV or JSON straight into pandas, polars or R:
import pandas as pd
# Personal / €49 Season Pass key adds home_xg, away_xg, shots_inside_box, passes...
url = "https://footballcharts-backend.onrender.com/api/v1/leagues/cha/results/?format=csv&season=2025-2026"
df = pd.read_csv(url, storage_options={"Authorization": "Bearer fc_your_key"})
print(df[["date", "home_team", "away_team", "home_goals", "away_goals", "home_xg", "away_xg"]].head())key <- Sys.getenv("FC_API_KEY")
url <- paste0(
"https://footballcharts-backend.onrender.com/api/v1/leagues/germany2/results/",
"?format=csv&season=2025-2026&key=", key
)
matches <- read.csv(url, stringsAsFactors = FALSE)
head(matches[, c("date", "home_team", "away_team", "home_xg", "away_xg")])Prefer browsing club-by-club chance quality in the browser first? All 25 league xG tables and 40+ shots tables are free to read on the web with no login, and spreadsheet users can grab our Google Sheets & Excel model template (=IMPORTDATA("https://footballcharts-backend.onrender.com/api/v1/leagues/premier/table/?format=csv&key=YOUR_KEY")).
Test a live download right now — get a free API key in 10 seconds
Grab a free key below (current + previous season, 200 calls/day), then click any league button underneath to inspect the exact CSV layout before deciding whether you need historical seasons or per-match xG columns.
Plans & one-off options — same API key, zero formula or code changes
Start with a free key in 10 seconds. Upgrading flips one flag on your existing key so historical ?season= calls and per-match xG/stat columns unlock immediately.
Free Key
€0no card
200 requests/day
- • All 98 leagues (men's, lower tiers & women's)
- • Current + previous season
- • CSV, Google Sheets, REST JSON & MCP
- • FT/HT scores, first-goal minute, tables & probabilities
2026/27 Season Pass
No subscription€49one-off · through July 2027
or €9 / month cancel any time
5,000 requests/day
- • Every season back to 2020 across all 98 leagues
- • 34 per-match stat columns: xG (25 leagues), shots, box shots, passes & cards (~64 leagues)
- • Single payment, zero auto-renewal
- • Personal & academic/modelling use
Historical Odds Archive
€291 league · €199 all 98
Bulk CSV + Parquet download
- • 2020-21 to 2025-26 opening & closing bookmaker odds
- • 1X2, Asian handicap & Over/Under ladders, BTTS, CS
- • ~3 books/match, bet365 named (no Pinnacle in 2020–26 pack)
- • Free Germany 2 & Estonia sample zips included
Building an app, site, bot or paid channel that other people use? See the Commercial API plan (€39/month, 25,000 requests/day).
