MLB API endpoint
Returns one of Baseball Savant's Year-to-Year Changes tables for batters, pitchers, batting teams, or pitching teams. Select one of the live statistic types and comparison start years; the page data contains available yearly values and differences. Table sorting and pagination are applied locally. Use mlb_discovery for all accepted group, type, and year values.
/mlb/statcast-year-to-yearReturns rows from Baseball Savant's Year-to-Year Changes table. The anonymous page embeds row data; this endpoint applies the selected table sort and pagination locally.
group (optional): Batter, Pitcher, Batter Team, or Pitcher Team. Defaults to Batter.type (optional): one of ba, xba, obp, xobp, slg, xslg, iso, xiso, babip, woba, xwoba, wobacon, xwobacon, bacon, xbacon, hard_hit_percent, exit_velocity_avg, sweet_spot_percent, barrel_batted_rate, launch_angle_avg, avg_swing_speed, attack_angle, ideal_angle_rate, attack_direction, vertical_swing_path, avg_swing_length, fastball_velo, breaking_velo, offspeed_velo, barrels, popups_percent, flyballs_percent, linedrives_percent, groundballs_percent, pull_percent, straightaway_percent, opposite_percent, poorlyweak_percent, pull_percent_airballs, poorlytopped_percent, poorlyunder_percent, flareburner_percent, solidcontact_percent, hr_flyballs_percent, popups, flyballs, linedrives, groundballs, in_zone_percent, out_zone_percent, edge_percent, z_swing_percent, oz_swing_percent, iz_contact_percent, oz_contact_percent, whiff_percent, f_strike_percent, f_swing_percent, swing_percent, meatball_swing_percent, meatball_percent, z_swing_miss_percent, oz_swing_miss_percent, in_zone, out_zone, edge, in_zone_swing, out_zone_swing, in_zone_swing_miss, out_zone_swing_miss, pitch_count, pa, ab, hit, single, double, triple, home_run, walk, strikeout, k_percent, bb_percent, hbp, batted_ball, pitch_usage_fastball, pitch_usage_offspeed, pitch_usage_breaking, pitch_count_fastball, pitch_count_offspeed, pitch_count_breaking. Defaults to hard_hit_percent.year (optional): comparison start year 2025, 2024, 2023, 2022, 2021, 2020, 2019, 2018, or 2017. Each value compares that year with the following season. Defaults to 2025.sort (optional): name_display_last_first, year_YYYY, TYPE_YYYY, or TYPE_diff_YYYY. Year columns accept 2015 through 2026; difference columns accept 2015 through 2025. TYPE must match the selected type. Defaults to <type>_diff_<year>.sort_dir (optional): asc or desc; defaults to desc for batter views and asc for pitcher views. Team views follow their corresponding batter/pitcher default.limit (optional): 1–500 rows; defaults to 100.offset (optional): zero-based row offset, 0–5000; defaults to 0.The source page has no team, position, or date filters. The table contains its
available yearly values and difference columns in each row. Sort columns are
validated against the selected metric before fetching. No-results groups or
years are represented by an empty rows array when the upstream table proves
there are no records.
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| entity_id | 40 | |
| hard_hit_percent_2015 | 4 | 24 to 37.5, median 33.8 |
| hard_hit_percent_2016 | 5 | 26.8 to 39.9, median 32.9 |
| hard_hit_percent_2017 | 5 | 30.2 to 37.9, median 34.7 |
| hard_hit_percent_2018 | 5 | 33.7 to 50.6, median 41 |
| hard_hit_percent_2019 | 13 | 19.8 to 47.4, median 41 |
| hard_hit_percent_2020 | 13 | 26.1 to 62.2, median 35.6 |
| hard_hit_percent_2021 | 12 | 27 to 47.3, median 40.8 |
| hard_hit_percent_2022 | 24 | 29.9 to 50, median 38.6 |
| hard_hit_percent_2023 | 31 | 22.2 to 49.3, median 38.4 |
| hard_hit_percent_2024 | 37 | 23.7 to 55.8, median 39.9 |
| hard_hit_percent_2025 | 40 | 16.7 to 56.3, median 40.8 |
| hard_hit_percent_2026 | 40 | 19.4 to 58.9, median 44.8 |
| hard_hit_percent_diff_2015 | 4 | -3.2 to 8.9, median -1.1 |
| hard_hit_percent_diff_2016 | 5 | -2.5 to 6.6, median 1.8 |
| hard_hit_percent_diff_2017 | 5 | 0.3 to 12.7, median 5.1 |
| hard_hit_percent_diff_2018 | 5 | -3.2 to 4, median 0.6 |
| hard_hit_percent_diff_2019 | 13 | -12.8 to 18.1, median -0.1 |
| hard_hit_percent_diff_2020 | 13 | -6.6 to 17.1, median 2.5 |
| hard_hit_percent_diff_2021 | 12 | -5.5 to 6.6, median -2.1 |
| hard_hit_percent_diff_2022 | 24 | -27.8 to 15.2, median 1.5 |
| hard_hit_percent_diff_2023 | 31 | -9 to 29.1, median 0.7 |
| hard_hit_percent_diff_2024 | 37 | -7 to 14.2, median -0.2 |
| hard_hit_percent_diff_2025 | 40 | 0.5 to 9.5, median 3.1 |
| href | 40 | median 65 characters |
| name | 40 | “De La Cruz, Elly” and 39 other values |
| name_display_last_first | 40 | “De La Cruz, Elly” and 39 other values |
| year_2015 | 40 | 2,015 |
| year_2016 | 40 | 2,016 |
| year_2017 | 40 | 2,017 |
| year_2018 | 40 | 2,018 |
| year_2019 | 40 | 2,019 |
| year_2020 | 40 | 2,020 |
| year_2021 | 40 | 2,021 |
| year_2022 | 40 | 2,022 |
| year_2023 | 40 | 2,023 |
| year_2024 | 40 | 2,024 |
| year_2025 | 40 | 2,025 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| group | string | No | Table group Allowed values: Batter, Pitcher, Batter Team, Pitcher Team. | ||
| type | string | No | Statistic type Allowed values: ba, xba, obp, xobp, slg, xslg, iso, xiso, babip, woba, xwoba, wobacon, xwobacon, bacon, xbacon, hard_hit_percent, exit_velocity_avg, sweet_spot_percent, barrel_batted_rate, launch_angle_avg, avg_swing_speed, attack_angle, ideal_angle_rate, attack_direction, vertical_swing_path, avg_swing_length, fastball_velo, breaking_velo, offspeed_velo, barrels, popups_percent, flyballs_percent, linedrives_percent, groundballs_percent, pull_percent, straightaway_percent, opposite_percent, poorlyweak_percent, pull_percent_airballs, poorlytopped_percent, poorlyunder_percent, flareburner_percent, solidcontact_percent, hr_flyballs_percent, popups, flyballs, linedrives, groundballs, in_zone_percent, out_zone_percent, edge_percent, z_swing_percent, oz_swing_percent, iz_contact_percent, oz_contact_percent, whiff_percent, f_strike_percent, f_swing_percent, swing_percent, meatball_swing_percent, meatball_percent, z_swing_miss_percent, oz_swing_miss_percent, in_zone, out_zone, edge, in_zone_swing, out_zone_swing, in_zone_swing_miss, out_zone_swing_miss, pitch_count, pa, ab, hit, single, double, triple, home_run, walk, strikeout, k_percent, bb_percent, hbp, batted_ball, pitch_usage_fastball, pitch_usage_offspeed, pitch_usage_breaking, pitch_count_fastball, pitch_count_offspeed, pitch_count_breaking. | ||
| year | string | No | Comparison start year; compares this season with the following year Allowed values: 2025, 2024, 2023, 2022, 2021, 2020, 2019, 2018, 2017. | ||
| sort | string | No | the selected metric's difference for the selected comparison year | Local sortable column; name_display_last_first, year_YYYY, TYPE_YYYY, or TYPE_diff_YYYY. Defaults to the selected metric's difference for the selected comparison year. | |
| sort_dir | string | No | Batter descending and Pitcher ascending | Sort direction; defaults to Batter descending and Pitcher ascending 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-year-to-year?group=Batter&type=ba&year=2025&sort_dir=asc&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"board": "year-to-year",
"group": "Batter",
"type": "hard_hit_percent",
"year": "2025",
"next_year": 2026,
"total": 1,
"sort": "hard_hit_percent_diff_2025",
"sort_dir": "desc",
"offset": 0,
"limit": 1,
"rows": [
{
"entity_id": 123,
"name_display_last_first": "Example, Player",
"hard_hit_percent_2025": 40.2,
"hard_hit_percent_diff_2025": -3.1,
"hard_hit_percent_2026": 37.1
}
]
}
}Request schema
No body schema
Response schema
#/definitions/mlb.statcastYearToYearResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| board | string | No | year-to-year | |||
| fetched_at | string | No | ||||
| group | string | No | Batter | |||
| limit | integer | No | 100 | |||
| next_year | integer | No | 2026 | |||
| offset | integer | No | 0 | |||
| rows | array | No | ||||
| sort | string | No | hard_hit_percent_diff_2025 | |||
| sort_dir | string | No | desc | |||
| source_url | string | No | ||||
| total | integer | No | 177 | |||
| type | string | No | hard_hit_percent | |||
| year | string | No | 2025 |
| 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-year-to-year?group=Batter&type=ba&year=2025&sort_dir=asc&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"