MLB API endpoint
Returns the separate Expected Statistics leaderboard with batter, pitcher, and team views; season, team, batter-position, BIP/PA qualifier and threshold filters; local metric sorting; and pagination. League-average values are returned separately.
/mlb/statcast-expectedQuery parameters:
type is one of batter, pitcher, batter-team, or pitcher-team; defaults to batter.year is a season from 2015 through the current season; defaults to the current season.team_id is an optional MLB team id from /api/v1/mlb/teams.position is one of C, 1B, 2B, SS, 3B, LF, CF, RF, or DH. It is valid only for type=batter.filter_type is bip or pa; defaults to bip.minimum is one of q, 1, 25, 50, 100, 150, 200, 250, 350, 450, 500, or 600; defaults to q.sort is one of entity_name, entity_team_name, pa, bip, ba, est_ba, ba_minus_est_ba_diff, slg, est_slg, slg_minus_est_slg_diff, woba, est_woba, woba_minus_est_woba_diff, wobacon, est_wobacon, wobacon_minus_est_wobacon_diff, exit_velocity_avg, hard_hit_percent, barrels_per_bip, or barrels_per_pa; defaults to est_woba.sort_dir is asc or desc; defaults to desc.limit is 1–500; defaults to 100.offset is 0–5000; defaults to 0.The table is fetched from the anonymous Baseball Savant page. Sorting and pagination are applied locally to the full upstream result. The response includes the league-average row separately. Baseball Savant silently ignores position outside the batter view; this endpoint rejects that combination. The upstream's bip and pa selectors alter minimum qualification semantics, and are passed through as observed.
| Field | Filled in, of 1 checked | Values in the sample |
|---|---|---|
| rank | 1 | 1 |
| entity_id | 1 | |
| name | 1 | “Caballero, José” |
| team_id | 1 | |
| team | 1 | “Yankees” |
| position | 1 | “SS” |
| qualified | 1 | true in 1 of 1 |
| metrics | 1 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| type | string | No | Leaderboard view Allowed values: batter, pitcher, batter-team, pitcher-team. | ||
| year | integer | No | Season from 2015 through the current season | ||
| team_id | string | No | Optional MLB team id from mlb_teams | ||
| position | string | No | Batter position; only supported for type=batter Allowed values: C, 1B, 2B, SS, 3B, LF, CF, RF, DH. | ||
| filter_type | string | No | Minimum qualifier type Allowed values: bip, pa. | ||
| minimum | string | No | Minimum BIP/PA threshold Allowed values: q, 1, 25, 50, 100, 150, 200, 250, 350, 450, 500, 600. | ||
| sort | string | No | Sort field Allowed values: entity_name, entity_team_name, pa, bip, ba, est_ba, ba_minus_est_ba_diff, slg, est_slg, slg_minus_est_slg_diff, woba, est_woba, woba_minus_est_woba_diff, wobacon, est_wobacon, wobacon_minus_est_wobacon_diff, exit_velocity_avg, hard_hit_percent, barrels_per_bip, barrels_per_pa. | ||
| 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-expected?type=batter&position=C&filter_type=bip&minimum=q&sort=entity_name&sort_dir=asc&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"board": "expected_statistics",
"type": "batter",
"year": 2026,
"filter_type": "bip",
"minimum": "q",
"sort": "est_woba",
"sort_dir": "desc",
"total": 246,
"offset": 0,
"limit": 1,
"league_average": [
2026,
".244",
".243"
],
"rows": [
{
"rank": 1,
"entity_id": "123",
"name": "Example Batter",
"team_id": "147",
"team": "Yankees",
"position": "SS",
"qualified": true,
"metrics": {
"est_woba": 0.4
}
}
]
}
}Request schema
No body schema
Response schema
#/definitions/mlb.statcastBoardResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | mlb.StatcastBoardResponse | No | ||||
| data.board | string | No | ||||
| data.end_year | integer | No | ||||
| data.fetched_at | string | No | ||||
| data.filter_type | string | No | ||||
| data.league_average | array | No | ||||
| data.limit | integer | No | ||||
| data.minimum | string | No | ||||
| data.offset | integer | No | ||||
| data.position | string | No | ||||
| data.range | string | No | ||||
| data.roles | array | No | ||||
| data.rows | array | No | StatcastRow record, 8 fields: entity_id, metrics, name, position, qualified, rank, team, team_id. Described under MLB Statcast leaderboard API. | |||
| data.sort | string | No | ||||
| data.sort_dir | string | No | ||||
| data.source_url | string | No | ||||
| data.split | string | No | ||||
| data.start_year | integer | No | ||||
| data.team_id | integer | No | ||||
| data.total | integer | No | ||||
| data.type | string | No | ||||
| data.year | 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-expected?type=batter&position=C&filter_type=bip&minimum=q&sort=entity_name&sort_dir=asc&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"