MLB API endpoint
Returns batter, batting-team, or league Swing Path and Attack Angle rows with the first-party season, game, swing, team, date, side, contact, hard-hit, attack-zone, and pitcher-hand filters. Use mlb_discovery for exact values.
/mlb/statcast-swing-pathFetches Baseball Savant's Swing Path and Attack Angle table. Sorting and pagination are applied locally after the first-party page data is parsed.
type: batter, batting-team, league (default batter).season_start, season_end: seasons 2023, 2024, 2025, 2026; start must not exceed end (defaults to 2026).game_type: Any, Exhibition, Playoff, Regular (default Regular).min_swings: q, 1, 5, 10, 25, 50, 100, 200, 500, 1000 (default q).min_group_swings: 1, 5, 10, 25, 50, 100, 200, 500, 1000 (default 1).team_id: 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.date_start, date_end: optional YYYY-MM-DD date range.bat_side: L, R.contact_type: 2, 4, 9.is_hard_hit: 1, 0.attack_zone: 0, 1, 1.1, 2, 3.pitch_hand: L, R.sort: name, team_name, avg_sweetspot_speed_mph, avg_plane_vertical_angle, attack_angle, attack_direction_pullopp, rate_ideal_attack_angle, avg_intercept_y_vs_plate, avg_intercept_y_vs_batter, avg_batter_y_position, avg_batter_x_position, avg_foot_sep0, avg_foot_angle0, n_swings (default avg_sweetspot_speed_mph).sort_dir: asc, desc (default desc).limit: 1–500 (default 100); offset: 0–5000 (default 0).Returns table rows and the applied filters, source URL, and fetch timestamp. Upstream values are preserved in row maps. The page's visual swing playback and raw CSV download are not returned by this endpoint.
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| attack_angle | 40 | 1.1 to 19.39, median 10.04 |
| attack_direction_pullopp | 40 | -16.05 to 6.14, median -2.76 |
| avg_batter_x_position | 40 | |
| avg_batter_y_position | 40 | |
| avg_foot_angle0 | 40 | -44.55 to 4.45, median -10.7 |
| avg_foot_sep0 | 40 | 18.11 to 39.95, median 28.71 |
| avg_intercept_y_vs_batter | 40 | |
| avg_intercept_y_vs_plate | 40 | |
| avg_plane_vertical_angle | 40 | 24.38 to 44.53, median 32.74 |
| avg_sweetspot_speed_mph | 40 | 74.67 to 79.46, median 75.72 |
| b_name_display_first_last | 40 | “Caminero, Junior” and 39 other values |
| bat_side_formatted | 40 | L (19), R (18), S (3) |
| batter_name | 40 | “Caminero, Junior” and 39 other values |
| id | 40 | |
| n_sides | 40 | 1 to 2, median 1 |
| n_swings | 40 | 655 to 1,275, median 994 |
| n_teams | 40 | 1 to 2, median 1 |
| name | 40 | “Caminero, Junior” and 39 other values |
| rate_ideal_attack_angle | 40 | 0.31 to 0.73, median 0.49 |
| savant_batter_id | 40 | |
| side | 40 | R (21), L (19) |
| team_id | 40 | |
| team_name | 40 | “Rays” and 26 other values |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| type | string | No | Row type Allowed values: batter, batting-team, league. | ||
| season_start | string | No | First season Allowed values: 2023, 2024, 2025, 2026. | ||
| season_end | string | No | Last season; must be >= season_start Allowed values: 2023, 2024, 2025, 2026. | ||
| game_type | string | No | Game type Allowed values: Any, Exhibition, Playoff, Regular. | ||
| min_swings | string | No | Minimum swing threshold Allowed values: q, 1, 5, 10, 25, 50, 100, 200, 500, 1000. | ||
| min_group_swings | string | No | Minimum swings per group Allowed values: 1, 5, 10, 25, 50, 100, 200, 500, 1000. | ||
| team_id | string | No | Optional MLB team id 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. | ||
| date_start | string | No | Optional range start in YYYY-MM-DD | ||
| date_end | string | No | Optional range end in YYYY-MM-DD | ||
| bat_side | string | No | Batter side Allowed values: L, R. | ||
| contact_type | string | No | Contact type Allowed values: 2, 4, 9. | ||
| is_hard_hit | string | No | Hard-hit filter Allowed values: 1, 0. | ||
| attack_zone | string | No | Attack zone Allowed values: 0, 1, 1.1, 2, 3. | ||
| pitch_hand | string | No | Pitcher hand Allowed values: L, R. | ||
| sort | string | No | Local sort field Allowed values: name, team_name, avg_sweetspot_speed_mph, avg_plane_vertical_angle, attack_angle, attack_direction_pullopp, rate_ideal_attack_angle, avg_intercept_y_vs_plate, avg_intercept_y_vs_batter, avg_batter_y_position, avg_batter_x_position, avg_foot_sep0, avg_foot_angle0, n_swings. | ||
| 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-swing-path?type=batter&season_start=2023&season_end=2023&game_type=Any&min_swings=q&min_group_swings=1&team_id=108&bat_side=L&contact_type=2&is_hard_hit=1&attack_zone=0&pitch_hand=L&sort=name&sort_dir=asc&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 0,
"data": {
"board": "swing-path-attack-angle",
"type": "batter",
"total": 1,
"sort": "avg_sweetspot_speed_mph",
"sort_dir": "desc",
"offset": 0,
"limit": 1,
"rows": [
{
"name": "Sample Player",
"team_name": "NYY",
"n_swings": 120
}
]
}
}Request schema
No body schema
Response schema
#/definitions/mlb.statcastSwingPathResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| board | string | No | swing-path-attack-angle | |||
| game_type | string | No | Regular | |||
| rows | array | No | ||||
| season_end | string | No | 2026 | |||
| season_start | string | No | 2026 | |||
| total | integer | No | 203 | |||
| 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-swing-path?type=batter&season_start=2023&season_end=2023&game_type=Any&min_swings=q&min_group_swings=1&team_id=108&bat_side=L&contact_type=2&is_hard_hit=1&attack_zone=0&pitch_hand=L&sort=name&sort_dir=asc&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"