MLB API endpoint
Returns the Batted Ball Profile table for batters, batting teams, pitchers, pitching teams, or league totals. Supports first-party season, game type, split, team, date, side, hand, pitch type, event threshold, and split-group threshold filters. The All-Star A game type is accepted by the live page query although its checkbox is hidden. Sorting and pagination are local. The league-average reference row is returned separately when requested; CSV and visualization controls are outside this JSON contract.
/mlb/statcast-batted-ballQuery parameters:
type: batter, batting-team, pitcher, pitching-team, league; defaults to batter.seasons: one or more seasons: 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026; defaults to 2026.game_types: one or more values: R, A, F, D, L, W; defaults to R. A is accepted by the upstream query even though the page hides its checkbox.splits: one or more dimensions: api_game_date_month_text, game_type, api_pitch_type_group03, bat_side, pitch_hand.min: minimum batted-ball events: q, 1, 5, 10, 25, 50, 100, 200, 500, 1000; defaults to q.min_split: minimum rows per split group: 1, 5, 10, 25, 50, 100, 200, 500, 1000; defaults to 1.split_year: 1 or 0; defaults to 1.teams: one or more team ids: 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 158.date_start, date_end: optional dates in YYYY-MM-DD, from 2015-04-05 through today; start must not follow end.bat_side, pitch_hand: optional L or R.pitch_types: one or more pitch codes: FF, SI, FC, CH, FS, FO, SC, CU, SL, ST, SV, KN.include_league_average: true or false; defaults to false. When enabled, returns the page's reference row in league_average.sort: name, team_name, num_bbe, gb_rate, air_rate, fb_rate, ld_rate, pu_rate, pull_rate, straight_rate, oppo_rate, pull_gb_rate, straight_gb_rate, oppo_gb_rate, pull_air_rate, straight_air_rate, oppo_air_rate; defaults to pull_air_rate.sort_dir: asc or desc; defaults to desc.limit: 1–500; defaults to 100. offset: 0–10000; defaults to 0.Notable response behavior: filters follow the Baseball Savant page; sort and pagination are applied to the returned rows. league_average is separate from normal rows and omitted unless requested. CSV downloads and visualizations are not included.
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| air_rate | 40 | 0.59 to 0.74, median 0.66 |
| b_name_display_first_last | 40 | “Crow-Armstrong, Pete” and 39 other values |
| fb_rate | 40 | 0.23 to 0.43, median 0.33 |
| gb_rate | 40 | 0.26 to 0.41, median 0.34 |
| id | 40 | |
| ld_rate | 40 | 0.18 to 0.31, median 0.23 |
| n_teams | 40 | 1 to 2, median 1 |
| name | 40 | “Crow-Armstrong, Pete” and 39 other values |
| num_bbe | 40 | 151 to 524, median 317 |
| oppo_air_rate | 40 | 0.11 to 0.22, median 0.16 |
| oppo_gb_rate | 40 | 0 to 0.05, median 0.03 |
| oppo_rate | 40 | 0.14 to 0.25, median 0.2 |
| pu_rate | 40 | 0.06 to 0.19, median 0.1 |
| pull_air_rate | 40 | 0.26 to 0.34, median 0.28 |
| pull_gb_rate | 40 | 0.13 to 0.26, median 0.2 |
| pull_rate | 40 | 0.39 to 0.59, median 0.49 |
| savant_batter_id | 40 | |
| straight_air_rate | 40 | 0.16 to 0.25, median 0.21 |
| straight_gb_rate | 40 | 0.04 to 0.15, median 0.11 |
| straight_rate | 40 | 0.23 to 0.37, median 0.31 |
| team_id | 40 | |
| team_name | 40 | “Cubs” and 23 other values |
| year | 40 | 2,026 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| type | string | No | Row type Allowed values: batter, batting-team, pitcher, pitching-team, league. | ||
| seasons | array<string> | No | One or more seasons Allowed values: 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026. Repeat this query parameter for multiple values. | ||
| game_types | array<string> | No | One or more game type codes Allowed values: R, A, F, D, L, W. Repeat this query parameter for multiple values. | ||
| splits | array<string> | No | One or more split dimensions Allowed values: api_game_date_month_text, game_type, api_pitch_type_group03, bat_side, pitch_hand. Repeat this query parameter for multiple values. | ||
| min | string | No | Minimum batted-ball events Allowed values: q, 1, 5, 10, 25, 50, 100, 200, 500, 1000. | ||
| min_split | string | No | Minimum rows per split group Allowed values: 1, 5, 10, 25, 50, 100, 200, 500, 1000. | ||
| split_year | string | No | Split seasons into separate rows Allowed values: 1, 0. | ||
| teams | array<string> | No | One or more MLB team ids Allowed values: 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 158. Repeat this query parameter for multiple values. | ||
| date_start | string | No | YYYY-MM-DD date range start (2015-04-05 through today) | ||
| date_end | string | No | YYYY-MM-DD date range end (2015-04-05 through today) | ||
| bat_side | string | No | Batter side Allowed values: L, R. | ||
| pitch_hand | string | No | Pitcher throwing hand Allowed values: L, R. | ||
| pitch_types | array<string> | No | One or more pitch type codes Allowed values: FF, SI, FC, CH, FS, FO, SC, CU, SL, ST, SV, KN. Repeat this query parameter for multiple values. | ||
| include_league_average | boolean | No | Include the first-party league-average reference row | ||
| sort | string | No | Local table sort field Allowed values: name, team_name, num_bbe, gb_rate, air_rate, fb_rate, ld_rate, pu_rate, pull_rate, straight_rate, oppo_rate, pull_gb_rate, straight_gb_rate, oppo_gb_rate, pull_air_rate, straight_air_rate, oppo_air_rate. | ||
| 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: 10000. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/mlb/statcast-batted-ball?type=batter&seasons=2015&game_types=R&splits=api_game_date_month_text&min=q&min_split=1&split_year=1&teams=108&bat_side=L&pitch_hand=L&pitch_types=FF&include_league_average=true&sort=name&sort_dir=asc&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"board": "batted-ball",
"type": "batter",
"seasons": [
"2026"
],
"game_types": [
"R"
],
"min": "q",
"total": 346,
"rows": [
{
"name": "Rojas, Miguel",
"team_name": "Dodgers",
"num_bbe": 207,
"pull_air_rate": 0.169
}
]
}
}Request schema
No body schema
Response schema
#/definitions/mlb.statcastBattedBallResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| board | string | No | batted-ball | |||
| game_types | array | No | R | |||
| league_average | array | No | ||||
| min | string | No | q | |||
| min_split | string | No | 1 | |||
| rows | array | No | ||||
| seasons | array | No | 2026 | |||
| show_league_average | boolean | No | true | |||
| total | integer | No | 346 | |||
| type | string | No | batter |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/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-batted-ball?type=batter&seasons=2015&game_types=R&splits=api_game_date_month_text&min=q&min_split=1&split_year=1&teams=108&bat_side=L&pitch_hand=L&pitch_types=FF&include_league_average=true&sort=name&sort_dir=asc&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"