Basketball Scraper: Box Scores, Play-by-Play & Odds
Pricing
from $12.60 / 1,000 match records
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
9 days ago
Last modified
Categories
Share
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 type | Fields |
|---|---|
match-record | matchId, 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-profile | teamName, playerName, position, jerseyNumber, heightCm, weightKg, country, salary, contractUntil (salary NBA only) |
standings-record | tournamentName, 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:
| Event | Price | What one event is |
|---|---|---|
match-record | $0.015 | One game |
match-statistics-record | $0.01 | One team stat line (full game or one quarter) |
box-score-player-record, lineup-record | $0.01 | One player box score line; one lineup entry |
h2h-record, odds-record, score-graph-record | $0.01 | One head-to-head tally; one odds outcome; one margin graph point |
play-by-play-record | $0.01 | One scoring play |
roster-record, standings-record | $0.01 | One roster player; one standings row (once per run) |
shot-record | $0.0003 | One shot chart entry |
play-log-record | $0.00015 | One play log entry |
odds-market-record | $0.0015 | One all-markets odds line |
player-profile-record | $0.003 | One 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
- Open the Actor and type a team name (for example "Los Angeles Lakers") or paste Sofascore match IDs.
- Switch on only the extras you need and keep Max Items low (default 10).
- Click Start, then download CSV, Excel, JSON or XML.
⚙️ Basketball Scraper input
| Field | Type | Default | Meaning |
|---|---|---|---|
teamNames | list | Los Angeles Lakers if no other source is set | Team names to scrape |
eventIds | list | empty | Sofascore match IDs to fetch directly |
liveOnly | boolean | false | Fetch all live games and ignore the lists |
gameWindow | string | both | both, played or upcoming games |
dateFrom, dateTo | string | empty | YYYY-MM-DD (UTC) window on start time |
tournaments, tournamentSeason | list, string | empty, latest | Competition id (132 is the NBA), name or id:seasonId; season such as 2024/2025 |
onlyNew, stateKey, resetSeen | boolean, string, boolean | false, empty, false | Monitor mode; optional monitor name; clear the seen list |
maxItems | integer | 10 | Cap on output rows; 1 to 1,000,000 |
includeStatistics | boolean | false | Team stats per quarter, billed per line (about 71 per NBA game) |
includeBoxScore, includeLineups, includeH2h, includeOdds, includeScoreGraph, includePlayByPlay | boolean | false | Per-game extras |
includeShotChart, includePlayLog | boolean | false | Shots with court position; every play with running score (NBA 2024/25 on) |
includeOddsMarkets | boolean | false | Moneyline, quarter and half winners, spread and total lines |
playerProfiles | list | empty | Player names, ids or page links; no games unless another search input is set |
includeRoster, includeStandings | boolean | false | Team 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.
| Capability | Basketball Scraper | sian.agency basketball-api-scraper | sportsverse NBA play-by-play |
|---|---|---|---|
| Shot coordinates | NBA from 2024/25 on | Not shown on the page | Yes, NBA since 2002 |
| Odds markets | Moneyline, quarters, halves, spread, total | Spread, total, quarter, half | Spread only |
| Player profiles | Name, id or link, with NBA salary | Profile with salary | No |
| Standings | One table per league | Total, home and away tables | No |
| Lineups, head-to-head, margin graph, only-new | Yes | Not listed | No |
| Price | $0.015 per game + $0.01 per extra record | From $2.50 per 1,000 games | From $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.
⚖️ Is it legal to scrape Sofascore basketball data?
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
- Tennis Match Stats Scraper for Sofascore tennis matches.
- Sofascore Match Stats Scraper for football.
- Sports Reference Stats Scraper for NBA and NHL history.
🆘 Support
Open an issue in the Issues tab or write to contact.punkrecordsdata@gmail.com.
Last updated: 2026-10-11