MLB API endpoint
Returns catchers ranked by pop-time metrics, filtered by season, team, and minimum steal attempts to second or third. Sort and pagination are applied locally.
/mlb/statcast-catcher-pop-timeReturns the Baseball Savant Catcher Pop Time table for the selected season. Upstream applies season, team, and minimum-attempt filters. Sorting and pagination are applied to the complete returned table locally.
year (optional): 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, or 2026. Defaults to 2026.team_id (optional): 108, 117, 133, 141, 144, 158, 138, 112, 109, 119, 137, 114, 136, 146, 121, 120, 110, 135, 143, 134, 140, 139, 111, 113, 115, 118, 116, 142, 145, or 147. Omit for all teams. Descriptions are available from mlb_discovery.statcast_catcher_pop_time_team_ids.min2b (optional): 1, 5, 10, 15, or 20 minimum attempts to second base. Defaults to 5.min3b (optional): 0, 1, 5, 10, 15, or 20 minimum attempts to third base. Defaults to 0.sort (optional): catcher, team, age, arm, exchange, 2b_attempts, 2b_all, 2b_caught_stealing, 2b_stolen_bases, 3b_attempts, 3b_all, 3b_caught_stealing, or 3b_stolen_bases. Defaults to 2b_all.sort_dir (optional): asc or desc. Defaults to asc.limit (optional): 1 through 500; defaults to 100.offset (optional): 0 through 5000; defaults to 0.The upstream page has two additional URL state parameters, sort and sortDir; those select a client-side table sort. The API exposes named sort fields and directions and applies them locally. The upstream CSV download and chart are outside this table endpoint.
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| age | 40 | 21 to 35, median 27 |
| catcher | 40 | “Stubbs, Garrett” and 39 other values |
| catcher_id | 40 | |
| exchange_2b_3b_sba | 40 | 0.59 to 0.71, median 0.63 |
| exchange_2b_cs | 39 | 0.57 to 1.08, median 0.63 |
| exchange_2b_sb | 40 | 0.58 to 0.83, median 0.64 |
| exchange_2b_sba | 40 | 0.59 to 0.83, median 0.64 |
| exchange_2b_sba_count | 40 | 5 to 68, median 23 |
| exchange_3b_cs | 18 | 0.43 to 0.73, median 0.57 |
| exchange_3b_sb | 27 | 0.47 to 0.83, median 0.61 |
| exchange_3b_sba | 30 | 0.43 to 0.83, median 0.6 |
| exchange_3b_sba_count | 40 | 0 to 7, median 2 |
| href | 40 | median 80 characters |
| maxeff_arm_2b_3b_sba | 40 | 79.7 to 90.1, median 84.5 |
| maxeff_arm_2b_cs | 36 | 78.8 to 89.7, median 84.5 |
| maxeff_arm_2b_sb | 40 | 79.7 to 90.1, median 84.3 |
| maxeff_arm_2b_sba | 40 | 79.7 to 90.1, median 84.7 |
| maxeff_arm_2b_sba_count | 40 | 1 to 7, median 3 |
| maxeff_arm_3b_cs | 9 | 77.5 to 84.7, median 81.7 |
| maxeff_arm_3b_sb | 15 | 79 to 84.2, median 82.1 |
| maxeff_arm_3b_sba | 22 | 71.9 to 84.9, median 81.7 |
| maxeff_arm_3b_sba_count | 40 | 0 to 1, median 1 |
| p_2b_cs | 40 | 0 to 19, median 8 |
| p_2b_cs_per | 40 | 0 to 0.55, median 0.31 |
| p_2b_sb | 40 | 4 to 54, median 14 |
| p_2b_sb_per | 40 | 0.45 to 1, median 0.68 |
| p_3b_cs | 40 | 0 to 4, median 0 |
| p_3b_cs_per | 30 | 0 to 1, median 0.33 |
| p_3b_sb | 40 | 0 to 3, median 1 |
| p_3b_sb_per | 30 | 0 to 1, median 0.67 |
| percent_rank_arm_cs_2b | 12 | 0.22 to 1, median 0.7 |
| percent_rank_pop_2b | 35 | 0.53 to 1, median 0.8 |
| percent_rank_pop_3b | 0 | |
| pop_2b_cs | 39 | 1.84 to 1.95, median 1.89 |
| pop_2b_sb | 40 | 1.83 to 1.97, median 1.9 |
| pop_2b_sba | 40 | 1.84 to 1.94, median 1.9 |
| pop_2b_sba_count | 40 | 5 to 65, median 21 |
| pop_3b_cs | 16 | 1.34 to 1.54, median 1.44 |
| pop_3b_sb | 27 | 1.33 to 1.67, median 1.44 |
| pop_3b_sba | 30 | 1.35 to 1.66, median 1.45 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| year | string | No | Season from 2015 through 2026 Allowed values: 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026. | ||
| team_id | string | No | MLB team id Allowed values: 108, 117, 133, 141, 144, 158, 138, 112, 109, 119, 137, 114, 136, 146, 121, 120, 110, 135, 143, 134, 140, 139, 111, 113, 115, 118, 116, 142, 145, 147. | ||
| min2b | string | No | Minimum attempts to second base Allowed values: 1, 5, 10, 15, 20. | ||
| min3b | string | No | Minimum attempts to third base Allowed values: 0, 1, 5, 10, 15, 20. | ||
| sort | string | No | Sort field from mlb_discovery Allowed values: catcher, team, age, arm, exchange, 2b_attempts, 2b_all, 2b_caught_stealing, 2b_stolen_bases, 3b_attempts, 3b_all, 3b_caught_stealing, 3b_stolen_bases. | ||
| sort_dir | string | No | Sort direction Allowed values: asc, desc. | ||
| limit | integer | No | Rows to return (1-500) Minimum: 1. Maximum: 500. | ||
| offset | integer | No | Zero-based 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-catcher-pop-time?year=2015&team_id=108&min2b=1&min3b=0&sort=catcher&sort_dir=asc&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"board": "catcher-pop-time",
"year": "2026",
"min_2b_attempts": "5",
"min_3b_attempts": "0",
"sort": "2b_all",
"sort_dir": "asc",
"total": 94,
"offset": 0,
"limit": 100,
"rows": [
{
"catcher_id": "592663",
"catcher": "Realmuto, J.T.",
"team_name_abbrev": "PHI",
"pop_2b_sba": "1.85",
"pop_2b_cs": "1.84",
"pop_2b_sb": "1.86"
}
]
}
}Request schema
No body schema
Response schema
#/definitions/mlb.statcastCatcherPopTimeResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | mlb.StatcastCatcherPopTimeResponse | No | ||||
| data.board | string | No | ||||
| data.fetched_at | string | No | ||||
| data.limit | integer | No | ||||
| data.min_2b_attempts | string | No | ||||
| data.min_3b_attempts | string | No | ||||
| data.offset | integer | No | ||||
| data.rows | array | No | ||||
| data.sort | string | No | ||||
| data.sort_dir | string | No | ||||
| data.source_url | string | No | ||||
| data.team_id | string | No | ||||
| data.total | integer | No | ||||
| data.year | string | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/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-catcher-pop-time?year=2015&team_id=108&min2b=1&min3b=0&sort=catcher&sort_dir=asc&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"