MLB Statcast Pitch-by-Pitch Data Scraper
Pricing
from $0.50 / 1,000 tracked pitches
MLB Statcast Pitch-by-Pitch Data Scraper
Scrape every MLB pitch with Statcast tracking: velocity, spin rate, movement, release point, plate location, plus exit velocity and launch angle on balls in play. Adds computed approach angle, perceived velocity and barrel classification MLB does not publish. No API key, no login, no proxy.
Pricing
from $0.50 / 1,000 tracked pitches
Rating
0.0
(0)
Developer
Elena Vance
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Every pitch of every MLB game, with the full Statcast tracking record — and the flight metrics MLB measures but never publishes.
Most MLB scrapers sell you teams, rosters, schedules and standings. This one sells the thing underneath: one row per pitch, with release speed, spin rate, movement, release point and plate location, exit velocity and launch angle on balls in play, and the raw nine-parameter trajectory model the whole thing is derived from.
No API key. No login. No proxy. Runs on the free plan.
What one row looks like
A called strike, first pitch of the game:
| Field | Value |
|---|---|
gameDate / venue | 2026-09-06 · Great American Ball Park |
pitcher / batter | Brady Singer (R) → Sal Frelick (L) |
inning · balls-strikes | 1 top · 0-0 |
pitchType | SI — Sinker |
releaseSpeed → plateSpeed | 89.2 → 81.6 mph |
perceivedVelocity | 90.52 mph (computed) |
spinRate / spinDirection | 2464 rpm / 206° |
extension | 6.79 ft |
releasePoint | x −1.30, y 53.71, z 5.15 ft (computed) |
plateLocation | x 0.70, z 2.49 ft · zone 6 · inZone true (computed) |
movement | −7.15 in horizontal, 5.32 in vertical, 8.91 in total (computed), 9.4 in induced vertical |
approachAngle | VAA −5.37°, HAA 1.07° (computed) |
flightTime | 0.419 s (computed) |
trajectory | all nine raw parameters, kept verbatim |
call | C — Called Strike |
playResult | Groundout — "Sal Frelick grounds out, first baseman Sal Stewart to pitcher Brady Singer." |
On a ball in play the row also carries battedBall: exit velocity, launch
angle, distance, trajectory, landing coordinates, and isBarrel,
isHardHit, isSweetSpot computed from Statcast's published thresholds.
The computed fields are the point
MLB publishes the nine-parameter constant-acceleration model for every pitch and almost none of the quantities analysts actually use. This Actor solves the model and returns both.
| Computed | Why you want it |
|---|---|
| Vertical approach angle (VAA) | The standard explanation for why a flat 93 mph fastball at the top of the zone misses bats a steeper 97 does not. MLB has never published it. |
| Horizontal approach angle (HAA) | The same, laterally. |
| Release point | The feed gives position at a fixed 50 ft measurement plane, which is a convention, not a place any pitcher stands. Arm-slot drift and pitch tunnelling are measured from the real release point. |
| Perceived velocity | Release speed normalised to league-average extension — what the pitch plays like to the hitter, not to the radar gun. |
| Flight time | Release to plate. The hitter's entire decision budget. |
| In-zone flag | Recomputed from the location and this batter's measured zone, so it survives a dropped zone field. |
| Barrel / hard-hit / sweet-spot | Statcast's published contact grades, absent from this feed. |
| Recomputed plate location | A per-row cross-check: it should match MLB's own pX/pZ to 0.001 ft. When it doesn't, that pitch was mistracked — and a model trained on it would learn the error. |
Sanity check on 365 pitches from one real game — four-seams flat at the top, curveballs steep at the bottom, exactly as they should be:
FF four-seam −3.76° FC cutter −5.59° CH changeup −7.07°SI sinker −5.32° ST sweeper −6.78° SL slider −7.67°CU curveball −8.42°
Input
Everything is optional. Run it with no input at all and it scrapes the most recent slate that was actually played — which works in February as well as in July, because it falls back to searching the whole previous season rather than returning nothing in the offseason.
| Field | Meaning |
|---|---|
dateFrom / dateTo | Game date range, YYYY-MM-DD. Max 31 days. |
gamePks | Specific MLB game IDs, e.g. [824469]. Overrides the dates. |
teamIds | Only games involving these teams, e.g. [147] for the Yankees. |
gameTypes | Regular season and postseason by default. Spring training is off — many of those parks have no tracking rig, so their pitches come back empty. |
pitcherIds / batterIds | Keep only these players' pitches. Combine both for one matchup. |
maxGames | The real cost control. A game is ~300 pitches. Default 5. |
maxItems | Hard cap on rows. Default 1000. |
Examples
Every pitch Paul Skenes threw last week:
{ "dateFrom": "2026-09-01", "dateTo": "2026-09-07", "pitcherIds": [694973], "maxGames": 40 }
One specific game, complete:
{ "gamePks": [824469], "maxItems": 500 }
A whole team's month:
{ "dateFrom": "2026-08-01", "dateTo": "2026-08-31", "teamIds": [147], "maxGames": 30, "maxItems": 10000 }
Filters are applied by MLB before the schedule comes back, so a narrow request over a wide range stays cheap rather than merely ending up smaller.
Notes on cost
maxGames, not the date range, is what a run costs. A month-wide range withmaxGames: 5reads five games. The range only decides what is eligible.- Player filters cut your bill. MLB has no "every pitch by this pitcher" endpoint, so whole games are still read — but you are only charged for rows you keep.
- Games that haven't started are skipped before any request is made. They contain no pitches.
- Runs go direct. No proxy is bought unless MLB actually refuses an IP, and then a free datacenter one is tried well before any metered residential one.
Output
One dataset row per pitch, exportable as JSON, CSV, Excel, XML or HTML. The full field list with descriptions is in .actor/dataset_schema.json.
battedBall is null on the ~85% of pitches nobody hit, rather than a block
of empty columns, so a CSV of a whole game stays readable.
Game context (teams, date, venue, game type) is repeated on every row on purpose — a pitch that cannot say which park it was thrown in is not much use on its own, and park effects on carry are large.
How it works
MLB's Stats API is genuinely open: no key, no login, no TLS fingerprinting, no rate limit encountered. There is nothing to bypass, so this Actor is a plain HTTP client with the physics on top. Two endpoints do all the work — one schedule request per run, one play-by-play request per game, four at a time.
The play-by-play endpoint is used rather than the more obvious live feed, with a field projection that cuts a game from 967 KB to 484 KB for byte-identical pitch data.
Details, including how the plate-crossing plane was verified against MLB's own published coordinates, are in docs/architecture.md.
Not affiliated with MLB
Independent tool. Reads the same public endpoint that mlb.com's own Gameday scoreboard reads. "MLB" and "Statcast" are trademarks of their respective owners and are used here only to describe what the data is.