basketball data hub

The Cross-League Basketball API for developers ballers.

Every basketball league we serve behind one envelope and one key: live scores, box scores, season stats, and a matchup endpoint that returns the whole preview in one call. Same field names for each league, so the parser you write once reads the next without a change. Sub-100ms REST.

Aggregate sport hub · choose a league before league-specific detail calls

250 req/day free (500 with GitHub). No credit card.

NBA · NCAA Men's Basketball · 2025/26 + NBA historical to 1946

Building NBA-only? That league has its own page, and it goes deeper on props, season history and the matchup endpoint. Go to the NBA API →

Featured league example · not aggregate coverage

NBA

single-league example · response shape, not coverage

1period · clock
2home_team · away_team
3linescore · status
Open the NBA authority →

Leagues in this sport

80
seasons in the archive
70,745 finished games, back to 1946

How far back the NBA archive goes

80 seasons are on record, back to 1946 — 70,745 finished games you can query today. One route serves the full span. These figures are measured from the customer-facing routes listed below, so this page cannot silently drift from the product.

ArchiveRouteSeasonsReaches back toFinished games
Unified NBA game archive/v1/matches?league=nba801946 – 202570,745

What each plan reaches

Edge & Pro
all 80 seasons
Solo & Trio
5 seasons
Free
the current season

Edge and Pro reach everything listed above. Solo and Trio reach five seasons. Free covers the current season.

Unified schema

One basketball envelope. League context stays explicit.

Canonical IDs, league keys, status and timestamps travel with the row. The hub describes shared fields; each league authority documents its own depth.

basketball
sport
selected key
league
canonical
id
served
status

No featured-league field is promoted to a sport-wide guarantee.

Event surface

League-native events inside the basketball hub.

Event granularity differs by competition. Discover a match and league first, then use that authority’s event contract rather than assuming one featured feed applies everywhere.

  1. 1/v1/nba/players/:player_id/propsPlayer prop lines + rolling hit ratesedge
  2. 2/v1/nba/players/:player_id/statsPer-season player aggregatesfree
  3. 3/v1/nba/leadersStatistical leaders with team affiliationfree
  4. 4/v1/matches/:id/odds?sport=basketballPre-match + in-play odds across 16+ booksedge

League directory

Choose the basketball competition you are actually building.

League pages own seasons, participants, examples and measured depth. This hub owns discovery across them.

League authorityRoleNext step

Coverage strength

What the aggregate basketball surface connects.

Counts below describe published route rows on this hub, not a promise that every league fills every field.

0

League authorities

8

Published routes

5

Build patterns

4

FAQ answers

Endpoints

On the gateway at api.bigballsdata.com. Authenticate with the bearer token from /dashboard/keys.

MethodPathReturnsPlan
GET/v1/matches?sport=basketballLive + scheduled basketball games (NBA + NCAAB)Free
GET/v1/nba/games/:match_id/matchupFull matchup intelligence endpointFree
GET/v1/nba/players/:player_id/propsPlayer prop lines + rolling hit ratesEdge
GET/v1/nba/players/:player_id/statsPer-season player aggregatesFree
GET/v1/nba/leadersStatistical leaders with team affiliationFree
GET/v1/standings?sport=basketball&league=nbaConference + division standingsFree
GET/v1/matches/:id/odds?sport=basketballPre-match + in-play odds across 16+ booksEdge
GET/v1/injuries?sport=basketballActive injury reportsFree

What you get, by plan

One row per capability, not per field per endpoint. Season spans are counted from rows that are actually populated, and each capability names the simplest endpoint that returns it.

Ratings and derived intelligence

CapabilityFreeSoloTrioEdgeProEndpoint
Current Elo rating—PENDINGPENDINGPENDINGPENDING/v1/teams/{id}/elo

Measured against production on 2026-09-13. A capability appears here only when it has rows, an endpoint that returns it, and a source we may both serve and quote.

Stats included

Every basketball stat field the API returns today — 76 in total, grouped by how they are produced. Each group carries its own freshness, because a sport is rarely uniformly current.

Per-game player stats

Post-game

Written after the game ends — not a live in-game feed. Last ingested 2026-09-16.

Endpoint
/v1/players/:id/stats
Last updated
2026-09-16

Fields (14)

Assists, Blocks, Defensive Rebounds, Field Goals Made/Attempted, Personal Fouls, Free Throws Made/Attempted, Minutes Played, Offensive Rebounds, Plus/Minus, Points, Rebounds, Steals, Three Point Field Goals Made/Attem, Turnovers

Season player stats

Historical

Held and queryable, but not currently being ingested. Last ingested 2026-06-03.

Endpoint
/v1/nba/players/:id/splits
Last updated
2026-06-03

Fields (46)

Ast %, Ast Ratio, Ast to, Defensive Rating, Dreb %, E Defensive Rating, E Net Rating, E Offensive Rating, E Pace, E Tov %, E Usg %, Efg %, Games Played, Losses, Minutes, Net Rating, Offensive Rating, Oreb %, Pace, Pace Per40, Pie, Poss, Rebounds %, Tm Tov %, Ts %, Usg %, W %, Wins, Ast, Blk, Dreb, Fg3 %, Fg3a, Fg3m, FG %, Fga, Fgm, Ft %, Fta, Ftm, Oreb, Pf, Points, Rebounds, Stl, Turnover

Team stats (per game)

Post-game

Written after the game ends — not a live in-game feed. Last ingested 2026-09-16.

Endpoint
/v1/matches/:id/statistics
Last updated
2026-09-16

Fields (26)

Assists, Blocks, Defensive Rebounds, Fast Break Points, Field Goal %, Field Goals Made/Attempted, Flagrant Fouls, Personal Fouls, Free Throw %, Free Throws Made/Attempted, Largest Lead, Lead Changes, Time Leading %, Offensive Rebounds, Points in the Paint, Score, Steals, Team Turnovers, Technical Fouls, Three-Point %, Three Point Field Goals Made/Attem, Total Rebounds, Total Technical Fouls, Total Turnovers, Turnover Points, Turnovers

Not included

  • Not shown here — player_per_game_box (new granularity, not yet mapped for display).
  • Not shown here — player_season_general: 176 raw upstream season keys with no route serving them.
  • Not shown here — play_by_play: play-by-play events, not a stat line — mostly identifiers once classified.
  • Not shown here — lineups: lineup composition, not a measured stat.
  • Not shown here — props: betting lines and prices, not stats — they belong on the odds surface.
  • player_season is not currently ingesting (last 2026-06-02).
  • player_season_advanced is not currently ingesting (last 2026-06-03).

Missing a stat?

We build what people actually ask for. If a field you need is not on this page, tell us — requests are how we decide what to add next.

Name the field or the endpoint shape. Specifics help more than categories.

Goes straight to the team as a product signal. No newsletter, no account, nothing else done with your address.

Player availability

basketball availability is league-scoped.

Injury, lineup and participant availability vary by league and season. Missing rows stay missing; the hub does not borrow another league’s records.

Nullable by design

Check the selected league authority and response timestamp before presenting a status as current.

Next up

Schedules across basketball competitions.

Each league publishes its own schedule and its own season boundaries. Call the league you selected and read the status and kickoff on the rows it returns, rather than inferring a season from this hub.

DiscoverGET /v1/leagues

Choose a real league key

Schedule/v1/matches?sport=basketball

Keep league + season

DetailGET /v1/matches/{id}

Traverse canonical IDs

From response to product

A featured league example, rendered and raw.

This is visibly scoped to NBA, single-league example · response shape, not coverage; it demonstrates the shared envelope without claiming that league represents all basketball.

Featured league example

NBA

single-league example · response shape, not coverage

period · clockhome_team · away_teamlinescore · status
{
  "data": [
    {
      "id": "canonical-id-from-response",
      "sport": "basketball",
      "league": "selected-league-key",
      "status": "finished",
      "home": {
        "name": "Home participant"
      },
      "away": {
        "name": "Away participant"
      },
      "score": {
        "home": null,
        "away": null
      }
    }
  ],
  "meta": {
    "example_scope": "NBA · single-league example · response shape, not coverage",
    "note": "Shape example; request the API for current values."
  }
}

basketball resources

Docs, comparisons and build guides.

Every card is a real destination. League authorities remain separate from supporting product and documentation routes.

Real API example

Start at aggregate basketball discovery.

The request deliberately omits a featured league when the route supports sport-wide discovery. Select a returned league key before league-specific calls.

curl -H "Authorization: Bearer $BBS_API_KEY" "https://api.bigballsdata.com/v1/matches?sport=basketball"
{
  "data": [
    {
      "id": "canonical-id-from-response",
      "sport": "basketball",
      "league": "selected-league-key",
      "status": "finished",
      "home": {
        "name": "Home participant"
      },
      "away": {
        "name": "Away participant"
      },
      "score": {
        "home": null,
        "away": null
      }
    }
  ],
  "meta": {
    "example_scope": "NBA · single-league example · response shape, not coverage",
    "note": "Shape example; request the API for current values."
  }
}

Integrate in a few lines

Node.js, @bigballsdata/sdktypescript
import { BigBallSportsClient } from '@bigballsdata/sdk';

const client = new BigBallSportsClient(process.env.BBS_API_KEY!);

// Tonight's matchup, fully assembled in one call.
const matchup = await client.nba.games.matchup(gameId);
for (const p of matchup.home_team.players) {
  console.log(p.name, p.season_averages?.pts ?? '-', 'ppg');
}

MCP

Connect an agent. Choose scope first.

An agent should discover basketball leagues, select one explicitly, then traverse matches and players by returned canonical IDs.

1get_leaguessport: basketball
2get_matchesleague: selected key
3get_match_detailsmatch_id: returned UUID

Data freshness

Freshness belongs to the selected league and dataset.

The hub never turns a single-league example into a current sport-wide claim, and it states no season of its own.

Scoped

Schedules

Current when populated

Source: League response

Scoped

Scores

Event-driven

Source: Match response

Scoped

Stats

Category-specific

Source: Dataset response

Scoped

Example

single-league example · response shape, not coverage

Source: Static label

Plan decision

Choose by endpoint, not by the hub headline.

Each row preserves its league or sport scope and resolves against the endpoint plan registry when that route has a canonical entry.

EndpointScopeMinimum plan
/v1/matches?sport=basketballSport/sharedfree
/v1/nba/games/:match_id/matchupLeague-specificfree
/v1/nba/players/:player_id/propsLeague-specificedge
/v1/nba/players/:player_id/statsLeague-specificfree
/v1/nba/leadersLeague-specificfree
/v1/standings?sport=basketball&league=nbaLeague-specificfree
/v1/matches/:id/odds?sport=basketballSport/sharededge
/v1/injuries?sport=basketballSport/sharedfree

Founder pricing

Start with basketball. Add depth as the product grows.

Prices and included dimensions come from the shared billing manifest; league coverage remains documented on each authority page.

Free

$0
  • ✓ 1 sport
  • ✓ 250 requests / day (500 with GitHub)
  • ✓ Current season
  • ✓ Scores, schedules, fixtures
Get a key

Solo

$19per month
  • ✓ Everything in Free, plus
  • ✓ 1 sport
  • ✓ 10,000 requests / day
  • ✓ Up to 5 seasons
Choose Solo

Trio

$49per month
  • ✓ Everything in Solo, plus
  • ✓ 3 sports
  • ✓ 25,000 requests / day
  • ✓ Up to 5 seasons
Choose Trio

Edge

$149per month
  • ✓ Everything in Trio, plus
  • ✓ All sports
  • ✓ 100,000 requests / day
  • ✓ All available history
Choose Edge

Pro

$299per month
  • ✓ Everything in Edge, plus
  • ✓ All sports
  • ✓ 200,000 requests / day
  • ✓ All available history
Choose Pro

Start on the free tier

100 requests per minute and 250 per day, free — the highest per-minute burst of any free sports API we checked. Burst is what matters when something asks several questions in a row and waits on each answer.

  • Every sport and league we cover — the paid tiers add history depth and premium fields, not more leagues.
  • Calls are counted one for one — no credit weighting, no markets-times-regions arithmetic.
  • Link GitHub and the daily cap goes to 500.
  • No credit card.
Get a key →

Or ask your AI tool directly

Connect your account to Claude, ChatGPT, Cursor, Perplexity or any other MCP-compatible tool and ask for basketball data in conversation — scores, standings, player stats and Elo ratings, with no API key to paste and no code to write. Your plan and limits carry over exactly as they do here.

Connect your AI tool →

Free covers a real app. Scale when you need to.

250 req/day free (500 with GitHub). Production starts at $49/mo. Live WebSocket push on Pro+.

Frequently asked

Answers before you choose a league.

Is there a free basketball API?

Yes. Scores, box scores, standings, player profiles, props, and injury reports at 250 requests/day (500 with GitHub), no credit card.

Does it cover NCAA basketball?

Yes. NCAA men's basketball runs on the same basketball surface as the NBA; filter with ?league=ncaab. NBA has the deepest coverage (props, matchup intelligence, and season history).

Does the basketball API include player props?

Yes. /v1/nba/players/:player_id/props returns the latest prop line we hold plus a rolling hit rate over the last N games, computed from box scores. Every response carries a `freshness` block derived from the line’s own timestamp (`data_as_of`, age in days, and a status of live/recent/stale). Read freshness.status rather than assuming a returned line is a current price: when nothing is on the board the newest line we hold can be days or weeks old, and the block says so in the response.

How fast are live basketball scores?

The REST scores endpoint refreshes on a 15-second cache during live games (~200ms typical round trip). WebSocket push is on the Pro plan.

Get an API key in 30 seconds