# Changelog of Fotmob Scraper (`normdata/fotmob-scraper`) Actor

- **URL**: https://apify.com/normdata/fotmob-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/normdata/fotmob-scraper.md

## Changelog

### 2026-09-27

- Runs now stop cleanly at the spending limit set for the run, and every row in the dataset is one that was paid for. Error rows are never charged.

### 2026-09-19

- Initial build: 4 modes (match/matches/league/leagues) reading FotMob's own real match, league,
  and directory data directly - no key, no login, zero anti-bot friction confirmed under sustained
  concurrent requests.
- **Real depth found beyond what the closest competitor set documents:** the same match record
  already carries a shot-by-shot map with per-shot expected goals (xG), head-to-head history, a
  minute-by-minute momentum graph, an attack-zone breakdown, and match weather - none of it in the
  closest competitors' own published field lists. Same real finding on league data: recent
  transfers and separate home/away/form/xG standings breakdowns come with every league pull.
- **Real design decision:** consolidated into one Actor with 4 modes instead of mirroring a real
  competitor's own four separate, single-purpose Actors - one purchase covers matches, leagues, and
  the full competitions directory.
- Real fixes applied while building: corrected the score/status fields to their real real location
  in the response (an early assumption based on a similarly-named but different section was wrong);
  corrected the league standings table to its real nested location (the first assumption, matching
  a different page's own field naming, was one level too shallow and returned 1 row instead of a
  full 20-team table).
- Bottleneck-tested locally: 1,000 full match records (shotmap, lineups, momentum, and all other
  bonus data included) in 14s, zero duplicates, zero missing core fields.
- 11 unit tests, 146 `expect()` calls, against real saved API response fixtures.
- Full live field audit across all 4 modes against `dataset_schema.json`: 57/57 fields match with
  zero discrepancy.
