MLB API endpoint
Returns pitcher or batter pitch-level arsenal leaderboards. Season, team, pitch type, minimum PA, and minimum-pitch qualification filters are replayed against the anonymous first-party table; sorting and pagination are applied locally. Use mlb_discovery for the full selector set. Player rows can be expanded with mlb-statcast-pitch-arsenal-details.
/mlb/statcast-pitch-arsenalReturns Baseball Savant's Pitch Arsenal Stats table for pitchers or batters.
Season, team, pitch type, minimum plate appearances, and qualified/minimum
pitch thresholds are sent to the first-party table. Sorting and pagination are
applied locally. Use /mlb/discovery for the live selector values and
/mlb/teams for current MLB team IDs.
type: pitcher or batter; defaults to pitcher.year: current season through seven seasons prior. The live selector on
2026-09-30 returned 2019, 2020, 2021, 2022, 2023, 2024, 2025,
2026; defaults to 2026.team_id: optional MLB team ID from /mlb/teams; observed set:
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.pitch_type: blank for all, or one of FF, CH, CU, FC, KN, SC,
SI, SL, SV, FS, ST. The first-party page also accepts legacy
aliases CUKC (same rows as CU) and SIFT (same rows as SI).min_pa: 1, 10, 25, 50, 100, 150, 200, 250, 350, 450,
500, or 600; defaults to 1.min_pitches: q, 1, 10, 50, 100, 200, 300, 500, or 750;
q means qualified and is the default.sort: locally sorted field; one of player_name, team_name_alt,
pitch_name, run_value_per_100, run_value, pitches, pitch_usage,
pa, ba, slg, woba, whiff_percent, k_percent, put_away,
est_ba, est_slg, est_woba, hard_hit_percent. Defaults to
run_value_per_100.sort_dir: asc or desc; defaults to desc.limit: 1–500; defaults to 100.offset: 0–5000; defaults to 0.The separate min_pa and min_pitches filters are both applied upstream.
Cold replays showed min=100 returned rows with at least 100 PA, while
minPitches=250 returned rows with at least 250 pitches. The q qualifier
returned only rows marked qualified. Team/type/season/pitch-type filters also
changed the embedded table. type=team is not a valid view and is rejected.
GET /api/v1/mlb/statcast-pitch-arsenal?type=pitcher&year=2026&team_id=119&pitch_type=FF&min_pa=100&min_pitches=250&limit=2
| Field | Filled in, of 11 checked | Values in the sample |
|---|---|---|
| ba | 11 | “.159” and 9 other values |
| babip | 11 | “.165” and 10 other values |
| bacon | 11 | “.237” and 9 other values |
| barrel_batted_rate | 11 | 4.6 to 18.9, median 9.6 |
| est_ba | 11 | “.217” and 10 other values |
| est_babip | 11 | “.286” and 9 other values |
| est_bacon | 11 | “.332” and 9 other values |
| est_iso | 11 | 0.11 to 0.29, median 0.17 |
| est_obp | 11 | 0.26 to 0.42, median 0.3 |
| est_slg | 11 | “.465” and 10 other values |
| est_woba | 11 | “.331” and 9 other values |
| est_wobacon | 11 | “.440” and 10 other values |
| exit_velocity_avg | 11 | 88.5 to 93.2, median 91.3 |
| fg_est_woba | 11 | 0.26 to 0.41, median 0.3 |
| fg_est_wobacon | 11 | 0.3 to 0.45, median 0.4 |
| fg_woba | 11 | 0.24 to 0.43, median 0.29 |
| fg_wobacon | 11 | 0.24 to 0.49, median 0.39 |
| hard_hit_percent | 11 | 37.5 to 56.4, median 45.4 |
| href | 11 | median 49 characters |
| is_qualified | 11 | 1 |
| is_sport_milb | 11 | 0 |
| is_sport_mlb | 11 | 1 |
| iso | 11 | 0.09 to 0.34, median 0.15 |
| k_percent | 11 | 15.2 to 31.9, median 27.7 |
| launch_angle_avg | 11 | 10.5 to 31.7, median 21.7 |
| num_teams | 11 | 1 to 2, median 1 |
| obp | 11 | 0.24 to 0.42, median 0.27 |
| pa | 11 | 113 to 273, median 166 |
| pitch_name | 11 | 4-Seam Fastball in all 11 |
| pitch_type | 11 | FF in all 11 |
| pitch_usage | 11 | 26.2 to 55.8, median 45.1 |
| pitches | 11 | 409 to 1,049, median 716 |
| player_id | 11 | |
| player_name | 11 | “Yamamoto, Yoshinobu” and 10 other values |
| player_type | 11 | pitcher in all 11 |
| put_away | 11 | 15.5 to 28.6, median 21.7 |
| rowId | 11 | “808967_FF” and 10 other values |
| run_value | 11 | -12 to 15, median 5 |
| run_value_per_100 | 11 | -1.4 to 2.1, median 0.9 |
| run_value_unformatted | 11 | -12.06 to 15.03, median 5.13 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| type | string | No | Row type Allowed values: pitcher, batter. | ||
| year | string | No | Season Allowed values: 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026. | ||
| team_id | string | No | MLB team id from mlb_teams | ||
| pitch_type | string | No | Pitch code; blank means all pitch types Allowed values: FF, CH, CU, FC, KN, SC, SI, SL, SV, FS, ST, CUKC, SIFT. | ||
| min_pa | string | No | Minimum plate appearances Allowed values: 1, 10, 25, 50, 100, 150, 200, 250, 350, 450, 500, 600. | ||
| min_pitches | string | No | Minimum pitches; q means qualified Allowed values: q, 1, 10, 50, 100, 200, 300, 500, 750. | ||
| sort | string | No | Local sort field Allowed values: player_name, team_name_alt, pitch_name, run_value_per_100, run_value, pitches, pitch_usage, pa, ba, slg, woba, whiff_percent, k_percent, put_away, est_ba, est_slg, est_woba, hard_hit_percent. | ||
| 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-pitch-arsenal?type=pitcher&year=2019&pitch_type=FF&min_pa=1&min_pitches=q&sort=player_name&sort_dir=asc&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"board": "pitch-arsenal-stats",
"type": "pitcher",
"year": "2026",
"team_id": "119",
"pitch_type": "FF",
"min_pa": "100",
"min_pitches": "250",
"total": 11,
"sort": "run_value_per_100",
"sort_dir": "desc",
"offset": 0,
"limit": 2,
"rows": [
{
"player_name": "Yamamoto, Yoshinobu",
"pitch_type": "FF",
"pitch_name": "4-Seam Fastball",
"run_value_per_100": 2.1
}
]
}
}Request schema
No body schema
Response schema
#/definitions/mlb.statcastPitchArsenalResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| board | string | No | pitch-arsenal-stats | |||
| min_pa | string | No | 1 | |||
| min_pitches | string | No | q | |||
| rows | array | No | ||||
| total | integer | No | 523 | |||
| type | string | No | pitcher | |||
| 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-pitch-arsenal?type=pitcher&year=2019&pitch_type=FF&min_pa=1&min_pitches=q&sort=player_name&sort_dir=asc&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"