College Baseball API
Welcome to the BALLDONTLIE College Baseball API, the best college baseball API on the planet. An API key is required. You can obtain an API key by creating a free account on our website. Read the authentication section to learn how to use the API key.
Take a look at our other APIs.
Join us on discord.
AI-Powered Integration
Using the OpenAPI Specification with AI
Our complete OpenAPI specification allows AI assistants to automatically understand and interact with our API. Simply share the spec URL with your AI assistant and describe what you want to build—the AI will handle the technical implementation.
Getting Started with AI:
- Copy this URL:
https://www.balldontlie.io/openapi.yml - Share it with your preferred AI assistant (ChatGPT, Claude, Gemini, etc.)
- Tell the AI what you want to build (e.g., "Create a dashboard showing today's college baseball games")
- The AI will read the OpenAPI spec and write the code for you
Example prompts to try:
- "Using the OpenAPI spec at https://www.balldontlie.io/openapi.yml, show me how to get the latest college baseball rankings"
- "Read the BALLDONTLIE OpenAPI spec and create a Python script that fetches today's college baseball games"
- "Help me understand the available college baseball endpoints from this OpenAPI spec: https://www.balldontlie.io/openapi.yml"
This makes it incredibly easy for non-technical users, analysts, and researchers to leverage our sports data without needing to learn programming from scratch.
Google Sheets Integration
Our Google Sheets integration lets you access all the same data available through our API using simple spreadsheet formulas. Perfect for college baseball tracking and analysis.
Quick Start:
- Get your API key from app.balldontlie.io
- Copy our Google Sheets script
- Paste it into your Google Sheet (Extensions > Apps Script)
- Start using functions in your cells
For full setup instructions and the complete list of 150+ functions, see our Google Sheets Integration Guide.
Data Availability
Account Tiers
There are three different account tiers which provide you access to different types of data. Visit our website to create an account for free.
Paid tiers do not apply across sports. The tier you purchase for College Baseball will not automatically be applied to other sports. You can purchase the ALL-ACCESS ($299.99/mo) tier to get access to every endpoint for every sport.
Read the table below to see the breakdown.
| Endpoint | Free | ALL-STAR | GOAT |
|---|---|---|---|
| Conferences | Yes | Yes | Yes |
| Teams | Yes | Yes | Yes |
| Players | Yes | Yes | Yes |
| Standings | Yes | Yes | Yes |
| Games | No | Yes | Yes |
| Rankings | No | Yes | Yes |
| Active Players | No | Yes | Yes |
| Plays | No | Yes | Yes |
| Player Batting Stats | No | No | Yes |
| Player Pitching Stats | No | No | Yes |
| Team Batting Stats | No | No | Yes |
| Team Pitching Stats | No | No | Yes |
| Team Fielding Stats | No | No | Yes |
| Player Season Batting Stats | No | No | Yes |
| Player Season Pitching Stats | No | No | Yes |
| Team Season Stats | No | No | Yes |
| Betting Odds | No | No | Yes |
The feature breakdown per tier is shown in the table below.
| Tier | Requests / Min | $USD / mo. |
|---|---|---|
| GOAT | 600 | 39.99 |
| ALL-STAR | 60 | 9.99 |
| Free | 5 | 0 |
Authentication
To authorize, use this code:
curl "api_endpoint_here" -H "Authorization: YOUR_API_KEY"
import { BalldontlieAPI } from "@balldontlie/sdk";
const api = new BalldontlieAPI({ apiKey: "YOUR_API_KEY" });
from balldontlie import BalldontlieAPI
api = BalldontlieAPI(api_key="YOUR_API_KEY")
Make sure to replace
YOUR_API_KEYwith your API key.
BALLDONTLIE uses API keys to allow access to the API. You can obtain an API key by creating a free account at our website
We expect the API key to be included in all API requests to the server in a header that looks like the following:
Authorization: YOUR_API_KEY
Pagination
This API uses cursor based pagination rather than limit/offset. Endpoints that support pagination will send back responses with a meta key that looks like what is displayed on the right.
{
"meta": {
"next_cursor": 90,
"per_page": 25
}
}
You can use per_page to specify the maximum number of results. It defaults to 25 and doesn't allow values larger than 100.
You can use next_cursor to get the next page of results. Specify it in the request parameters like this: ?cursor=NEXT_CURSOR.
Errors
The API uses the following error codes:
| Error Code | Meaning |
|---|---|
| 401 | Unauthorized - You either need an API key or your account tier does not have access to the endpoint. |
| 400 | Bad Request -- The request is invalid. The request parameters are probably incorrect. |
| 404 | Not Found -- The specified resource could not be found. |
| 406 | Not Acceptable -- You requested a format that isn't json. |
| 429 | Too Many Requests -- You're rate limited. |
| 500 | Internal Server Error -- We had a problem with our server. Try again later. |
| 503 | Service Unavailable -- We're temporarily offline for maintenance. Please try again later. |
Conferences
Get All Conferences
curl "https://api.balldontlie.io/cbb/v1/conferences" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/conferences", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/conferences",
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"id": 1,
"name": "American Conference",
"short_name": "American"
},
{
"id": 2,
"name": "Atlantic Coast Conference",
"short_name": "ACC"
},
{
"id": 12,
"name": "Southeastern Conference",
"short_name": "SEC"
}
]
}
This endpoint retrieves all conferences.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/conferences
Query Parameters
This endpoint does not accept any query parameters.
Teams
Get All Teams
curl "https://api.balldontlie.io/cbb/v1/teams" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/teams", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/teams",
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"id": 1,
"conference_id": 1,
"name": "Roadrunners",
"full_name": "UTSA Roadrunners",
"college": "UTSA",
"abbreviation": "UTSA"
},
{
"id": 110,
"conference_id": 12,
"name": "Longhorns",
"full_name": "Texas Longhorns",
"college": "Texas",
"abbreviation": "TEX"
}
]
}
This endpoint retrieves all teams.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/teams
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| conference_id | false | Filter teams by conference ID |
Players
Get All Players
curl "https://api.balldontlie.io/cbb/v1/players?per_page=25" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/players?per_page=25", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/players",
params={"per_page": 25},
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"id": 1,
"first_name": "Mark",
"last_name": "Nowak",
"height": null,
"weight": null,
"bats": null,
"throws": null,
"team": {
"id": 157,
"conference_id": null,
"name": "Norse",
"full_name": "Northern Kentucky Norse",
"college": "Northern Kentucky",
"abbreviation": "NKU"
}
}
],
"meta": { "next_cursor": 25, "per_page": 25 }
}
This endpoint retrieves all players.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/players
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| search | false | Search players by name |
| team_ids[] | false | Filter by team IDs. Use bracket notation (e.g. team_ids[]=1&team_ids[]=2) |
| player_ids[] | false | Filter by player IDs. Use bracket notation |
| per_page | false | Number of results per page (default 25, max 100) |
| cursor | false | Cursor for pagination |
Standings
Get Standings
curl "https://api.balldontlie.io/cbb/v1/standings?season=2025" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/standings?season=2025", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/standings",
params={"season": 2025},
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"team": {
"id": 14,
"conference_id": 2,
"name": "Tar Heels",
"full_name": "North Carolina Tar Heels",
"college": "North Carolina",
"abbreviation": "UNC"
},
"conference": {
"id": 2,
"name": "Atlantic Coast Conference",
"short_name": "ACC"
},
"season": 2025,
"wins": 45,
"losses": 13,
"ties": null,
"win_percentage": 0.775862068,
"runs_for": 450,
"runs_against": 230
}
]
}
This endpoint retrieves standings for a given season.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/standings
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| season | true | The season year (e.g. 2025) |
| conference_id | false | Filter standings by conference ID |
Games
Get All Games
curl "https://api.balldontlie.io/cbb/v1/games?seasons[]=2025&per_page=25" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/games?seasons[]=2025&per_page=25", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/games",
params={"seasons[]": 2025, "per_page": 25},
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"id": 11736,
"date": "2025-02-15T00:00:00.000Z",
"season": 2025,
"status": "post",
"period_detail": "Final",
"period": 9,
"home_team": {
"id": 111,
"conference_id": 12,
"name": "Aggies",
"full_name": "Texas A&M Aggies",
"college": "Texas A&M",
"abbreviation": "TA&M"
},
"visitor_team": {
"id": 86,
"conference_id": 8,
"name": "Phoenix",
"full_name": "Elon Phoenix",
"college": "Elon",
"abbreviation": "ELON"
},
"home_score": 4,
"away_score": 2,
"home_hits": 5,
"away_hits": 5,
"home_errors": 2,
"away_errors": 1,
"home_linescores": [0, 0, 0, 0, 0, 3, 0, 1],
"away_linescores": [0, 0, 0, 0, 0, 2, 0, 0, 0]
}
],
"meta": { "next_cursor": 11737, "per_page": 25 }
}
This endpoint retrieves all games.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/games
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| dates[] | false | Filter by dates (ISO 8601 format). Use bracket notation (e.g. dates[]=2025-02-15) |
| seasons[] | false | Filter by seasons. Use bracket notation (e.g. seasons[]=2025) |
| team_ids[] | false | Filter by team IDs. Use bracket notation |
| start_date | false | Filter games on or after this date (ISO 8601) |
| end_date | false | Filter games on or before this date (ISO 8601) |
| per_page | false | Number of results per page (default 25, max 100) |
| cursor | false | Cursor for pagination |
Rankings
Get Rankings
curl "https://api.balldontlie.io/cbb/v1/rankings" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/rankings", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/rankings",
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"team": {
"id": 38,
"conference_id": 4,
"name": "Bruins",
"full_name": "UCLA Bruins",
"college": "UCLA",
"abbreviation": "UCLA"
},
"rank": 1,
"trend": "-"
},
{
"team": {
"id": 113,
"conference_id": 12,
"name": "Tigers",
"full_name": "LSU Tigers",
"college": "LSU",
"abbreviation": "LSU"
},
"rank": 2,
"trend": "-"
},
{
"team": {
"id": 110,
"conference_id": 12,
"name": "Longhorns",
"full_name": "Texas Longhorns",
"college": "Texas",
"abbreviation": "TEX"
},
"rank": 3,
"trend": "-"
}
]
}
Returns the latest D1Baseball Top 25 rankings.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/rankings
Query Parameters
This endpoint does not accept any query parameters.
Active Players
Get Active Players
curl "https://api.balldontlie.io/cbb/v1/players/active?per_page=25" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/players/active?per_page=25", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/players/active",
params={"per_page": 25},
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"id": 1,
"first_name": "Mark",
"last_name": "Nowak",
"height": null,
"weight": null,
"bats": null,
"throws": null,
"team": {
"id": 157,
"conference_id": null,
"name": "Norse",
"full_name": "Northern Kentucky Norse",
"college": "Northern Kentucky",
"abbreviation": "NKU"
}
}
],
"meta": { "next_cursor": 25, "per_page": 25 }
}
This endpoint retrieves all active players. Active players are those currently on a team roster.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/players/active
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| search | false | Search players by name |
| team_ids[] | false | Filter by team IDs. Use bracket notation |
| player_ids[] | false | Filter by player IDs. Use bracket notation |
| per_page | false | Number of results per page (default 25, max 100) |
| cursor | false | Cursor for pagination |
Plays
Get Plays
curl "https://api.balldontlie.io/cbb/v1/plays?game_id=11736" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/plays?game_id=11736", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/plays",
params={"game_id": 11736},
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"game_id": 11736,
"order": 1,
"type": "Start Inning",
"text": "Top of the 3rd inning",
"home_score": 0,
"away_score": 0,
"period": 3,
"at_bat_id": "4017500240401",
"pitch_count": "{\"balls\":0,\"strikes\":0}",
"outs": 0,
"scoring_play": false,
"score_value": null,
"team": {
"id": 86,
"conference_id": 8,
"name": "Phoenix",
"full_name": "Elon Phoenix",
"college": "Elon",
"abbreviation": "ELON"
}
}
]
}
This endpoint retrieves all plays for a specific game.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/plays
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| game_id | true | The ID of the game |
Player Batting Stats
Get Player Batting Stats
curl "https://api.balldontlie.io/cbb/v1/player_batting_stats?seasons[]=2025&per_page=25" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/player_batting_stats?seasons[]=2025&per_page=25", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/player_batting_stats",
params={"seasons[]": 2025, "per_page": 25},
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"player": {
"id": 18569,
"first_name": "Johnny",
"last_name": "Knox",
"height": null,
"weight": null,
"bats": null,
"throws": null
},
"team": {
"id": 159,
"conference_id": null,
"name": "Bobcats",
"full_name": "Quinnipiac Bobcats",
"college": "Quinnipiac",
"abbreviation": "QUIN"
},
"game": {
"id": 11745,
"date": "2025-02-14T17:00:00.000Z",
"season": 2025
},
"starter": true,
"bat_order": 1,
"at_bats": 3,
"runs": 1,
"hits": 1,
"rbi": 0,
"home_runs": 0,
"walks": 1,
"strikeouts": 0,
"pitches_seen": 0,
"avg": 0.333,
"obp": 0.5,
"slg": 1
}
],
"meta": { "next_cursor": 3559, "per_page": 25 }
}
This endpoint retrieves per-game batting stats for individual players.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/player_batting_stats
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| game_ids[] | false | Filter by game IDs. Use bracket notation |
| dates[] | false | Filter by dates (ISO 8601 format). Use bracket notation |
| seasons[] | false | Filter by seasons. Use bracket notation (e.g. seasons[]=2025) |
| player_ids[] | false | Filter by player IDs. Use bracket notation |
| team_ids[] | false | Filter by team IDs. Use bracket notation |
| start_date | false | Filter stats on or after this date (ISO 8601) |
| end_date | false | Filter stats on or before this date (ISO 8601) |
| per_page | false | Number of results per page (default 25, max 100) |
| cursor | false | Cursor for pagination |
Player Pitching Stats
Get Player Pitching Stats
curl "https://api.balldontlie.io/cbb/v1/player_pitching_stats?seasons[]=2025&per_page=25" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/player_pitching_stats?seasons[]=2025&per_page=25", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/player_pitching_stats",
params={"seasons[]": 2025, "per_page": 25},
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"player": {
"id": 18578,
"first_name": "Josh",
"last_name": "Lajoie",
"height": null,
"weight": null,
"bats": null,
"throws": null
},
"team": {
"id": 159,
"conference_id": null,
"name": "Bobcats",
"full_name": "Quinnipiac Bobcats",
"college": "Quinnipiac",
"abbreviation": "QUIN"
},
"game": {
"id": 11745,
"date": "2025-02-14T17:00:00.000Z",
"season": 2025
},
"starter": true,
"innings_pitched": 2.1,
"hits_allowed": 2,
"runs_allowed": 6,
"earned_runs": 6,
"walks": 5,
"strikeouts": 1,
"home_runs_allowed": 0,
"pitch_count": 59,
"strikes": 27,
"era": 23.14
}
],
"meta": { "next_cursor": 1246, "per_page": 25 }
}
This endpoint retrieves per-game pitching stats for individual players.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/player_pitching_stats
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| game_ids[] | false | Filter by game IDs. Use bracket notation |
| dates[] | false | Filter by dates (ISO 8601 format). Use bracket notation |
| seasons[] | false | Filter by seasons. Use bracket notation (e.g. seasons[]=2025) |
| player_ids[] | false | Filter by player IDs. Use bracket notation |
| team_ids[] | false | Filter by team IDs. Use bracket notation |
| start_date | false | Filter stats on or after this date (ISO 8601) |
| end_date | false | Filter stats on or before this date (ISO 8601) |
| per_page | false | Number of results per page (default 25, max 100) |
| cursor | false | Cursor for pagination |
Team Batting Stats
Get Team Batting Stats
curl "https://api.balldontlie.io/cbb/v1/team_batting_stats?seasons[]=2025&per_page=25" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/team_batting_stats?seasons[]=2025&per_page=25", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/team_batting_stats",
params={"seasons[]": 2025, "per_page": 25},
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"team": {
"id": 116,
"conference_id": 12,
"name": "Bulldogs",
"full_name": "Georgia Bulldogs",
"college": "Georgia",
"abbreviation": "UGA"
},
"game": {
"id": 11745,
"date": "2025-02-14T17:00:00.000Z",
"season": 2025
},
"home_away": "home",
"at_bats": 27,
"runs": 9,
"hits": 4,
"home_runs": 1,
"rbi": 8,
"walks": 8,
"strikeouts": 4,
"stolen_bases": 4,
"caught_stealing": 0,
"hit_by_pitch": 3,
"sacrifice_flies": 0,
"sacrifice_hits": 0,
"left_on_base": 6,
"doubles": 3,
"triples": 0,
"gidp": 0,
"total_bases": 10,
"extra_base_hits": 4,
"pitches": 0,
"avg": 0.148,
"obp": 0.395,
"slg": 0.37
}
],
"meta": { "next_cursor": 238, "per_page": 25 }
}
This endpoint retrieves per-game batting stats for teams.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/team_batting_stats
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| game_ids[] | false | Filter by game IDs. Use bracket notation |
| dates[] | false | Filter by dates (ISO 8601 format). Use bracket notation |
| seasons[] | false | Filter by seasons. Use bracket notation (e.g. seasons[]=2025) |
| team_ids[] | false | Filter by team IDs. Use bracket notation |
| start_date | false | Filter stats on or after this date (ISO 8601) |
| end_date | false | Filter stats on or before this date (ISO 8601) |
| per_page | false | Number of results per page (default 25, max 100) |
| cursor | false | Cursor for pagination |
Team Pitching Stats
Get Team Pitching Stats
curl "https://api.balldontlie.io/cbb/v1/team_pitching_stats?seasons[]=2025&per_page=25" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/team_pitching_stats?seasons[]=2025&per_page=25", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/team_pitching_stats",
params={"seasons[]": 2025, "per_page": 25},
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"team": {
"id": 116,
"conference_id": 12,
"name": "Bulldogs",
"full_name": "Georgia Bulldogs",
"college": "Georgia",
"abbreviation": "UGA"
},
"game": {
"id": 11745,
"date": "2025-02-14T17:00:00.000Z",
"season": 2025
},
"home_away": "home",
"innings_pitched": 9,
"hits_allowed": 4,
"runs_allowed": 1,
"earned_runs": 1,
"walks": 5,
"strikeouts": 6,
"home_runs_allowed": 0,
"stolen_bases_allowed": 0,
"caught_stealing": 0,
"sacrifice_flies": 0,
"sacrifice_hits": 0,
"doubles_allowed": 0,
"triples_allowed": 1,
"rbi": 0,
"at_bats": 28,
"saves": 0,
"save_opportunities": 0,
"pitch_count": 145,
"strikes": 91,
"era": 1,
"whip": 1,
"oba": 0.143
}
],
"meta": { "next_cursor": 238, "per_page": 25 }
}
This endpoint retrieves per-game pitching stats for teams.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/team_pitching_stats
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| game_ids[] | false | Filter by game IDs. Use bracket notation |
| dates[] | false | Filter by dates (ISO 8601 format). Use bracket notation |
| seasons[] | false | Filter by seasons. Use bracket notation (e.g. seasons[]=2025) |
| team_ids[] | false | Filter by team IDs. Use bracket notation |
| start_date | false | Filter stats on or after this date (ISO 8601) |
| end_date | false | Filter stats on or before this date (ISO 8601) |
| per_page | false | Number of results per page (default 25, max 100) |
| cursor | false | Cursor for pagination |
Team Fielding Stats
Get Team Fielding Stats
curl "https://api.balldontlie.io/cbb/v1/team_fielding_stats?seasons[]=2025&per_page=25" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/team_fielding_stats?seasons[]=2025&per_page=25", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/team_fielding_stats",
params={"seasons[]": 2025, "per_page": 25},
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"team": {
"id": 116,
"conference_id": 12,
"name": "Bulldogs",
"full_name": "Georgia Bulldogs",
"college": "Georgia",
"abbreviation": "UGA"
},
"game": {
"id": 11745,
"date": "2025-02-14T17:00:00.000Z",
"season": 2025
},
"home_away": "home",
"errors": 0,
"putouts": 27,
"assists": 16,
"double_plays": 0,
"passed_balls": 0,
"outfield_assists": 0
}
],
"meta": { "next_cursor": 238, "per_page": 25 }
}
This endpoint retrieves per-game fielding stats for teams.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/team_fielding_stats
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| game_ids[] | false | Filter by game IDs. Use bracket notation |
| dates[] | false | Filter by dates (ISO 8601 format). Use bracket notation |
| seasons[] | false | Filter by seasons. Use bracket notation (e.g. seasons[]=2025) |
| team_ids[] | false | Filter by team IDs. Use bracket notation |
| start_date | false | Filter stats on or after this date (ISO 8601) |
| end_date | false | Filter stats on or before this date (ISO 8601) |
| per_page | false | Number of results per page (default 25, max 100) |
| cursor | false | Cursor for pagination |
Player Season Batting Stats
Get Player Season Batting Stats
curl "https://api.balldontlie.io/cbb/v1/player_season_batting_stats?season=2025&per_page=25" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/player_season_batting_stats?season=2025&per_page=25", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/player_season_batting_stats",
params={"season": 2025, "per_page": 25},
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"player": {
"id": 16746,
"first_name": "Austin",
"last_name": "Smith",
"height": null,
"weight": null,
"bats": null,
"throws": null,
"team": {
"id": 230,
"conference_id": null,
"name": "Flames",
"full_name": "UIC Flames",
"college": "UIC",
"abbreviation": "UIC"
}
},
"team": {
"id": 230,
"conference_id": null,
"name": "Flames",
"full_name": "UIC Flames",
"college": "UIC",
"abbreviation": "UIC"
},
"season": 2025,
"games_played": 6,
"at_bats": 15,
"runs": 2,
"hits": 5,
"home_runs": 0,
"rbi": 1,
"walks": 2,
"strikeouts": 2,
"avg": 0.333,
"obp": 0.412,
"slg": 0.333
}
],
"meta": { "next_cursor": 4701, "per_page": 25 }
}
This endpoint retrieves season-level batting stats for individual players.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/player_season_batting_stats
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| season | false | Filter by season year (e.g. 2025) |
| player_ids[] | false | Filter by player IDs. Use bracket notation |
| team_ids[] | false | Filter by team IDs. Use bracket notation |
| per_page | false | Number of results per page (default 25, max 100) |
| cursor | false | Cursor for pagination |
Player Season Pitching Stats
Get Player Season Pitching Stats
curl "https://api.balldontlie.io/cbb/v1/player_season_pitching_stats?season=2025&per_page=25" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/player_season_pitching_stats?season=2025&per_page=25", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/player_season_pitching_stats",
params={"season": 2025, "per_page": 25},
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"player": {
"id": 12722,
"first_name": "Edgar",
"last_name": "Sanchez",
"height": "67",
"weight": "175",
"bats": "L",
"throws": "R",
"team": {
"id": 294,
"conference_id": null,
"name": "Panthers",
"full_name": "Prairie View A&M Panthers",
"college": "Prairie View A&M",
"abbreviation": "PV"
}
},
"team": {
"id": 294,
"conference_id": null,
"name": "Panthers",
"full_name": "Prairie View A&M Panthers",
"college": "Prairie View A&M",
"abbreviation": "PV"
},
"season": 2025,
"games_played": 1,
"innings_pitched": 1,
"hits_allowed": 0,
"runs_allowed": 0,
"earned_runs": 0,
"walks": 0,
"strikeouts": 0,
"home_runs_allowed": 0,
"pitch_count": 6,
"strikes": 4,
"era": 0,
"whip": 0
}
],
"meta": { "next_cursor": 3238, "per_page": 25 }
}
This endpoint retrieves season-level pitching stats for individual players.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/player_season_pitching_stats
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| season | false | Filter by season year (e.g. 2025) |
| player_ids[] | false | Filter by player IDs. Use bracket notation |
| team_ids[] | false | Filter by team IDs. Use bracket notation |
| per_page | false | Number of results per page (default 25, max 100) |
| cursor | false | Cursor for pagination |
Team Season Stats
Get Team Season Stats
curl "https://api.balldontlie.io/cbb/v1/team_season_stats?season=2025&per_page=25" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/team_season_stats?season=2025&per_page=25", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/team_season_stats",
params={"season": 2025, "per_page": 25},
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"team": {
"id": 112,
"conference_id": 12,
"name": "Gators",
"full_name": "Florida Gators",
"college": "Florida",
"abbreviation": "FLA"
},
"season": 2025,
"games_played": 51,
"batting_avg": 0.293,
"runs": 382,
"hits": 488,
"home_runs": 80,
"rbi": 350,
"walks": 231,
"strikeouts": 417,
"stolen_bases": 65,
"obp": 0.379,
"slg": 0.502,
"era": 5.33,
"innings_pitched": 424,
"hits_allowed": 422,
"runs_allowed": 283,
"earned_runs": 251,
"pitching_walks": 216,
"pitching_strikeouts": 523,
"pitching_home_runs": 59,
"whip": 1.5,
"errors": 44,
"double_plays": 0
}
],
"meta": { "next_cursor": 960, "per_page": 25 }
}
This endpoint retrieves season-level combined batting, pitching, and fielding stats for teams.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/team_season_stats
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| season | false | Filter by season year (e.g. 2025) |
| team_ids[] | false | Filter by team IDs. Use bracket notation |
| per_page | false | Number of results per page (default 25, max 100) |
| cursor | false | Cursor for pagination |
Betting Odds
Get Betting Odds
curl "https://api.balldontlie.io/cbb/v1/odds?dates[]=2026-02-28&per_page=25" \
-H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/cbb/v1/odds?dates[]=2026-02-28&per_page=25", {
headers: { "Authorization": "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
"https://api.balldontlie.io/cbb/v1/odds",
params={"dates[]": "2026-02-28", "per_page": 25},
headers={"Authorization": "YOUR_API_KEY"}
)
data = response.json()
The above command returns JSON structured like this:
{
"data": [
{
"id": 176718856,
"game_id": 881,
"vendor": "betmgm",
"spread_home_value": "-1.5",
"spread_home_odds": -120,
"spread_away_value": "1.5",
"spread_away_odds": -105,
"moneyline_home_odds": -235,
"moneyline_away_odds": 180,
"total_value": "13.5",
"total_over_odds": -115,
"total_under_odds": -115,
"updated_at": "2026-03-01T19:14:04.090Z"
}
],
"meta": { "next_cursor": 176719053, "per_page": 25 }
}
This endpoint retrieves betting odds for college baseball games. Either dates[] or game_ids[] is required.
HTTP Request
GET https://api.balldontlie.io/cbb/v1/odds
Query Parameters
| Parameter | Required | Description |
|---|---|---|
| dates[] | conditional | Filter by dates (ISO 8601 format). Either dates or game_ids is required |
| game_ids[] | conditional | Filter by game IDs. Either dates or game_ids is required |
| per_page | false | Number of results per page (default 25, max 100) |
| cursor | false | Cursor for pagination |