# Changelog of Ufc Stats Scraper (`normdata/ufc-stats-scraper`) Actor

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

## Changelog

### 2026-09-05

- **Quieter, cleaner logs under load.** A live run of 94 fights showed ~30 "site was slow —
  retrying" warnings even though the run finished fine in 15s — noisy and alarming-looking for
  a successful run. Retries are now silent by default; if any happened, one friendly summary
  line appears at the end instead ("The site was a bit slow along the way (N retries), but
  everything finished clean.").
- **Lower default concurrency** against the stats site (was scaling up to 24 parallel requests
  on larger memory allocations, now capped at 10) — it's a small, old-school server, not a
  CDN-backed API, and the lower ceiling avoids triggering those retries in the first place.
  Verified the same 94-fight run locally: same result, same ~15s, zero retries needed.

### 2026-09-04 (yet even later)

- **Default mode changed to Fight breakdowns.** The out-of-the-box sample now shows 10 real
  fights with full round-by-round strike/grappling stats — the actor's headline differentiator
  — instead of 10 basic fighter profiles that looked similar to competitors' output.
- **Fixed a real bug found while building that demo:** any fight that ended in round 1 (a
  first-round finish) came back with an *empty* round-by-round breakdown. The parser wrongly
  required more than one round of data to accept the table; a first-round KO/TKO legitimately
  only has one round. Regression-tested with a real 1-round finish (McGregor vs. Holloway 2).

### 2026-09-04 (yet later)

- **Fixed a real prefill gap:** the default sample only listed one fighter (Jon Jones), so a
  fresh run with untouched inputs returned 1 row even though "Maximum rows" showed 10 — the
  cap was never the problem, there just weren't 10 targets to fill it. The prefill (and the
  free-plan demo) now lists 10 well-known fighters across divisions, so an out-of-the-box run
  actually returns 10 rows.

### 2026-09-04 (even later)

- Break-tested with 25 adversarial scenarios (garbage/mixed input, invalid enums and dates,
  absurd filters, free-plan lock, timing on large pulls) — all clean, nothing hangs.
- Added `nickname` and `no_contests` fields (both were on the source page but not being
  captured).
- Progress updates on large pulls (`⏳ Checked N of M so far…`), matching the friendly,
  one-line-per-event log style throughout.
- Field order polish: link/ID fields moved to just before the row-meta fields, so the columns
  a client actually scans (name, record, stats) come first.
- Removed the last mentions of the data source's name from logs and the README.

### 2026-09-04 (later)

- **Direct fighter links.** Paste fighter profile URLs to scrape exactly those fighters,
  skipping the name search — handy for refreshing a previous run's results.
- **Stance and career win/loss filters** for Fighter profiles, so a directory browse only
  keeps the fighters you actually want.

### 2026-09-04

*Initial build.*

- Three modes: fighter profiles, events, fight-by-fight breakdowns.
- Fighter profiles: bio, career strike/takedown averages, full fight history (nested or
  flattened to one row per past fight).
- Events: completed or upcoming, full fight card per event, date-range filter.
- Fight breakdowns: knockdowns, significant strikes, total strikes, takedowns, submission
  attempts, reversals, control time — fight-wide, with an optional round-by-round split. No
  other UFC scraper on the Store exposes this level of detail.
- Data source is gated by a proof-of-work check (solved in pure code — no browser, no proxy).
- Heights/weights/reach normalized to metric alongside the original record.
- Free-plan lock: non-paying accounts always run the built-in demo preset, capped at 10 rows.
