MLB API endpoint
Returns the Pitch Timer Infractions table for pitchers, batters, catchers, teams, or opposing teams. Filters for type, season, minimum pitches, and zero-infraction rows are upstream-backed; entity search, table sorting, and pagination are applied locally. The chart ordering is included as view metadata; the endpoint returns table rows, not the SVG chart.
/mlb/statcast-pitch-timerReturns the table embedded in Baseball Savant's Pitch Timer Infractions page. First-party season/type/minimum-pitch controls are replayed upstream; name filtering, table sorting, and pagination are applied locally. chart_sort records the SVG view ordering selection; this JSON endpoint returns table rows and does not reproduce the chart.
type: Pit, Bat, Cat, Team, or Opp (default Team).season: 2023, 2024, 2025, or 2026 (default 2026; the live selector is the current season and previous three).min_pitches: 1, 5, 25, 50, 100, 250, 500, or 1000 (default 1).include_zeroes: 0 or 1 (default 0). Value 1 adds zero-infraction players for Pit, Bat, and Cat; it does not change Team or Opp rows.q: optional case-insensitive substring of the entity name, applied locally before pagination (up to 100 characters).chart_sort: violating, violated, net, ballsAgainst, ballsFor, strikesAgainst, strikesFor, or division (default violating). This is view metadata and does not change the table data.sort: entity_name, N_pitches, N_time_violations, N_pitcher_pitch_timer, N_batter_pitch_timer, N_batter_timeout, N_catcher_pitch_timer, N_defensive_shift, or rate (default N_time_violations).sort_dir: asc or desc (default desc).limit: 1–500 (default 100); offset: 0–5000 (default 0).Use /mlb/discovery for the exact type, season, threshold, chart-sort, and table-sort sets. Sorting and query filtering happen on the returned page's embedded data; table filtering occurs before pagination.
Rows preserve first-party values: year, entity_code, entity_id, entity_name, N_pitches, N_batter_pitch_timer, N_batter_timeout, N_catcher_pitch_timer, N_defensive_shift, N_pitcher_pitch_timer, N_time_violations, and rate. The upstream page also exposes a CSV download and a D3/SVG chart; neither is returned as a separate representation here.
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| N_batter_pitch_timer | 40 | 0 |
| N_batter_timeout | 40 | 0 |
| N_catcher_pitch_timer | 40 | 0 |
| N_defensive_shift | 40 | 0 |
| N_pitcher_pitch_timer | 40 | 2 to 6, median 3 |
| N_pitches | 40 | 172 to 3,106, median 1,757 |
| N_time_violations | 40 | 2 to 6, median 3 |
| entity_code | 40 | |
| entity_id | 40 | |
| entity_name | 40 | “Baz, Shane” and 39 other values |
| rate | 40 | 86 to 1,553, median 523.33 |
| year | 40 | 2,026 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| type | string | No | Entity group Allowed values: Pit, Bat, Cat, Team, Opp. | ||
| season | string | No | Season Allowed values: 2023, 2024, 2025, 2026. | ||
| min_pitches | string | No | Minimum pitches Allowed values: 1, 5, 25, 50, 100, 250, 500, 1000. | ||
| include_zeroes | string | No | Include entities without infractions Allowed values: 0, 1. | ||
| q | string | No | Local case-insensitive entity-name substring filter | ||
| chart_sort | string | No | Chart ordering metadata Allowed values: violating, violated, net, ballsAgainst, ballsFor, strikesAgainst, strikesFor, division. | ||
| sort | string | No | Local table sort field Allowed values: entity_name, N_pitches, N_time_violations, N_pitcher_pitch_timer, N_batter_pitch_timer, N_batter_timeout, N_catcher_pitch_timer, N_defensive_shift, rate. | ||
| 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-pitch-timer?type=Pit&season=2023&min_pitches=1&include_zeroes=0&q=coffee&chart_sort=violating&sort=entity_name&sort_dir=asc&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 0,
"data": {
"board": "pitch-timer-infractions",
"type": "Team",
"season": "2026",
"min_pitches": "1",
"include_zeroes": false,
"chart_sort": "violating",
"total": 1,
"sort": "N_time_violations",
"sort_dir": "desc",
"offset": 0,
"limit": 1,
"rows": [
{
"entity_code": "Team",
"entity_id": 110,
"entity_name": "Orioles",
"N_pitches": 47876,
"N_time_violations": 20,
"rate": 2393.8
}
]
}
}Request schema
No body schema
Response schema
#/definitions/mlb.statcastPitchTimerResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| board | string | No | pitch-timer-infractions | |||
| rows | array | No | ||||
| season | string | No | 2026 | |||
| total | integer | No | 30 | |||
| type | string | No | Team |
| 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-pitch-timer?type=Pit&season=2023&min_pitches=1&include_zeroes=0&q=coffee&chart_sort=violating&sort=entity_name&sort_dir=asc&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"