# Changelog of Tennis Scraper — Matches, Odds History, Players, Rankings, H2H (`teodor_banea/tennisexplorer-scraper`) Actor

- **URL**: https://apify.com/teodor_banea/tennisexplorer-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/teodor_banea/tennisexplorer-scraper.md

## Changelog

### 0.1.3 (2026-10-16)

- Invalid `players`/`pairs` entries: one ERRORS record each (were duplicated or dropped), a warning
  log line, and "N invalid input entries skipped" in the status message.
- Tournament pages already cached or failed this run are no longer fetched again for later day
  pages (HttpCrawler ignores `skipNavigation` set in a hook; the fetch is now skipped with a marker
  error and the rows delivered from the cache).
- Qualifying rounds from the match-detail header map to `Q-1R`-style codes like the tournament pages.

### 0.1.2 (2026-10-16)

- Memory and speed (platform QA): HttpCrawler instead of CheerioCrawler (every page was parsed
  twice), time-zone formatters memoised and offsets cached per hour (a match-detail page holds
  \~4,000 odds timestamps; odds mode ran at 7 pages/min and a 7-day run was killed at 512 MB).
  Default memory 1024 MB.
- Odds printed as 0 on the site (no quote for a line) are null, not 0.
- "Futures" and other unlinked events now get their name, round and surface from the match-detail
  header when `includeOdds` is on.
- An unknown player slug is reported as `notFound` (the site answers HTTP 200 with a generic page).
- A malformed `players` / `pairs` entry is recorded in ERRORS as `invalid` and the run continues
  with the valid entries; the run fails only when no entry is usable.
- Tournament pages that failed (UTR series answer HTTP 500) are not requested again for later day
  pages, and ERRORS holds one record per page.
- HTTP/1.1 only — the site's HTTP/2 server refused streams under load.
- `maxResults` prefill 100 (first run ≈ $0.30).
- README: odds-row key includes `lineUnit`; bookmakers without history; cap truncation.

### 0.1.0 — 2026-10-16

First release.

- Modes: `matches` (date range, ATP/WTA singles and doubles or all tours, optional tournament filter), `players` (slug, URL or name; seasons or `all`), `rankings` (ATP/WTA, current or year-end, any depth), `headToHead` (slug pairs or `/mutual/` URLs).
- Match rows with score text plus set columns, ISO UTC start times (London/Prague wall clocks converted with daylight saving), status incl. retired and walkover, seeds, average odds, pre-match H2H, and round/surface/prize money from cached tournament pages (qualification pages when needed).
- Optional per-bookmaker odds rows from match-detail pages: match winner, Over/Under, Asian handicap, correct score; current and opening odds, timestamped movement history, average rows, withdrawn-quote flag.
- Player rows with bio, W/L by surface, titles list, injuries/retirements, seasons; match rows for singles, doubles and mixed.
- Run-wide `maxResults` with reserved slots, crawl stop at the cap, pending-push reconcile on migration, `TOURNAMENTS` cache and `ERRORS` record in the key-value store, even request pacing.
