Sports Reference APIsports-reference.com ↗
Retrieve college football player career stats from Sports-Reference.com. Passing, rushing, receiving, and scoring totals plus per-season breakdowns by player ID.
What is the Sports Reference API?
The Sports Reference CFB API provides access to college football player statistics through 1 endpoint and over 15 response fields per player. The get_player_career_stats endpoint returns both per-season breakdowns and career totals across passing, rushing/receiving, and scoring categories. You can query any player using a URL-slug identifier like joe-burrow-1 or jamarr-chase-1 and get structured data including position, physical measurements, and full statistical history.
curl -X GET 'https://api.parse.bot/scraper/e8b5e7ca-33c5-4dbf-9db7-62bdcfe20b32/get_player_career_stats?player_id=joe-burrow-1' \ -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 sports-reference-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.
"""Walkthrough: College Football Stats SDK — bounded, re-runnable; every call capped."""
from parse_apis.sports_reference_com_api import CollegeFootball, PlayerNotFound
client = CollegeFootball()
# Fetch career stats for a QB
player = client.players.get(player_id="joe-burrow-1")
print(player.name, player.position, player.height, player.weight)
print("Passing career:", player.career_totals.passing)
print("Rushing/Receiving career:", player.career_totals.rushing_receiving)
# Inspect per-season passing data
for season in player.seasons.passing[:3]:
print(season)
# Typed error: handle a player that doesn't exist
try:
missing = client.players.get(player_id="nonexistent-player-999")
print(missing.name)
except PlayerNotFound as e:
print(f"Player not found: {e.player_id}")
print("exercised: players.get")
Retrieve career statistics across all offensive categories (passing, rushing/receiving, scoring) for a college football player. Returns both career totals and per-season breakdowns. The table structure adapts to position: QBs/RBs show rushing-first stats, WRs/TEs show receiving-first stats. Empty category objects indicate the player has no stats in that category.
| Param | Type | Description |
|---|---|---|
| player_idrequired | string | URL slug identifier for the player (e.g. 'joe-burrow-1', 'jamarr-chase-1'). Lowercase letters, numbers, and hyphens only. Obtainable from the player's Sports Reference URL path. |
{
"type": "object",
"fields": {
"name": "string — player full name",
"height": "string — height in feet-inches format (e.g. '6-4')",
"weight": "string — weight in pounds",
"seasons": "object containing passing, rushing_receiving, and scoring per-season arrays",
"position": "string — position abbreviation (QB, WR, RB, TE, etc.)",
"player_id": "string — the player slug identifier",
"career_totals": "object containing passing, rushing_receiving, and scoring career stat summaries"
},
"sample": {
"data": {
"name": "Joe Burrow",
"height": "6-4",
"weight": "221",
"seasons": {
"passing": [
{
"pos": "QB",
"class": "SR",
"games": "15",
"pass_td": "60",
"year_id": "2019*",
"pass_att": "527",
"pass_cmp": "402",
"pass_yds": "5671",
"conf_abbr": "SEC",
"pass_rating": "202.0",
"team_name_abbr": "LSU"
}
],
"scoring": [
{
"pos": "QB",
"class": "SR",
"games": "15",
"all_td": "5",
"year_id": "2019*",
"conf_abbr": "SEC",
"total_points": "30",
"team_name_abbr": "LSU"
}
],
"rushing_receiving": [
{
"pos": "QB",
"class": "SR",
"games": "15",
"rush_td": "5",
"year_id": "2019*",
"rush_att": "115",
"rush_yds": "368",
"conf_abbr": "SEC",
"team_name_abbr": "LSU"
}
]
},
"position": "QB",
"player_id": "joe-burrow-1",
"career_totals": {
"passing": {
"games": "39",
"pass_td": "78",
"pass_att": "945",
"pass_cmp": "650",
"pass_int": "11",
"pass_yds": "8852",
"pass_rating": "172.4",
"pass_cmp_pct": "68.8"
},
"scoring": {
"games": "39",
"all_td": "13",
"total_points": "78",
"points_per_game": "2.0"
},
"rushing_receiving": {
"rec": "1",
"games": "39",
"rec_td": "0",
"rec_yds": "16",
"rush_td": "13",
"rush_att": "258",
"rush_yds": "820"
}
}
},
"status": "success"
}
}About the Sports Reference API
What the API Returns
The get_player_career_stats endpoint accepts a player_id string — a lowercase hyphenated slug matching the player's profile URL on Sports-Reference's CFB section — and returns a structured object. Top-level fields include name, position, height, weight, and the player_id echo. Statistics are split into two top-level objects: seasons and career_totals.
Season and Career Data Structure
Both seasons and career_totals contain three parallel sub-objects: passing, rushing_receiving, and scoring. The seasons object holds arrays of per-year entries so you can track a player's statistical progression year by year. career_totals collapses those arrays into single summary rows. The table layout adapts to position: quarterbacks and running backs present rushing-centric stat ordering, while wide receivers and tight ends lead with receiving figures.
Player Identification
Players are identified by a player_id slug. Disambiguating suffixes (e.g., -1, -2) handle name collisions between players who share a name. There is no search-by-name endpoint currently — you need to know the slug before making a request. Common slugs follow the pattern firstname-lastname-1 using only lowercase letters, digits, and hyphens.
Coverage Scope
The API covers offensive skill-position statistics: passing yards/TDs/interceptions, rushing yards/attempts/TDs, receptions/receiving yards/TDs, and scoring totals. Defensive stats, special teams data, and team-level statistics are outside the current endpoint's scope.
The Sports Reference API is a managed, monitored endpoint for sports-reference.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when sports-reference.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 sports-reference.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 college-to-pro comparison tool using career receiving yards and TD totals from
career_totals.rushing_receiving - Track a quarterback's season-by-season passing progression using the
seasons.passingarray - Populate a player profile card with
name,position,height, andweightfields - Compare multi-year scoring output for running backs using
seasons.scoringbreakdowns - Validate NFL draft prospect stats by pulling full college career totals before a player's draft year
- Build a historical CFB stats database indexed by
player_idslugs for batch enrichment - Generate season-over-season receiving efficiency charts for wide receivers and tight ends
| 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 Sports-Reference.com have an official developer API?+
What does `career_totals` actually contain versus `seasons`?+
seasons is an object with three arrays — passing, rushing_receiving, and scoring — where each array element represents one academic year. career_totals uses the same three keys but collapses all years into single summary rows, giving you lifetime aggregate figures like total career passing yards or career rushing touchdowns without needing to sum the season array yourself.Does the API cover defensive players, linemen, or special teams stats?+
Can I look up a player by name rather than by their slug ID?+
player_id slug as input — there is no name-search or autocomplete endpoint. You need to know the slug (e.g., joe-burrow-1) before calling get_player_career_stats. You can fork this API on Parse and revise it to add a player search endpoint that resolves names to slugs.How are players with the same name handled?+
john-smith-1 and john-smith-2. The suffix is part of the required player_id input, so you need to use the correct one to retrieve the intended player's stats.