wehoop
3.0.0Access Women's Basketball Play by Play Data
Overview
A utility for working with women's basketball data. A scraping and aggregating interface for the WNBA Stats API https://stats.wnba.com/ and ESPN's https://www.espn.com women's college basketball and WNBA statistics. It provides users with the capability to access the game play-by-plays, box scores, standings and results to analyze the data for themselves.
**WBB cross-source crosswalk (wbb_*_crosswalk / load_wbb_*_crosswalk)**
Three new live builders — wbb_team_crosswalk(), wbb_schedule_crosswalk(),
wbb_player_crosswalk() — and three cached loaders —
load_wbb_team_crosswalk(), load_wbb_schedule_crosswalk(),
load_wbb_player_crosswalk() — link ESPN, Fox Sports (Bifrost), and Bart
Torvik (barttorvik.com/ncaaw) WBB team/game/player identities into wide,
one-row-per-entity tibbles keyed on espn_team_id. Team and schedule
crosswalks use deterministic normalized-name joins with curated alias tables
for known ESPN/Fox/Torvik name divergences (e.g. "UConn" / "Connecticut",
"Ole Miss" / "Mississippi"); player matching uses blocked Jaro-Winkler fuzzy
matching with jersey tiebreakers (min_confidence = 0.92). Yahoo columns are
NA placeholders reserved for a future source.
Show all changes in 3.0.0Hide the rest of the changes in 3.0.0
Two new women's Bart Torvik scrapers — bart_wbb_ratings() (T-Rank team
ratings) and bart_wbb_game_schedule() (full season schedule + results) —
pull CSV/JSON from barttorvik.com/ncaaw. A new fox_wbb_teams_all() enumerator
walks unseen Fox team ids to assemble the complete WBB team directory (single
fox_wbb_teams() calls only return one conference at a time). Parallels the
WNBA crosswalk surface added in the same release.
**WNBA cross-source crosswalk (wnba_*_crosswalk / load_wnba_*_crosswalk)**
Three new live builders — wnba_team_crosswalk(), wnba_schedule_crosswalk(),
wnba_player_crosswalk() — and three cached loaders —
load_wnba_team_crosswalk(), load_wnba_schedule_crosswalk(),
load_wnba_player_crosswalk() — link ESPN, WNBA Stats API, and Fox Sports
team/game/player identities into wide, one-row-per-entity tibbles.
wnba_team_crosswalk() and wnba_player_crosswalk() are keyed on
espn_team_id; wnba_schedule_crosswalk() is keyed on espn_game_id.
Team and schedule crosswalks use deterministic normalized-name joins; player
matching uses blocked Jaro-Winkler fuzzy matching with jersey/DOB tiebreakers
(min_confidence = 0.92). Yahoo columns are NA placeholders reserved for a
future source. A new fox_wnba_teams() / fox_wbb_teams() wrapper provides
the Fox Bifrost team directory used by the crosswalk engine. Cached artifacts
are backed by the wnba_crosswalk release tag in sportsdataverse-data.
**Fox Sports basketball wrappers (fox_wnba_* / fox_wbb_*)**
Read-only Fox Sports "Bifrost" basketball wrappers over
api.foxsports.com/bifrost/v1/{wnba,wcbk}/*, complementing the espn_wnba_* /
espn_wbb_* families. Eight wrappers per league flatten Fox's layout-oriented
JSON (sections → tables → rows → cells) into tidy wehoop_data tibbles:
fox_<lg>_pbp (period-based play-by-play), _boxscore, _odds,
_team_roster, _team_stats, _team_gamelog, _standings,
_league_leaders. A shared internal layer backs both leagues. Verified live;
reverse-engineering notes + an OpenAPI 3.1 spec live in the sdv-internal-refs
repo. Parallels the cfbfastR / hoopR / fastRhockey / baseballr /
sportsdataverse-py fox_* families.
**Her Hoop Stats (hhs_*) — subscription**
New hhs_*() family for Her Hoop Stats, a
subscription women's-basketball statistics service. Like hoopR's KenPom kp_*()
wrappers, these log in with the subscriber's *own* credentials (read from the
email/password arguments, the wehoop.herhoopstats_email /
wehoop.herhoopstats_password options, or the HERHOOPSTATS_EMAIL /
HERHOOPSTATS_PW environment variables — never bundled) and reuse the session
cookie:
- **
hhs_teams(min_season, max_season, division)** — NCAA women's team single-season summary index (with ateam_linkper row). - **
hhs_team_stats(team_link)** — a team's statistics page. - **
hhs_team_roster(team_link)** — a team's player roster.
Examples are \dontrun{} and tests skip unless credentials are present, so
R CMD check never attempts a login. Because the service is subscriber-only, the
login flow and member-table selectors are provided as a starting point and may
need adjustment if the site changes.
**WNBA Basketball-Reference (bref_wnba_*)**
New bref_wnba_*() family scraping WNBA data from
Basketball-Reference — a deep
historical source (back to 1997) wehoop did not previously cover, complementing
the WNBA Stats API and ESPN wrappers. No account or API key is required:
- **
bref_wnba_player_stats(season, table)** — league-wide player season stats (table = "per_game"/"totals"/"advanced"). - **
bref_wnba_team_stats(season, table)** — team season stats (table = "per_game"/"totals"/"per_poss"/"advanced"). - **
bref_wnba_standings(season)** — both conferences, labelledEastern/Western.
All echo the requested season (and the stat table) as columns. The two
Sports-Reference scraping quirks are handled internally (comment-hidden tables
are un-commented; columns are read from each cell's data-stat attribute).
Basketball-Reference rate-limits aggressive scraping (~20 requests/minute);
examples are \donttest{} and tests are network-gated.
**ESPN endpoint naming convention (game_*/player_*)**
The new-in-3.0.0 ESPN endpoint wrappers are named with the shared sportsdataverse
taxonomy used by cfbfastR/hoopR: event_competitor* → game_team*,
event_competition → game, event_* → game_*, and athlete_* → player_* (58
functions). These wrappers are new this release and were never on CRAN (2.1.0), so
the convention is applied directly without deprecation shims. The web-common-v3
/athletes/{id}/stats wrapper becomes *_player_stats_v3 (kept alongside the
core-v2 *_player_stats, a different endpoint). The long-standing
espn_wnba_pbp() / espn_wnba_team_box() / etc. are unaffected.
**New exported functions**
*NCAA WBB league-wide RAPM loader*
| Function | Description |
|---|---|
| load_ncaa_wbb_rapm() | League-wide regularized adjusted plus-minus (single ridge over all Division I stints per season, Torvik-gated), one row per player-season. Backed by the ncaa_wbb_rapm release tag, seasons 2011-2026. Distinct from the within-team load_ncaa_wbb_rapm_within_team(). |
*New WNBA Stats API V3 endpoints*
| Function | Description |
|---|---|
| wnba_playbyplayv3() | V3 play-by-play endpoint wrapper. Used internally by wnba_pbp() via a V3→V2 compatibility pipeline (.v3_to_v2_format_wnba(), .build_player_roster_wnba(), .players_on_court_v3_wnba()) that retains V2-compatible columns while adding V3-only columns (x_legacy, y_legacy, shot_distance, shot_result, is_field_goal, points_total, shot_value). |
| wnba_boxscoresummaryv3() | V3 boxscore summary endpoint wrapper. |
| wnba_boxscoreusagev3() | V3 boxscore usage endpoint wrapper. |
*58 new ESPN endpoint wrappers (across 7 domains)*
Built on shared internal helpers in R/espn_basketball_*_helpers.R so each WBB/WNBA pair stays DRY (one bugfix to the helper propagates to both). The pkgdown reference index was reorganized into 14 per-domain ESPN subsections to scale the rendered nav.
*News & calendar*
| Function | Description |
|---|---|
| espn_wbb_news() / espn_wnba_news() | League-level news feed (site-v2 /news). |
| espn_wbb_team_news() / espn_wnba_team_news() | Team-level news feed (site-v2 /teams/{id}/news). |
| espn_wbb_calendar() / espn_wnba_calendar() | Scoreboard calendar blocks (site-v2 /scoreboard?dates={season}). |
*Injuries*
| Function | Description |
|---|---|
| espn_wbb_injuries() / espn_wnba_injuries() | League-wide injury feed (site-v2 /injuries). The season parameter is attached as a constant output column for downstream joins (ESPN's injury endpoint has no server-side season filter). |
| espn_wbb_team_injuries() / espn_wnba_team_injuries() | Team-scoped injury feed (site-v2 /teams/{id}/injuries). |
WBB injury data is typically sparse on ESPN; both variants return an empty tibble (rather than erroring) when no injuries are reported.
*Team detail*
| Function | Description |
|---|---|
| espn_wbb_team() / espn_wnba_team() | Single-team info as a named list (Info, Record, NextEvent, StandingSummary, Coaches) via site-v2 /teams/{id}. |
| espn_wbb_team_roster() / espn_wnba_team_roster() | Roster (one row per athlete with position, height, weight, headshot) via site-v2 /teams/{id}/roster. |
| espn_wbb_team_schedule() / espn_wnba_team_schedule() | Schedule (one row per event with opponent, venue, broadcast, result) via site-v2 /teams/{id}/schedule. |
| espn_wbb_team_leaders() / espn_wnba_team_leaders() | Statistical leaders (long format per category-rank-athlete) via site-v2 /teams/{id}/leaders. |
*Athlete coverage* (8 endpoints × 2 leagues = 16 functions)
| Function | Endpoint family | Description |
|---|---|---|
| espn_wbb_athlete_info() / espn_wnba_athlete_info() | site-v2 | Athlete bio/team/position/status/college/draft info. |
| espn_wbb_athlete_overview() / espn_wnba_athlete_overview() | web-common-v3 | Season overview and last-5-games. |
| espn_wbb_athlete_stats() / espn_wnba_athlete_stats() | web-common-v3 | Per-category stats as a named list. |
| espn_wbb_athlete_gamelog() / espn_wnba_athlete_gamelog() | web-common-v3 | Game-by-game log. |
| espn_wbb_athlete_splits() / espn_wnba_athlete_splits() | web-common-v3 | Long-format home/away/opponent splits. |
| espn_wbb_athlete_eventlog() / espn_wnba_athlete_eventlog() | core-v2 | Per-event log; statistics.$ref URLs returned as a statistics_ref character column (not auto-resolved). |
| espn_wbb_athlete_awards() / espn_wnba_athlete_awards() | core-v2 | Awards (sparse / often empty). Empty payload returns a canonical-shape empty tibble. |
| espn_wbb_athlete_statisticslog() / espn_wnba_athlete_statisticslog() | core-v2 | Statistics log. |
*WNBA-only ESPN endpoints*
| Function | Description |
|---|---|
| espn_wnba_draft() | Paginates core-v2 /seasons/{year}/draft (up to 20 pages); flat tibble of picks (round, pick, overall, team, athlete, position, college). |
| espn_wnba_freeagents() | Wraps core-v2 /seasons/{year}/freeagents; returns an empty tibble outside the free-agent window. |
| espn_wnba_transactions() | Wraps site-v2 /transactions?season={year}&limit={limit} with null-safe to_team_id for release transactions. |
| espn_wnba_conferences() | Mirrors espn_wbb_conferences() against the WNBA scoreboard-conferences endpoint; uses the same dplyr::select(-dplyr::any_of("subGroups")) drift guard. |
*Event detail* — all under core-v2 /events/{id}/competitions/{id}/
| Function | Description |
|---|---|
| espn_wbb_event_odds() / espn_wnba_event_odds() | Game-level odds (one row per provider; WBB typically empty). |
| espn_wbb_event_probabilities() / espn_wnba_event_probabilities() | Paginated play-level win probabilities (/probabilities); internal page loop capped at 50 pages, respects limit parameter. |
| espn_wbb_event_officials() / espn_wnba_event_officials() | Per-game officials. |
| espn_wbb_event_broadcasts() / espn_wnba_event_broadcasts() | Broadcast outlets. |
*League-wide catalog* (6 endpoints × 2 leagues = 12 functions)
| Function | Description |
|---|---|
| espn_wbb_leaders() / espn_wnba_leaders() | League leaders (web-common-v3 statistics/byathlete). |
| espn_wbb_venues() / espn_wnba_venues() | Venue catalog. |
| espn_wbb_coaches() / espn_wnba_coaches() | Coach roster. |
| espn_wbb_athletes_index() / espn_wnba_athletes_index() | Athlete index, paginated with progress messages (WBB default limit 25000, WNBA 5000). |
| espn_wbb_seasons() / espn_wnba_seasons() | Season list. |
| espn_wbb_season_info() / espn_wnba_season_info() | Single-season info; $ref components returned as character columns (not auto-resolved). |
*New data loaders (50+ functions)*
All loaders follow the existing load_wnba_pbp() shape — (seasons, ..., dbConnection = NULL, tablename = NULL), progressively() decorator, data.table::rbindlist(use.names = TRUE, fill = TRUE), optional DB write, and a final wehoop_data class set on the in-memory result. Tests gated by WEHOOP_LOAD_TESTS=1 via skip_load_test() in tests/testthat/helper-skip.R. All datasets read from new sportsdataverse-data release tags published by the wehoop-wbb-data, wehoop-wnba-data, and wehoop-wnba-stats-data pipelines.
*Season-level rosters and player stats*
| Function | Release tag |
|---|---|
| load_wbb_rosters() | espn_womens_college_basketball_rosters |
| load_wbb_player_stats() | espn_womens_college_basketball_player_season_stats |
| load_wnba_rosters() | espn_wnba_rosters |
| load_wnba_player_stats() | espn_wnba_player_season_stats |
| load_wnba_stats_rosters() | wnba_stats_rosters |
| load_wnba_stats_coaches() | wnba_stats_coaches |
| load_wnba_stats_player_stats() | wnba_stats_player_season_stats |
| load_wnba_stats_lineups() | wnba_stats_lineups |
New file R/load_wnba_stats.R houses the four wnba_stats_* loaders. Adds most_recent_wnba_stats_season() helper in R/utils.R (thin wrapper around most_recent_wnba_season() for naming symmetry with the wnba_stats_* family).
*Season-summary loaders*
| Function | Release tag |
|---|---|
| load_wbb_team_stats() | espn_womens_college_basketball_team_season_stats |
| load_wbb_standings() | espn_womens_college_basketball_standings |
| load_wnba_team_stats() | espn_wnba_team_season_stats |
| load_wnba_standings() | espn_wnba_standings |
| load_wnba_draft() | espn_wnba_draft |
| load_wnba_stats_team_stats() | wnba_stats_team_season_stats |
| load_wnba_stats_standings() | wnba_stats_standings |
| load_wnba_stats_draft() | wnba_stats_draft |
*Shot events, per-game rosters, game officials*
| Function | Release tag |
|---|---|
| load_wbb_shots() | espn_womens_college_basketball_shots |
| load_wbb_game_rosters() | espn_womens_college_basketball_game_rosters |
| load_wbb_officials() | espn_womens_college_basketball_officials |
| load_wnba_shots() | espn_wnba_shots |
| load_wnba_game_rosters() | espn_wnba_game_rosters |
| load_wnba_officials() | espn_wnba_officials |
| load_wnba_stats_shots() | wnba_stats_shots |
| load_wnba_stats_game_rosters() | wnba_stats_game_rosters |
| load_wnba_stats_officials() | wnba_stats_officials |
*WNBA Stats API schedule + game logs + PBP*
| Function | Release tag |
|---|---|
| load_wnba_stats_schedule() + _manifest() | wnba_stats_schedules |
| load_wnba_stats_player_game_logs() + _manifest() | wnba_stats_player_game_logs (new tag) |
| load_wnba_stats_pbp() + _manifest() | wnba_stats_pbp |
Populated by the rewritten wehoop-wnba-stats-data/R/wnba_stats_01_pbp.R pipeline (V3 PBP with on-court lineups supplied directly by wnba_pbp(), plus possession assignment, FT-to-foul attribution, garbage-time flag, and a per-season + master schedule build). All three datasets are wired into update_wnba_stats_db() (datasets = c("schedule", "player_game_logs", "pbp", ...)).
*Manifest helpers + selective DB updates*
- Adds **25
load_*_manifest()helpers** (one per non-PBP/non-schedule dataset across the three release-tag families). Each manifest returns the per-seasonseason/row_count/generated_at_utc/source_endpointCSV attached to its release tag, so users can discover available seasons without triggering a heavyload_*()call. - Adds a
datasets=argument onupdate_wnba_db()/update_wbb_db()and a newupdate_wnba_stats_db()for selective DB population. Example:update_wbb_db(datasets = c("rosters", "player_stats")). Whendatasets=NULL, the historical play-by-play behavior is preserved.
*Vignettes & reference reorganization*
- Adds
vignettes/espn-endpoints.Rmdcovering all 80 ESPN basketball wrappers (existing 22 + 58 new). - Reorganizes the pkgdown reference index into 14 per-domain ESPN subsections so the rendered nav scales for the new surface.
*Tier 1 core-v2 expansion (crawler-driven)*
20 new wrappers across 9 resource families, paired with the matching hoopR additions. Surfaced by an internal $ref-following crawler that mapped the entire reachable b
The NEWS section is longer than shown here.
From NEWS.md in the release
Install
Health
- OK13 OK2026-08-04
- NOTE12 OK, 1 NOTE2026-08-01
- OK13 OK2026-06-09
- ERROR12 OK, 1 ERROR2026-06-08
- OK14 OK2026-03-10
Documentation
- Help pages
- 351 (86 internal)includes a package overview page
- Examples that run
- 2%3 run in a plain check · 154 only when donttest examples are enabled (R CMD check --as-cran) · 3 never run
- Exported functions with examples
- 61%
- Documented parameters
- 99%
- Return-value docs
- 100%
- Help pages citing references
- 0%
Downloads
Repository
- PRs merged (all time)
- 90%
- Median days to close, 50 most recently updated closed issues
- 182
- Median days to close, 50 most recently updated closed PRs
- 0
Stars over time
Forks over time
Releases over time
Issues over time
PRs over time
Commits over time
16 development-tooling and community-health practices detected across 7 families in the upstream repository
Checks run against github.com/sportsdataverse/wehoop on 2026-10-11.
The R CMD check workflow runs on Linux, macOS and Windows, and on R-devel
GitHub Pages site last deployed 2026-10-10 · The repository has a site deploy workflow
pkgdown site last built 2026-10-10
Show all practicesHide 3 practices
This repository shows signs of AI coding tools.
- GitHub Copilotfirst seen 2026-03-19Seen in the repository: .github/copilot-instructions.mdPull request: opened by its own account
- Claude Codefirst seen 2026-04-14Seen in the repository: CLAUDE.mdNamed in .Rbuildignore: CLAUDE.mdNamed in .gitignore: .claude
- Gemini CLIfirst seen 2026-06-30Named in .gitignore: .gemini
Dependencies
Installing wehoop adds 47 packages (28 with compiled code, 38 MB of source tarballs). Heaviest: stringi 11 MB, data.table 5.7 MB, glmnet 2.7 MB.
Code & Tests
Datasets
People & History
Pick two releases to compare their code metrics.
- 3.0.0Latest2026-08-24 · current release · diff ↗ ·
added 283 exports
bart_wbb_game_schedule, bart_wbb_ratings, bref_wnba_player_stats, bref_wnba_standings, bref_wnba_team_stats, espn_basketball_player_core, espn_wbb_athletes_index, espn_wbb_award, espn_wbb_calendar, espn_wbb_coach, espn_wbb_coach_record, espn_wbb_coach_season, espn_wbb_coaches, espn_wbb_franchise, espn_wbb_franchises, espn_wbb_game_broadcasts, espn_wbb_game_odds, espn_wbb_game_official_detail, espn_wbb_game_officials, espn_wbb_game_play, espn_wbb_game_play_personnel, espn_wbb_game_player_box, espn_wbb_game_powerindex, espn_wbb_game_predictor, espn_wbb_game_probabilities, espn_wbb_game_propbets, espn_wbb_game_situation, espn_wbb_game_team_leaders, espn_wbb_game_team_linescores, espn_wbb_game_team_records and 253 more - RR 4.6.0 released · 2026-04-24
- RR 4.5.0 released · 2025-04-11
- 2.1.0
- RR 4.4.0 released · 2024-04-24
- 2.0.02023-11-26 · diff ↗ ·
added 31 exports
espn_wbb_game_rosters, espn_wbb_player_stats, espn_wnba_game_rosters, espn_wnba_player_stats, helper_espn_wbb_pbp, helper_espn_wbb_player_box, helper_espn_wbb_team_box, helper_espn_wnba_pbp, helper_espn_wnba_player_box, helper_espn_wnba_team_box, ncaa_wbb_teams, wnba_boxscoreadvancedv3, wnba_boxscorefourfactorsv3, wnba_boxscorehustlev2, wnba_boxscoremiscv3, wnba_boxscoreplayertrackv3, wnba_boxscorescoringv3, wnba_boxscoretraditionalv3, wnba_franchiseleaderswrank, wnba_infographicfanduelplayer, wnba_leaderstiles, wnba_leagueleaders, wnba_live_boxscore, wnba_live_pbp, wnba_pbps, wnba_schedule, wnba_scoreboardv3, wnba_shotchartlineupdetail, wnba_teams, wnba_todays_scoreboard and 1 more - RR 4.3.0 released · 2023-04-21
- 1.5.02022-06-17 · diff ↗ ·
added 110 exports
espn_wbb_team_stats, espn_wnba_team_stats, most_recent_wbb_season, most_recent_wnba_season, wnba_alltimeleadersgrids, wnba_assistleaders, wnba_assisttracker, wnba_boxscoreadvancedv2, wnba_boxscorefourfactorsv2, wnba_boxscoremiscv2, wnba_boxscoreplayertrackv2, wnba_boxscorescoringv2, wnba_boxscoresummaryv2, wnba_boxscoretraditionalv2, wnba_boxscoreusagev2, wnba_commonallplayers, wnba_commonplayerinfo, wnba_commonplayoffseries, wnba_commonteamroster, wnba_cumestatsplayer, wnba_cumestatsplayergames, wnba_cumestatsteam, wnba_cumestatsteamgames, wnba_data_pbp, wnba_draftboard, wnba_draftcombinedrillresults, wnba_draftcombinenonstationaryshooting, wnba_draftcombineplayeranthro, wnba_draftcombinespotshooting, wnba_draftcombinestats and 80 more - RR 4.2.0 released · 2022-04-22
- 1.2.12021-11-09 · diff ↗
- 1.2.02021-11-03
- RR 4.1.0 released · 2021-05-18
Package metadata
- First published
- 2021-11-03
- Total releases
- 6 / 5 yrs
- License
- MIT + file LICENSE OSI
- Minimum R
- ≥ 4.1.0
- Bundled data
- 2.6 KB / 1 file
- Download size
- 741 KB
Cite
Cite this package
Run in R for the authors' preferred citation:
citation("wehoop")The package provides a citation file that builds its entry when R runs it. Run citation() to see it.
Cite the R Observatory
For a number measured here: a download total, a coverage figure, an archival date.
From data release v2026-10-17, which the citation names so these numbers can be found later. More on citing and the projects behind them.