MLB API endpoint
Returns the standard anonymous Baseball Savant Statcast leaderboard for batters, pitchers, teams, or pitcher teams. Supports the page's season, team, batter position, minimum batted-ball event, and sortable metric filters, plus local pagination. Use mlb_discovery for exact filter sets. Other Baseball Savant leaderboard pages are listed there but are not represented by this route.
/mlb/statcast-leadersReturns Baseball Savant's standard Statcast leaderboard for batters, pitchers,
team batting, or team pitching. The source embeds a structured JSON row array in
the anonymous HTML response. The endpoint sorts and paginates that row set
locally while preserving the available metrics in each row's metrics object.
type: optional row type: batter, pitcher, batter-team, or
pitcher-team. Defaults to batter.year: optional season from the current season back 11 seasons. Defaults to
the current season. mlb_discovery returns the current minimum and maximum.team_id: optional positive MLB team ID from /api/v1/mlb/teams.position: optional batter position: C, 1B, 2B, SS, 3B, LF,
CF, RF, or DH. Position filtering is supported with type=batter.min_bbe: optional minimum batted-ball events: q, 1, 25, 50, 100,
150, 200, 250, 350, 450, 500, or 600. q means qualified.sort: optional field: entity_name, bip, launch_angle_avg,
sweet_spot_percent, exit_velocity_max, exit_velocity_avg,
avg_best_speed, exit_velocity_fbld, distance_max, distance_hr_avg,
hard_hit_ct, hard_hit_percent, hard_hit_per_swing, barrel_ct,
barrels_per_bip, or barrels_per_pa. Defaults to barrels_per_pa.sort_dir: optional asc or desc; defaults to desc.limit: optional page size from 1 to 500; defaults to 100.offset: optional zero-based row offset from 0 to 5000; defaults to 0.Use mlb_discovery for the exact live-verified filter values and the complete
60-item Baseball Savant leaderboard navigation inventory. This route covers the
standard Statcast leaderboard page only; other listed leaderboard pages have
different data views and are not implied to be covered by this endpoint.
GET /api/v1/mlb/statcast-leaders?type=batter&year=2026&position=SS&min_bbe=25&sort=exit_velocity_avg&sort_dir=desc&limit=2
| Field | Filled in, of 1 checked | Values in the sample |
|---|---|---|
| rank | 1 | 1 |
| entity_id | 1 | |
| name | 1 | “Caballero, José” |
| team_id | 1 | |
| team | 1 | “Yankees” |
| position | 1 | “SS” |
| qualified | 1 | true in 1 of 1 |
| metrics | 1 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| type | string | No | Leaderboard row type Allowed values: batter, pitcher, batter-team, pitcher-team. | ||
| year | integer | No | Season; current season back 11 seasons | ||
| team_id | string | No | Optional MLB team id from mlb_teams | ||
| position | string | No | Batter position Allowed values: C, 1B, 2B, SS, 3B, LF, CF, RF, DH. | ||
| min_bbe | string | No | Minimum batted-ball event threshold Allowed values: q, 1, 25, 50, 100, 150, 200, 250, 350, 450, 500, 600. | ||
| sort | string | No | Sort field Allowed values: entity_name, bip, launch_angle_avg, sweet_spot_percent, exit_velocity_max, exit_velocity_avg, avg_best_speed, exit_velocity_fbld, distance_max, distance_hr_avg, hard_hit_ct, hard_hit_percent, hard_hit_per_swing, barrel_ct, barrels_per_bip, barrels_per_pa. | ||
| sort_dir | string | No | Sort direction Allowed values: asc, desc. | ||
| limit | integer | No | Rows per page (1-500) Minimum: 1. Maximum: 500. | ||
| offset | integer | No | Zero-based row offset Minimum: 0. Maximum: 5000. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/mlb/statcast-leaders?type=batter&position=C&min_bbe=q&sort=entity_name&sort_dir=asc&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"type": "batter",
"year": 2026,
"position": "SS",
"min_bbe": "25",
"sort": "exit_velocity_avg",
"sort_dir": "desc",
"total": 42,
"offset": 0,
"limit": 2,
"rows": [
{
"rank": 1,
"entity_id": "660271",
"name": "Example Player",
"team_id": "147",
"team": "Yankees",
"position": "SS",
"qualified": true,
"metrics": {
"bip": 150,
"exit_velocity_avg": 93.2,
"barrels_per_pa": 8.1
}
},
{
"rank": 2,
"entity_id": "660272",
"name": "Second Player",
"team_id": "111",
"team": "Red Sox",
"position": "SS",
"qualified": true,
"metrics": {
"bip": 132,
"exit_velocity_avg": 92.7,
"barrels_per_pa": 7.4
}
}
]
}
}Request schema
No body schema
Response schema
#/definitions/mlb.statcastResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | mlb.StatcastResponse | No | ||||
| data.fetched_at | string | No | ||||
| data.limit | integer | No | ||||
| data.min_bbe | string | No | ||||
| data.offset | integer | No | ||||
| data.position | string | No | ||||
| data.rows | array | No | ||||
| data.rows[].entity_id | string | No | ||||
| data.rows[].metrics | object | No | ||||
| data.rows[].name | string | No | ||||
| data.rows[].position | string | No | ||||
| data.rows[].qualified | boolean | No | ||||
| data.rows[].rank | integer | No | ||||
| data.rows[].team | string | No | ||||
| data.rows[].team_id | string | No | ||||
| data.sort | string | No | ||||
| data.sort_dir | string | No | ||||
| data.source_url | string | No | ||||
| data.team_id | integer | No | ||||
| data.total | integer | No | ||||
| data.type | string | No | ||||
| data.year | integer | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/mlb/statcast-leaders?type=batter&position=C&min_bbe=q&sort=entity_name&sort_dir=asc&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"