- Integer id columns are decimal strings — Every id column of integers (
id,*_id,game_pk,playerId, …) comes back as exact decimal strings on every surface — parsers, producers, loaders, HockeyTech analytics. Compare and join ids as strings;Number(row.game_id)for a safe number back. (changelog) - 400 / 422 raise
InvalidParameterError— For every family (it wasAssetFetchError), never retried; the message names host, path and status with a redacted excerpt of the body. (changelog) - Typed returns — generated row types for
parsed: true— TypeScript only. A wrapper's raw payload resolves tounknown(wasany); verified endpoints resolve to their row interfaces; the summary dispatchers toParsedTables. Narrow or cast a raw payload. (changelog) - Typed wrapper params and loader rows;
strictmode — TypeScript only. A param the endpoint does not have, a missing required path param or a non-booleanboolparam is a type error; parser rows areRecord<string, unknown>; loader rows are their generated row types. (changelog) - Wrapper failures raise
NoDataError/AssetFetchError— Instead of raw axios errors.NoDataError= the fetch worked and there is nothing there (404, ESPN{ code: 404 });AssetFetchError= the fetch failed (403 / 429 / 5xx after retries, network). Retries followDEFAULT_RETRY_STATUSESwith backoff. (changelog)
sdv.mbb — Native (non-ESPN) APIs
Beyond the ESPN surface, sdv.mbb also wraps the league's own live APIs. Same { parsed: true } contract; each method is exposed under both snake_case and camelCase on sdv.mbb.
Native API — KenPom
Flat (non-ESPN) wrappers for kenpom.com (subscription; HTML pages). Host: https://kenpom.com. Each method is exposed under BOTH its snake_case name kenpom_<endpoint> (sdv-py's name, py/R parity) and its camelCase form (canonical) on sdv.mbb. Pass { parsed: true } to run the payload through its tidy.js parser; omit it for the raw response. Endpoints marked multi-table parse to several frames in sdv-py; with parsed: true they return the default shown in the Parser column (one sub-frame, or every table as a dict), and section: "<name>" selects any other (an unknown name throws, listing the valid ones). Auth: a KenPom subscription login — email / password on the call, or the KENPOM_EMAIL / KENPOM_PW environment variables (hoopR's KP_USER / KP_PW also work). The session is logged in once and reused. The raw response is the page HTML; { parsed: true } returns every table on the page keyed by its HTML id.
| Method | HTTP | Path params | Query params | Parser | Auth |
|---|---|---|---|---|---|
kenpom_archive_ratings / kenpomArchiveRatings | https://kenpom.com/archive.php | — | date → d | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_arenas / kenpomArenas | https://kenpom.com/arenas.php | — | year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_box / kenpomBox | https://kenpom.com/box.php | — | game_id → g, year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_coach_history / kenpomCoachHistory | https://kenpom.com/history.php | — | coach → c | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_conference / kenpomConference | https://kenpom.com/conf.php | — | conf → c, year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_conference_history / kenpomConferenceHistory | https://kenpom.com/confhistory.php | — | conf → c | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_conference_stats / kenpomConferenceStats | https://kenpom.com/confstats.php | — | year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_efficiency / kenpomEfficiency | https://kenpom.com/summary.php | — | year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_fan_match / kenpomFanMatch | https://kenpom.com/fanmatch.php | — | date → d | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_foul_trouble / kenpomFoulTrouble | https://kenpom.com/foul_trouble.php | — | year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_four_factors / kenpomFourFactors | https://kenpom.com/stats.php | — | year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_game_attributes / kenpomGameAttributes | https://kenpom.com/game_attrs.php | — | year → y, attribute → s | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_game_plan / kenpomGamePlan | https://kenpom.com/gameplan.php | — | team, year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_height / kenpomHeight | https://kenpom.com/height.php | — | year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_home_court_advantage / kenpomHomeCourtAdvantage | https://kenpom.com/hca.php | — | — | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_kpoy / kenpomKpoy | https://kenpom.com/kpoy.php | — | year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_officials / kenpomOfficials | https://kenpom.com/officials.php | — | year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_opponent_tracker / kenpomOpponentTracker | https://kenpom.com/opptracker.php | — | team, year → y, side → t | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_player_career / kenpomPlayerCareer | https://kenpom.com/player.php | — | player_id → p | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_player_stats / kenpomPlayerStats | https://kenpom.com/playerstats.php | — | year → y, metric → s, conf → f, conf_only → c | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_point_distribution / kenpomPointDistribution | https://kenpom.com/pointdist.php | — | year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_program_ratings / kenpomProgramRatings | https://kenpom.com/programs.php | — | — | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_ratings / kenpomRatings | https://kenpom.com/index.php | — | year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_referee / kenpomReferee | https://kenpom.com/referee.php | — | referee → r, year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_team / kenpomTeam | https://kenpom.com/team.php | — | team, year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_team_history / kenpomTeamHistory | https://kenpom.com/history.php | — | team → t | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_team_players_expanded / kenpomTeamPlayersExpanded | https://kenpom.com/player-expanded.php | — | team, year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_team_stats / kenpomTeamStats | https://kenpom.com/teamstats.php | — | year → y, side → od | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_trends / kenpomTrends | https://kenpom.com/trends.php | — | — | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
kenpom_win_probability / kenpomWinProbability | https://kenpom.com/winprob.php | — | game_id → g, year → y | parse_kenpom_page — multi-table (default: every table, as a dict): section = a table id on the page (e.g. ratings_table; team.php: schedule_table, player_table, depth_chart) | yes |
Generated by tools/codegen/generate.mjs from tools/codegen/endpoints/kenpom.yaml (vendored from sdv-py) — see How this library is built.