Find an API

Search public APIs with auth details & Postman guides

← All APIs

BallDontLie NBA API

api.balldontlie.io · Media

Media API Key Free Tier Sports NBA Basketball

NBA stats API — players, teams, games, and season averages going back to 1979. Free tier available, no credit card required.

Authentication

API Key authentication Free API key at balldontlie.io — no credit card. Pass as Authorization: Bearer YOUR_KEY.

Sample Requests

GET Search players

Search for NBA players by name.

https://api.balldontlie.io/v1/players?search=lebron

Hover any highlighted part to learn what it does

Headers — extra info sent with the request
Authorization Bearer YOUR_API_KEY
curl -X GET "https://api.balldontlie.io/v1/players?search=lebron" \
  -H "Authorization: Bearer YOUR_API_KEY"
import requests
params = {
    "search": "lebron"
}
headers = {
    "Authorization": "Bearer YOUR_API_KEY"
}
response = requests.get(
    "https://api.balldontlie.io/v1/players",
    params=params,
    headers=headers,
)
print(response.json())
const url = new URL('https://api.balldontlie.io/v1/players');
url.searchParams.set('search', 'lebron');

const response = await fetch(url, {
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  },
}); 
const data = await response.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
	"net/url"
)

func main() {
	baseURL, _ := url.Parse("https://api.balldontlie.io/v1/players")
	q := baseURL.Query()
	q.Set("search", "lebron")
	baseURL.RawQuery = q.Encode()
	targetURL := baseURL.String()
	req, _ := http.NewRequest("GET", targetURL, nil)
	req.Header.Set("Authorization", "Bearer YOUR_API_KEY")

	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}
require "net/http"
require "json"

uri = URI("https://api.balldontlie.io/v1/players")
uri.query = URI.encode_www_form({
  "search" => "lebron"
})

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"

req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer YOUR_API_KEY"

res = http.request(req)
puts JSON.parse(res.body)
<?php
$url = "https://api.balldontlie.io/v1/players?" . http_build_query([
    "search" => "lebron"
]);
$opts = ["http" => [
    "method" => "GET",
    "header" => implode("\r\n", [
        "Authorization: Bearer YOUR_API_KEY"
    ]),
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));
GET Get season averages

Get LeBron James 2023-24 season averages.

https://api.balldontlie.io/v1/season_averages?season=2023&player_ids=237

Hover any highlighted part to learn what it does

Headers — extra info sent with the request
Authorization Bearer YOUR_API_KEY
curl -X GET "https://api.balldontlie.io/v1/season_averages?season=2023&player_ids=237" \
  -H "Authorization: Bearer YOUR_API_KEY"
import requests
params = {
    "season": "2023",
    "player_ids": "237"
}
headers = {
    "Authorization": "Bearer YOUR_API_KEY"
}
response = requests.get(
    "https://api.balldontlie.io/v1/season_averages",
    params=params,
    headers=headers,
)
print(response.json())
const url = new URL('https://api.balldontlie.io/v1/season_averages');
url.searchParams.set('season', '2023');
url.searchParams.set('player_ids', '237');

const response = await fetch(url, {
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  },
}); 
const data = await response.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
	"net/url"
)

func main() {
	baseURL, _ := url.Parse("https://api.balldontlie.io/v1/season_averages")
	q := baseURL.Query()
	q.Set("season", "2023")
	q.Set("player_ids", "237")
	baseURL.RawQuery = q.Encode()
	targetURL := baseURL.String()
	req, _ := http.NewRequest("GET", targetURL, nil)
	req.Header.Set("Authorization", "Bearer YOUR_API_KEY")

	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}
require "net/http"
require "json"

uri = URI("https://api.balldontlie.io/v1/season_averages")
uri.query = URI.encode_www_form({
  "season" => "2023",
  "player_ids" => "237"
})

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"

req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer YOUR_API_KEY"

res = http.request(req)
puts JSON.parse(res.body)
<?php
$url = "https://api.balldontlie.io/v1/season_averages?" . http_build_query([
    "season" => "2023",
    "player_ids" => "237"
]);
$opts = ["http" => [
    "method" => "GET",
    "header" => implode("\r\n", [
        "Authorization: Bearer YOUR_API_KEY"
    ]),
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));

Postman Setup Guide

Get Postman ↗
  1. Get a free API key at balldontlie.io (no credit card)
  2. Set Authorization: Bearer YOUR_KEY header
  3. Search players: GET /v1/players?search=curry
  4. Season averages: GET /v1/season_averages?season=2023&player_ids={id}

What can you build with BallDontLie NBA API?

BallDontLie NBA API is a Media API. Developers commonly use media APIs for:

  • storing and delivering images, video, and audio
  • building digital asset management and media libraries
  • transcoding and optimising media for the web
  • adding video streaming and playback to your app
  • automating content tagging and metadata extraction

API Key authentication. You'll receive a key after signing up. Send it with every request — in a header or query parameter. Keep it out of client-side code and never commit it to version control. BallDontLie NBA API is free to use up to a usage limit, making it a low-risk choice to experiment with.

New to APIs? Read our beginner's guide

Open documentation ↗