NHL Advanced Stats Scraper: MoneyPuck xG, Corsi, Odds avatar

NHL Advanced Stats Scraper: MoneyPuck xG, Corsi, Odds

Pricing

from $4.45 / 1,000 skater season rows

Go to Apify Store
NHL Advanced Stats Scraper: MoneyPuck xG, Corsi, Odds

NHL Advanced Stats Scraper: MoneyPuck xG, Corsi, Odds

Scrape NHL expected goals, Corsi, on-ice splits, line combos, playoff odds and game win probabilities back to the 2008-09 season.

Pricing

from $4.45 / 1,000 skater season rows

Rating

0.0

(0)

Developer

ParseForge

ParseForge

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

ParseForge

MoneyPuck NHL Advanced Stats Scraper: xG, Corsi, Odds

Scrape every MoneyPuck NHL table back to the 2008-09 season: 4,700 skater rows, 490 goalie rows, 3,000 line combinations and 160 team rows per season. Every row carries expected goals, Corsi, Fenwick, on-ice and off-ice splits, danger buckets and per-60 rates. No login or API key. Export to CSV, JSON, Excel, or XML.

MoneyPuck publishes its model output as flat files and the NHL publishes a public schedule and standings API, but neither gives you a filtered, joined, one-row-per-entity table. This Actor reads both, applies your filters on the raw upstream row, and returns exactly the seasons, situations, teams and columns you asked for.

Who uses itWhat they scrape NHL advanced stats for
Hockey bettorsModel win probability against the market price, game by game
Fantasy playersExpected goals and per-60 rates to find undervalued skaters
Sports analystsOn-ice and off-ice splits for player impact models
Media and content teamsLine combination usage and team danger profiles for previews
Data scientistsEighteen seasons of shot-quality data as a training set

What it does

This Actor collects NHL advanced statistics from MoneyPuck and the NHL public API, and returns each entity as a flat row. Every row carries:

  • ๐Ÿงพ Core fields: player or team, position, situation, season, games played, ice time, points, goals, assists, shots and shot attempts.
  • ๐ŸŽฏ Expected goals: raw xG, flurry and score adjusted xG, goals above expected, and xG per 60.
  • ๐ŸงŠ On-ice context: on-ice and off-ice xG, Corsi and Fenwick percentages, ice time rank.
  • ๐Ÿฅ… Goalie model output: goals saved above expected, expected save percentage, rebound control.
  • ๐ŸŽฒ Odds and predictions: playoff and Stanley Cup probabilities, and the model versus market win probability for each game.
  • ๐Ÿ“Š Computed signals: points per 60, goals per 60, shooting percentage, faceoff win percentage, goal and expected goal differential.

Results export to CSV, JSON, Excel, or XML, or stream from the API.

What you can do with NHL advanced stats

๐Ÿ“ˆ Find the games where the model disagrees with the book.

The game prediction rows carry the MoneyPuck win probability and the implied market probability side by side, plus the difference between them, so a scan of one date range surfaces the disagreements without any odds maths of your own.

๐Ÿ” Rank skaters by what they created, not what went in.

Goals above expected, xG per 60 and on-ice xG percentage separate a shooter on a hot streak from one who is generating chances, over any season back to 2008-09.

๐Ÿง  Build a player impact model.

Turn on the on-ice offence and defence blocks and every skater row carries roughly sixty extra columns of what happened while that player was on the ice, in the situation you selected.

๐ŸงŠ Study line combinations and deployment.

The line dataset returns 3,000 forward lines and defence pairings per season with ice time rank, expected goals share and danger buckets, which is where usage decisions actually show up.

Why choose this scraper

What you get
Ten tables in one ActorSkaters, goalies, teams, lines, playoff odds, game predictions, schedule, standings and two game-log tables
Eighteen seasonsRegular season and playoffs, every season from 2008-09 to the latest published one
Five situation splitsAll situations, 5 on 5, 5 on 4, 4 on 5 and other strengths
Filters run before billingTeam, position, name, games played, ice time, points and expected goals are applied to the full upstream row
Optional columns are optionalSix column blocks are off by default and billed only on the rows where they actually returned data
No key, no loginBoth upstreams are public, so there is nothing to register and no rate limit to negotiate

How it compares

There are several NHL scrapers on Apify and most of them read scoreboards: ESPN scores, live odds, or the box score tables from Hockey Reference. None of them return the MoneyPuck model output, which is the file hockey analysts actually work from. The closest neighbours are our own hockey-reference-scraper, which gives you the traditional counting stats, and the various nhl-stats-scraper listings that wrap the NHL public API. This Actor is the one that carries expected goals, danger buckets, on-ice splits and win probabilities.

This ActorHockey Reference scrapersESPN and scoreboard scrapers
Expected goals and danger bucketsYesNoNo
On-ice and off-ice splitsYesNoNo
Line and pairing combinationsYesNoNo
Playoff odds and win probabilitiesYesNoOdds only, no model
Seasons available2008-09 onwardFull history, counting statsCurrent season
Situation splitsFiveNoneNone

What an NHL skater row looks like

{
"playerId": "8478043",
"playerName": "Sam Lafferty",
"team": "CHI",
"position": "C",
"situation": "all",
"season": "2025",
"seasonLabel": "2025-26",
"gameType": "regular",
"gamesPlayed": 29,
"icetimeMinutes": 249.32,
"timeOnIcePerGameMinutes": 8.6,
"shifts": 354,
"iceTimeRank": 327,
"gameScore": 0.83,
"points": 2,
"goals": 1,
"primaryAssists": 0,
"secondaryAssists": 1,
"shotsOnGoal": 9,
"missedShots": 5,
"blockedShotAttempts": 6,
"shotAttempts": 20,
"xGoals": 0.85,
"xGoalsAdjusted": 0.78,
"goalsAboveExpected": 0.15,
"shootingPct": 11.11,
"pointsPer60": 0.481,
"goalsPer60": 0.241,
"xGoalsPer60": 0.205,
"shotAttemptsPer60": 4.813,
"rebounds": 2,
"reboundGoals": 0,
"hits": 35,
"takeaways": 2,
"giveaways": 15,
"dZoneGiveaways": 3,
"faceoffsWon": 26,
"faceoffsLost": 26,
"faceoffWinPct": 50,
"penalties": 2,
"penaltyMinutes": 4,
"penaltiesDrawn": 1,
"shotsBlockedByPlayer": 5,
"onIceXGoalsPct": 39,
"onIceCorsiPct": 47,
"onIceFenwickPct": 45,
"offIceXGoalsPct": 43,
"sourceUrl": "https://moneypuck.com/moneypuck/playerData/seasonSummary/2025/regular/skaters.csv",
"rowType": "skater",
"scrapedAt": "2026-08-28T19:19:25.896Z"
}

Configure the run

Pick the tables you want in Data to scrape, choose a Season and a Game type, and select which Game situations you want split out. Everything else is a filter: team, position, player name, minimum games, minimum ice time, minimum points and minimum expected goals are all applied to the raw upstream row, so you can filter on a column without buying the block that contains it. When you select several tables, the row cap is split evenly between them and anything one table leaves unused rolls to the next.

Every skater in the latest published season, no extras:

{
"datasets": ["skaters"],
"season": "latest",
"gameType": "regular",
"situations": ["all"],
"maxItems": 5000
}

Colorado's 5 on 5 skaters with the on-ice and danger columns:

{
"datasets": ["skaters"],
"season": "2025",
"situations": ["5on5"],
"teams": ["COL"],
"minIcetimeMinutes": 200,
"includeOnIceFor": true,
"includeOnIceAgainst": true,
"includeDangerBreakdown": true,
"maxItems": 100
}

Model versus market win probability for a week of games:

{
"datasets": ["gamePredictions", "schedule"],
"dateFrom": "2026-04-01",
"dateTo": "2026-04-07",
"maxItems": 200
}

Pricing

Pay per event. You are charged for the rows you receive, plus one event per source file downloaded and one start event per run.

EventPrice
Actor start$0.02 per run
Source file scanned$0.01 per file
Skater, goalie, team, line, playoff odds and game prediction rows$0.005 per row
Schedule, standings and game log rows$0.003 per row
Player biography block$0.004 per enriched row
On-ice offence and on-ice defence blocks$0.002 per row each
Danger, zone starts, expected goals detail and off-ice blocks$0.0015 per row each
RowsTypical cost
100 skater rows$0.53
1,000 skater rows$5.03
10,000 skater rows$50.03

Volume tiers apply: Bronze pays 3.8% less, Silver 7.4% less, Gold and above 11% less.

Free users

Free Apify accounts get a 10 row preview per run, which is enough to check the schema and the field names. Upgrade to a paid plan to lift the cap to a million rows per run.

Run it

  1. Create a free Apify account. New accounts get $5 in free credit.
  2. Open the Actor, leave the default input, and press Start to see ten skater rows.
  3. Pick the tables, the season and the filters you want, then raise Max Items.
  4. Export the dataset to CSV, JSON, Excel or XML, or read it from the API.

Use with AI agents (MCP)

claude mcp add apify --transport sse https://mcp.apify.com/sse --header "Authorization: Bearer YOUR_APIFY_TOKEN"

Then ask in plain language:

  • "Get me every Colorado skater at 5 on 5 last season with more than 200 minutes of ice time."
  • "Which games this week does the model like more than the sportsbook does?"
  • "Pull the top 50 skaters by goals above expected for the 2024-25 season."

Troubleshooting

No results came back. The most common cause is a situation filter that does not exist in the table you picked. Line and pairing rows exist for 5 on 5 and other strengths, not for every split. Start with all and narrow from there.

Fewer rows than I asked for. When you select several tables the cap is split between them, and a table that runs out of matching rows hands the remainder to the next one. Raise Max Items, or select fewer tables.

A column I expected is missing. The six column blocks are off by default. Tick the block you need, for example on-ice offence, and the columns appear on the rows that have them.

Playoff odds all read 0 or 100. The simulation file is a live file. Between seasons it holds the finished season, where every probability has collapsed to a certainty. During the season it holds live odds.

The run is slow. Game logs are one file download per player or per team. Lower Max players or teams for game logs, or select the season summary tables instead.

FAQ

QuestionAnswer
Where does the data come from?MoneyPuck's published model files and the NHL public API. Both are public and neither needs a key.
How far back does it go?The 2008-09 season, for both regular season and playoffs.
What does a season number mean?The season's starting year, MoneyPuck style. 2025 is the 2025-26 season.
What are the situations?All situations, 5 on 5, 5 on 4 power play, 4 on 5 penalty kill, and other strengths.
Are old team codes handled?Yes. Los Angeles is L.A before 2017 upstream, and a filter on LAK matches those rows too.
Can I filter without paying for the column?Yes. Filters run on the full upstream row before projection, so filtering by expected goals does not require the expected goals detail block.
Is the market win probability included?Yes, on game prediction rows, together with the model probability and the difference between them.
How fast is it?Measured at 9,756 rows in 15.4 seconds on a 512 MB run, with a 267 MB peak.
Does it need a proxy?No. Both upstreams answer plain HTTP requests.

Browse the full ParseForge collection for more scrapers.

Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.

Disclaimer: this is an unofficial tool, not affiliated with MoneyPuck or the National Hockey League. It reads only public data that both sources publish without a login. Statistics about public sporting events are not personal data under GDPR, CCPA or PIPL; player names appear because they are part of the public record of a professional competition.