MLB API endpoint
Returns Pitcher Arm Angle table rows and the matching MLB-average reference. Supports season, team, game type, pitch type, hand, batter side, pitch-count thresholds, date range, and up to four group-by selectors. Table sorting and pagination run locally. Visualization-only controls, animation, and CSV output are separate formats.
/mlb/statcast-arm-angleReturns pitcher rows and the matching league-average reference embedded in Baseball Savant's Arm Angle table. The API replays supported page filters, then sorts and paginates the pitcher rows locally. The page also provides charts, animation, and CSV output; those formats are outside this JSON endpoint.
Query parameters:
seasons: repeat for multiple seasons; accepted values are 2026, 2025, 2024, 2023, 2022, 2021, and 2020. Defaults to 2026; at most three may be selected because broader requests timed out.teams: repeat for one or more MLB 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. Omit for all teams.game_types: repeat R, F, D, L, or W; defaults to R.pitch_types: repeat FF, SI, FC, CH, FS, FO, SC, CU, SL, ST, SV, or KN; defaults to FF.pitch_hand: L or R; omit for both.bat_side: L or R; omit for both.min: minimum total pitches, one of q, 1, 5, 10, 25, 50, 100, 300, 500, 1000, 1500, 2000, 2500, or 3000; defaults to q (qualified).min_group_pitches: minimum pitches per group, one of 1, 5, 10, 25, 50, 100, 300, 500, 1000, 1500, or 2000; defaults to 1.group_by: repeat up to four values from year, api_game_date_month_text, api_pitch_type_group03, game_type, bat_side, and fld_team_id.date_start, date_end: optional inclusive dates in YYYY-MM-DD format; supply both together.sort: local sort field: name, team_name, pitch_hand, n_pitches, arm_angle, release_ball_x, relative_release_ball_x, release_ball_z, relative_shoulder_x, or shoulder_z; defaults to arm_angle.sort_dir: asc or desc; defaults to asc.limit: rows per page, 1–500; defaults to 100.offset: zero-based row offset, 0–5000; defaults to 0.An explicit selection of all 30 teams is treated as the blank all-team filter. The table is pitcher-only; type, visualization perspective/size/sort modes, and chart/animation controls are not API filters.
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| arm_angle | 40 | 49.24 to 69, median 54.36 |
| id | 40 | |
| n_pitches | 40 | 22 to 1,414, median 583 |
| n_teams | 40 | 1 to 3, median 1 |
| name | 40 | “Vesia, Alex” and 39 other values |
| p_name_display_first_last | 40 | “Vesia, Alex” and 39 other values |
| pitch_hand | 40 | R (24), L (16) |
| pitcher | 40 | 607,192 to 804,267, median 670,950 |
| relative_release_ball_x | 40 | |
| relative_shoulder_x | 40 | |
| release_ball_x | 40 | |
| release_ball_z | 40 | 5.69 to 7.06, median 6.12 |
| shoulder_z | 40 | 3.79 to 5, median 4.35 |
| team_id | 40 | |
| team_name | 40 | “Dodgers” and 24 other values |
| unique_id | 40 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| seasons | array<string> | No | 2026 | Seasons; at most three may be combined. Defaults to 2026. Allowed values: 2026, 2025, 2024, 2023, 2022, 2021, 2020. Repeat this query parameter for multiple values. | |
| teams | array<string> | No | MLB team ids; omit for 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. Repeat this query parameter for multiple values. | ||
| game_types | array<string> | No | R | Game type codes; defaults to R. Allowed values: R, F, D, L, W. Repeat this query parameter for multiple values. | |
| pitch_types | array<string> | No | FF | Pitch type codes; defaults to FF. Allowed values: FF, SI, FC, CH, FS, FO, SC, CU, SL, ST, SV, KN. Repeat this query parameter for multiple values. | |
| pitch_hand | string | No | Pitcher throwing hand; omit for both. Allowed values: L, R. | ||
| bat_side | string | No | Batter side; omit for both. Allowed values: L, R. | ||
| min | string | No | q | Minimum total pitches; defaults to q. Allowed values: q, 1, 5, 10, 25, 50, 100, 300, 500, 1000, 1500, 2000, 2500, 3000. | |
| min_group_pitches | string | No | 1 | Minimum pitches per group; defaults to 1. Allowed values: 1, 5, 10, 25, 50, 100, 300, 500, 1000, 1500, 2000. | |
| group_by | array<string> | No | Up to four grouping fields. Allowed values: year, api_game_date_month_text, api_pitch_type_group03, game_type, bat_side, fld_team_id. Repeat this query parameter for multiple values. | ||
| date_start | string | No | Inclusive start date, YYYY-MM-DD. | ||
| date_end | string | No | Inclusive end date, YYYY-MM-DD. | ||
| sort | string | No | arm_angle | Local table sort field; defaults to arm_angle. Allowed values: name, team_name, pitch_hand, n_pitches, arm_angle, release_ball_x, relative_release_ball_x, release_ball_z, relative_shoulder_x, shoulder_z. | |
| sort_dir | string | No | asc | Local sort direction; defaults to asc. Allowed values: asc, desc. | |
| limit | integer | No | Rows per page (1-500). Minimum: 1. Maximum: 500. | ||
| offset | integer | No | Zero-based row offset (0-5000). Minimum: 0. Maximum: 5000. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/mlb/statcast-arm-angle?seasons=2026&teams=108&game_types=R&pitch_types=FF&pitch_hand=L&bat_side=L&min=q&min_group_pitches=1&group_by=year&sort=name&sort_dir=asc&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"board": "pitcher-arm-angle",
"seasons": [
"2026"
],
"teams": null,
"game_types": [
"R"
],
"pitch_types": [
"FF"
],
"sort": "arm_angle",
"sort_dir": "asc",
"total": 276,
"offset": 0,
"limit": 1,
"rows": [
{
"name": "Example Pitcher",
"id": 123456,
"team_name": "Example Club",
"n_pitches": 500,
"arm_angle": 48.2
}
],
"league_average": []
}Request schema
No body schema
Response schema
#/definitions/mlb.statcastArmAngleResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| bat_side | string | No | L | |||
| board | string | No | pitcher-arm-angle | |||
| date_end | string | No | 2026-04-15 | |||
| date_start | string | No | 2026-03-25 | |||
| fetched_at | string | No | ||||
| game_types | array | No | R | |||
| group_by | array | No | ||||
| league_average | array | No | ||||
| limit | integer | No | 100 | |||
| min | string | No | q | |||
| min_group_pitches | string | No | 1 | |||
| offset | integer | No | 0 | |||
| pitch_hand | string | No | R | |||
| pitch_types | array | No | FF | |||
| rows | array | No | ||||
| seasons | array | No | 2026 | |||
| sort | string | No | arm_angle | |||
| sort_dir | string | No | asc | |||
| source_url | string | No | ||||
| teams | array | No | 147 | |||
| total | integer | No | 276 |
| 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-arm-angle?seasons=2026&teams=108&game_types=R&pitch_types=FF&pitch_hand=L&bat_side=L&min=q&min_group_pitches=1&group_by=year&sort=name&sort_dir=asc&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"