MLB Statcast Pitch-by-Pitch Data Scraper avatar

MLB Statcast Pitch-by-Pitch Data Scraper

Pricing

from $0.50 / 1,000 tracked pitches

Go to Apify Store
MLB Statcast Pitch-by-Pitch Data Scraper

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

Elena Vance

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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:

FieldValue
gameDate / venue2026-09-06 · Great American Ball Park
pitcher / batterBrady Singer (R) → Sal Frelick (L)
inning · balls-strikes1 top · 0-0
pitchTypeSI — Sinker
releaseSpeedplateSpeed89.2 → 81.6 mph
perceivedVelocity90.52 mph (computed)
spinRate / spinDirection2464 rpm / 206°
extension6.79 ft
releasePointx −1.30, y 53.71, z 5.15 ft (computed)
plateLocationx 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
approachAngleVAA −5.37°, HAA 1.07° (computed)
flightTime0.419 s (computed)
trajectoryall nine raw parameters, kept verbatim
callC — Called Strike
playResultGroundout — "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.

ComputedWhy 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 pointThe 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 velocityRelease speed normalised to league-average extension — what the pitch plays like to the hitter, not to the radar gun.
Flight timeRelease to plate. The hitter's entire decision budget.
In-zone flagRecomputed from the location and this batter's measured zone, so it survives a dropped zone field.
Barrel / hard-hit / sweet-spotStatcast's published contact grades, absent from this feed.
Recomputed plate locationA 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.

FieldMeaning
dateFrom / dateToGame date range, YYYY-MM-DD. Max 31 days.
gamePksSpecific MLB game IDs, e.g. [824469]. Overrides the dates.
teamIdsOnly games involving these teams, e.g. [147] for the Yankees.
gameTypesRegular season and postseason by default. Spring training is off — many of those parks have no tracking rig, so their pitches come back empty.
pitcherIds / batterIdsKeep only these players' pitches. Combine both for one matchup.
maxGamesThe real cost control. A game is ~300 pitches. Default 5.
maxItemsHard 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 with maxGames: 5 reads 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.