# Changelog of ESPN Sports Data Scraper: Boxscores, Gamelogs & Odds (`mrbridge/espn-sports-data-scraper`) Actor

- **URL**: https://apify.com/mrbridge/espn-sports-data-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/mrbridge/espn-sports-data-scraper.md

## Changelog

All notable changes to this Actor are documented here, by the build number shown in your run details. This project follows [Keep a Changelog](https://keepachangelog.com/) and [Semantic Versioning](https://semver.org/).

### 0.3.11 (2026-09-24)

#### Fixed

- **Include odds now does what it says.** It adds six columns to scoreboard rows: `has_odds`, `favorite`, `spread`, `over_under`, `home_moneyline` and `away_moneyline`. They are read from the scoreboard ESPN already returns, so the setting costs no extra request and no extra charge. Before this release the setting did nothing.

#### Added

- Game summary rows gain `home_moneyline` and `away_moneyline`, next to the odds columns they already carried.
- Every odds column is declared in the dataset schema and shown in the Overview view.

#### Which games carry odds

Measured on 2026-09-24 on NFL, MLB, WNBA and NBA games:

- A scoreboard carries betting lines for games not yet played. A finished game's scoreboard entry has none, so its odds columns are null.
- A game summary keeps the lines after the final whistle, moneylines included, for games of the current seasons. We checked finished NFL, MLB and WNBA games from 15 hours to 7 months old.
- An older game can lose them. An NBA game from January 2025 has none left.
- Lines appear only once sportsbooks post them. An MLB game two days away had none yet.
- A missing line is always null, never 0.

### 0.3.9 (2026-09-24)

#### Fixed

- **Scoreboards return games again.** Since mid-September, ESPN refuses the date-range request this Actor used and answers with an error message instead of games. Runs then reported "No results found" and finished successfully with an empty dataset. The Actor now asks ESPN for one day at a time, the form ESPN still answers, for every league, for date ranges and for full seasons.
- **An ESPN refusal is reported as an ESPN error, never as "no games".** It appears in the run's `OUTPUT` record with the code `UPSTREAM_ERROR` and ESPN's own message, the run's final message says ESPN returned errors, and nothing is billed for it.
- **Refusals are no longer kept in the cache.** Earlier builds stored ESPN's error message for 30 days as if it were a real answer, so a date that failed once kept returning nothing. Such stored entries are now ignored and replaced by a fresh answer.
- **Each game is delivered and billed once, whatever the league.** Asked for a single day, ESPN can return a whole week of football. Every league now keeps only the games of the days you asked for, on the US Eastern calendar ESPN uses, and drops any game already delivered in the run.

#### Changed

- A full season now takes one request per day instead of one per week, so a season pull runs a little longer. Billing does not change: you pay per result delivered, never per request.
- College Football no longer asks ESPN for an extra day at the end of a date range. The day-by-day request returns every day you asked for.

### 0.3 (2026-08-25)

Everything below ships as one release, replacing 0.2.3.

#### Fixed

- **College Football scoreboards no longer lose the last day of a date range.** Asking for 13 to 19 December returned games up to the 18th only. The fix asks ESPN for one extra day and filters the answer back to the days you asked for, using the US Eastern calendar ESPN itself uses: a game listed at 01:00 UTC on 20 December belongs to the 19th and is now delivered. Duplicates are removed before anything is written, so nothing is billed twice.
- **College Football now returns the top division by default.** Runs used ESPN group 50, which ESPN names `CAA - South`. They now use group 80, which ESPN names `FBS`, matching what this Actor promises. Set **NCAA group override** if you want a different group. NCAA Basketball is unchanged.

#### Changed

- **Billing is described exactly as it is applied.** You are charged once per result delivered to the dataset. Earlier versions of this page described a per-game and per-season charge that was never applied. Prices are unchanged.
- The two cost fields ("Max items" and "Max charged events") are replaced by a single **Result limit**, prefilled at 100. It bounds both the number of results and the amount billed, and the run stops as soon as it is reached, even in the middle of a game or a season. Runs and tasks saved before this release keep working unchanged.
- **NCAA group** becomes **NCAA group override** and no longer carries a default value, so each league uses its own default unless you set one.
- **Season type is a request filter, not a guarantee.** Your choice is forwarded to ESPN, which decides what to return: a run asking for the postseason may occasionally include a regular-season game. Every row carries its own `season_type`, so an exact match is one filter away on your side.
- Every published example task is capped at 90 results, so any of them can be run as a trial for at most 0.27 USD at the entry rate. Verified on 2026-08-25 across the 18 published tasks.
- Three example tasks were unpublished because their titles promised data this Actor does not produce: Formula 1 standings, ESPN Fantasy player data, and a betting-odds export whose configuration never fetched odds.
- Failed lookups and invalid inputs are no longer written to the dataset, so they are never charged. They are reported in the run's `OUTPUT` key-value store record instead, with the same nine error codes and a plain-language message, and the run still finishes successfully.
- The run's final message and the `OUTPUT` record now report the number of results actually billed, and name which ceiling stopped a run.
- The run log is readable again: no repeated warning, and a progress line for every season, page or batch of games.

### 0.2.3 (2026-07-22)

#### Added

- A machine-readable run summary written to the default key-value store as `OUTPUT`, documented by a key-value store schema, so an integration can read a run's totals without scanning the dataset.

### 0.2.2 (2026-07-22)

#### Changed

- Store description, SEO metadata and README polish. No behaviour change.

### 0.2.1 (2026-07-20)

#### Added

- All 11 data types end-to-end: scoreboard (date range and bulk multi-season), gameSummary, playByPlay, playerBoxscore, schedule, teams, standings, roster, athletes, athleteGamelog, news.
- Bulk multi-season scoreboard discovers authoritative season bounds from ESPN and iterates weekly.
- The `seasonType` input offers an "All" option (preseason + regular season + postseason) and it is the default, so a season pull is complete by default. Choose a single type (1, 2 or 3) to narrow it.
- Play-by-play and player boxscore emit flat rows plus a per-game envelope. Athlete gamelog emits per-game rows plus a per-season envelope.
- Structured error reporting for every failure (9-code taxonomy), and the run always finishes successfully.
- KV cache of immutable responses (finished games, past seasons) with a 30-day TTL.

### 0.1.1 (2026-07-17)

#### Added

- Initial scaffold, Actor configuration and schemas.
