FotMob Scraper - Live Scores, xG, Ratings & Standings
Pricing
from $2.00 / 1,000 match (fixtures / live / result)s
FotMob Scraper - Live Scores, xG, Ratings & Standings
Scrape FotMob football data in one Actor: fixtures, live scores, league standings, match details with lineups/xG/player ratings, team squads, player profiles, transfers, and search. HTTP JSON API alternative — Python, Node.js, MCP.
Pricing
from $2.00 / 1,000 match (fixtures / live / result)s
Rating
0.0
(0)
Developer
Andrej Kiva
Maintained by CommunityActor stats
0
Bookmarked
34
Total users
10
Monthly active users
a day ago
Last modified
Categories
Security
Limited permissionsShare
FotMob Scraper — Live Scores, xG, Player Ratings, Standings & Transfers
Get structured football data from FotMob with one Apify Actor for matches, leagues, match details, teams, players, transfers, and search. Choose a mode, provide optional IDs or dates, then receive records in an Apify dataset. Use it as a football data API source for live scores, league standings, xG, player ratings, fixtures, results, team squads, and more, including Premier League, Bundesliga, and Champions League coverage available through FotMob.
Why this Actor
- Nine modes in one Actor:
auto,matches,leagues,league,match,team,player,transfers, andsearchcover a broad set of FotMob data needs. - Cheapest per record: match records start at $2 per 1,000 and search hits at $1 per 1,000; per-event pricing is shown below so you can estimate costs from the records you need. Small runs have a tiny start fee.
- HTTP JSON collection: the Actor reads FotMob's public data endpoints directly. It does not need a browser, which keeps the collection process lightweight.
- Match analysis fields: request xG, player ratings, lineups, shotmap, and momentum when FotMob provides them.
- Profiles and transfers included: get team and player profiles and transfer feed records alongside match data, areas often outside the scope of single-purpose score tools.
- Chain collection in one run: collect matches, then set
enrichMatchDetailsto fetch details for those matches, including xG and lineups. - Structured export: records land in an Apify dataset ready for JSON, CSV, Excel, API access, or further processing.
What problems it solves
- Analytics and prediction models: build feature sets from fixtures, results, standings, xG, lineups, and player performance.
- Live-score apps and alerts: retrieve scheduled, live, or finished matches and feed score updates into your app or notification workflow.
- Fantasy and tipster tools: combine player ratings, team form, fixtures, and season leaders for research and planning.
- Media and CMS scoreboards: collect match lists, results, competition tables, and match details in a consistent dataset format.
- ID mapping: search clubs, players, and matches or enumerate league IDs before running targeted collections.
What data you get
Each successful dataset item includes a record type, source, and scrape timestamp. The exact fields depend on the selected mode and optional include settings; FotMob may not publish every field for every record.
| Mode | What one record contains | Typical use |
|---|---|---|
matches | One fixture, live match, or result with teams, score, status, date, competition, and IDs | Daily schedules, live-score feeds, results |
leagues | One competition directory entry with its name, category, country code, ID, and URL | Discover competitions and build ID lists |
league | One competition season with available standings, fixtures, top players, season, and match IDs | League standings, season analysis, fixture lists |
match | One match detail record with requested lineups, events, team and player stats, ratings, xG, venue, and related data | Match reports and performance analysis |
team | One team profile with optional squad, fixtures, and standings slice | Squad research and club pages |
player | One player profile with biography, position, primary team, recent matches, and career details when available | Player pages and profile enrichment |
transfers | One recent transfer row with player, clubs, date, and fee fields when available | Transfer feeds and roster tracking |
search | One typed search result with entity details and IDs | Resolve team, player, or match IDs |
auto | Records from the mode inferred from the inputs you provide | Convenient runs when the target is clear from filled fields |
For match detail records, includeShotmap adds the shotmap payload and includeMomentum adds momentum graph data. These optional fields can increase record size. The includeRaw option attaches the full FotMob payload as rawData.
How to use it in 60 seconds
- Pick a mode. Choose
matchesfor a date's fixtures,leaguefor a competition season,matchfor match details, or another mode for profiles, transfers, and search.autoselects based on the inputs you fill. - Fill targets. Add IDs or URLs for the selected mode. For matches, use
datesordateFromanddateTo; filters such asleagueIds,matchStatus, andtimezoneare optional. - Run the Actor. Set include options and
maxItemsas needed. Results are written as they are collected. - Export or connect. Download JSON, CSV, or Excel from the dataset, read records through the Apify API, or connect an integration.
Input examples
Examples use only input fields defined by the Actor schema. You can combine applicable options; defaults are used for fields you leave out.
Today's matches (Berlin timezone)
{"mode": "matches","timezone": "Europe/Berlin","matchStatus": "all","locale": "de","maxItems": 200}
An empty dates list and no date range means today's matches in UTC by default. timezone selects the day bucket used for match collection.
Bundesliga standings and fixtures
{"mode": "league","leagueIds": ["54"],"includeStandings": true,"includeFixtures": true,"includeTopPlayers": true}
Match details (lineups, xG, ratings)
{"mode": "match","matchIds": ["4506324"],"includeLineups": true,"includeTeamStats": true,"includePlayerStats": true,"includeEvents": true}
Team squad
{"mode": "team","teamIds": ["9825"],"includeSquad": true,"includeFixtures": true}
Transfers feed
{"mode": "transfers","transferPages": 2,"maxItems": 100}
Search teams and players
{"mode": "search","searchQueries": ["Bayern", "Haaland"],"maxItems": 50}
Premier League results over a date range
dateFrom and dateTo are inclusive and use YYYYMMDD format. League ID 47 is the Premier League.
{"mode": "matches","leagueIds": ["47"],"dateFrom": "20260801","dateTo": "20260831","matchStatus": "finished","timezone": "Europe/London"}
Today's matches with match detail enrichment
This fetches the match list and then requests match detail records for those matches. Details are charged as separate match-detail events; use a suitable run timeout for a large set.
{"mode": "matches","timezone": "Europe/Berlin","matchStatus": "all","enrichMatchDetails": true,"maxItems": 100}
Output examples
Every dataset item includes recordType, source, and scrapedAt. These examples show common fields; available data can vary by match and season.
Match row
{"recordType": "match","matchId": 5903801,"leagueId": 54,"leagueName": "Bundesliga","ccode": "GER","utcTime": "2026-08-04T17:00:00.000Z","started": false,"finished": false,"homeTeam": { "id": 9823, "name": "Bayern München", "score": null },"awayTeam": { "id": 9788, "name": "Borussia Dortmund", "score": null },"matchUrl": "https://www.fotmob.com/match/5903801","date": "20260804","source": "fotmob-scraper","scrapedAt": "2026-08-04T16:00:00Z"}
Match details (xG, venue, player of the match)
{"recordType": "matchDetail","matchId": 4506324,"leagueName": "Premier League","homeTeam": { "id": 10252, "name": "Aston Villa", "score": 0 },"awayTeam": { "id": 10260, "name": "Manchester United", "score": 0 },"xgHome": 0.5,"xgAway": 0.56,"xgotHome": 0.39,"xgotAway": 0.97,"venue": "Villa Park","referee": "Robert Jones","attendance": "42682","playerOfTheMatch": {"playerId": 268375,"name": "Emiliano Martinez","teamName": "Aston Villa","rating": 8.4}}
Record types at a glance
recordType | Common fields |
|---|---|
match | matchId, teams, score, status, utcTime, leagueId, matchUrl |
leagueDir | leagueId, name, category, ccode, leagueUrl |
league | standings, fixtures, matchIds, top players, season |
matchDetail | lineups, events, xgHome/xgAway, teamStats, playerStats, venue, referee, H2H |
team | squad, fixtures, standings slice |
player | bio, primary team, position, recent matches, career |
transfer | player, from/to clubs, fee fields, date |
searchHit | typed search hits with entity IDs. ccode is not provided by FotMob search and is null |
Pricing — what a run costs
This Actor uses pay-per-event pricing. The following prices are per 1,000 successfully delivered records:
| Event | Price per 1,000 records |
|---|---|
| Match (fixture, live match, or result) | $2.00 |
| League directory row | $1.50 |
| League season record | $6.00 |
| Match details (xG, ratings, lineups) | $6.00 |
| Team profile | $5.00 |
| Player profile | $5.00 |
| Transfer row | $2.00 |
| Search hit | $1.00 |
The Actor start fee is $0.00005 per run—practically zero, so small runs stay cheap. For example:
- A day of fixtures (about 70 matches) costs approximately $0.14.
- 100 match detail records cost approximately $0.60.
- 5 top-league tables cost approximately $0.03.
You pay only for records delivered to the dataset. Set maxItems to limit the number of records, and use Apify's max-charge-per-run cap to control spend. Apify's free plan includes $5 monthly credit to try Actors. Exact prices are on the Pricing tab and may change.
Compared to the alternatives
| Consideration | This Actor | Build your own scraper | Single-purpose FotMob tools | Manual copy |
|---|---|---|---|---|
| Modes covered | Nine modes in one Actor, including auto | Whatever you implement | Usually focused on one data type per tool | Depends on what you copy |
| Team, player, and transfers | Team and player profiles plus transfers feed | Possible, with separate endpoint work | Depends on the specific tool | Manual and time-consuming |
| xG, shotmap, and momentum | Match details support these when available | Possible when endpoints expose them | Depends on the tool | Usually copied field by field |
| Setup time | Configure input and run | Build, deploy, and maintain collection code | Configure each separate tool | Repeat manual work for each update |
| Maintenance when FotMob changes | Actor is maintained; report issues in the Issues tab | You handle endpoint changes | Each tool maintainer handles its scope | You adjust your process |
| Export formats | Apify dataset formats and API | Choose and implement formats | Depends on platform and tool | Paste into your chosen format |
| Start fee | $0.00005 per run, plus record events | Infrastructure and engineering costs | Pricing varies by tool | No Actor fee; staff time applies |
The right choice depends on the fields and workflow you need. This Actor is designed for structured FotMob collection across match, competition, profile, transfer, and search data.
Use cases
- Daily football data pipeline: schedule
matches, then useenrichMatchDetailswhen the downstream process needs match detail records. - Prediction and model features: collect xG, ratings, lineups, results, and competition context where FotMob provides them.
- Fantasy and tipster research: compare upcoming fixtures with team form and season player leaders.
- CMS scoreboards: export results for a date range as JSON, CSV, or Excel and load them into a publishing workflow.
- ID discovery: use
leaguesorsearch, then pass discovered IDs to targeted runs. - Soccer stats archive: store dated match and league records in your own dataset for analysis over time.
Integration examples
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('crawloop/fotmob-scraper').call({mode: 'matches',timezone: 'Europe/Berlin',maxItems: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.slice(0, 5));
Python
from apify_client import ApifyClientclient = ApifyClient(token="YOUR_TOKEN")run = client.actor("crawloop/fotmob-scraper").call(run_input={"mode": "league","leagueIds": ["54"],"includeStandings": True,"includeFixtures": True,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item.get("name"), len(item.get("standings") or []))
cURL
curl -s -X POST "https://api.apify.com/v2/acts/crawloop~fotmob-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"mode":"match","matchIds":["4506324"],"includePlayerStats":true,"includeTeamStats":true}'
MCP and AI assistants
Use the Actor from AI tools through Apify MCP. Connect your Apify account, then call the Actor by its Store ID or name: crawloop/fotmob-scraper.
Example prompts:
- “Run FotMob Scraper for today's matches in Europe/Berlin and return finished games as JSON.”
- “Get Bundesliga league ID 54 standings and top scorers.”
- “Fetch match 4506324 with lineups and xG, then summarize the player ratings.”
Schedule it
Use Apify Schedules for daily results or to poll live matches every few minutes. Connect run results to webhooks or automation tools such as Zapier, Make, and Google Sheets to pass records into your workflow.
FAQ
Do I need a FotMob account?
No. The Actor uses public JSON endpoints and does not require a FotMob login.
Is this a FotMob API?
It is an Actor that collects data from FotMob's public data endpoints and returns it in a structured Apify dataset. It is not an official FotMob API product, and endpoint availability can change.
Is it legal, and is the data public?
The Actor reads data available from public FotMob pages and endpoints. You are responsible for your use of the data under applicable laws and FotMob's terms. See the disclaimer below.
Does it need a proxy?
No. Requests use HTTP, and a datacenter proxy is usually sufficient if you choose to use one. Proxy configuration is optional.
How fresh are live scores?
They are as fresh as FotMob's public feed at the time the Actor runs. This is a snapshot, not a guaranteed real-time push stream.
Is German /de a separate dataset?
No. The locale option changes URL language and request language headers. Competition and match IDs are global.
How do I find league or match IDs?
Run mode: "leagues" or mode: "search", or start with mode: "matches" and read the matchId and leagueId fields from its records.
Can I get historical seasons?
Yes. Use mode: "league" and provide a seasons value such as 2024/2025 when FotMob lists that season in its available seasons.
Why can a player profile be empty?
FotMob sometimes returns empty player data. Missing records are not written to the dataset and are not billed as delivered records.
What happens if FotMob changes its API?
We maintain the Actor as FotMob's public endpoints change. If a mode stops working or its output changes unexpectedly, report the issue in the Actor's Issues tab.
What about transfers versus Transfermarkt?
This Actor provides FotMob's recent transfers feed. For deep transfer-fee histories, use a source focused on that data.
Can I use it in production?
You can use it for scheduled collection and exports. Plan for the possibility of endpoint changes, set appropriate run limits, and follow applicable terms and laws.
Related Actors
- PrizePicks Player Props Scraper
- Underdog Fantasy Player Props
- DFS Multi-Source Props Scraper
- Betr Picks Scraper
Disclaimer
This Actor is not affiliated with FotMob. It collects publicly accessible data; you are responsible for using it under applicable law and FotMob's terms. Data availability and accuracy are not guaranteed.