Fotmob Scraper avatar

Fotmob Scraper

Pricing

from $10.00 / 1,000 match results

Go to Apify Store
Fotmob Scraper

Fotmob Scraper

Every shot's exact location and xG, minute-by-minute momentum, head-to-head history, and attack-zone breakdown - for any FotMob match, league, or day of fixtures worldwide. Full standings, season fixtures, and transfers per competition, plus a complete leagues directory.

Pricing

from $10.00 / 1,000 match results

Rating

0.0

(0)

Developer

Norm Data

Norm Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Norm Data

โšฝ FotMob Scraper

Every shot's exact location and expected goals, minute-by-minute match momentum, head-to-head history, and attack-zone breakdown, for any football match, league, or day of fixtures worldwide. One Actor covers matches, leagues, and the full competitions directory. No login.

Point it at a match ID, a date, or a league ID, and get export-ready data for analytics, fantasy tools, media, and league dashboards.

๐ŸŽฏ Who uses it?

๐Ÿ“Š Analysts & modelers

Shot-level xG, team-stat comparisons, and momentum data for match prediction, player evaluation, or content.

๐ŸŽฎ Fantasy & scouting tools

Per-player ratings and stats across matches for player tracking and squad building.

๐Ÿ“ฐ Media & content teams

Lineups, timelines, head-to-head history, and highlights links for match summaries and reporting.

๐Ÿ† League & competition dashboards

Full standings with home/away/form/xG splits, season fixtures, and transfer activity.

โœจ What it does

  • Match: one deep record per match, with final score, lineups and formations, per-player stats and ratings, the goal/card/substitution timeline, a full team-stat comparison, venue, referee, weather, player of the match, a shot-by-shot map with expected goals (xG), head-to-head history, a minute-by-minute momentum graph, and an attack-zone breakdown.
  • Matches: every match on a given date, across every competition worldwide, in one call.
  • League: a competition's full standings table (plus separate home/away/form/xG breakdowns), the complete season's fixtures and results, season top players, and recent transfers.
  • Leagues: the complete real directory of competitions worldwide, for discovering league IDs.

Missing source values are returned as null, never invented.

Why this scraper

  • Far more per match than a bare score. Shot-by-shot xG, head-to-head history, live momentum, and attack-zone data all come on every match record, at no extra request.
  • One Actor instead of four. Matches, leagues, and the leagues directory are all built in, not separate purchases.
  • Real transfer data and deeper standings on every league. Recent transfers, plus home/away/form/xG standings breakdowns, come with every league pull, not just the plain table.
  • Fast and reliable at real scale. Tested at 1,000 full match records in well under a minute, zero duplicates, zero crashes under load.
  • No login, no API key.

How it compares

Checked directly against the closest real competitor set on Apify (their own declared input/output):

CapabilityThis actorClosest competitors
Shot-by-shot map with per-shot xGyesnot documented
Head-to-head historyyesnot documented
Match momentum graphyesnot documented
Attack-zone breakdownyesnot documented
Recent transfers per leagueyesnot documented
Matches + Leagues + Directory in one Actoryes4 separate Actors
Reported reliabilitytested clean at 1,000-record scaleone competitor sits at 87 to 93% success

๐Ÿ“ฆ What data you get

EntityUseful fields
MatchID, URL, teams, score, stadium, capacity, referee, weather, player of the match, highlights link, lineups, formations, per-player stats and ratings, the goal/card/substitution timeline, and a full team-stat comparison.
Shot & momentum dataA shot-by-shot map with pitch coordinates and xG, a minute-by-minute momentum graph, and a left/center/right attack-zone split per team per half.
Head-to-headSummary record and the real match history between the two teams.
LeagueStandings (plus home/away/form/xG breakdowns), season fixtures and results, top players, and recent transfers.
DirectoryEvery real competition worldwide, for discovering league IDs.

Every record includes scraped_at (UTC). Download your dataset from Apify as CSV, JSON, Excel, or XML.

๐Ÿ’ก Use cases

๐Ÿ“Š Full breakdown of one match

{ "mode": "match", "matchIds": ["5795363"] }

๐Ÿ“… Every match on a given date

{ "mode": "matches", "dates": ["20260920"] }

๐Ÿ† A league's standings, fixtures, and transfers

{ "mode": "league", "leagueIds": ["47"] }

๐Ÿ”Ž Discover league IDs

{ "mode": "leagues" }

โš™๏ธ How the input is organised

Pick a mode and a maximum results cap first, then fill in only the section that matches your mode:

SectionWhat it's for
Match modeReal FotMob match IDs, for a full per-match breakdown.
Matches modeDates in YYYYMMDD format, each getting its own fair share of the results cap.
League modeReal FotMob league IDs, for standings, fixtures, and transfers.

Leagues mode needs nothing else, it returns the full competitions directory. Use it to discover the league or match IDs the other modes need.

Apify Free plan: every run is limited to a fixed 10-row sample. Upgrade your Apify plan to run your own settings.

๐Ÿ›ก๏ธ Limits & responsible use

This Actor reads only FotMob's own public match, league, and directory data. It never signs in and never accesses anything gated behind an account.

weather or highlights_url are sometimes null because FotMob itself doesn't set them for every match (indoor, older, or lower-profile fixtures), a real source-side gap, not a parsing failure. A match that hasn't started yet has no result status text in Matches mode; it fills in once the match kicks off.

If a match, league, or date can't be loaded, that row is skipped with a warning in the run log. The rest of the run continues.

๐Ÿ“ง Contact

Need a scraper for a different site, or found something wrong with this one? norm.data.scrapers@gmail.com

Local development

bun install
bun test # offline: normalization (real fixtures)
bun run src/main.ts # reads storage/key_value_stores/default/INPUT.json