Skip to contents

wehoop 3.0.0

New data loaders

ESPN endpoint expansion

CRAN preparation

  • Add cph (copyright holder) role to Saiem Gilani in Authors@R (CRAN strict requirement).
  • Bump LICENSE and LICENSE.md copyright year from 2020 to 2026.
  • Add full roxygen blocks (description, @return, @examples) to most_recent_wbb_season() and most_recent_wnba_season(), which had been title/@export-only.
  • Add @examples \donttest{} blocks to all 58 new ESPN endpoint wrappers. Live-API examples are wrapped in \donttest{} so they do not run during routine R CMD check but are still exercised under --run-donttest. The redundant @details code-block samples were removed from these 58 functions; the legacy @details-with-code-block convention is retained for the WNBA Stats API (wnba_*) and NCAA (ncaa_wbb_*) wrappers per the project’s documentation conventions in CLAUDE.md.
  • Modernize inst/CITATION: replace deprecated citEntry() / personList() with bibentry() / c(person(), ...) (R 4.x deprecation cleanup).
  • Add parameter_descriptions (dataset) and year_to_season (utility) to _pkgdown.yml reference index so pkgdown::check_pkgdown() passes (resolves the gh-pages deploy failure).

WNBA Stats API V3 Endpoints Added

WNBA Time Calculation Fix

  • .players_on_court() — corrected quarter-length math to use 10-minute WNBA quarters (600 seconds/quarter, 2400 seconds of regulation) rather than the NBA 12-minute quarter constants.

Data Loaders

  • update_wnba_db() function updated to use sportsdataverse-data releases url instead of wehoop-data repository URL
  • update_wbb_db() function updated to use sportsdataverse-data releases url instead of wehoop-data repository URL

Restored Functionality

  • wnba_draftboard() — rewritten against the new upstream endpoint https://content-api-prod.nba.com/public/1/leagues/wnba/draft/{season}/board. The old wnba.com/wp-json/api/v1/get_draft_board endpoint stopped serving data; the replacement returns a tidied named list of two tibbles — board (draft metadata) and picks (one row per pick with team, prospect, career stats, and headshot URL). See ?wnba_draftboard for the column schema.
  • Un-deprecations — the following wrappers were deprecated in 2.1.0 or earlier in 3.0.0 dev when the underlying endpoints were returning empty result sets. Re-probing in mid-season 2026 (verified 2026-05-16 against LeagueID=10, current 2025-26 season) shows the endpoints have resumed publishing populated data, so the lifecycle::deprecate_stop() shim has been removed and the original body restored on each:
    • wnba_playerprofilev2() — returns SeasonTotalsRegularSeason (9 seasons), SeasonTotalsPostSeason (7), SeasonTotalsAllStarSeason (6), SeasonTotalsPreseason (7), the matching CareerTotals* rollups, SeasonRankingsRegularSeason/PostSeason, SeasonHighs (17), CareerHighs (22), and NextGame for A’ja Wilson (PLAYER_ID = 1628932). Default league_id is now '10'.
    • wnba_teaminfocommon() — returns TeamInfoCommon (current-season W/L + conference/division + slug/code), TeamSeasonRanks (PTS/REB/AST + opponent PTS rank), and the 76-season AvailableSeasons list for Las Vegas Aces (TEAM_ID = 1611661319). Function body un-commented; error handling migrated from raw cli::cli_alert_danger() to .report_api_error() / .report_api_warning() for consistency.
    • wnba_teamyearbyyearstats() — returns TeamStats with 30 seasons × 34 columns of full franchise-level year-by-year ledger (GP, W, L, win%, conference rank, division rank, ratings) for the Aces.
    • wnba_leaguelineupviz() — returns LeagueLineupViz with 458–4,169 5-player lineup combinations × 25 columns (off/def/net rating, pace, TS%, eFG%) depending on filters, current 2025-26 WNBA season.

Bug Fixes

  • wnba_schedule() — migrated off the retired stats.wnba.com/stats/scheduleleaguev2 endpoint (returns Connection Reset since March 2026; issue #53) to the public CDN at cdn.wnba.com/static/json/staticData/scheduleLeagueV2.json. The CDN serves the same leagueSchedule.gameDates[].games[] payload as the dead stats endpoint, requires no authentication or special headers, and stays current with the live WNBA season. For historical seasons (CDN only serves the current season) the function now emits a cli::cli_alert_info pointing users at load_wnba_schedule(seasons = ...), which reads cached ESPN snapshots from the sportsdataverse-data releases.
  • wnba_leaguegamelog() — default league_id was '00' (NBA), causing every call without an explicit league_id argument to return ~2,500 rows of NBA data instead of WNBA (issue #48). Default is now '10' (WNBA), matching the rest of the package. Additionally, the parameter order in the outgoing query string was reordered to put LeagueID first, because the WNBA Stats API as of 2026 returns a Cloudflare HTML error page for the alphabetical ordering (Counter, DateFrom, DateTo, Direction, LeagueID, ...) but a populated LeagueGameLog for LeagueID-first. Verified 2026-05-16: same param values, alphabetical-first returns HTML, LeagueID-first returns 572 WNBA rows.
  • espn_wbb_conferences() — ESPN dropped the subGroups column from its scoreboard-conferences response; the function now uses dplyr::select(-dplyr::any_of("subGroups")) so new column drops no longer break the call. Also initializes conferences <- NULL before the tryCatch so a transient error surfaces a cli_alert_danger instead of object 'conferences' not found.
  • ncaa_wbb_NET_rankings() — the NCAA.com rankings table now exposes Conf/Prev/Quad 1..4 headers; after janitor::clean_names() these land as conf/prev/quad_1..4, breaking the documented schema. The function now renames conf → conference and prev → previous via dplyr::rename(dplyr::any_of(...)) so existing consumers keep working while the new quad_* columns ride along untouched.
  • Return-value initialization pattern — swept ~124 WNBA and ESPN wrappers that return(df_list) (or returned other vars assigned only inside tryCatch(expr = ...)) without initializing the return value first. When the API errored, callers saw object 'df_list' not found instead of the intended cli::cli_alert_danger + empty-list fallback. Each wrapper now initializes its return variable before tryCatch, so errors degrade gracefully to an empty list / NULL. Affected files: R/wnba_stats_boxscore.R, R/wnba_stats_boxscore_v3.R, R/wnba_stats_cume.R, R/wnba_stats_draft.R, R/wnba_stats_franchise.R, R/wnba_stats_leaders.R, R/wnba_stats_league.R, R/wnba_stats_league_dash.R, R/wnba_stats_lineups.R, R/wnba_stats_pbp.R, R/wnba_stats_player.R, R/wnba_stats_player_dash.R, R/wnba_stats_roster.R, R/wnba_stats_scoreboard.R, R/wnba_stats_shotchart.R, R/wnba_stats_team.R, R/wnba_stats_team_dash.R, R/wnba_stats_video.R, R/espn_wbb_data.R, R/espn_wnba_data.R, R/wnba_data_pbp.R.
  • wnba_data_pbp() — added plays_df <- data.frame() init so HTTP/2 stream errors from data.wnba.com return an empty data frame with a cli_alert_danger rather than object 'plays_df' not found.

Test Suite Hardening

  • Flipped 394 column assertions from strict expect_equal(sort(colnames(x)), sort(cols)) to subset checks expect_in(sort(cols), sort(colnames(x))) across 115 test files — per the CLAUDE.md guidance, WNBA / ESPN APIs add columns without removing old ones, and the strict checks were brittle.
  • Injected skip("No rows returned from endpoint at test time") guards into 114 test files so tests which access x[[1]] degrade gracefully to a skip (rather than a subscript-out-of-bounds error) when the upstream endpoint errors or returns empty.
  • Cleaned stale column names out of expected cols lists where ESPN renamed/removed columns (jersey, active, team_x_ref_2, team_is_all_star, Team_IDTEAM_ID).
  • Added per-element null/empty-column check helpers to test-wnba_teamvsplayer.R and test-wnba_playerdashboardbyclutch.R so tests tolerate the WNBA Stats API returning fewer result-set elements than the test expects.
  • Added tools/ directory (excluded from the package build via .Rbuildignore) containing the one-off R scripts used to apply the above sweeps: patch_df_list_init.R, patch_return_var_init.R, flip_expect_equal_cols.R, inject_skip_guard.R.

Deprecations (lifecycle, slated for 3.1.0 removal)

Adds lifecycle to Imports and migrates every existing cli::cli_alert_danger() deprecation stub to lifecycle::deprecate_stop(), matching the style used in hoopR. Calling any of these functions now errors with a structured lifecycleDeprecatedError that names a replacement (or, where none exists, an explanation). Their tests skip with a "Deprecated: <fn>() now errors by design; use <replacement>." message before the function call.

Newly deprecated in 3.0.0 — endpoints returned <!DOCTYPE html> (HTTP 404 / maintenance page) at test time:

Already deprecated, re-stated under the lifecycle pattern:

Soft warning (lifecycle::deprecate_warn) — function still runs but recommends a replacement; will escalate to deprecate_stop if the upstream endpoint isn’t restored:

  • wnba_boxscoresummaryv3()wnba_boxscoresummaryv2(). The V3 endpoint still answers 200 OK with the full schema, but the core result sets (game_summary, line_score, inactive_players, other_stats, available_video, game_info, arena_info) come back zero-row in 2025; only officials and last_five_meetings populate. The V2 variant still returns full data.

HTTP layer

  • Jittered exponential backoff in .retry_request(). Replaced the default fixed 2-second retry cadence with runif(1, 0.5, 1.5) * 2^i so retries from concurrent users hitting the same rate-limited endpoint don’t synchronize into a thundering-herd burst that Cloudflare scores as an attack. Same 3 max tries; same backoff envelope (~0.5–6s); just spread.

  • Restored proxy support. When wehoop migrated from httr to httr2 in the V3 work, the legacy httr::use_proxy() plumbing was dropped and request_with_proxy() quietly stopped honoring proxies (its ... was preserved purely for source compatibility — see the prior comment “currently unused (preserved for backwards compatibility with callers that previously passed httr::use_proxy() etc.)”). Both request_with_proxy() and the lower-level .retry_request() now accept a proxy = argument:

    • proxy = NULL (default) — libcurl reads http_proxy / https_proxy / no_proxy env vars automatically.
    • proxy = "http://host:port" — string form, forwarded to httr2::req_proxy(url = ...).
    • proxy = list(url=, port=, username=, password=, auth=) — named list spread into httr2::req_proxy() for authenticated proxies. Resolution order in .retry_request(): explicit proxy = arg → getOption("wehoop.proxy") → libcurl env vars. The ... thread works for WNBA Stats wrappers (which forward into request_with_proxy()); ESPN / NCAA wrappers call .retry_request() directly without ..., so use options(wehoop.proxy = ...) at the top of the session to cover those without per-function plumbing. Validated end-to-end: ncaa_wbb_teams() and espn_wnba_game_all() both routed through an authenticated test proxy via the option fallback.

Test infrastructure

  • Empty / NULL responses now FAIL the test instead of silently SKIPping. The earlier skip("No rows returned from endpoint at test time") guard was hiding regressions: when an upstream endpoint starts returning HTML (404 / maintenance) or breaks in some other silent way, the test should flag it. Converted all 117 such guards across tests/testthat/test-*.R from skip(...) to fail(...) + return(invisible(NULL)) so the test surfaces a FAIL count for follow-up. Deprecation skips and the env-gated skip_*_test() / skip_on_cran() / skip_on_ci() helpers are unchanged.
  • Pinned 16 wnba_team* test files from most_recent_wnba_season() to most_recent_wnba_season() - 1 so the team-stats endpoints have a known-completed season to query and don’t degenerate to “no rows” in the WNBA off-season window. wnba_teams() and standings tests still track the live season because that’s what they’re meant to verify.
  • Bumped .ncaa_headers() user-agent to Chrome 130 and added the Sec-Fetch-* / sec-ch-ua-* headers a real browser sends.
  • ncaa_wbb_teams() keeps its legacy stats.ncaa.org/team/inst_team_list scrape (per-season per-division team list with season_id populated), and now threads the proxy = argument from ... through to .retry_request() at the top level. stats.ncaa.org is fronted by Akamai and returns HTTP 403 (Reference #18.<...>) to many residential and cloud IP ranges; pass a proxy that egresses from a non-blocked address — either per-call (ncaa_wbb_teams(year, division, proxy = list(url=, port=, username=, password=))) or session-wide (options(wehoop.proxy = list(...))). See the Network access section of ?ncaa_wbb_teams for the full resolution order.

wehoop 2.1.0

CRAN release: 2024-07-21

wehoop 2.0.0

CRAN release: 2023-11-25

  • load_wnba_*() functions now use sportsdataverse-data releases url instead of wehoop-data repository URL
  • load_wbb_*() functions now use sportsdataverse-data releases url instead of wehoop-data repository URL
  • wnba_pbp() function and new wnba_pbps() function added with on_court (default TRUE) parameter to return on court players for each play event

wehoop 1.9.0

WNBA Stats API Live Endpoints

WNBA Boxscore V3 (and V3-styled) Endpoints Added

Other WNBA Stats API functions added

Other Functions Added

Proxy Capability Added and Other Notes

  • Add rlang dots option for passing httr::use_proxy() option to wnba_*() functions
  • Returns documentation added for all working WNBA Stats API endpoints and ESPN functions
  • Tests added for all working WNBA Stats API endpoints and ESPN functions, over 750 tests when run locally

wehoop 1.8.0

wehoop 1.7.0

wehoop 1.6.0

  • Updates tidyr and dplyr statements to use quotations on columns instead of data masking per tidyselect deprecation notice.

wehoop 1.5.0

CRAN release: 2022-06-17

~106 WNBA Stats API functions added

name file
wnba_alltimeleadersgrids() R/wnba_stats_leaders.R
wnba_assistleaders() R/wnba_stats_leaders.R
wnba_assisttracker() R/wnba_stats_leaders.R
wnba_boxscoreadvancedv2() R/wnba_stats_boxscore.R
wnba_boxscorefourfactorsv2() R/wnba_stats_boxscore.R
wnba_boxscoremiscv2() R/wnba_stats_boxscore.R
wnba_boxscoreplayertrackv2() R/wnba_stats_boxscore.R
wnba_boxscorescoringv2() R/wnba_stats_boxscore.R
wnba_boxscoresummaryv2() R/wnba_stats_boxscore.R
wnba_boxscoretraditionalv2() R/wnba_stats_boxscore.R
wnba_boxscoreusagev2() R/wnba_stats_boxscore.R
wnba_commonallplayers() R/wnba_stats_roster.R
wnba_commonplayerinfo() R/wnba_stats_roster.R
wnba_commonplayoffseries() R/wnba_stats_roster.R
wnba_commonteamroster() R/wnba_stats_roster.R
wnba_cumestatsplayer() R/wnba_stats_cume.R
wnba_cumestatsplayergames() R/wnba_stats_cume.R
wnba_cumestatsteam() R/wnba_stats_cume.R
wnba_cumestatsteamgames() R/wnba_stats_cume.R
wnba_data_pbp() R/wnba_data_pbp.R
wnba_draftboard() R/wnba_stats_draft.R
wnba_draftcombinedrillresults() R/wnba_stats_draft.R
wnba_draftcombinenonstationaryshooting() R/wnba_stats_draft.R
wnba_draftcombineplayeranthro() R/wnba_stats_draft.R
wnba_draftcombinespotshooting() R/wnba_stats_draft.R
wnba_draftcombinestats() R/wnba_stats_draft.R
wnba_drafthistory() R/wnba_stats_draft.R
wnba_fantasywidget() R/wnba_stats_lineups.R
wnba_franchisehistory() R/wnba_stats_franchise.R
wnba_franchiseleaders() R/wnba_stats_franchise.R
wnba_franchiseplayers() R/wnba_stats_franchise.R
wnba_gamerotation() R/wnba_stats_boxscore.R
wnba_homepageleaders() R/wnba_stats_leaders.R
wnba_homepagev2() R/wnba_stats_leaders.R
wnba_hustlestatsboxscore() R/wnba_stats_boxscore.R
wnba_leaguedashlineups() R/wnba_stats_lineups.R
wnba_leaguedashplayerbiostats() R/wnba_stats_league_dash.R
wnba_leaguedashplayerclutch() R/wnba_stats_league_dash.R
wnba_leaguedashplayershotlocations() R/wnba_stats_league_dash.R
wnba_leaguedashplayerstats() R/wnba_stats_league_dash.R
wnba_leaguedashteamclutch() R/wnba_stats_league_dash.R
wnba_leaguedashteamshotlocations() R/wnba_stats_league_dash.R
wnba_leaguedashteamstats() R/wnba_stats_league_dash.R
wnba_leaguegamefinder() R/wnba_stats_league.R
wnba_leaguegamelog() R/wnba_stats_league.R
wnba_leaguehustlestatsplayer() R/wnba_stats_hustle.R
wnba_leaguehustlestatsplayerleaders() R/wnba_stats_hustle.R
wnba_leaguehustlestatsteam() R/wnba_stats_hustle.R
wnba_leaguehustlestatsteamleaders() R/wnba_stats_hustle.R
wnba_leaguelineupviz() R/wnba_stats_lineups.R
wnba_leagueplayerondetails() R/wnba_stats_lineups.R
wnba_leagueseasonmatchups() R/wnba_stats_lineups.R
wnba_leaguestandingsv3() R/wnba_stats_league.R
wnba_pbp() R/wnba_stats_pbp.R
wnba_playerawards() R/wnba_stats_player.R
wnba_playercareerbycollege() R/wnba_stats_player.R
wnba_playercareerbycollegerollup() R/wnba_stats_player.R
wnba_playercareerstats() R/wnba_stats_player.R
wnba_playercompare() R/wnba_stats_player.R
wnba_playerdashboardbyclutch() R/wnba_stats_player_dash.R
wnba_playerdashboardbygamesplits() R/wnba_stats_player_dash.R
wnba_playerdashboardbygeneralsplits() R/wnba_stats_player_dash.R
wnba_playerdashboardbylastngames() R/wnba_stats_player_dash.R
wnba_playerdashboardbyopponent() R/wnba_stats_player_dash.R
wnba_playerdashboardbyshootingsplits() R/wnba_stats_player_dash.R
wnba_playerdashboardbyteamperformance() R/wnba_stats_player_dash.R
wnba_playerdashboardbyyearoveryear() R/wnba_stats_player_dash.R
wnba_playerestimatedmetrics() R/wnba_stats_player.R
wnba_playerfantasyprofile() R/wnba_stats_player.R
wnba_playerfantasyprofilebargraph() R/wnba_stats_player.R
wnba_playergamelog() R/wnba_stats_player.R
wnba_playergamelogs() R/wnba_stats_player.R
wnba_playergamestreakfinder() R/wnba_stats_player.R
wnba_playerheadshot() R/wnba_stats_player.R
wnba_playerindex() R/wnba_stats_player.R
wnba_playernextngames() R/wnba_stats_player.R
wnba_playerprofilev2() R/wnba_stats_player.R
wnba_playervsplayer() R/wnba_stats_player.R
wnba_scoreboard() R/wnba_stats_scoreboard.R
wnba_scoreboardv2() R/wnba_stats_scoreboard.R
wnba_shotchartdetail() R/wnba_stats_shotchart.R
wnba_shotchartleaguewide() R/wnba_stats_shotchart.R
wnba_teamdashboardbyclutch() R/wnba_stats_team_dash.R
wnba_teamdashboardbygamesplits() R/wnba_stats_team_dash.R
wnba_teamdashboardbygeneralsplits() R/wnba_stats_team_dash.R
wnba_teamdashboardbylastngames() R/wnba_stats_team_dash.R
wnba_teamdashboardbyopponent() R/wnba_stats_team_dash.R
wnba_teamdashboardbyshootingsplits() R/wnba_stats_team_dash.R
wnba_teamdashboardbyteamperformance() R/wnba_stats_team_dash.R
wnba_teamdashboardbyyearoveryear() R/wnba_stats_team_dash.R
wnba_teamdashlineups() R/wnba_stats_team_dash.R
wnba_teamdetails() R/wnba_stats_team.R
wnba_teamestimatedmetrics() R/wnba_stats_team.R
wnba_teamgamelog() R/wnba_stats_team.R
wnba_teamgamelogs() R/wnba_stats_team.R
wnba_teamgamestreakfinder() R/wnba_stats_team.R
wnba_teamhistoricalleaders() R/wnba_stats_team.R
wnba_teaminfocommon() R/wnba_stats_team.R
wnba_teamplayerdashboard() R/wnba_stats_team.R
wnba_teamplayeronoffdetails() R/wnba_stats_team.R
wnba_teamplayeronoffsummary() R/wnba_stats_team.R
wnba_teamvsplayer() R/wnba_stats_team.R
wnba_teamyearbyyearstats() R/wnba_stats_team.R
wnba_videodetails() R/wnba_stats_video.R
wnba_videoevents() R/wnba_stats_video.R
wnba_videostatus() R/wnba_stats_video.R

Adds 4 ESPN WBB and WNBA functions

wehoop 1.2.1

CRAN release: 2021-11-09

  • Minor release to stay ahead of tidyr release revdepchecks

wehoop 1.2.0

CRAN release: 2021-11-03

  • Add returns for all the functions
  • Update a handful of field names from the scoreboard functions and to also include neutral_site and conference_competition columns for the women’s college basketball scoreboard function.

wehoop 1.1.1

wehoop 1.1.0

Add schedule loaders

wehoop 1.0.0

Add team box score loaders

Add player box score loaders

Getting Started vignette

wehoop 0.9.2

Quick fix for update db functions

Dependency pruning

This update is a non-user facing change to package dependencies to shrink the list of dependencies.

wehoop 0.9.1

Clean names and team returns

wehoop 0.9.0

Loading capabilities added to the package

wehoop 0.3.0

Dependencies

  • R version 3.5.0 or greater dependency added
  • purrr version 0.3.0 or greater dependency added
  • rvest version 1.0.0 or greater dependency added
  • progressr version 0.6.0 or greater dependency added
  • usethis version 1.6.0 or greater dependency added
  • xgboost version 1.1.0 or greater dependency added
  • tidyr version 1.0.0 or greater dependency added
  • stringr version 1.3.0 or greater dependency added
  • tibble version 3.0.0 or greater dependency added
  • furrr dependency added
  • future dependency added

Test coverage

  • Added tests for all ESPN functions
Function Naming Convention Change
  • Similarly, data and metrics sourced from ESPN will begin with espn_ as opposed to wbb_ or wnba_.
  • Data sourced directly from the NCAA website will start the function with ncaa_

wehoop 0.2.0

wehoop 0.1.0