Skip to main content
Breaking in 4.0.0
  • 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 was AssetFetchError), 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 to unknown (was any); verified endpoints resolve to their row interfaces; the summary dispatchers to ParsedTables. Narrow or cast a raw payload. (changelog)
  • Typed wrapper params and loader rows; strict mode — TypeScript only. A param the endpoint does not have, a missing required path param or a non-boolean bool param is a type error; parser rows are Record<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 follow DEFAULT_RETRY_STATUSES with 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.

MethodHTTPPath paramsQuery paramsParserAuth
kenpom_archive_ratings / kenpomArchiveRatingshttps://kenpom.com/archive.php—date → dparse_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 / kenpomArenashttps://kenpom.com/arenas.php—year → yparse_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 / kenpomBoxhttps://kenpom.com/box.php—game_id → g, year → yparse_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 / kenpomCoachHistoryhttps://kenpom.com/history.php—coach → cparse_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 / kenpomConferencehttps://kenpom.com/conf.php—conf → c, year → yparse_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 / kenpomConferenceHistoryhttps://kenpom.com/confhistory.php—conf → cparse_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 / kenpomConferenceStatshttps://kenpom.com/confstats.php—year → yparse_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 / kenpomEfficiencyhttps://kenpom.com/summary.php—year → yparse_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 / kenpomFanMatchhttps://kenpom.com/fanmatch.php—date → dparse_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 / kenpomFoulTroublehttps://kenpom.com/foul_trouble.php—year → yparse_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 / kenpomFourFactorshttps://kenpom.com/stats.php—year → yparse_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 / kenpomGameAttributeshttps://kenpom.com/game_attrs.php—year → y, attribute → sparse_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 / kenpomGamePlanhttps://kenpom.com/gameplan.php—team, year → yparse_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 / kenpomHeighthttps://kenpom.com/height.php—year → yparse_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 / kenpomHomeCourtAdvantagehttps://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 / kenpomKpoyhttps://kenpom.com/kpoy.php—year → yparse_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 / kenpomOfficialshttps://kenpom.com/officials.php—year → yparse_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 / kenpomOpponentTrackerhttps://kenpom.com/opptracker.php—team, year → y, side → tparse_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 / kenpomPlayerCareerhttps://kenpom.com/player.php—player_id → pparse_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 / kenpomPlayerStatshttps://kenpom.com/playerstats.php—year → y, metric → s, conf → f, conf_only → cparse_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 / kenpomPointDistributionhttps://kenpom.com/pointdist.php—year → yparse_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 / kenpomProgramRatingshttps://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 / kenpomRatingshttps://kenpom.com/index.php—year → yparse_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 / kenpomRefereehttps://kenpom.com/referee.php—referee → r, year → yparse_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 / kenpomTeamhttps://kenpom.com/team.php—team, year → yparse_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 / kenpomTeamHistoryhttps://kenpom.com/history.php—team → tparse_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 / kenpomTeamPlayersExpandedhttps://kenpom.com/player-expanded.php—team, year → yparse_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 / kenpomTeamStatshttps://kenpom.com/teamstats.php—year → y, side → odparse_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 / kenpomTrendshttps://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 / kenpomWinProbabilityhttps://kenpom.com/winprob.php—game_id → g, year → yparse_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.