Building a sports app that needs NBA data? The landscape in 2026 runs from completely free (with sharp limits) to enterprise contracts that require a sales call. This guide covers every meaningful option, what you actually get from each, and how to pick the right tier for your project.
What Developers Need from an NBA API
Most sports applications require some combination of: game scores and schedules (current and historical), player stats (per-game box scores, season totals), team standings, roster and injury data, historical depth for ML training, and real-time updates during games. No single free API covers all of these — here's what's actually available.
Free Options
stats.nba.com (The Official NBA Stats API)
The official NBA data source powers stats.nba.com with a rich undocumented REST API. It covers player game logs, season totals, team stats, advanced metrics, and shot charts going back to 1946. The data quality is excellent — this is the same data the league uses internally.
The catch: it's unofficial. The NBA doesn't publish documentation, doesn't have an API key system, and the endpoints break without notice. CORS is blocked from the browser — you have to proxy through a server. Headers require browser spoofing. For personal projects and prototyping, stats.nba.com is unbeatable. For production apps with real users, the reliability risk is material.
// stats.nba.com — server-side only (CORS blocked from browser)
const url = 'https://stats.nba.com/stats/playergamelogs' +
'?Season=2025-26&SeasonType=Regular%20Season&LeagueID=00';
const res = await fetch(url, {
headers: {
'Host': 'stats.nba.com',
'Referer': 'https://www.nba.com/',
'User-Agent': 'Mozilla/5.0 (compatible)',
'x-nba-stats-origin': 'stats',
'x-nba-stats-token': 'true',
}
});
const { resultSets } = await res.json();
BallDontLie
BallDontLie is a clean, documented REST API for NBA data. The free tier gives you game scores, standings, player stats, and season averages at 5 requests/minute. It's the right choice for hobby projects where a real documented API matters more than data depth. Paid tiers ($9–$40/mo) unlock live game data and historical depth back to 1979.
Paid Options
PlayCaller Data-as-a-Service API
PlayCaller's DaaS API covers NBA alongside 8 other sports (NFL, MLB, NHL, CFB, Soccer, Tennis, Golf, UFC) from a single key — no separate integrations per sport. The NBA endpoints include game logs, standings, player stats, rosters, and scoring leaders, with ML confidence scores and back-to-back flags included at the Pro Insights tier.
What sets it apart for developers: official TypeScript and Python SDKs (on npm and PyPI), pgvector similarity search for finding statistically similar players, SSE streaming for real-time score events, HMAC-signed webhooks for event-driven architectures, and MCP server support so AI agents like Claude and GPT can call the API natively. The free developer sandbox runs 14 days with 200 requests/day and no card required.
# TypeScript SDK
import { PlayCallerClient } from '@playcaller/sdk';
const client = new PlayCallerClient({ apiKey: process.env.PLAYCALLER_API_KEY });
const games = await client.nba.getGames({ date: '2026-07-04' });
const players = await client.nba.getPlayers({ team: 'LAL', limit: 15 });
const alpha = await client.players.getAlpha({ playerId: 'pc_nba_1234' }); // Pro tier
# Python SDK
from playcaller import PlayCallerClient
client = PlayCallerClient(api_key=os.environ["PLAYCALLER_API_KEY"])
standings = client.nba.get_standings()
for event in client.events.stream(): print(event.type, event.data)
Pricing: Free sandbox → $99/mo Build (2,000 req/day) → $499/mo Pro Insights (20,000 req/day, ML + SSE)
Sportradar
Sportradar is the enterprise standard — used by major media companies, sportsbooks, and the NBA itself as an official data partner. The data coverage is comprehensive: live play-by-play, real-time lineups, betting markets. The barrier is pricing and process: you need a sales conversation, a contract, and a budget starting in the low thousands per month. Not appropriate for indie developers or early-stage startups.
Which One Should You Use?
Prototype / personal project: stats.nba.com — free, rich data, excellent for learning. Accept that endpoints may change and build accordingly.
Early-stage app with real users: PlayCaller DaaS sandbox → Build tier. A proper documented API, TypeScript/Python SDKs, consistent endpoints, and 2,000 req/day for $99/mo. The 14-day free sandbox covers all development without a card.
Multi-sport application: PlayCaller DaaS — the only option in this tier covering NFL, NBA, MLB, NHL, Golf, UFC, Soccer, and Tennis from one key. No juggling multiple API credentials or normalizing different data schemas.
Enterprise / media / sportsbook: Sportradar — when you need official data partnership, live play-by-play, and an enterprise SLA with contractual guarantees, Sportradar is the correct choice.
Getting Started
The PlayCaller sandbox activates in 30 seconds — no card, no sales call:
# 1. Get your free key at playcallerapp.com/developer # 2. Hit your first endpoint curl https://playcallerapp.com/v1/nba/games \ -H "X-PlayCaller-Key: pc_sand_your_key_here" # 3. Install the SDK npm install @playcaller/sdk # or pip install playcaller-sdk