Skip to content

FBref Football Stats Scraper

Try for free

Football statistics from FBref for any competition and season: league table, team and opponent stats, and player stats (goals, assists, shots, minutes, cards, goalkeeping), merged into one row per team and per player. No login needed.

⚽ FBref Football Stats Scraper

Get football statistics from FBref for any league, cup and season: the league table, every team's stats (and what their opponents did against them) and every player's stats, merged into one row per team and one row per player. Paste a competition URL or just type "Serie A". No login needed. $0.01785 per row on the Free plan, platform usage included.

✨ Why use FBref Football Stats Scraper?

  • 🧩 One row per team, one per player. FBref spreads a season over many tables (standard, shooting, goalkeeping, playing time, misc …). The actor reads them all and merges them, so goals, shots, minutes, cards and saves sit in the same row.
  • 🏆 Any competition, any season. Premier League, Serie A, La Liga, Bundesliga, Ligue 1, MLS, Champions League, women's leagues, cups and hundreds more, current or past seasons.
  • 🏷️ Stable field names. Every stat keeps FBref's own name (goals, shots_on_target, cards_yellow, gk_saves …) in every competition and season, typed as numbers.
  • 🆚 Opponent stats included. Team rows also carry what opponents did against the team (opp_shots, opp_goals, opp_possession …).
  • 🛡️ Gets through FBref's browser check. FBref asks every visitor to pass a check page; the actor passes it and paces its page loads so runs finish cleanly.
  • 🔍 Honest output. A field FBref leaves empty is left out; nothing is guessed or filled in.

🎯 Use cases

  • 📊 Season analysis: compare teams on goals, shots, possession and discipline, or rank players by goals, assists and minutes.
  • 🧠 Scouting and recruitment: filter players by position, age, minutes and output across leagues.
  • 🎲 Models and predictions: feed league tables and per-90 stats into your own models.
  • 📰 Content and fantasy football: build tables, charts and weekly stat roundups.
  • 🗂️ Historical datasets: collect the same competition over many seasons with identical columns.

🚀 How to use

  1. Paste one or more FBref URLs, for example https://fbref.com/en/comps/11/Serie-A-Stats, or type competition names such as Serie A or Premier League.
  2. Optional: add seasons (2024-2025, or 2024 for leagues that play in one calendar year). Empty = the current season.
  3. Choose whether you want team rows, player rows or both, and optionally limit the stat types.
  4. Run the actor and download the results as JSON, CSV, Excel or HTML, or read them through the API.

📥 Input

FieldWhat it does
startUrlsFBref competition pages (any season), stat category pages or squad pages
competitionsCompetition names (e.g. Serie A, Premier League, Bundesliga, Champions League) or FBref competition ids (e.g. 11 = Serie A); the run log says which FBref competition a name was read as
seasonsSeasons for competitions given without one, e.g. 2025-2026, 2024/25, 2024
includeteams, players or both (default both)
statTypesStat categories to read; empty = every category FBref has data for
{
  "competitions": ["Serie A"],
  "seasons": ["2025-2026"],
  "include": ["teams", "players"]
}

A squad page (e.g. https://fbref.com/en/squads/d48ad4ff/Napoli-Stats) gives that club's players, one row per player and competition.

📤 Output

Every row has type (team or player), competition, competitionId, season, statGroups (which FBref tables filled the row) and sourceUrl.

Team fieldsPlayer fields
team, teamId, teamUrl, leagueTableplayer, playerId, playerUrl, team, teamId
League table: rank, games, wins, ties, losses, goals_for, goals_against, goal_diff, points, points_avg, last_5, attendance_per_g, top_team_scorers, top_keeper, home_*, away_*Profile: nationality, position, age (years-days), birth_year
Standard: players_used, avg_age, possession, goals, assists, goals_pens, pens_made, cards_yellow, cards_red, per-90 ratesStandard: games, games_starts, minutes, minutes_90s, goals, assists, goals_pens, pens_made, pens_att, cards_yellow, cards_red, per-90 rates
Shooting: shots, shots_on_target, shots_on_target_pct, goals_per_shot …Shooting: shots, shots_on_target, shots_on_target_pct, goals_per_shot …
Goalkeeping: gk_players_used, gk_saves, gk_save_pct, gk_clean_sheets …Goalkeeping (keepers): gk_saves, gk_save_pct, gk_clean_sheets …
Playing time and misc: points_per_game, plus_minus, fouls, fouled, offsides, crosses, interceptions, tackles_won, own_goals …Playing time and misc: minutes_pct, games_subs, unused_subs, plus_minus, fouls, crosses, interceptions, tackles_won …
Opponents: the same stats with an opp_ prefix

Example rows from a test run (trimmed):

[
  {
    "type": "team", "competition": "Serie A", "competitionId": "11", "season": "2026-2027",
    "team": "Lazio", "teamId": "7213da33", "teamUrl": "https://fbref.com/en/squads/7213da33/Lazio-Stats",
    "leagueTable": "Serie A", "rank": 1, "games": 11, "wins": 9, "ties": 2, "losses": 0,
    "goals_for": 25, "goals_against": 9, "goal_diff": 16, "points": 29, "last_5": "WWWWD",
    "possession": 53.7, "goals": 24, "assists": 20, "cards_yellow": 17, "gk_clean_sheets": 4,
    "opp_possession": 46.3, "opp_goals": 7,
    "statGroups": ["league_table", "league_table_home_away", "standard", "standard_against", "keeper", "shooting", "playing_time", "misc"]
  },
  {
    "type": "player", "competition": "Premier League", "competitionId": "9", "season": "2024-2025",
    "player": "Mohamed Salah", "playerId": "e342ad68", "playerUrl": "https://fbref.com/en/players/e342ad68/Mohamed-Salah",
    "team": "Liverpool", "teamId": "822bd0ba", "nationality": "EGY", "position": "MF", "age": "32", "birth_year": 1992,
    "minutes_90s": 37.5, "goals": 29, "assists": 18, "shots": 130, "shots_on_target": 61,
    "shots_on_target_pct": 46.9, "pens_made": 9, "pens_att": 9,
    "statGroups": ["shooting", "passing"]
  }
]

💰 Pricing

You pay per saved row (one team or one player), platform usage included:

PlanPer rowPer run (start)
Free$0.01785$0.017
Starter$0.01728$0.01635
Scale$0.01672$0.01574
Business$0.01615$0.01513

Example: one league season with its 20 team rows costs about $0.37 on the Free plan. The same season with every player who has played (Serie A 2026-2027 after 11 rounds: 506 players) adds about $9.03. Choose teams only, or one squad page (about 25 players), for a smaller run.

❓ FAQ

Is it legal to scrape FBref? The actor reads public pages that anyone can open in a browser. Check FBref's terms and use the data responsibly.

Do I need a login or a proxy? No. The actor uses a hosted browser to pass FBref's check page; there is nothing to set up.

How many rows do I get? Every team and every player FBref lists for the competition season. There is no row limit; a full season of a big league is about 20 teams and 500 to 600 players.

Why is a field missing in some rows? FBref leaves some cells empty (e.g. shot accuracy for a player with no shots, goalkeeping stats for outfield players). Those fields are left out of the row rather than filled with a guess.

Can I schedule it or use the API? Yes. Schedule runs (e.g. weekly during the season) and read the dataset through the Scrape.ly API, or connect it to your tools with the integrations.

⚠️ Limits

  • Today FBref's pages show no expected goals (xG, npxG, xAG) values, and its passing, pass type, goal and shot creation, defensive action and possession tables carry no figures apart from assists (seen for current and recent seasons of Serie A and the Premier League). The actor returns what FBref shows; if FBref publishes those values again they appear as extra fields with FBref's names.
  • FBref asks every visitor to pass a browser check and limits how fast one visitor may load pages, so a full season with players takes about one to two minutes.
  • Team rows come from competition pages; squad pages give player rows only.
  • Squad members with no appearance yet (FBref lists them with 0 games and no stats) are not saved.
  • When a competition has several tables (e.g. conferences), a team's rank and table fields come from its own table, named in leagueTable.

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes.

No credit card. No setup calls.