Basketball API Scraper — Box Scores, Stats & Standings avatar

Basketball API Scraper — Box Scores, Stats & Standings

Pricing

from $2.50 / 1,000 game extracteds

Go to Apify Store
Basketball API Scraper — Box Scores, Stats & Standings

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Ü

SIÁN OÜ

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Basketball API Scraper — Box Scores, Stats & Standings 🚀

SIÁN Agency Store Sports Data Scraper Sports Betting Odds Scraper Instagram AI Transcript Extractor

🎉 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 to
competitionSeasons to seasonSchedule to get the IDs, then run the Actor and summarise
the 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

FieldTypeRequiredDescription
operationstringYesWhich dataset to extract (see the 14 operations below)
querystringNoCompetition name to search for (searchCompetitions)
competitionIdstringNoNumeric competition ID (competitionSeasons, seasonSchedule, leagueStandings)
seasonIdstringNoNumeric season ID (seasonSchedule, leagueStandings)
teamIdstringNoNumeric team ID (teamProfile, teamSchedule, teamRoster)
playerIdstringNoNumeric player ID (playerProfile)
gameIdstringNoNumeric game ID (all five game* operations)
standingsTypestringNototal, home or away (leagueStandings)
gameWindowstringNoplayed or upcoming (both schedule operations)
pageintegerNoZero-based start page for paginated operations
maxPagesintegerNoHow 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:

FieldTypeDescription
playerNamestringPlayer full name (box score, roster, play-by-play)
pointsnumberPoints scored
reboundsnumberTotal rebounds, plus offensiveRebounds and defensiveRebounds
assistsnumberAssists
steals / blocks / turnoversnumberDefensive and ball-security counts
plusMinusnumberPoint differential while the player was on court
minutesPlayednumberMinutes played, to one decimal
fieldGoalPctnumberField goal percentage
threePointsMade / threePointAttemptsnumberThree-point shooting split
wins / losses / winPercentagenumberStandings record
gamesBehind / streak / pointDifferentialnumber/stringStandings context
homeQuarterScores / awayQuarterScoresobjectPoints by quarter (q1q4) plus overtime
homeSeriesWins / awaySeriesWinsnumberPlayoff series score
shotTypestringonePoint, twoPoints or threePoints
salaryAmount / salaryCurrencynumber/stringPlayer salary
arenaName / arenaCapacity / headCoachstring/numberTeam profile detail
decimalOdds / fractionalOdds / movementnumber/stringOdds with price movement
status / errorMessagestringRow 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 ApifyClient
client = 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)

  1. Trigger: Schedule (e.g. every 60 seconds during game hours)
  2. HTTP Request: Call the Actor with {"operation": "liveGames"}
  3. Process: Filter rows where gameStatusType is inprogress
  4. 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
  • 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.

🔗 View current pricing


❓ 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 teamId will not work as a gameId.
  • Re-derive the ID from the operation that produces it (seasonSchedule for gameId, teamRoster for playerId).

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 gameStatusType on 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 gameSummary for 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 tableName on 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.


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

Telegram Support

Join our active support community


Built by SIÁN Agency | More Tools