MLB API endpoint
Returns Baseball Savant's ABS challenge table with repeated season, game type, split, challenging-team, opponent-team, pitch-type, and shadow-zone filters, plus challenger type, level, thresholds, leverage, pitch location, breakeven, and split-year controls. Filter values are live-verified and listed by /mlb/discovery. The entire filtered table is returned; UI-only drawer details and client-side sorting are not separate source filters.
/mlb/statcast-abs-challengesReturns the full ABS challenge leaderboard for the selected filters. Repeated filters are combined as the Baseball Savant page does. Rows preserve all metric fields; total is the number of rows returned. The table is already ordered by its default metric. UI-only row drawers and local column sorting are not additional filters.
challenge_type (optional): batter, batting-team, catcher, pitcher, catching-team, team-summary, league. Default: batter.seasons (repeatable, optional): 2025, 2026. If omitted, Baseball Savant defaults to the current season.game_types (repeatable, optional): R, S, F, D, L, W. If omitted, the page defaults to R.data_mode (optional): for, against. Default: for.data_count (optional): chal, runs. Default: chal.min_challenges (optional): 0, 1, 2, 5, 10, 20. Default: 1.min_opponent_challenges (optional): 0, 1, 2, 5, 10, 20. Default: 0.level (optional): mlb, aaa. Default: mlb.leverage (optional): ``, vlow, low, med, high. Empty means all leverage bands.ball_strike (optional): ``, in, out. Empty means all pitch locations.breakeven (optional): ``, low, med, high, vhigh. Empty means all breakeven bands.split_year (optional): 0, 1. Default: 1.splits (repeatable, optional): api_game_date_month_text, game_type, bat_position_code, lineup_cd, leverage_run_value_code, is_strike_calc, home_away, api_pitch_type_group03, gameday3_pitchzone_cd, abschallenge_breakeven_code.challenge_team_ids and opponent_team_ids (repeatable, optional): 141, 110, 139, 111, 147, 114, 118, 116, 142, 145, 108, 117, 133, 136, 140, 144, 146, 121, 120, 143, 158, 138, 112, 134, 113, 109, 119, 137, 135, 115.pitch_types (repeatable, optional): FF, SI, FC, CH, FS, FO, SC, CU, SL, ST, SV, KN.shadow_zones (repeatable, optional): 11, 12, 13, 14, 16, 17, 18, 19.All filter choices are exposed by /api/v1/mlb/discovery under statcast_abs_challenge_filters. Team values are MLB Stats API ids. Enum sets were checked against the live selector and replayed through the anonymous first-party page on 2026-10-01. The page currently offers seasons 2025 and 2026; the season discovery list advances with the current year.
| Field | Filled in, of 526 checked | Values in the sample |
|---|---|---|
| cost_vs_exp | 500 | -0.68 to 0.29, median 0.02 |
| cost_vs_exp_against | 500 | -0.31 to 0.25, median 0 |
| exp_chal | 500 | 0.34 to 26.83, median 7.51 |
| exp_chal_against | 500 | 0.07 to 32.9, median 8.39 |
| exp_chal_gained | 500 | 0 to 14.12, median 3.58 |
| exp_chal_gained_against | 500 | 0 to 22.84, median 4.84 |
| exp_chal_lost | 500 | 0.1 to 15.23, median 3.85 |
| exp_chal_lost_against | 500 | 0 to 14.7, median 3.64 |
| exp_chal_runs | 500 | -2.06 to 2.71, median -0.15 |
| exp_chal_runs_against | 500 | -1.07 to 3.16, median 0.05 |
| exp_chal_runs_gained | 500 | 0 to 4.22, median 0.63 |
| exp_chal_runs_gained_against | 500 | 0 to 5.7, median 0.84 |
| exp_chal_runs_lost | 500 | 0.02 to 3.2, median 0.81 |
| exp_chal_runs_lost_against | 500 | 0 to 3.09, median 0.76 |
| exp_rate_challenges | 500 | 0.02 to 0.2, median 0.05 |
| exp_rate_challenges_against | 500 | 0 to 0.07, median 0.02 |
| exp_rate_challenges_diff | 500 | -0.06 to 0.17, median 0 |
| exp_rate_challenges_diff_against | 500 | -0.05 to 0.05, median 0 |
| exp_rate_overturns | 497 | 0.07 to 0.94, median 0.48 |
| exp_rate_overturns_against | 491 | 0.19 to 0.99, median 0.57 |
| exp_runs_cost | 500 | 0 to 0.52, median 0.12 |
| exp_runs_cost_against | 500 | 0 to 0.43, median 0.11 |
| exp_runs_gained_per_chal | 500 | 0 to 0.39, median 0.08 |
| exp_runs_gained_per_chal_against | 500 | 0 to 0.6, median 0.09 |
| id | 500 | |
| level | 500 | MLB in all 500 |
| levelCode | 500 | 1 |
| n_chal_runs | 500 | -2.52 to 3.19, median -0.16 |
| n_chal_runs_against | 500 | -1.89 to 4.42, median 0.04 |
| n_chal_runs_gained | 500 | 0 to 5.55, median 0.54 |
| n_chal_runs_gained_against | 500 | 0 to 5.68, median 0.74 |
| n_chal_runs_lost | 500 | 0 to 5.46, median 0.63 |
| n_chal_runs_lost_against | 500 | 0 to 3.57, median 0.84 |
| n_challenges | 500 | 1 to 51, median 6 |
| n_challenges_against | 500 | 0 to 41, median 8 |
| n_fails | 500 | 0 to 26, median 3 |
| n_fails_against | 500 | 0 to 17, median 4 |
| n_levels | 500 | 1 |
| n_levels_against | 500 | 1 |
| n_overturns | 500 | 0 to 28, median 3 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| challenge_type | string | No | Challenge board group Allowed values: batter, batting-team, catcher, pitcher, catching-team, team-summary, league. | ||
| seasons | array<string> | No | Season values Allowed values: 2025, 2026. Repeat this query parameter for multiple values. | ||
| game_types | array<string> | No | Game type codes Allowed values: R, S, F, D, L, W. Repeat this query parameter for multiple values. | ||
| data_mode | string | No | Challenges made or against Allowed values: for, against. | ||
| data_count | string | No | Challenge count or run value Allowed values: chal, runs. | ||
| min_challenges | string | No | Minimum challenges made Allowed values: 0, 1, 2, 5, 10, 20. | ||
| min_opponent_challenges | string | No | Minimum challenges against Allowed values: 0, 1, 2, 5, 10, 20. | ||
| level | string | No | Competition level Allowed values: mlb, aaa. | ||
| leverage | string | No | Leverage bucket; empty selects All Allowed values: vlow, low, med, high. | ||
| ball_strike | string | No | Pitch location; empty selects All Allowed values: in, out. | ||
| breakeven | string | No | Challenge breakeven band; empty selects All Allowed values: low, med, high, vhigh. | ||
| split_year | string | No | Separate year groups Allowed values: 0, 1. | ||
| splits | array<string> | No | Split dimensions Allowed values: api_game_date_month_text, game_type, bat_position_code, lineup_cd, leverage_run_value_code, is_strike_calc, home_away, api_pitch_type_group03, gameday3_pitchzone_cd, abschallenge_breakeven_code. Repeat this query parameter for multiple values. | ||
| challenge_team_ids | array<string> | No | Challenging MLB team ids Allowed values: 141, 110, 139, 111, 147, 114, 118, 116, 142, 145, 108, 117, 133, 136, 140, 144, 146, 121, 120, 143, 158, 138, 112, 134, 113, 109, 119, 137, 135, 115. Repeat this query parameter for multiple values. | ||
| opponent_team_ids | array<string> | No | Opponent MLB team ids Allowed values: 141, 110, 139, 111, 147, 114, 118, 116, 142, 145, 108, 117, 133, 136, 140, 144, 146, 121, 120, 143, 158, 138, 112, 134, 113, 109, 119, 137, 135, 115. Repeat this query parameter for multiple values. | ||
| pitch_types | array<string> | No | Pitch type codes Allowed values: FF, SI, FC, CH, FS, FO, SC, CU, SL, ST, SV, KN. Repeat this query parameter for multiple values. | ||
| shadow_zones | array<string> | No | Shadow zone codes Allowed values: 11, 12, 13, 14, 16, 17, 18, 19. Repeat this query parameter for multiple values. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/mlb/statcast-abs-challenges?challenge_type=batter&seasons=2025&game_types=R&data_mode=for&data_count=chal&min_challenges=0&min_opponent_challenges=0&level=mlb&leverage=vlow&ball_strike=in&breakeven=low&split_year=0&splits=api_game_date_month_text&challenge_team_ids=141&opponent_team_ids=141&pitch_types=FF&shadow_zones=11" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"board": "ABS Challenges",
"filters": {
"challenge_type": "batter",
"data_mode": "for",
"data_count": "chal",
"min_challenges": "1",
"min_opponent_challenges": "0",
"level": "mlb",
"split_year": "1"
},
"total": 1,
"source_url": "https://baseballsavant.mlb.com/leaderboard/abs-challenges",
"fetched_at": "2026-10-01T00:00:00Z",
"rows": [
{
"year": 2026,
"player_name": "Example Player",
"n_challenges": 14,
"n_overturns": 12,
"rate_overturns": 0.857
}
]
}
}Request schema
No body schema
Response schema
#/definitions/mlb.statcastABSChallengesResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | mlb.StatcastABSChallengesResponse | No | ||||
| data.board | string | No | ||||
| data.fetched_at | string | No | ||||
| data.filters | mlb.StatcastABSChallengesOption | No | ||||
| data.filters.ball_strike | string | No | ||||
| data.filters.breakeven | string | No | ||||
| data.filters.challenge_team_ids | array | No | ||||
| data.filters.challenge_type | string | No | ||||
| data.filters.data_count | string | No | ||||
| data.filters.data_mode | string | No | ||||
| data.filters.game_types | array | No | ||||
| data.filters.level | string | No | ||||
| data.filters.leverage | string | No | ||||
| data.filters.min_challenges | string | No | ||||
| data.filters.min_opponent_challenges | string | No | ||||
| data.filters.opponent_team_ids | array | No | ||||
| data.filters.pitch_types | array | No | ||||
| data.filters.seasons | array | No | ||||
| data.filters.shadow_zones | array | No | ||||
| data.filters.split_year | string | No | ||||
| data.filters.splits | array | No | ||||
| data.rows | array | No | ||||
| data.source_url | string | No | ||||
| data.total | integer | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/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-abs-challenges?challenge_type=batter&seasons=2025&game_types=R&data_mode=for&data_count=chal&min_challenges=0&min_opponent_challenges=0&level=mlb&leverage=vlow&ball_strike=in&breakeven=low&split_year=0&splits=api_game_date_month_text&challenge_team_ids=141&opponent_team_ids=141&pitch_types=FF&shadow_zones=11" \
-H "x-api-key: $CRAWLORA_API_KEY"