NAV
shell javascript python

Turkish Basketball Super League API

Access Turkish Basketball Super League teams, players, games, lineups, scoring, statistics and standings. Get an API key at app.balldontlie.io. Browse our other APIs.

OpenAPI Specification

Download the OpenAPI specification.

Authentication

Send your API key in the Authorization header with every request. The base URL is https://api.balldontlie.io/bsl/v1.

Account Tiers

Endpoint Free ALL-STAR GOAT
Teams Yes Yes Yes
Players Yes Yes Yes
Standings Yes Yes Yes
Games No Yes Yes
Lineups No Yes Yes
Scoring No Yes Yes
Player Stats No No Yes
Team Stats No No Yes

FREE: $0, 5 requests/minute. ALL-STAR: $9.99/month, 60 requests/minute. GOAT: $39.99/month, 600 requests/minute.

Manage subscriptions in the account dashboard. ALL-ACCESS includes all leagues.

Data Availability

Seasons use the starting year: 2026 means the 2026–27 season. Game dates and times are in UTC. Coverage varies by game and statistic. Unavailable statistics are null; an empty collection means no matching records are currently available. Final statistics may be corrected after the game. Playing-time precision can vary. Lineups appear when confirmed starters are available. Scoring is a score progression, not full play-by-play.

Pagination

List endpoints return data and meta. The default page size is 25, with a maximum of 100. Pass meta.next_cursor as cursor to get the next page; stop when it is absent. A full final page may be followed by an empty page. meta.prev_cursor, when present, echoes the cursor used for the current request. Array filters use repeated bracketed query parameters, such as team_ids[]=1&team_ids[]=2.

Errors

Status Meaning
400 Invalid parameters; JSON {"errors":[{"param":"per_page","error":"Invalid value"}]}
401 Missing/invalid API key or insufficient subscription; Unauthorized
404 Record not found; JSON {"error":"Not found"}
429 Rate limit exceeded
500 Server error

Teams

Get teams

Requires FREE or higher. Availability varies by game.

GET /bsl/v1/teams

curl --get "https://api.balldontlie.io/bsl/v1/teams?per_page=1" \
  -H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/teams?per_page=1", {
  headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
    "https://api.balldontlie.io/bsl/v1/teams?per_page=1",
    headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()

Example response

{
  "data": [
    {
      "id": 1855,
      "name": "Besiktas",
      "abbreviation": "BES"
    }
  ],
  "meta": {
    "per_page": 1
  }
}

Parameters

Parameter Required Description
per_page No Results per page (default 25, maximum 100).
cursor No Use meta.next_cursor from the previous response.
season No Season start year.

Get a team

Requires FREE or higher. Availability varies by game.

GET /bsl/v1/teams/{id}

curl --get "https://api.balldontlie.io/bsl/v1/teams/1855" \
  -H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/teams/1855", {
  headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
    "https://api.balldontlie.io/bsl/v1/teams/1855",
    headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()

Example response

{
  "data": {
    "id": 1855,
    "name": "Besiktas",
    "abbreviation": "BES"
  }
}

Parameters

Parameter Required Description
id Yes Team ID.

Response fields

Field Type Description
id integer Team ID.
name string Team name.
abbreviation string or null Team abbreviation.

Players

Get players

Requires FREE or higher. Availability varies by game.

GET /bsl/v1/players

curl --get "https://api.balldontlie.io/bsl/v1/players?per_page=1" \
  -H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/players?per_page=1", {
  headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
    "https://api.balldontlie.io/bsl/v1/players?per_page=1",
    headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()

Example response

{
  "data": [
    {
      "id": 79171,
      "name": "Ugurlu B.",
      "country": "Turkey"
    }
  ],
  "meta": {
    "next_cursor": 79171,
    "per_page": 1
  }
}

Parameters

Parameter Required Description
per_page No Results per page (default 25, maximum 100).
cursor No Use meta.next_cursor from the previous response.
season No Filter by participation in this season.
search No Case-insensitive player name search.
team_ids[] No Filter by team participation in lineups or stats; combine with season for a season-specific roster.

Get a player

Requires FREE or higher. Availability varies by game.

GET /bsl/v1/players/{id}

curl --get "https://api.balldontlie.io/bsl/v1/players/79171" \
  -H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/players/79171", {
  headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
    "https://api.balldontlie.io/bsl/v1/players/79171",
    headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()

Example response

{
  "data": {
    "id": 79171,
    "name": "Ugurlu B.",
    "country": "Turkey"
  }
}

Parameters

Parameter Required Description
id Yes Player ID.

Response fields

Field Type Description
id integer Player ID.
name string Player name.
country string or null Country, when available.

Games

Get games

Requires ALL-STAR or GOAT. Availability varies by game.

GET /bsl/v1/games

curl --get "https://api.balldontlie.io/bsl/v1/games?per_page=1" \
  -H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/games?per_page=1", {
  headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
    "https://api.balldontlie.io/bsl/v1/games?per_page=1",
    headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()

Example response

{
  "data": [
    {
      "id": 2602,
      "season": 2026,
      "datetime": "2026-10-05T16:00:00.000Z",
      "status": "final",
      "home_team": {
        "id": 1855,
        "name": "Besiktas",
        "abbreviation": "BES"
      },
      "visitor_team": {
        "id": 1856,
        "name": "Trabzonspor",
        "abbreviation": "TRA"
      },
      "home_team_score": 90,
      "visitor_team_score": 81
    }
  ],
  "meta": {
    "next_cursor": 2602,
    "per_page": 1
  }
}

Parameters

Parameter Required Description
per_page No Results per page (default 25, maximum 100).
cursor No Use meta.next_cursor from the previous response.
team_ids[] No Filter by team IDs from the teams endpoint. Maximum 100 values.
seasons[] No Filter by season start years. Maximum 100 values.
dates[] No Filter by UTC game dates.
start_date No Inclusive UTC start date.
end_date No Inclusive UTC end date.
status No Filter by game status.

Get a game

Requires ALL-STAR or GOAT. Availability varies by game.

GET /bsl/v1/games/{id}

curl --get "https://api.balldontlie.io/bsl/v1/games/2602" \
  -H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/games/2602", {
  headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
    "https://api.balldontlie.io/bsl/v1/games/2602",
    headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()

Example response

{
  "data": {
    "id": 2602,
    "season": 2026,
    "datetime": "2026-10-05T16:00:00.000Z",
    "status": "final",
    "home_team": {
      "id": 1855,
      "name": "Besiktas",
      "abbreviation": "BES"
    },
    "visitor_team": {
      "id": 1856,
      "name": "Trabzonspor",
      "abbreviation": "TRA"
    },
    "home_team_score": 90,
    "visitor_team_score": 81
  }
}

Parameters

Parameter Required Description
id Yes Game ID.

Response fields

Field Type Description
id integer Game ID.
season integer Season start year; 2026 identifies the 2026–27 season.
datetime string Scheduled start time in UTC.
status string scheduled, live, final, postponed, cancelled
home_team Team
visitor_team Team
home_team_score integer or null Home score. Null before scoring is available.
visitor_team_score integer or null Visitor score. Null before scoring is available.

Player Stats

Get player stats

Requires GOAT. Availability varies by game.

GET /bsl/v1/stats

curl --get "https://api.balldontlie.io/bsl/v1/stats?per_page=1&game_ids%5B%5D=2602" \
  -H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/stats?per_page=1&game_ids%5B%5D=2602", {
  headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
    "https://api.balldontlie.io/bsl/v1/stats?per_page=1&game_ids%5B%5D=2602",
    headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()

Example response

{
  "data": [],
  "meta": {
    "per_page": 1
  }
}

Parameters

Parameter Required Description
per_page No Results per page (default 25, maximum 100).
cursor No Use meta.next_cursor from the previous response.
team_ids[] No Filter by team IDs from the teams endpoint. Maximum 100 values.
seasons[] No Filter by season start years. Maximum 100 values.
game_ids[] No Filter by game IDs from the games endpoint. Maximum 100 values.
player_ids[] No Filter by player IDs from the players endpoint. Maximum 100 values.

Response fields

Field Type Description
id integer Stat record ID.
game_id integer Game ID from the games endpoint.
team Team
player Player
pts number or null Points. Null when unavailable.
reb number or null Total rebounds. Null when unavailable.
oreb number or null Offensive rebounds. Null when unavailable.
dreb number or null Defensive rebounds. Null when unavailable.
ast number or null Assists. Null when unavailable.
stl number or null Steals. Null when unavailable.
blk number or null Blocked shots. Null when unavailable.
turnover number or null Turnovers. Null when unavailable.
pf number or null Personal fouls. Null when unavailable.
fgm number or null Field goals made. Null when unavailable.
fga number or null Field goals attempted. Null when unavailable.
fg2m number or null Two-point field goals made. Null when unavailable.
fg2a number or null Two-point field goals attempted. Null when unavailable.
fg3m number or null Three-point field goals made. Null when unavailable.
fg3a number or null Three-point field goals attempted. Null when unavailable.
ftm number or null Free throws made. Null when unavailable.
fta number or null Free throws attempted. Null when unavailable.
min string or null Playing time, as minutes or minutes:seconds according to available precision.
plus_minus number or null Plus/minus.

Team Stats

Get team stats

Requires GOAT. Availability varies by game.

GET /bsl/v1/team_stats

curl --get "https://api.balldontlie.io/bsl/v1/team_stats?per_page=1&game_ids%5B%5D=2602" \
  -H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/team_stats?per_page=1&game_ids%5B%5D=2602", {
  headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
    "https://api.balldontlie.io/bsl/v1/team_stats?per_page=1&game_ids%5B%5D=2602",
    headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()

Example response

{
  "data": [],
  "meta": {
    "per_page": 1
  }
}

Parameters

Parameter Required Description
per_page No Results per page (default 25, maximum 100).
cursor No Use meta.next_cursor from the previous response.
team_ids[] No Filter by team IDs from the teams endpoint. Maximum 100 values.
seasons[] No Filter by season start years. Maximum 100 values.
game_ids[] No Filter by game IDs from the games endpoint. Maximum 100 values.
period No 0 for the entire game; 1–4 for quarters; 5+ for overtime.

Response fields

Field Type Description
id integer Stat record ID.
game_id integer Game ID from the games endpoint.
team Team
period integer 0 = entire game; 1–4 = quarters; 5 and above = overtime periods.
pts number or null Points. Null when unavailable.
reb number or null Total rebounds. Null when unavailable.
oreb number or null Offensive rebounds. Null when unavailable.
dreb number or null Defensive rebounds. Null when unavailable.
ast number or null Assists. Null when unavailable.
stl number or null Steals. Null when unavailable.
blk number or null Blocked shots. Null when unavailable.
turnover number or null Turnovers. Null when unavailable.
pf number or null Personal fouls. Null when unavailable.
fgm number or null Field goals made. Null when unavailable.
fga number or null Field goals attempted. Null when unavailable.
fg2m number or null Two-point field goals made. Null when unavailable.
fg2a number or null Two-point field goals attempted. Null when unavailable.
fg3m number or null Three-point field goals made. Null when unavailable.
fg3a number or null Three-point field goals attempted. Null when unavailable.
ftm number or null Free throws made. Null when unavailable.
fta number or null Free throws attempted. Null when unavailable.

Lineups

Get lineups

Requires ALL-STAR or GOAT. Availability varies by game.

GET /bsl/v1/lineups

curl --get "https://api.balldontlie.io/bsl/v1/lineups?per_page=1&game_ids%5B%5D=2602" \
  -H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/lineups?per_page=1&game_ids%5B%5D=2602", {
  headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
    "https://api.balldontlie.io/bsl/v1/lineups?per_page=1&game_ids%5B%5D=2602",
    headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()

Example response

{
  "data": [],
  "meta": {
    "per_page": 1
  }
}

Parameters

Parameter Required Description
per_page No Results per page (default 25, maximum 100).
cursor No Use meta.next_cursor from the previous response.
team_ids[] No Filter by team IDs from the teams endpoint. Maximum 100 values.
seasons[] No Filter by season start years. Maximum 100 values.
game_ids[] Yes Filter by game IDs from the games endpoint. Maximum 100 values.
player_ids[] No Filter by player IDs from the players endpoint. Maximum 100 values.

Response fields

Field Type Description
id integer Lineup record ID.
game_id integer Game ID from the games endpoint.
team Team
player Player
jersey_number string or null Jersey number.
starter boolean Whether the player is a confirmed starter.

Scoring

Get scoring

Requires ALL-STAR or GOAT. Returns scoring progression, not a full play-by-play feed. Availability varies by game.

GET /bsl/v1/scoring

curl --get "https://api.balldontlie.io/bsl/v1/scoring?per_page=1&game_id=2602" \
  -H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/scoring?per_page=1&game_id=2602", {
  headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
    "https://api.balldontlie.io/bsl/v1/scoring?per_page=1&game_id=2602",
    headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()

Example response

{
  "data": [],
  "meta": {
    "per_page": 1
  }
}

Parameters

Parameter Required Description
per_page No Results per page (default 25, maximum 100).
cursor No Use meta.next_cursor from the previous response.
game_id Yes Game ID from the games endpoint.

Response fields

Field Type Description
id integer Scoring record ID.
game_id integer Game ID from the games endpoint.
sequence integer Scoring sequence, returned in ascending order.
period integer 1–4 = quarters; 5 and above = overtime periods.
home_team_score integer Cumulative home score.
visitor_team_score integer Cumulative visitor score.

Standings

Get standings

Requires FREE or higher. Availability varies by game.

GET /bsl/v1/standings

curl --get "https://api.balldontlie.io/bsl/v1/standings?per_page=1&season=2026" \
  -H "Authorization: YOUR_API_KEY"
const response = await fetch("https://api.balldontlie.io/bsl/v1/standings?per_page=1&season=2026", {
  headers: { Authorization: "YOUR_API_KEY" }
});
const data = await response.json();
import requests
response = requests.get(
    "https://api.balldontlie.io/bsl/v1/standings?per_page=1&season=2026",
    headers={"Authorization": "YOUR_API_KEY"}
)
response.raise_for_status()
data = response.json()

Example response

{
  "data": [
    {
      "id": 200,
      "season": 2026,
      "group": null,
      "rank": 2,
      "team": {
        "id": 1862,
        "name": "Bahcesehir Kol.",
        "abbreviation": "BAH"
      },
      "games_played": 3,
      "wins": 3,
      "losses": 0,
      "points_for": 274,
      "points_against": 241
    }
  ],
  "meta": {
    "next_cursor": 200,
    "per_page": 1
  }
}

Parameters

Parameter Required Description
per_page No Results per page (default 25, maximum 100).
cursor No Use meta.next_cursor from the previous response.
season Yes Season start year.

Response fields

Field Type Description
id integer Standing record ID.
season integer Season start year.
group string or null Standings group; null for an ungrouped league.
rank integer Rank within the group.
team Team
games_played integer Games played.
wins integer Wins.
losses integer Losses.
points_for integer Points scored.
points_against integer Points conceded.