Fotmob Scraper
Pricing
from $10.00 / 1,000 match results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share

โฝ 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):
| Capability | This actor | Closest competitors |
|---|---|---|
| Shot-by-shot map with per-shot xG | yes | not documented |
| Head-to-head history | yes | not documented |
| Match momentum graph | yes | not documented |
| Attack-zone breakdown | yes | not documented |
| Recent transfers per league | yes | not documented |
| Matches + Leagues + Directory in one Actor | yes | 4 separate Actors |
| Reported reliability | tested clean at 1,000-record scale | one competitor sits at 87 to 93% success |
๐ฆ What data you get
| Entity | Useful fields |
|---|---|
| Match | ID, 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 data | A 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-head | Summary record and the real match history between the two teams. |
| League | Standings (plus home/away/form/xG breakdowns), season fixtures and results, top players, and recent transfers. |
| Directory | Every 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:
| Section | What it's for |
|---|---|
| Match mode | Real FotMob match IDs, for a full per-match breakdown. |
| Matches mode | Dates in YYYYMMDD format, each getting its own fair share of the results cap. |
| League mode | Real 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 installbun test # offline: normalization (real fixtures)bun run src/main.ts # reads storage/key_value_stores/default/INPUT.json