Basketball Scraper: Box Scores, Play-by-Play & Odds avatar

Basketball Scraper: Box Scores, Play-by-Play & Odds

Pricing

from $12.60 / 1,000 match records

Go to Apify Store
Basketball Scraper: Box Scores, Play-by-Play & Odds

Basketball Scraper: Box Scores, Play-by-Play & Odds

Basketball scraper for NBA, EuroLeague and other leagues: game results with score by quarter, team stats, player box scores, play-by-play, odds, lineups, rosters and standings from Sofascore. Export CSV, Excel, JSON, XML. No login or API key. 10 record types.

Pricing

from $12.60 / 1,000 match records

Rating

0.0

(0)

Developer

RecordsData

RecordsData

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

9 days ago

Last modified

Share

RecordsData

Basketball Scraper collects Sofascore basketball games for any NBA, EuroLeague or other team: score by quarter, box scores, play-by-play, NBA shot coordinates, all odds markets, lineups, rosters, standings and player profiles with salary. Enter a team name, match ID, player name or competition season, export CSV, Excel or JSON. No login or API key. $0.015 per game, $0.01 per extra record; team statistics are off by default. Shot chart entries cost $0.0003, play log entries $0.00015, odds market lines $0.0015 and player profiles $0.003 each.

Basketball Scraper turns a team name such as "Los Angeles Lakers" into structured game data: the final score, points per quarter, team statistics, a box score line for every player, a point-margin curve and every scoring play. A verified cloud run on 2026-10-07 returned 10 Lakers games with 235 player box scores, 235 lineup entries, 1,206 scoring plays, 20 odds outcomes and 10 head-to-head records in about 55 seconds; a plain 10-game run takes about 6 seconds. It is built for fantasy and DFS tools, betting models, sports media and analysts.

🏀 What does Basketball Scraper do?

  • Finds a team by name and collects its played and upcoming games, or fetches matches by ID, filtered by date range.
  • Lists every game of a competition season (NBA, EuroLeague or another Sofascore competition id), or every live game with the "Live games only" switch.
  • Adds optional extras per game: team statistics, box scores, lineups, head-to-head, result odds, margin graph and scoring plays.
  • Adds a shot chart and full play log (NBA 2024/25 on only) and all odds markets.
  • Looks up player profiles by name, id or link (NBA salary included), plus the season roster and league standings.

📊 What data can you extract from Sofascore basketball?

Record typeFields
match-recordmatchId, slug, tournament, round, homeTeam, awayTeam, homeScore, awayScore, scoreByQuarter, status, statusType, startTime, season, winner, scrapedAt
boxScore (nested)side, playerId, playerName, position, jerseyNumber, isStarter, minutesPlayed, points, rebounds, assists, steals, blocks, turnovers, field goals, three pointers, free throws, usage, plusMinus, rating
statistics, lineups, h2hRecord, odds, scoreGraph, playByPlay (nested)team stat lines, lineup entries, head-to-head wins, bookmaker odds, minute/margin points, scoring plays with running score
shotChart, playLog (nested, NBA 2024/25 on)shooter, 2PT or 3PT, made or missed, x and y court position, zone, distance in feet, assist, blocker; every play in time order with period, clock and running score
oddsMarkets (nested)market, outcome, line, current and opening odds (fractional, decimal)
roster-record, player-profileteamName, playerName, position, jerseyNumber, heightCm, weightKg, country, salary, contractUntil (salary NBA only)
standings-recordtournamentName, teamName, position, wins, losses, percentage, gamesBehind

🧾 Basketball Scraper sample output

Abridged real record from a verified run (one game, extras on; arrays shortened):

{
"recordType": "match-record",
"matchId": 14441947,
"homeTeam": "Orlando Magic",
"awayTeam": "Los Angeles Lakers",
"homeScore": 104,
"awayScore": 105,
"scoreByQuarter": [{ "quarter": 1, "homePoints": 30, "awayPoints": 37 }],
"boxScore": [{ "side": "home", "playerName": "Paolo Banchero", "minutesPlayed": 36, "points": 16, "rebounds": 5, "assists": 6, "plusMinus": -18, "rating": 7.1 }],
"playByPlay": [{ "time": 48, "playerName": "Luke Kennard", "side": "away", "points": 3, "homeScore": 104, "awayScore": 105 }]
}

💰 How much does it cost to scrape basketball data?

Pay per event. You pay only for saved records; error rows, "not found" games, empty searches and failed runs are never charged. Prices at the Free plan tier (higher plans pay slightly less for match-record only). Date windows, season mode and monitor mode add no event:

EventPriceWhat one event is
match-record$0.015One game
match-statistics-record$0.01One team stat line (full game or one quarter)
box-score-player-record, lineup-record$0.01One player box score line; one lineup entry
h2h-record, odds-record, score-graph-record$0.01One head-to-head tally; one odds outcome; one margin graph point
play-by-play-record$0.01One scoring play
roster-record, standings-record$0.01One roster player; one standings row (once per run)
shot-record$0.0003One shot chart entry
play-log-record$0.00015One play log entry
odds-market-record$0.0015One all-markets odds line
player-profile-record$0.003One player profile

Team statistics are off by default because they are billed per statistic line: one finished NBA game returned 71 lines (confirmed in a 2026-10-04 cloud run), about $0.71 extra per game. The default settings cost $0.015 per game, or $15.00 per 1,000 games. 1,000 box score lines add $10.00. The shot chart adds $0.0003 per shot: 160 shots add $0.048 per game, or $48.00 per 1,000 games. The play log (about 465 plays per game) adds $0.07 per game, or $69.75 per 1,000 games. All odds markets (10 lines) add $0.015 per game, and 100 player profiles cost $0.30.

🚀 How to scrape basketball data in 3 steps

  1. Open the Actor and type a team name (for example "Los Angeles Lakers") or paste Sofascore match IDs.
  2. Switch on only the extras you need and keep Max Items low (default 10).
  3. Click Start, then download CSV, Excel, JSON or XML.

⚙️ Basketball Scraper input

FieldTypeDefaultMeaning
teamNameslistLos Angeles Lakers if no other source is setTeam names to scrape
eventIdslistemptySofascore match IDs to fetch directly
liveOnlybooleanfalseFetch all live games and ignore the lists
gameWindowstringbothboth, played or upcoming games
dateFrom, dateTostringemptyYYYY-MM-DD (UTC) window on start time
tournaments, tournamentSeasonlist, stringempty, latestCompetition id (132 is the NBA), name or id:seasonId; season such as 2024/2025
onlyNew, stateKey, resetSeenboolean, string, booleanfalse, empty, falseMonitor mode; optional monitor name; clear the seen list
maxItemsinteger10Cap on output rows; 1 to 1,000,000
includeStatisticsbooleanfalseTeam stats per quarter, billed per line (about 71 per NBA game)
includeBoxScore, includeLineups, includeH2h, includeOdds, includeScoreGraph, includePlayByPlaybooleanfalsePer-game extras
includeShotChart, includePlayLogbooleanfalseShots with court position; every play with running score (NBA 2024/25 on)
includeOddsMarketsbooleanfalseMoneyline, quarter and half winners, spread and total lines
playerProfileslistemptyPlayer names, ids or page links; no games unless another search input is set
includeRoster, includeStandingsbooleanfalseTeam and league records, once per run
{ "teamNames": ["Los Angeles Lakers"], "gameWindow": "played", "dateFrom": "2026-03-01", "dateTo": "2026-03-31", "maxItems": 10, "includeBoxScore": true }

📦 Basketball Scraper output and empty results

Rows go to the default dataset, one per game, roster player, standings row or player profile, identified by recordType. An unknown player name returns one free error row. A malformed date returns one never-charged invalid-input row. An empty search ends as succeeded with no charge. If Sofascore blocks every request, the run fails with no charge.

⚖️ Basketball Scraper vs alternatives

Competitor figures read on 2026-10-10.

CapabilityBasketball Scrapersian.agency basketball-api-scrapersportsverse NBA play-by-play
Shot coordinatesNBA from 2024/25 onNot shown on the pageYes, NBA since 2002
Odds marketsMoneyline, quarters, halves, spread, totalSpread, total, quarter, halfSpread only
Player profilesName, id or link, with NBA salaryProfile with salaryNo
StandingsOne table per leagueTotal, home and away tablesNo
Lineups, head-to-head, margin graph, only-newYesNot listedNo
Price$0.015 per game + $0.01 per extra recordFrom $2.50 per 1,000 gamesFrom $0.20 per 1,000 results

Basketball Scraper adds lineups, head-to-head, the margin graph and monitor mode. Our shot coordinates cover NBA games from 2024/25 only, while sportsverse reaches back to 2002. sian.agency offers home and away standings tables, which we do not, and both rivals list a lower headline price.

💼 Use cases

Fantasy and DFS projection models, betting-model backtests against bookmaker odds (informational, not advice), sports media recaps and widgets, and scouting analysis of minutes, plus-minus and scoring runs.

🔌 Basketball Scraper API, schedule and integrations

curl -X POST "https://api.apify.com/v2/acts/RecordsData~basketball-match-stats-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"teamNames":["Los Angeles Lakers"],"maxItems":10,"includeStatistics":false}'

Schedule runs after game nights and connect the dataset to Zapier or Make.

🤖 Basketball Scraper MCP server for AI agents

AI agents can call this Actor through the Apify MCP server at https://mcp.apify.com?tools=RecordsData/basketball-match-stats-scraper. Choose it when an agent needs structured NBA, EuroLeague or other Sofascore basketball data.

MCP client configuration:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=RecordsData/basketball-match-stats-scraper"
}
}
}

Example agent prompt:

Use the Basketball Scraper to fetch the last 5 Los Angeles Lakers games with player box scores on and team statistics off, then tell me who scored the most points across those games.

Tool description: returns one dataset row per game, roster player, standings row or player profile.

The Actor reads publicly available game data without logging in. You are responsible for using it in line with Sofascore's terms and local law. Independent tool, not affiliated with Sofascore, the NBA or any league or team.

❓ Frequently asked questions

Which leagues does Basketball Scraper cover? Basketball Scraper covers any basketball league that Sofascore covers, including the NBA and EuroLeague. Enter a team name or a Sofascore match ID to get scores, box scores and standings for that league. Depth depends on what Sofascore publishes for that league and game.

Why did I get 0 results? If Basketball Scraper returns 0 results, either the team name did not resolve or the team has no recent or upcoming games on Sofascore. Use the full team name, for example "Los Angeles Lakers" and not "Lakers". The run still ends as succeeded and an empty search is not charged.

Why did my run fail? Sofascore challenges automated requests, and in October 2026 its old api.sofascore.com host started returning HTTP 403, so Basketball Scraper uses a different request path. Each request is retried up to 12 times. If every request is blocked the run fails and charges nothing.

Why is my run expensive? An extra that is billed per line is almost always switched on. Team statistics are off by default and produce about 71 lines per NBA game at $0.01 each; box scores, play-by-play and the score graph also add one charge per record. Check your extras, lower Max Items, or set a maximum charge.

Am I charged for failed games or error rows? No. Basketball Scraper never charges for error rows, games that were not found, empty searches or failed runs. Records are charged only after they have been saved to the dataset, so you pay only for data you actually receive in the dataset.

How are roster and standings billed? Roster and standings records are billed once per unique team and once per unique league season in the run, not once per game. Each roster player and each standings row is one $0.01 event at the Free tier, regardless of how many games you scrape.

Can I scrape games between two dates or a whole season? Yes. Set dateFrom and dateTo (YYYY-MM-DD, UTC) with gameWindow to keep played or upcoming games inside that window. For a whole competition, put an id or name such as NBA in tournaments and a season such as 2024/2025 in tournamentSeason.

How does only-new monitor mode work? Switch on onlyNew and Basketball Scraper remembers every game a search has returned, in a key-value store named basketball-seen in your Apify account. Later runs return only new games, and skipped games are free. Use stateKey for separate monitors, or resetSeen to start over.

Does it return shot coordinates, spread or total odds? Yes, with limits. The shot chart gives x and y court position, zone, distance and shooter for every NBA field-goal attempt from 2024/25 on. Older seasons and other leagues have no coordinates and no charge. All odds markets add spread, total, quarter and half lines.

Can I look up a player profile or salary? Yes. Put player names, Sofascore ids or page links in playerProfiles and Basketball Scraper returns one profile row each: team, position, jersey number, height, weight, birth date and country. NBA players also get salary, currency and contract end date; other leagues have no salary, so those fields are left out.

Can I get standings split into home and away? No. Basketball Scraper returns the single league table, with position, matches, wins, losses, points for and against, percentage and games behind, once per league per run. Home and away tables are not built, so split them yourself from the game rows.

Can I use match IDs instead of a team name? Yes. Basketball Scraper accepts Sofascore match IDs in the eventIds field, so you can fetch specific games directly without searching by team. The ID is the number after "id:" in a Sofascore match URL. If both teamNames and eventIds are empty, the Actor defaults to Los Angeles Lakers.

What does the score margin graph contain? The Basketball Scraper score margin graph contains one point per minute of game time, each with the home team score minus the away team score. A positive margin means the home team led. Every graph point is billed as one $0.01 score-graph event.

Why is play-by-play period sometimes missing? Sofascore does not label every scoring play with its quarter, so Basketball Scraper may return a play-by-play row without a period. The field is omitted instead of guessed; each play still has the time, player, side, points and running score.

How can I cap my spend? To cap spend, lower Max Items, keep Team statistics and other per-record extras off unless you need them, and set a maximum charge per run in the run options. The Actor stops cleanly when the limit is reached. A default run costs $0.015 per game at the Free tier.

🔗 Want more sports data? Other RecordsData scrapers

🆘 Support

Open an issue in the Issues tab or write to contact.punkrecordsdata@gmail.com.

Last updated: 2026-10-11