Basketball API Scraper — Box Scores, Stats & Standings
Pricing
from $2.50 / 1,000 game extracteds
Basketball API Scraper — Box Scores, Stats & Standings
Basketball data API: per-player box scores with points, rebounds, assists, steals, blocks, plus-minus and field goal percentage; league standings with win percentage and games behind; season schedules, quarter-by-quarter scores, play-by-play, rosters with salaries, live games and point spreads.
Pricing
from $2.50 / 1,000 game extracteds
Rating
0.0
(0)
Developer
SIÁN OÜ
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Basketball API Scraper — Box Scores, Stats & Standings 🚀
🎉 Full per-player box scores — 22 stat columns for every player in every game
Built for fantasy tools, live score widgets, stat dashboards and betting models
🔍 What is the Basketball API Scraper — and when should you use it?
The Basketball API Scraper turns basketball competitions, games, teams and players into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.
Use it when you need: per-player box scores (points, rebounds, offensive and defensive rebounds, assists, steals, blocks, turnovers, personal fouls, plus-minus, minutes played, field goals made and attempted, field goal percentage, two-pointers, three-pointers, free throws, player rating), league standings (wins, losses, win percentage, games behind, streak, points for, points against, point differential, qualification), season and team schedules with quarter-by-quarter scoring and playoff series score, shot-classified play-by-play, team profiles with arena and head coach, rosters with jersey numbers and salaries, player profiles with height, weight and contract dates, per-quarter team statistics, point spread and game total odds, and games in progress right now.
Use something else when: you need football, tennis, F1, MMA or esports. Use Sports Data Scraper for 30+ sports, or Football API Scraper for football fixtures, tables and lineups. If you only want bookmaker lines across many sports, use Sports Betting Odds Scraper.
🤖 Use with AI agents
Already connected to the Apify MCP server? Just ask for this Actor by name: sian.agency/basketball-api-scraper
Your agent can pay for its own runs. This Actor is eligible for agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.
Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
I want a per-player box score for a basketball game using the Apify Actor `sian.agency/basketball-api-scraper`.Use it when I need: box scores, league standings, season and team schedules, play-by-play, team and player profiles, rosters with salaries, team statistics, point spreads and live games — for basketball.Don't use it when: I need football, tennis, F1, MMA or esports — use `sian.agency/sports-data-scraper` instead.How to call it: set `operation` to one of- searchCompetitions (needs `query`, e.g. "EuroLeague") — find a competitionId- competitionSeasons (needs `competitionId`) — find a seasonId- seasonSchedule (needs `competitionId` + `seasonId`) — games, returns gameId and team IDs- leagueStandings (needs `competitionId` + `seasonId`)- teamProfile / teamSchedule / teamRoster (need `teamId`)- playerProfile (needs `playerId`)- gameSummary / gameBoxScore / gamePlayByPlay / gameTeamStats / gameOdds (need `gameId`)- liveGames (needs nothing)Start with this input:{"operation": "gameBoxScore","gameId": "13753624"}Ask me which competition and which game I care about, chain searchCompetitions tocompetitionSeasons to seasonSchedule to get the IDs, then run the Actor and summarisethe results as a table sorted by points.
Things you can ask your agent for:
- "Find the EuroLeague, pull last season's final standings, and tell me which team had the best point differential."
- "Get the box score for the most recent game team 3428 played and rank the players by plus-minus."
- "Pull the last 90 games of competition 132 season 65360 and show me every game decided by 3 points or fewer."
Machine-readable API, MCP config and OpenAPI definition for this Actor are published at apify.com/sian.agency/basketball-api-scraper.md.
📋 Overview
Basketball data, finally shaped like basketball. Most general sports scrapers return football-shaped rows — halves instead of quarters, cards instead of baskets, points tables instead of win-loss records. This Actor is built and tested against basketball payloads only, so every column arrives populated.
Why professionals choose us:
- ✅ 22 box-score columns per player: points, rebounds (total, offensive, defensive), assists, steals, blocks, turnovers, personal fouls, plus-minus, minutes, field goals, three-pointers, free throws, field goal percentage and player rating
- ⚡ Whole leagues in one call: standings return every conference, division and league-wide table together — up to 90 rows from a single operation
- 🎯 Real basketball vocabulary: win percentage, games behind, streak, point differential, quarter-by-quarter scoring, playoff series score, one/two/three-point shot classification
- 💰 Pay only for the operation you ran: 14 discrete charge events instead of one blanket per-row fee, so pulling a standings table never costs the same as pulling 109 play-by-play rows
- 💎 Salary and contract data: roster and player rows carry salary amount, currency and contract expiry
- ✨ Basketball-only search: competition search is filtered to basketball, so a query never buries you in other sports
✨ Features
- 🏀 Game Box Score: every player from both benches with a full statistical line
- 📋 League Standings: wins, losses, win percentage, games behind, streak, points for and against
- 🗓️ Season Schedule: paginated game lists with final scores and quarter splits
- 📆 Team Schedule: one team's played or upcoming games
- ⏱️ Play-by-Play: every basket classified as a one, two or three-pointer with running score
- 📈 Game Team Stats: team totals split by full game and by quarter
- 👥 Team Roster: jersey number, position, height, weight, nationality, salary, contract
- 👤 Player Profile: full biography with salary and contract dates
- 🏟️ Team Profile: arena, capacity, city, head coach, team colours, recent form
- 💱 Game Odds: point spread, game total, quarter and half markets with opening and current prices
- 🔴 Live Games: everything tipped off right now, with quarter scores and current period
- 🔍 Competition Search: find any competition by name, basketball results only
- 📤 Export anywhere: JSON, CSV, Excel straight from the Apify dataset
- 🧾 HTML run report: every run writes a summary report to the key-value store
🎬 Quick Start
Pick an operation, supply the one or two IDs it needs, and run. Every schedule row hands you the gameId and team IDs for the next operation, so you can chain from a competition name to a full box score in three runs.
curl -X POST https://api.apify.com/v2/acts/sian.agency~basketball-api-scraper/runs?token=YOUR_TOKEN \-H 'Content-Type: application/json' \-d '{"operation": "gameBoxScore", "gameId": "13753624"}'
🚀 Getting Started (3 Simple Steps)
Step 1: Find your competition
Run searchCompetitions with a name like "EuroLeague", "NCAA" or "Liga ACB". Results are basketball only, and each row gives you a competitionId.
Step 2: Pick a season and pull the schedule
Run competitionSeasons with that competitionId to get a seasonId, then seasonSchedule to list the games. Every row carries a gameId, homeTeam.id and awayTeam.id.
Step 3: Go deep on what matters
Feed a gameId into gameBoxScore, gamePlayByPlay, gameTeamStats or gameOdds — or feed a teamId into teamRoster for salaries and jersey numbers.
That's it! In under a minute, you'll have:
- A full per-player statistical line for any game
- A complete league table with win percentage and games behind
- A season's worth of results with quarter-by-quarter scoring
📥 Input Configuration
| Field | Type | Required | Description |
|---|---|---|---|
operation | string | Yes | Which dataset to extract (see the 14 operations below) |
query | string | No | Competition name to search for (searchCompetitions) |
competitionId | string | No | Numeric competition ID (competitionSeasons, seasonSchedule, leagueStandings) |
seasonId | string | No | Numeric season ID (seasonSchedule, leagueStandings) |
teamId | string | No | Numeric team ID (teamProfile, teamSchedule, teamRoster) |
playerId | string | No | Numeric player ID (playerProfile) |
gameId | string | No | Numeric game ID (all five game* operations) |
standingsType | string | No | total, home or away (leagueStandings) |
gameWindow | string | No | played or upcoming (both schedule operations) |
page | integer | No | Zero-based start page for paginated operations |
maxPages | integer | No | How many pages to fetch, up to 50 (30 games per page) |
The 14 operations: searchCompetitions, competitionSeasons, seasonSchedule, leagueStandings, teamProfile, teamSchedule, teamRoster, playerProfile, gameSummary, gameBoxScore, gamePlayByPlay, gameTeamStats, gameOdds, liveGames.
Example — box score:
{"operation": "gameBoxScore","gameId": "13753624"}
Example — full league table:
{"operation": "leagueStandings","competitionId": "132","seasonId": "65360","standingsType": "total"}
Example — a season of results:
{"operation": "seasonSchedule","competitionId": "132","seasonId": "65360","gameWindow": "played","maxPages": 3}
📤 Output
Results are saved to the Apify dataset. The field set depends on the operation — here are the most valuable columns:
| Field | Type | Description |
|---|---|---|
playerName | string | Player full name (box score, roster, play-by-play) |
points | number | Points scored |
rebounds | number | Total rebounds, plus offensiveRebounds and defensiveRebounds |
assists | number | Assists |
steals / blocks / turnovers | number | Defensive and ball-security counts |
plusMinus | number | Point differential while the player was on court |
minutesPlayed | number | Minutes played, to one decimal |
fieldGoalPct | number | Field goal percentage |
threePointsMade / threePointAttempts | number | Three-point shooting split |
wins / losses / winPercentage | number | Standings record |
gamesBehind / streak / pointDifferential | number/string | Standings context |
homeQuarterScores / awayQuarterScores | object | Points by quarter (q1–q4) plus overtime |
homeSeriesWins / awaySeriesWins | number | Playoff series score |
shotType | string | onePoint, twoPoints or threePoints |
salaryAmount / salaryCurrency | number/string | Player salary |
arenaName / arenaCapacity / headCoach | string/number | Team profile detail |
decimalOdds / fractionalOdds / movement | number/string | Odds with price movement |
status / errorMessage | string | Row outcome; error rows are never charged |
Example — one box-score row:
{"gameId": 13753624,"side": "home","teamId": 3428,"playerId": 1132126,"playerName": "Jonathan Kuminga","jerseyNumber": "0","position": "F","isStarter": false,"minutesPlayed": 25.6,"points": 30,"rebounds": 6,"offensiveRebounds": 2,"defensiveRebounds": 4,"assists": 3,"steals": 0,"blocks": 2,"turnovers": 1,"personalFouls": 3,"plusMinus": 8,"playerRating": 8.4,"fieldGoalsMade": 11,"fieldGoalAttempts": 21,"fieldGoalPct": 52,"threePointsMade": 2,"threePointAttempts": 5,"freeThrowsMade": 6,"freeThrowAttempts": 7,"_operation": "gameBoxScore","status": "success"}
Example — one standings row:
{"tableName": "Eastern Conference","position": 1,"teamId": 3432,"teamName": "Cleveland Cavaliers","gamesPlayed": 82,"wins": 64,"losses": 18,"winPercentage": 0.78,"gamesBehind": 0,"streak": -1,"pointsFor": 9999,"pointsAgainst": 9217,"pointDifferential": "+782","qualification": "Playoffs","_operation": "leagueStandings","status": "success"}
💼 Use Cases & Examples
1. Fantasy Basketball Draft Boards
Fantasy platform developers building projections from real per-player production.
Input: gameBoxScore for every game in a season, chained from seasonSchedule
Output: One row per player per game with 22 statistical columns
Use: Rolling averages, usage rates, minutes trends and plus-minus splits that drive draft rankings and weekly waiver advice.
2. Live Score Widgets
Front-end teams shipping an in-play scoreboard.
Input: liveGames on a short schedule
Output: Every basketball game in progress with current score, quarter splits and status
Use: Auto-refreshing widgets and mobile push alerts, covering professional, college and international competitions in one call.
3. Team & Player Season Dashboards
Analytics teams tracking form, rosters and payroll.
Input: leagueStandings, teamRoster and teamSchedule
Output: Complete league tables, roster lines with salary and contract expiry, and full game logs
Use: Season-long dashboards showing record, streak, games behind, roster turnover and payroll commitment side by side.
4. Betting Model Inputs
Quantitative modellers building basketball price models.
Input: gameOdds plus gameTeamStats and gamePlayByPlay for the same games
Output: Point spreads and game totals with opening and current prices, alongside quarter-level team stats and shot-classified scoring sequences
Use: Backtest closing-line value, model quarter-scoring distributions and quantify three-point variance.
5. Sports Media & Editorial Research
Journalists, newsletters and academics who need reliable historical data.
Input: competitionSeasons then seasonSchedule across multiple seasons
Output: Every game with final score, venue, round, attendance and playoff series state
Use: Match reports, record-tracking pieces, season retrospectives and reproducible academic datasets.
6. Scouting & Recruitment Databases
Scouts and agencies tracking players across leagues.
Input: searchCompetitions across leagues, then teamRoster and playerProfile
Output: Player biographies with height, weight, position, nationality, salary and contract expiry
Use: Build a cross-league scouting database and flag players entering the final year of a contract.
7. Quarter-Level Game Analysis
Coaching and performance staff studying momentum.
Input: gameTeamStats with the per-quarter split, plus gamePlayByPlay
Output: Team totals for every quarter (scoring, rebounds, assists, turnovers, biggest lead, time spent in lead) and every scoring play in sequence
Use: Identify which quarters a team wins or loses, and how scoring runs are built.
🔗 Integration Examples
JavaScript/Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('sian.agency/basketball-api-scraper').call({operation: 'gameBoxScore',gameId: '13753624'});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.sort((a, b) => b.points - a.points)[0]);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('sian.agency/basketball-api-scraper').call(run_input={'operation': 'leagueStandings', 'competitionId': '132', 'seasonId': '65360'})for item in client.dataset(run['defaultDatasetId']).iterate_items():print(item['position'], item['teamName'], item['wins'], item['losses'], item['winPercentage'])
cURL
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~basketball-api-scraper/runs?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"operation": "seasonSchedule", "competitionId": "132", "seasonId": "65360", "maxPages": 3}'
Automation Workflows (N8N / Zapier / Make)
- Trigger: Schedule (e.g. every 60 seconds during game hours)
- HTTP Request: Call the Actor with
{"operation": "liveGames"} - Process: Filter rows where
gameStatusTypeisinprogress - Action: Post score changes to Slack, a database or a live widget
📊 Performance & Pricing
FREE Tier (Try It Now)
- Full feature access — all 14 operations, same data quality
- No credit card required
- Perfect for evaluating field coverage before you commit
PAID Tier (Production Ready)
- Lower per-row rates that taper further as your Apify plan grows
- Charged per successful row, per operation — error rows are never billed
- Pulling a standings table costs standings rates, not play-by-play rates
💰 Pay only for the operation you ran — 14 discrete charge events instead of one blanket per-row fee.
❓ Frequently Asked Questions
Q: Which competitions are covered?
A: Professional, college and international basketball worldwide. Use searchCompetitions to find any competition by name — results are filtered to basketball.
Q: How do I find the IDs the operations need?
A: Chain them. searchCompetitions gives you competitionId, competitionSeasons gives you seasonId, and every seasonSchedule row gives you gameId plus homeTeam.id and awayTeam.id.
Q: Why did my home or away standings return an error row?
A: Competitions split into conferences or divisions publish the combined table only. Use standingsType: "total" — for those leagues it returns every conference, division and league-wide table in one run.
Q: What output formats are available? A: JSON, CSV, Excel and XML — export directly from the Apify dataset.
Q: Are historical seasons available?
A: Yes. competitionSeasons lists every published season, often decades of them, and both schedule operations and standings accept any of those season IDs.
Q: How current is live data?
A: liveGames reflects games in progress at the moment of the run, including the current quarter and running score.
Q: Do I get charged for rows that failed?
A: No. Rows with status: "error" are written to the dataset so you can see what happened, but they are never charged.
Q: How many games per page?
A: Up to 30. maxPages controls how many pages to pull, and pagination stops early when no further pages exist.
🐛 Troubleshooting
An operation returns "Not found — check the ID used for this operation."
- IDs are operation-specific: a
teamIdwill not work as agameId. - Re-derive the ID from the operation that produces it (
seasonScheduleforgameId,teamRosterforplayerId).
gameWindow: "upcoming" returned completed games.
- The competition or team has no scheduled fixtures right now (off-season, or the season has finished), so played games are returned instead. Check
gameStatusTypeon each row.
gameBoxScore returned an error row.
- Box scores are published once a game has tipped off. For a fixture that has not started, use
gameSummaryfor scheduling detail instead.
liveGames returned an error row.
- No basketball game was in progress at that moment. Schedule the run during game hours for your target competitions.
Standings look shorter than expected.
- Single-table competitions return one table; conference-and-division leagues return several. Check
tableNameon each row to see which table it belongs to.
⚠️ Trademark Disclaimer
All league, competition, team and player names, logos and marks referenced in this Actor's output are the property of their respective owners. SIÁN Agency is not affiliated with, endorsed by, or sponsored by any basketball league, federation, club or governing body. All names are used solely as factual identifiers to describe publicly available sports information. This Actor collects only publicly accessible data and does not access any private, subscription-gated or proprietary system.
⚖️ Is it legal to scrape data?
Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.
However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.
You can also read Apify's blog post on the legality of web scraping.
🤝 Support
Join our active support community
- For issues or questions, open an issue in the actor's Issues tab
- Check SIÁN Agency Store for more automation tools
- 📧 apify@sian-agency.online
Built by SIÁN Agency | More Tools