MLB API endpoint
Returns batter or pitcher percentile rankings. Type, season, and team are first-party table filters. Repeated pctl filters, table sorting, and pagination are applied locally to the embedded rows. Use mlb_discovery for exact type-specific fields, comparators, seasons, and team ids. CSV is a separate download.
/mlb/statcast-percentileQuery parameters:
type: batter or pitcher; defaults to batter.year: one of 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026; defaults to 2026.team: blank for all teams, or one of 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.pctl: repeat for multiple local filters, each formatted field-comparator-value. Comparators are gte, gt, lt, lte; values are numeric from 0 through 100; each field can appear once. Batter fields: percent_rank_xwoba, percent_rank_xba, percent_rank_xslg, percent_rank_xiso, percent_rank_xobp, percent_rank_barrel, percent_rank_barrel_batted_rate, percent_rank_exit_velocity_avg, percent_rank_exit_velocity_max, percent_rank_hard_hit_percent, percent_rank_k_percent, percent_rank_bb_percent, percent_rank_whiff_percent, percent_rank_chase_percent, percent_speed_order, percent_rank_oaa, percent_rank_arm_overall, percent_rank_swing_speed, percent_rank_squared_up_swing, percent_rank_swing_length. Pitcher fields: percent_rank_xwoba, percent_rank_xba, percent_rank_xslg, percent_rank_xiso, percent_rank_xobp, percent_rank_barrel, percent_rank_barrel_batted_rate, percent_rank_exit_velocity_avg, percent_rank_hard_hit_percent, percent_rank_k_percent, percent_rank_bb_percent, percent_rank_whiff_percent, percent_rank_chase_percent, percent_rank_fastball_velo, percent_rank_fastball_spin, percent_rank_cu_spin, percent_rank_fastball_extension, percent_rank_swing_speed, percent_rank_squared_up_swing, percent_rank_swing_length.sort: player_name or a metric field listed above for the selected type; defaults to percent_rank_xwoba.sort_dir: asc or desc; defaults to desc.limit: 1–500; defaults to 100.offset: 0–5000; defaults to 0.Notable response behavior: the complete selected season/type table is returned; team filtering follows the page selector, while percentile filters and sorting are applied locally. Rows include the percentile metrics and a player_url. CSV is a separate download.
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| percent_rank_acceleration | 40 | 21 to 99, median 74 |
| percent_rank_arm_max | 35 | 9 to 99, median 56 |
| percent_rank_arm_overall | 35 | 1 to 100, median 57 |
| percent_rank_attack_angle | 40 | 7 to 100, median 59 |
| percent_rank_ba | 40 | 4 to 100, median 75 |
| percent_rank_babip | 40 | 10 to 100, median 78 |
| percent_rank_bacon | 40 | 15 to 100, median 83 |
| percent_rank_barrel | 40 | 30 to 100, median 86 |
| percent_rank_barrel_batted_rate | 40 | 22 to 100, median 88 |
| percent_rank_bb_percent | 40 | 1 to 100, median 78 |
| percent_rank_chase_percent | 40 | 6 to 98, median 58 |
| percent_rank_cu_spin | 0 | |
| percent_rank_exit_velocity_avg | 40 | 24 to 100, median 89 |
| percent_rank_exit_velocity_max | 40 | 38 to 100, median 94 |
| percent_rank_fastball_extension | 0 | |
| percent_rank_fastball_spin | 0 | |
| percent_rank_fastball_velo | 0 | |
| percent_rank_framing | 3 | 19 to 47, median 43 |
| percent_rank_hard_hit_percent | 40 | 21 to 100, median 89 |
| percent_rank_iso | 40 | 16 to 100, median 84 |
| percent_rank_jump | 12 | 1 to 100, median 20 |
| percent_rank_k_percent | 40 | 1 to 91, median 36 |
| percent_rank_launch_angle_avg | 40 | 1 to 97, median 40 |
| percent_rank_oaa | 30 | 1 to 100, median 33 |
| percent_rank_obp | 40 | 20 to 100, median 87 |
| percent_rank_pop_2b | 3 | 63 to 92, median 73 |
| percent_rank_slg | 40 | 40 to 100, median 87 |
| percent_rank_squared_up_swing | 40 | 2 to 97, median 48 |
| percent_rank_swing_length | 40 | 3 to 100, median 50 |
| percent_rank_swing_speed | 40 | 16 to 100, median 80 |
| percent_rank_vertical_swing_path | 40 | 2 to 100, median 67 |
| percent_rank_whiff_percent | 40 | 1 to 94, median 34 |
| percent_rank_woba | 40 | 44 to 100, median 89 |
| percent_rank_wobacon | 40 | 29 to 100, median 82 |
| percent_rank_xba | 40 | 2 to 100, median 80 |
| percent_rank_xbacon | 40 | 32 to 100, median 89 |
| percent_rank_xera | 0 | |
| percent_rank_xiso | 40 | 21 to 100, median 90 |
| percent_rank_xobp | 40 | 38 to 100, median 89 |
| percent_rank_xslg | 40 | 50 to 100, median 91 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| type | string | No | Table type Allowed values: batter, pitcher. | ||
| year | string | No | Season Allowed values: 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026. | ||
| team | string | No | MLB team id; blank selects all teams 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. | ||
| pctl | array<string> | No | Repeated field-comparator-value filter from the type-specific field set in mlb_discovery; value range 0-100 Repeat this query parameter for multiple values. | ||
| sort | string | No | Local sort field from the type-specific set in mlb_discovery | ||
| sort_dir | string | No | Local 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-percentile?type=batter&year=2015&team=108&sort_dir=asc&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"board": "percentile-rankings",
"type": "batter",
"year": "2026",
"filters": [
{
"field": "percent_rank_xwoba",
"comparator": "gte",
"value": 50
}
],
"sort": "percent_rank_xwoba",
"sort_dir": "desc",
"total": 28,
"offset": 0,
"limit": 5,
"rows": [
{
"player_id": "592450",
"player_name": "Example Player",
"percent_rank_xwoba": 86,
"player_url": "https://baseballsavant.mlb.com/savant-player/592450"
}
]
}
}Request schema
No body schema
Response schema
#/definitions/mlb.statcastPercentileResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| board | string | No | percentile-rankings | |||
| fetched_at | string | No | ||||
| filters | array | No | ||||
| filters[].comparator | string | No | ||||
| filters[].field | string | No | ||||
| filters[].value | number | No | ||||
| limit | integer | No | 100 | |||
| offset | integer | No | 0 | |||
| rows | array | No | ||||
| sort | string | No | percent_rank_xwoba | |||
| sort_dir | string | No | desc | |||
| source_url | string | No | ||||
| team | string | No | 147 | |||
| total | integer | No | 28 | |||
| type | string | No | batter | |||
| year | string | No | 2026 |
| 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-percentile?type=batter&year=2015&team=108&sort_dir=asc&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"