KenPom APIkenpom.com ↗
Access KenPom Division I college basketball ratings via API. Retrieve team efficiency metrics, rankings, tempo, and strength-of-schedule data from 2002 to 2026.
What is the KenPom API?
The KenPom API exposes 4 endpoints covering Pomeroy College Basketball Ratings for every Division I team from the 2002 through 2026 seasons. The get_ratings endpoint returns the full rankings table with adjusted efficiency margin, offensive and defensive efficiency, tempo, luck, and strength-of-schedule fields. Two search endpoints let you find teams and coaches by name substring, and get_ratings_by_conference narrows results to a single conference abbreviation.
curl -X GET 'https://api.parse.bot/scraper/6092ec52-1c27-4ba8-88d3-b6893da27e69/get_ratings?year=2024' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace kenpom-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
from parse_apis.kenpom_college_basketball_api import KenPom, TeamRating, Season
kenpom = KenPom()
# Get ratings for the 2025 season
season = kenpom.season(year="2025")
for team in season.ratings(limit=5):
print(team.team, team.conference, team.adj_em, team.w_l)
# Filter by conference
for team in season.ratings_by_conference(conference="ACC"):
print(team.rank, team.team, team.adj_oe, team.adj_de)
# Search for teams by name
for team in kenpom.teams.search(query="Michigan"):
print(team.name)
# Search for coaches by name
for coach in kenpom.coaches.search(query="Izzo"):
print(coach.name)
Fetches the main Pomeroy College Basketball Ratings table for a given season. Returns all Division I teams with their rankings, adjusted efficiency margins, tempo, luck, and strength-of-schedule metrics. Each team includes rank, conference, win-loss record, and 10 paired metric/rank columns. Defaults to the current season when year is omitted.
| Param | Type | Description |
|---|---|---|
| year | string | The season year (2002-2026). |
{
"type": "object",
"fields": {
"year": "string indicating the requested season year",
"ratings": "array of TeamRating objects"
},
"sample": {
"data": {
"year": "2025",
"ratings": [
{
"w_l": "35-4",
"luck": "-.026",
"rank": "1",
"team": "Duke",
"adj_t": "66.0",
"adj_de": "90.8",
"adj_em": "+39.29",
"adj_oe": "130.1",
"luck_rank": "252",
"adj_t_rank": "269",
"conference": "ACC",
"sos_adj_de": "101.9",
"sos_adj_em": "+11.51",
"sos_adj_oe": "113.4",
"adj_de_rank": "5",
"adj_oe_rank": "1",
"ncsos_adj_em": "+9.46",
"sos_adj_de_rank": "55",
"sos_adj_em_rank": "51",
"sos_adj_oe_rank": "43",
"ncsos_adj_em_rank": "21"
}
]
},
"status": "success"
}
}About the KenPom API
Ratings and Efficiency Metrics
The get_ratings endpoint accepts an optional year parameter (2002–2026) and returns an array of team rating objects covering every Division I program for that season. Each object includes rank, team, conference, w_l, adj_em (adjusted efficiency margin), adj_oe with its rank, adj_de with its rank, and adj_t (adjusted tempo) with its rank. Omitting the year returns the current season's data. These metrics are the core of the Pomeroy system — adj_em is the margin the team would be expected to outscore an average team per 100 possessions on a neutral floor.
Conference Filtering
get_ratings_by_conference shares the same year parameter and adds a required conference string. Matching is case-insensitive against the abbreviations used in the ratings table — ACC, B12, SEC, B10, and so on. The response echoes the requested abbreviation back in a conference field and includes a count of matched teams, making it straightforward to verify the filter hit the right group.
Team and Coach Search
search_teams accepts a query substring and returns an array of matching team name strings. Omitting the query returns the full list of all tracked team names. search_coaches works the same way against coach full names — first and last name. Nicknames and aliases are not matched; only literal substrings of the coach's official name will return results. Both endpoints echo the query back in the response.
The KenPom API is a managed, monitored endpoint for kenpom.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when kenpom.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official kenpom.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a season-over-season efficiency trend tracker using
adj_emvalues from multipleget_ratingsyear calls - Compare adjusted offensive and defensive efficiency rankings across all teams in a single conference via
get_ratings_by_conference - Populate a team autocomplete search box using
search_teamswith partial name queries - Look up which teams a coach has been associated with by first searching for the coach name via
search_coaches - Generate conference strength reports using
countand aggregatedadj_emfromget_ratings_by_conference - Identify the fastest and slowest tempo teams in a given season by sorting on
adj_tfromget_ratings - Backfill historical college basketball analytics databases using the 2002–2026 year range
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does KenPom have an official developer API?+
What does the `adj_em` field represent and how is it different from win-loss record?+
adj_em is the adjusted efficiency margin — the number of points a team would be expected to outscore an average Division I opponent per 100 possessions on a neutral court, adjusted for the quality of opponents faced. It is a pace-adjusted, opponent-adjusted metric and captures more predictive information than raw w_l record, which is also returned but does not account for schedule strength or game pace.Does the API return individual game logs, player statistics, or four-factors data?+
Which conference abbreviations does `get_ratings_by_conference` accept?+
ACC, B12, SEC, B10, MWC, WCC, and others. Matching is case-insensitive. If you are unsure of an abbreviation, call get_ratings first and inspect the conference field values in the returned team objects.How far back does historical data go, and is data available for non-Division I programs?+
year parameter covers seasons from 2002 through 2026. Data is limited to Division I programs only. Non-Division I teams are not included in any endpoint response. You can fork this API on Parse and revise it if you need to extend coverage to earlier seasons or add additional team tiers as that data becomes accessible.