MLB API endpoint
Returns batter, batting-team, pitcher, pitching-team, or league rows with the page's season, game type, pitch-group, split, team, date, swing, contact, zone, pitch hand/type, count, timing-axis, and timing-flag filters. Sorting is local. Use mlb_discovery for exact values.
/mlb/statcast-swing-timingFetches Baseball Savant's Swing Timing and Miss Distance table. Sorting and pagination are applied locally after the first-party page data is parsed.
type: batter, batting-team, pitcher, pitching-team, league (default batter).seasons: repeatable values 2023, 2024, 2025, 2026 (default 2026).game_types: repeatable values R, A, F, D, L, W (default R).splits: repeatable values api_pitch_type_group03, api_pitch_type_group09, api_game_date_month_text, bat_contact_code, game_type, is_hit_into_play_hardhit, is_best_speed, timing_x_tiedupflail, timing_y_earlylate, timing_z_overunder, pitch_hand, bat_side, is_pre_ball_count_3, is_pre_strike_count_2, pitchzone_height_code, is_starter_pitcher (default api_pitch_type_group09).min_swings: q, 1, 5, 10, 25, 50, 100, 200, 500, 1000 (default q).min_split: 1, 5, 10, 25, 50, 100, 200, 500, 1000 (default 1).split_year: 1, 0 (default 1).teams: repeatable 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.date_start, date_end: optional YYYY-MM-DD date range.bat_side: L, R; contact_type: 2, 4, 9; attack_zone: 0, 1, 1.1, 2, 3; pitch_hand: L, R.pitch_types: repeatable values FF, SI, FC, CH, FS, FO, SC, CU, SL, ST, SV, KN.counts: repeatable values 00, 01, 02, 10, 11, 12, 20, 21, 22, 30, 31, 32.swing_timing_x: repeatable values Tiedup, Centered, Flail.swing_timing_y: repeatable values Early, OnTime, Late.swing_timing_z: repeatable values Under, Linedup, Over.flags, not_flags: repeatable values is_timing_xyz_flawed, is_timing_xyz_perfect.sort: name, team_name, pitch_hand_type, bat_side_type, n_swings, competitive_swings, strikes_swinging, miss_distance, flails, centers, tied_ups, earlys, on_times, lates, unders, lined_ups, overs, delta_run_exp, whiff_rate, competitive_percent, perfect_percent, flawed_percent (default n_swings).sort_dir: asc, desc (default desc); limit: 1–500 (default 100); offset: 0–5000 (default 0).Returns table rows plus the applied seasons, game types, split dimensions, source URL, and fetch timestamp. Upstream values are preserved in row maps. The first-party per-swing miss-distance expansion endpoint is not included in this table response.
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| api_pitch_type_group09 | 40 | FF in all 40 |
| avg_x_centered | 40 | |
| avg_x_flail | 40 | |
| avg_x_tied_up | 40 | |
| avg_y_early | 40 | |
| avg_y_late | 40 | |
| avg_y_on_time | 40 | |
| avg_z_lined_up | 40 | 0.23 to 0.85, median 0.51 |
| avg_z_over | 40 | -3.94 to -2.22, median -3.04 |
| avg_z_under | 40 | 2.58 to 3.54, median 2.93 |
| b_name_display_first_last | 40 | “Aranda, Jonathan” and 39 other values |
| bat_side_formatted | 40 | R (23), L (16), S (1) |
| bat_side_type | 40 | R (23), L (16), X (1) |
| centered_percent | 40 | 0.61 to 0.84, median 0.72 |
| centers | 40 | 440 to 661, median 517 |
| competitive_percent | 40 | 0.87 to 0.95, median 0.91 |
| competitive_swings | 40 | 591 to 731, median 645 |
| delev_delta_run_exp | 40 | -29.62 to 2.23, median -17.96 |
| delta_run_exp | 40 | -29.62 to 2.23, median -17.96 |
| early_percent | 40 | 0 to 0.13, median 0.02 |
| earlys | 40 | 2 to 91, median 16 |
| flailed_percent | 40 | 0.06 to 0.32, median 0.13 |
| flails | 40 | 45 to 237, median 94 |
| flawed | 40 | 5 to 61, median 22 |
| flawed_percent | 40 | 0.01 to 0.08, median 0.03 |
| id | 40 | |
| late_percent | 40 | 0.12 to 0.44, median 0.23 |
| lates | 40 | 78 to 294, median 159 |
| lined_up_percent | 40 | 0.36 to 0.84, median 0.6 |
| lined_ups | 40 | 252 to 576, median 426 |
| miss_distance | 40 | 0.75 to 1.78, median 1.18 |
| n_sides | 40 | 1 to 2, median 1 |
| n_swings | 40 | 659 to 807, median 703 |
| n_teams | 40 | 1 to 2, median 1 |
| name | 40 | “Aranda, Jonathan” and 39 other values |
| on_time_percent | 40 | 0.54 to 0.85, median 0.73 |
| on_times | 40 | 358 to 634, median 513 |
| over_percent | 40 | 0.01 to 0.09, median 0.04 |
| overs | 40 | 5 to 66, median 30 |
| perfect | 40 | 112 to 297, median 163 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| type | string | No | Row type Allowed values: batter, batting-team, pitcher, pitching-team, league. | ||
| seasons | array<string> | No | One or more seasons Allowed values: 2023, 2024, 2025, 2026. Repeat this query parameter for multiple values. | ||
| game_types | array<string> | No | One or more game types Allowed values: R, A, F, D, L, W. Repeat this query parameter for multiple values. | ||
| splits | array<string> | No | One or more split dimensions Allowed values: api_pitch_type_group03, api_pitch_type_group09, api_game_date_month_text, bat_contact_code, game_type, is_hit_into_play_hardhit, is_best_speed, timing_x_tiedupflail, timing_y_earlylate, timing_z_overunder, pitch_hand, bat_side, is_pre_ball_count_3, is_pre_strike_count_2, pitchzone_height_code, is_starter_pitcher. Repeat this query parameter for multiple values. | ||
| min_swings | string | No | Minimum swing threshold Allowed values: q, 1, 5, 10, 25, 50, 100, 200, 500, 1000. | ||
| min_split | string | No | Minimum swings per split group Allowed values: 1, 5, 10, 25, 50, 100, 200, 500, 1000. | ||
| split_year | string | No | Split years into separate rows Allowed values: 1, 0. | ||
| teams | array<string> | No | One or more MLB team ids 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. | ||
| 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. | ||
| attack_zone | string | No | Attack zone Allowed values: 0, 1, 1.1, 2, 3. | ||
| pitch_hand | string | No | Pitcher hand Allowed values: L, R. | ||
| pitch_types | array<string> | No | One or more pitch type codes Allowed values: FF, SI, FC, CH, FS, FO, SC, CU, SL, ST, SV, KN. Repeat this query parameter for multiple values. | ||
| counts | array<string> | No | One or more ball-strike counts Allowed values: 00, 01, 02, 10, 11, 12, 20, 21, 22, 30, 31, 32. Repeat this query parameter for multiple values. | ||
| swing_timing_x | array<string> | No | Tied-up, centered, or flailed Allowed values: Tiedup, Centered, Flail. Repeat this query parameter for multiple values. | ||
| swing_timing_y | array<string> | No | Early, on-time, or late Allowed values: Early, OnTime, Late. Repeat this query parameter for multiple values. | ||
| swing_timing_z | array<string> | No | Under, lined-up, or over Allowed values: Under, Linedup, Over. Repeat this query parameter for multiple values. | ||
| flags | array<string> | No | Positive timing flags Allowed values: is_timing_xyz_flawed, is_timing_xyz_perfect. Repeat this query parameter for multiple values. | ||
| not_flags | array<string> | No | Excluded timing flags Allowed values: is_timing_xyz_flawed, is_timing_xyz_perfect. Repeat this query parameter for multiple values. | ||
| sort | string | No | Local sort field Allowed values: name, team_name, pitch_hand_type, bat_side_type, n_swings, competitive_swings, strikes_swinging, miss_distance, flails, centers, tied_ups, earlys, on_times, lates, unders, lined_ups, overs, delta_run_exp, whiff_rate, competitive_percent, perfect_percent, flawed_percent. | ||
| 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-timing?type=batter&seasons=2023&game_types=R&splits=api_pitch_type_group03&min_swings=q&min_split=1&split_year=1&teams=108&bat_side=L&contact_type=2&attack_zone=0&pitch_hand=L&pitch_types=FF&counts=00&swing_timing_x=Tiedup&swing_timing_y=Early&swing_timing_z=Under&flags=is_timing_xyz_flawed¬_flags=is_timing_xyz_flawed&sort=name&sort_dir=asc&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 0,
"data": {
"board": "swing-timing-miss-distance",
"type": "batter",
"total": 1,
"sort": "n_swings",
"sort_dir": "desc",
"offset": 0,
"limit": 1,
"rows": [
{
"uniqueId": "666018_FF_2026",
"name": "Sample Player",
"n_swings": 100
}
]
}
}Request schema
No body schema
Response schema
#/definitions/mlb.statcastSwingTimingResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| board | string | No | swing-timing-miss-distance | |||
| game_types | array | No | R | |||
| rows | array | No | ||||
| seasons | array | No | 2026 | |||
| splits | array | No | api_pitch_type_group09 | |||
| total | integer | No | 926 | |||
| 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-timing?type=batter&seasons=2023&game_types=R&splits=api_pitch_type_group03&min_swings=q&min_split=1&split_year=1&teams=108&bat_side=L&contact_type=2&attack_zone=0&pitch_hand=L&pitch_types=FF&counts=00&swing_timing_x=Tiedup&swing_timing_y=Early&swing_timing_z=Under&flags=is_timing_xyz_flawed¬_flags=is_timing_xyz_flawed&sort=name&sort_dir=asc&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"