MLB API endpoint
Returns pitcher-level pitch movement table rows for the selected season, pitch type, throwing hand, and minimum pitch count. Sorting and pagination are applied locally. The page's X/Z visualization axes and CSV download are separate presentation formats and are not returned by this JSON table contract.
/mlb/statcast-pitch-movementQuery parameters:
year: season. Values: 2026, 2025, 2024, 2023, 2022, 2021, 2020, 2019, 2018, 2017. Defaults to 2026.pitch_type: pitch code. Values: FF, CH, CU, FC, FO, KN, SC, SI, SL, SV, FS, ST, ALL. ALL returns rows for all available pitch types. Defaults to FF.hand: pitcher throwing hand: R or L. Omit to include both.min: minimum pitch count. Values: q, 50, 100, 250, 500, 750, 1000, 1500, 2000, 2500, 3000. Defaults to q (qualified).sort: local sort field. Values: pitcher_name, team_name_abbrev, pitch_hand, pitch_type_name, pitches_thrown, avg_speed, pitcher_break_z, diff_z, pitcher_break_x_hidden, diff_x, pitcher_break_z_induced, diff_z_induced_standard, diff_x_standard. Defaults to pitcher_break_z.sort_dir: asc or desc. Defaults to desc.limit: rows per page, 1–500; defaults to 100.offset: zero-based row offset, 0–5000; defaults to 0.Notable response behavior: Season, pitch type, pitcher hand, and minimum count are passed to the anonymous Baseball Savant page query. Sorting and pagination are local over the complete embedded table. Rows retain the source movement and comparison metrics and omit the embedded HTML player link; pitcher_id is included. The page's X/Z chart-axis controls and csv=true download are separate visualization and CSV formats, not part of this JSON table contract.
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| avg_speed | 40 | 88 to 96.9, median 93.7 |
| diff_x | 40 | |
| diff_x_hidden | 40 | |
| diff_x_hidden_standard | 40 | |
| diff_x_standard | 40 | |
| diff_z | 40 | -4.9 to 0.7, median -2.4 |
| diff_z_hidden | 40 | -4.9 to 0.7, median -2.4 |
| diff_z_hidden_standard | 40 | -7.5 to -2.4, median -3.6 |
| diff_z_induced_hidden_standard | 40 | -6.6 to 0.5, median -2.7 |
| diff_z_induced_standard | 40 | -6.6 to 0.5, median -2.7 |
| diff_z_standard | 40 | -7.5 to -2.4, median -3.6 |
| is_qualified | 40 | 0 to 1, median 1 |
| league_avg_speed_standard | 40 | 95.3 |
| league_break_x | 40 | |
| league_break_x_hidden | 40 | |
| league_break_x_hidden_standard | 40 | |
| league_break_x_standard | 40 | |
| league_break_z | 40 | -20.7 to -13.7, median -16.3 |
| league_break_z_hidden | 40 | -20.7 to -13.7, median -16.3 |
| league_break_z_hidden_standard | 40 | -14.6 |
| league_break_z_induced | 40 | 11.8 to 16.7, median 15.1 |
| league_break_z_induced_hidden_standard | 40 | 15.6 |
| league_break_z_induced_standard | 40 | 15.6 |
| league_break_z_standard | 40 | -14.6 |
| num_teams | 40 | 1 to 3, median 1 |
| percent_rank_diff_x | 39 | |
| percent_rank_diff_z | 39 | 0.01 to 0.68, median 0.14 |
| pitch_hand | 40 | R in all 40 |
| pitch_per | 40 | 0.13 to 0.66, median 0.3 |
| pitch_type | 40 | FF in all 40 |
| pitch_type_name | 40 | 4-Seam Fastball in all 40 |
| pitcher_break_x | 40 | |
| pitcher_break_x_hidden | 40 | |
| pitcher_break_x_hidden_standard | 40 | |
| pitcher_break_x_standard | 40 | |
| pitcher_break_z | 40 | 17 to 22.1, median 18.2 |
| pitcher_break_z_hidden | 40 | -22.1 to -17, median -18.2 |
| pitcher_break_z_hidden_standard | 40 | -22.1 to -17, median -18.2 |
| pitcher_break_z_induced | 40 | 9 to 16.1, median 12.9 |
| pitcher_break_z_induced_hidden | 40 | -16.1 to -9, median -13 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| year | string | No | Season Allowed values: 2026, 2025, 2024, 2023, 2022, 2021, 2020, 2019, 2018, 2017. | ||
| pitch_type | string | No | Pitch class Allowed values: FF, CH, CU, FC, FO, KN, SC, SI, SL, SV, FS, ST, ALL. | ||
| hand | string | No | Pitcher throwing hand; omit for both Allowed values: R, L. | ||
| min | string | No | Minimum pitch count Allowed values: q, 50, 100, 250, 500, 750, 1000, 1500, 2000, 2500, 3000. | ||
| sort | string | No | Local table sort field Allowed values: pitcher_name, team_name_abbrev, pitch_hand, pitch_type_name, pitches_thrown, avg_speed, pitcher_break_z, diff_z, pitcher_break_x_hidden, diff_x, pitcher_break_z_induced, diff_z_induced_standard, diff_x_standard. | ||
| 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-pitch-movement?year=2026&pitch_type=FF&hand=R&min=q&sort=pitcher_name&sort_dir=asc&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"board": "pitch-movement",
"year": "2025",
"pitch_type": "SL",
"hand": "L",
"min": "50",
"total": 106,
"rows": [
{
"pitcher_name": "Kikuchi, Yusei",
"pitcher_id": "579328",
"pitch_type": "SL",
"pitch_type_name": "Slider",
"pitch_hand": "L",
"avg_speed": "87",
"pitches_thrown": "1121",
"pitcher_break_x": 2.9,
"pitcher_break_z": 32.4
}
]
}
}Request schema
No body schema
Response schema
#/definitions/mlb.statcastPitchMovementResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| board | string | No | pitch-movement | |||
| hand | string | No | R | |||
| min | string | No | q | |||
| pitch_type | string | No | FF | |||
| rows | array | No | ||||
| total | integer | No | 431 | |||
| 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-movement?year=2026&pitch_type=FF&hand=R&min=q&sort=pitcher_name&sort_dir=asc&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"