MLB API endpoint
Returns Baseball Savant Baserunning Run Value, Basestealing, or Extra Bases Taken tables. All filter value sets were read from the live first-party controls; rows are embedded in the page response and searched, sorted, and paged locally. Use mlb_discovery.statcast_baserunning_filters for board-specific groups, thresholds, and sort fields. CSV and visual expansion modes are excluded; this returns the underlying JSON table rows.
/mlb/statcast-baserunningReturns one of Baseball Savant's Baserunning Run Value, Basestealing, or Extra Bases Taken tables. The upstream page embeds the table rows; search, sorting, and pagination are applied locally. Use mlb_discovery.statcast_baserunning_filters for the same board-specific selectors in structured form.
board (required): baserunning-run-value, basestealing-running-game, or baserunning.type: board group. baserunning-run-value: Run, Batting Team, Pitching Team, League. basestealing-running-game: Bat, Batting Team, League. baserunning: Run, Fld, Pit, Batting Team, Pitching Team, League.game_type: Regular, Playoff, All; default Regular.season_start, season_end: ordered seasons from 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026 through the current season; defaults to the current season.split: no, yes; default no.n: board-specific threshold. Baserunning Run Value: q, 1, 5, 10, 20, 30, 40, 50, 75, 100, 250, 500, 1000. Basestealing: q, 1, 50, 100, 200, 500, 1000, 1500, 2000. Extra Bases Taken: top, 1, 5, 10, 20, 30, 40, 50, 75, 100, 250, 500, 1000.team: split or one MLB team ID: 108, 117, 133, 141, 144, 158, 138, 112, 109, 119, 137, 114, 136, 146, 121, 120, 110, 135, 143, 134, 140, 139, 113, 111, 115, 118, 116, 142, 145, 147. Omit for all teams.with_team_only: true or false; only valid with one team ID and a non-League group. Defaults to the first-party active-team setting.pitch_hand (all, L, R), runner_moved (All, Advance, Out, Hold), target_base (All, 2B, 3B), and prior_pk (All, 0, 1, 2, 3).key_base_out: All, r10_to_2b_210, r10_to_3b_210, r11_to_3b_10, r11_to_3b_2, r11_to_hp_10, r11_to_hp_2, r12_to_hp_10, r12_to_hp_2, r13_to_hp_0, r13_to_hp_1.sort: locally sortable row field. Baserunning Run Value: entity_name, team_name, start_year, N_runner_moved, N_runner_moved_SBX, N_runner_moved_XB, runner_runs_SB2, runner_runs_SB3, runner_runs_SBX, runner_runs_XB, runner_runs_XB_freeze, runner_runs_XB_snipe, runner_runs_XB_swipe, runner_runs_tot, simple_stolen_on_running_act_SB2, simple_stolen_on_running_act_SB3. Basestealing: entity_name, team_name, start_year, bk, catcher_name, cs, entity_id, fb, fielder_name, game_date, n_bk, n_cs, n_fb, n_init, n_minus, n_pk, n_plus, n_sb, net_act_minus, net_act_plus, pitcher_name, pk, r_primary_lead, r_primary_lead_sbx, r_sec_minus_prim_lead, r_sec_minus_prim_lead_sbx, r_secondary_lead, r_secondary_lead_sbx, r_sprint_speed_top50percent, rate_sbx, runner_moved_cd, runner_name, runs_stolen_on_running_act, sb, sba, simple_stolen_on_running_act, target_base. Extra Bases Taken: entity_name, team_name, start_year, runner_runs, fielder_runs, runner_runs_swipe, runner_runs_snipe, runner_runs_freeze, fielder_runs_swipe, fielder_runs_snipe, fielder_runs_freeze, n_opp_xb, rate_att_xb, est_rate_att_generic_runner, est_rate_att_generic_fielder, rate_att_xb_diff_runner, rate_att_xb_diff_fielder, n_safe, rate_safe, rate_safe_per_attempt.sort_dir: asc, desc; default desc.search: case-insensitive substring match on player/team display name.limit: 1–500, default 100. offset: 0–10000, default 0.Filter names that only apply to one board are rejected on the other boards. expanded is a presentation-only control and CSV is a separate non-JSON mode, so neither is exposed.
curl 'https://api.crawlora.net/api/v1/mlb/statcast-baserunning?board=baserunning-run-value&type=Run&season_start=2025&season_end=2026&n=10&sort=runner_runs_tot&sort_dir=desc&limit=25' \
-H 'x-api-key: YOUR_API_KEY'
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| N_runner_moved | 40 | 35 to 120, median 69 |
| N_runner_moved_SBX | 40 | 5 to 48, median 23 |
| N_runner_moved_XB | 40 | 16 to 77, median 47 |
| N_runner_moved_max_noentity | 40 | 120 |
| end_year | 40 | 2,026 |
| end_year_upper | 40 | 9,999 |
| entity_id | 40 | |
| entity_name | 40 | “Carroll, Corbin” and 39 other values |
| key_name_abbrev | 40 | |
| key_team_id | 40 | |
| num_teams | 40 | 1 to 2, median 1 |
| row_id | 40 | |
| runner_runs_SB2 | 40 | -0.38 to 4.72, median 1.8 |
| runner_runs_SB3 | 40 | -0.46 to 2.12, median 0.24 |
| runner_runs_SBX | 40 | -0.52 to 5.5, median 2.12 |
| runner_runs_XB | 40 | 0.02 to 6.62, median 2.07 |
| runner_runs_XB_freeze | 40 | -2.3 to -0.15, median -0.95 |
| runner_runs_XB_snipe | 40 | -2.34 to 0, median 0 |
| runner_runs_XB_swipe | 40 | 1.63 to 8.23, median 3.66 |
| runner_runs_tot | 40 | 2.65 to 8.94, median 4.07 |
| simple_stolen_on_running_act_SB2 | 40 | 0.22 to 24.61, median 8.89 |
| simple_stolen_on_running_act_SB3 | 40 | -1.49 to 10.38, median 1.17 |
| simple_stolen_on_running_act_SBX | 40 | -1.19 to 30.68, median 10.7 |
| start_year | 40 | 2,026 |
| start_year_lower | 40 | 0 to 2,026, median 2,026 |
| team_image_url | 40 | “https://www.mlbstatic.com/team-logos/109.svg” and 24 other values |
| team_name | 40 | “AZ” and 24 other values |
| team_selection_id | 40 | |
| timeframe | 40 | 2,026 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| board | string | Yes | Baseball Savant table Allowed values: baserunning-run-value, basestealing-running-game, baserunning. | baserunning-run-value | |
| type | string | No | Board group; accepted values depend on board Allowed values: Run, Bat, Batting Team, Pitching Team, Fld, Pit, League. | ||
| game_type | string | No | Game scope Allowed values: Regular, Playoff, All. | ||
| season_start | integer | No | Inclusive first season Allowed values: 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026. | ||
| season_end | integer | No | Inclusive last season Allowed values: 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026. | ||
| split | string | No | Return separate year rows Allowed values: no, yes. | ||
| n | string | No | Board-specific row threshold Allowed values: q, top, 1, 5, 10, 20, 30, 40, 50, 75, 100, 250, 500, 1000, 1500, 2000. | ||
| team | string | No | MLB team id or split-team rows Allowed values: split, 108, 117, 133, 141, 144, 158, 138, 112, 109, 119, 137, 114, 136, 146, 121, 120, 110, 135, 143, 134, 140, 139, 113, 111, 115, 118, 116, 142, 145, 147. | ||
| with_team_only | boolean | No | Restrict to selected team's active player rows; requires a specific team id | ||
| pitch_hand | string | No | Basestealing pitcher hand Allowed values: all, L, R. | ||
| runner_moved | string | No | Basestealing runner outcome Allowed values: All, Advance, Out, Hold. | ||
| target_base | string | No | Basestealing target base Allowed values: All, 2B, 3B. | ||
| prior_pk | string | No | Basestealing prior pickoffs Allowed values: All, 0, 1, 2, 3. | ||
| key_base_out | string | No | Extra Bases Taken situation Allowed values: All, r10_to_2b_210, r10_to_3b_210, r11_to_3b_10, r11_to_3b_2, r11_to_hp_10, r11_to_hp_2, r12_to_hp_10, r12_to_hp_2, r13_to_hp_0, r13_to_hp_1. | ||
| sort | string | No | Local sort field; accepted values depend on board Allowed values: entity_name, team_name, start_year, N_runner_moved, N_runner_moved_SBX, N_runner_moved_XB, runner_runs_SB2, runner_runs_SB3, runner_runs_SBX, runner_runs_XB, runner_runs_XB_freeze, runner_runs_XB_snipe, runner_runs_XB_swipe, runner_runs_tot, simple_stolen_on_running_act_SB2, simple_stolen_on_running_act_SB3, bk, catcher_name, cs, entity_id, fb, fielder_name, game_date, n_bk, n_cs, n_fb, n_init, n_minus, n_pk, n_plus, n_sb, net_act_minus, net_act_plus, pitcher_name, pk, r_primary_lead, r_primary_lead_sbx, r_sec_minus_prim_lead, r_sec_minus_prim_lead_sbx, r_secondary_lead, r_secondary_lead_sbx, r_sprint_speed_top50percent, rate_sbx, runner_moved_cd, runner_name, runs_stolen_on_running_act, sb, sba, simple_stolen_on_running_act, target_base, runner_runs, fielder_runs, runner_runs_swipe, runner_runs_snipe, runner_runs_freeze, fielder_runs_swipe, fielder_runs_snipe, fielder_runs_freeze, n_opp_xb, rate_att_xb, est_rate_att_generic_runner, est_rate_att_generic_fielder, rate_att_xb_diff_runner, rate_att_xb_diff_fielder, n_safe, rate_safe, rate_safe_per_attempt. | ||
| sort_dir | string | No | Local sort direction Allowed values: asc, desc. | ||
| search | string | No | Case-insensitive substring in the displayed player or team name | ||
| limit | integer | No | Rows per page, 1-500 Minimum: 1. Maximum: 500. | ||
| offset | integer | No | Zero-based row offset Minimum: 0. Maximum: 10000. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/mlb/statcast-baserunning?board=baserunning-run-value&type=Run&game_type=Regular&season_start=2016&season_end=2016&split=no&n=q&team=split&with_team_only=true&pitch_hand=all&runner_moved=All&target_base=All&prior_pk=All&key_base_out=All&sort=entity_name&sort_dir=asc&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"board": "baserunning-run-value",
"total": 1,
"offset": 0,
"limit": 25,
"rows": [
{
"entity_name": "Example Runner",
"runner_runs_tot": 1.2
}
]
}
}Request schema
No body schema
Response schema
#/definitions/mlb.statcastBaserunningResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | ||||
| data | mlb.StatcastBaserunningResponse | No | ||||
| data.board | string | No | ||||
| data.fetched_at | string | No | ||||
| data.filters | mlb.StatcastBaserunningOption | No | ||||
| data.filters.board | string | No | ||||
| data.filters.game_type | string | No | ||||
| data.filters.key_base_out | string | No | ||||
| data.filters.limit | integer | No | ||||
| data.filters.n | string | No | ||||
| data.filters.offset | integer | No | ||||
| data.filters.pitch_hand | string | No | ||||
| data.filters.prior_pk | string | No | ||||
| data.filters.runner_moved | string | No | ||||
| data.filters.search | string | No | ||||
| data.filters.season_end | integer | No | ||||
| data.filters.season_start | integer | No | ||||
| data.filters.sort | string | No | ||||
| data.filters.sort_dir | string | No | ||||
| data.filters.split | string | No | ||||
| data.filters.target_base | string | No | ||||
| data.filters.team | string | No | ||||
| data.filters.type | string | No | ||||
| data.filters.with_team_only | boolean | No | ||||
| data.limit | integer | No | ||||
| data.offset | integer | No | ||||
| data.rows | array | No | ||||
| data.source_url | string | No | ||||
| data.total | integer | No | ||||
| msg | string | No |
| 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-baserunning?board=baserunning-run-value&type=Run&game_type=Regular&season_start=2016&season_end=2016&split=no&n=q&team=split&with_team_only=true&pitch_hand=all&runner_moved=All&target_base=All&prior_pk=All&key_base_out=All&sort=entity_name&sort_dir=asc&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"