API Documentation

Complete reference for the BSD Public API. Free, no rate limits, no credit card.

Prefer interactive docs? Swagger UI ReDoc OpenAPI Schema
Overview

The BSD API provides read-only access to football data and machine learning predictions. All responses are JSON.

Base URLhttps://sports.bzzoiro.com/api/
FormatJSON
AuthToken-based (see below)
MethodsGET only (read-only API)
PriceFree
Authentication

Every API request requires a token. Get yours by registering a free account.

Include the token in the Authorization header:

Authorization: Token YOUR_API_KEY

Example:

curl -H "Authorization: Token abc123def456" https://sports.bzzoiro.com/api/leagues/
Unauthenticated requests return 401 Unauthorized. You can view and regenerate your token at /dashboard/.
Error Responses
CodeMeaningExample
401UnauthorizedMissing or invalid token
404Not FoundInvalid endpoint or object ID
500Server ErrorUnexpected server issue
Timezone Support

By default, all dates are returned in the server timezone (Asia/Dubai, UTC+4). You can pass a tz query parameter to shift dates to your local timezone.

ParamTypeDescription
tzstringIANA timezone name (e.g. Europe/Warsaw, America/New_York, UTC)

When provided, the tz parameter:

  • Converts event_date and other datetime fields to the specified timezone
  • Adjusts date_from / date_to filters to use your local date boundaries

Example: A match at 21:00 CET (UTC+1) is stored as 00:00+04:00 (next day in Dubai). Without tz, filtering by the original date would miss it.

# Without tz: dates in Asia/Dubai (UTC+4)
curl -H "Authorization: Token YOUR_API_KEY" \
     "https://sports.bzzoiro.com/api/events/?date_from=2026-03-07"

# With tz: dates in Europe/Warsaw (UTC+1)
curl -H "Authorization: Token YOUR_API_KEY" \
     "https://sports.bzzoiro.com/api/events/?date_from=2026-03-07&tz=Europe/Warsaw"

Supported on: /api/events/, /api/live/, /api/predictions/, /api/player-stats/. Invalid timezone values are silently ignored (server default is used).

Endpoints

GET/api/leagues/

Returns all active leagues/tournaments. Cached for 5 minutes.

Parameters

None. Returns all active leagues.

Response fields
FieldTypeDescription
idintegerInternal league ID
api_idintegerExternal league ID
namestringLeague name (e.g. "Premier League")
countrystringCountry (e.g. "England")
season_idintegerCurrent season ID
Example
curl -H "Authorization: Token YOUR_API_KEY" \
     https://sports.bzzoiro.com/api/leagues/
{
  "count": 32,
  "next": null,
  "previous": null,
  "results": [
    {
      "id": 1,
      "api_id": 17,
      "name": "Premier League",
      "country": "England",
      "season_id": 61627
    },
    ...
  ]
}
Detail: GET /api/leagues/{id}/ returns a single league by its id.
GET/api/teams/

Returns all teams. Cached for 5 minutes.

Query parameters
ParamTypeRequiredDescription
countrystringNoFilter by country (case-insensitive). E.g. ?country=Spain
leagueintegerNoFilter by league id. Returns all teams that play in that league. E.g. ?league=1
Response fields
FieldTypeDescription
idintegerInternal team ID
api_idintegerExternal team ID
namestringFull team name
short_namestringShort name (e.g. "FCB")
countrystringCountry of origin
Example
curl -H "Authorization: Token YOUR_API_KEY" \
     "https://sports.bzzoiro.com/api/teams/?country=Spain"
Detail: GET /api/teams/{id}/ returns a single team.
GET/api/events/

Returns matches. Cached for 2 minutes.

Important: If no date_from or date_to is provided, only matches in the next 7 days are returned. For leagues with future schedules (e.g. World Cup 2026), you must specify date filters to see their events.
Example: /api/events/?league=27&date_from=2026-06-01&date_to=2026-07-31
Query parameters
ParamTypeRequiredDescription
date_fromdateNoStart date (YYYY-MM-DD). If omitted (and no date_to), defaults to today
date_todateNoEnd date (YYYY-MM-DD). If omitted (and no date_from), defaults to today + 7 days
leagueintegerNoFilter by league id (get IDs from /api/leagues/)
teamstringNoFilter by team name (case-insensitive, partial match). E.g. ?team=Madrid
statusstringNoFilter by status (see values below)
tzstringNoTimezone for dates (e.g. Europe/Warsaw). See Timezone Support
Status values
notstarted inprogress 1st_half halftime 2nd_half finished postponed cancelled
Response fields
FieldTypeDescription
idintegerInternal event ID
api_idintegerExternal event ID
leagueobjectNested league (id, api_id, name, country, season_id)
home_teamstringHome team name
away_teamstringAway team name
home_team_objobject | nullNested team object
away_team_objobject | nullNested team object
event_datedatetimeKick-off time (ISO 8601)
round_numberinteger | nullMatchday / round number
statusstringMatch status
home_scoreinteger | nullHome goals (full-time)
away_scoreinteger | nullAway goals (full-time)
home_score_htinteger | nullHome goals at half-time (derived from incidents, null if 1st half or not started)
away_score_htinteger | nullAway goals at half-time (derived from incidents, null if 1st half or not started)
current_minuteinteger | nullCurrent minute (live only)
periodstringPeriod: 1T, HT, 2T, FT
Example
curl -H "Authorization: Token YOUR_API_KEY" \
     "https://sports.bzzoiro.com/api/events/?date_from=2026-02-08&date_to=2026-02-10&league=1"
Detail: GET /api/events/{id}/ returns a single event.
NEW Match Spatial Data StatsBomb-grade data, free
Available now on event detail endpoints. The GET /api/events/{id}/ and GET /api/live/ responses now include per-shot expected goals with pitch coordinates, full goal build-up passing sequences, minute-by-minute momentum graphs, and real average player positions. This is the same caliber of spatial data that premium providers charge thousands of dollars per season for.
⚽ Shotmap per-shot xG with coordinates

The shotmap field on GET /api/events/{id}/ returns every shot in the match. Each entry contains the shooter's pitch position (pos.x, pos.y), the goal-mouth target (gm.y, gm.z), pre-shot xG, post-shot xGoT, body part, and situation (open play, set piece, corner, etc.).

Coordinates use the standard 105×68 pitch grid. pos is where the shot was taken; gm maps to the goal frame (y = horizontal, z = height).

"shotmap": [
  {
    "min": 26, "type": "goal", "sit": "corner", "body": "head",
    "home": true, "xg": 0.383, "xgot": 0.949,
    "pos": {"x": 3.9, "y": 45.8}, "gm": {"y": 54.4, "z": 13.9},
    "gml": "low-left", "pid": 548194
  },
  {
    "min": 53, "type": "save", "sit": "open-play", "body": "right-foot",
    "home": false, "xg": 0.071, "xgot": 0.023,
    "pos": {"x": 18.2, "y": 31.4}, "gm": {"y": 45.1, "z": 8.2},
    "gml": "centre", "pid": 219847
  }
  // ... all shots in the match
]
⚡ Goal Build-up Sequences full passing chains with coordinates

Goals in the incidents array now contain a sequence field: the complete passing chain that led to the goal. Every touch includes the player name, event type, origin and destination coordinates, plus metadata like assist flags, body part for the final shot, and goalkeeper position at the moment of the strike.

"incidents": [
  {
    "type": "goal", "player": "D. Fry", "minute": 26,
    "is_home": true, "assist": "A. Browne",
    "home_score": 1, "away_score": 0,
    "sequence": [
      {"player": "A. Morris", "event": "pass",
       "pos": {"x": 83.4, "y": 11.5},
       "end": {"x": 82.3, "y": 20.7}},
      {"player": "A. Browne", "event": "cross",
       "pos": {"x": 82.8, "y": 22.5},
       "end": {"x": 96.1, "y": 54.2}, "assist": true},
      {"player": "D. Fry", "event": "goal",
       "pos": {"x": 96.1, "y": 54.2}, "body": "head",
       "gm": {"y": 54.4, "z": 13.9},
       "gk": {"x": 99.5, "y": 51.4}}
    ]
  }
  // ... other incidents (cards, subs, etc.)
]
Visualized: Corner → Cross → Header Goal
A. Morris A. Browne D. Fry ● pass → ● assist → ● GOAL (xG 0.38, header, from corner)
📈 Momentum Graph minute-by-minute pressure

The momentum field provides a minute-by-minute pressure index. Positive values indicate home-team dominance, negative values indicate away-team dominance. Use it to build momentum charts, detect surges, or feed into in-play models.

"momentum": [
  {"minute": 1, "value": 12},
  {"minute": 2, "value": -5},
  {"minute": 3, "value": 28},
  {"minute": 4, "value": -15},
  // ... one entry per minute played
  {"minute": 90, "value": 8}
]
👥 Average Positions real formation with x,y per player

The average_positions field returns each player's average pitch position during the match, grouped by team. Use it to reconstruct actual formations, identify asymmetric fullbacks, inverted wingers, or compare tactical setups.

"average_positions": {
  "home": [
    {"player": "D. Fry", "pid": 548194, "pos": {"x": 88.3, "y": 34.1}, "number": 9},
    {"player": "A. Browne", "pid": 331022, "pos": {"x": 72.1, "y": 12.8}, "number": 7},
    // ... 11 players
  ],
  "away": [
    {"player": "L. Martinez", "pid": 220495, "pos": {"x": 25.4, "y": 33.8}, "number": 6},
    // ... 11 players
  ]
}
Availability: Spatial data fields (shotmap, sequence, momentum, average_positions) are populated for finished and in-progress matches. Fields return null for matches that have not started. Data coverage spans all supported leagues.
GET/api/live/

Returns only matches currently in play with real-time scores, minute, incidents (goals, cards, substitutions) and live statistics. Cached for 30 seconds.

Query parameters
ParamTypeRequiredDescription
tzstringNoTimezone for dates (e.g. Europe/Warsaw). See Timezone Support
Response fields

Same fields as Events, plus:

FieldTypeDescription
incidentsarray | nullList of match incidents. Each item has type ("goal", "card", "substitution"), minute, player_name, is_home
live_statsobject | nullLive statistics with home and away sub-objects containing: ball_possession, total_shots, shots_on_target, corner_kicks, fouls, yellow_cards, red_cards, offsides, etc.
Example
curl -H "Authorization: Token YOUR_API_KEY" \
     https://sports.bzzoiro.com/api/live/
{
  "count": 3,
  "results": [
    {
      "id": 580,
      "home_team": "Liverpool",
      "away_team": "Arsenal",
      "home_score": 2,
      "away_score": 1,
      "current_minute": 67,
      "period": "2T",
      "status": "2nd_half",
      "incidents": [
        {"type": "goal", "minute": 12, "player_name": "Salah", "is_home": true},
        {"type": "goal", "minute": 34, "player_name": "Saka", "is_home": false},
        {"type": "goal", "minute": 55, "player_name": "Diaz", "is_home": true}
      ],
      "live_stats": {
        "home": {"ball_possession": 52, "total_shots": 14, "shots_on_target": 6, "corner_kicks": 5},
        "away": {"ball_possession": 48, "total_shots": 10, "shots_on_target": 4, "corner_kicks": 3}
      },
      "league": {"name": "Premier League", "country": "England"},
      ...
    }
  ]
}
Note: This endpoint returns an empty list when no matches are being played. The incidents and live_stats fields may be null for matches that just started.
GET/api/predictions/

Returns CatBoost ML predictions for football matches. Defaults to upcoming matches. Cached for 2 minutes.

Query parameters
ParamTypeRequiredDescription
upcomingbooleanNoDefault true. Set false to include past predictions. Ignored when date_from or date_to is set.
date_fromdateNoStart date (YYYY-MM-DD). Overrides upcoming filter.
date_todateNoEnd date (YYYY-MM-DD). Overrides upcoming filter.
leagueintegerNoFilter by league id (get IDs from /api/leagues/)
tzstringNoTimezone for dates (e.g. Europe/Warsaw). See Timezone Support
Response fields
FieldTypeDescription
idintegerPrediction ID
eventobjectFull nested event object (see Events)
created_atdatetimeWhen the prediction was generated
1X2 Probabilities
prob_home_winfloatProbability of home win (0-100)
prob_drawfloatProbability of draw (0-100)
prob_away_winfloatProbability of away win (0-100)
predicted_resultstringH (Home), D (Draw), or A (Away)
Expected Goals
expected_home_goalsfloatExpected goals for home team
expected_away_goalsfloatExpected goals for away team
Over/Under Markets
prob_over_15float | nullP(total goals > 1.5) (0-100)
prob_over_25floatP(total goals > 2.5) (0-100)
prob_over_35float | nullP(total goals > 3.5) (0-100)
prob_btts_yesfloatP(both teams score) (0-100)
Recommendations
confidencefloatModel confidence (0-1)
model_versionstringML model version
most_likely_scorestringMost probable scoreline (e.g. "2-1")
favoritestring | nullH or A — which team is favored
favorite_probfloat | nullFavorite's win probability
favorite_recommendbooleanModel recommends betting on the favorite
over_15_recommendbooleanModel recommends Over 1.5
over_25_recommendbooleanModel recommends Over 2.5
over_35_recommendbooleanModel recommends Over 3.5
btts_recommendbooleanModel recommends BTTS
winner_recommendbooleanModel recommends "has a winner" (no draw)
Example
curl -H "Authorization: Token YOUR_API_KEY" \
     https://sports.bzzoiro.com/api/predictions/
{
  "count": 48,
  "results": [
    {
      "id": 87,
      "event": {
        "id": 580,
        "home_team": "Liverpool",
        "away_team": "Arsenal",
        "event_date": "2026-02-10T17:30:00+0400",
        "league": {"name": "Premier League", "country": "England"},
        ...
      },
      "prob_home_win": 52.3,
      "prob_draw": 24.1,
      "prob_away_win": 23.6,
      "predicted_result": "H",
      "expected_home_goals": 1.82,
      "expected_away_goals": 1.14,
      "prob_over_15": 87.4,
      "prob_over_25": 61.2,
      "prob_over_35": 28.7,
      "prob_btts_yes": 58.9,
      "confidence": 0.72,
      "model_version": "CatBoost v4.0",
      "most_likely_score": "2-1",
      "favorite": "H",
      "favorite_prob": 52.3,
      "favorite_recommend": true,
      "over_25_recommend": true,
      "btts_recommend": true,
      ...
    }
  ]
}
Detail: GET /api/predictions/{id}/ returns a single prediction.
Past results: Use ?upcoming=false to get predictions for finished matches.
GET/api/players/

Returns football players. 21,000+ players across all covered leagues. Each player has a club team (current_team) and optionally a national team (national_team). Cached for 5 minutes.

Query parameters
ParamTypeRequiredDescription
teamintegerNoFilter by club team id. E.g. ?team=44 (Barcelona)
national_teamintegerNoFilter by national team id. E.g. ?national_team=475 (Spain)
nationalitystringNoFilter by nationality (case-insensitive). E.g. ?nationality=Brazil
positionstringNoFilter by position: G (Goalkeeper), D (Defender), M (Midfielder), F (Forward)
Response fields
FieldTypeDescription
idintegerInternal player ID
api_idintegerExternal player ID (use for /img/player/{api_id}/)
namestringFull name
short_namestringShort name (e.g. "M. Salah")
positionstringG, D, M, or F
jersey_numberinteger | nullShirt number
heightinteger | nullHeight in cm
date_of_birthdate | nullDate of birth (YYYY-MM-DD)
nationalitystringCountry of nationality
market_valueinteger | nullMarket value in EUR
current_teamobject | nullClub team — nested team object (id, api_id, name, short_name, country)
national_teamobject | nullNational team — same structure as current_team. Only set for players who have played international matches
Examples
# Get all Brazilian forwards
curl -H "Authorization: Token YOUR_API_KEY" \
     "https://sports.bzzoiro.com/api/players/?position=F&nationality=Brazil"

# Get Spain national team squad
curl -H "Authorization: Token YOUR_API_KEY" \
     "https://sports.bzzoiro.com/api/players/?national_team=475"

# Get Barcelona squad
curl -H "Authorization: Token YOUR_API_KEY" \
     "https://sports.bzzoiro.com/api/players/?team=44"
{
  "count": 27,
  "results": [
    {
      "id": 1234,
      "api_id": 1402912,
      "name": "Lamine Yamal",
      "short_name": "L. Yamal",
      "position": "M",
      "jersey_number": 19,
      "height": 180,
      "date_of_birth": "2007-07-13",
      "nationality": "Spain",
      "market_value": 150000000,
      "current_team": {
        "id": 44,
        "api_id": 2817,
        "name": "Barcelona",
        "short_name": "Barcelona",
        "country": "Spain"
      },
      "national_team": {
        "id": 475,
        "api_id": 4698,
        "name": "Spain",
        "short_name": "Spain",
        "country": "Spain"
      }
    },
    ...
  ]
}
Detail: GET /api/players/{id}/ returns a single player with both club and national team.
Photo: Use /img/player/{api_id}/ to get the player photo (no auth required).
Tip: Use ?team= for club squads (e.g. Barcelona) and ?national_team= for international squads (e.g. Spain World Cup roster).
GET/api/player-stats/

Returns per-match player statistics. 139,000+ stat records across all covered leagues. Cached for 5 minutes.

Query parameters
ParamTypeRequiredDescription
playerintegerNoFilter by player id
eventintegerNoFilter by event id (all player stats for a match)
teamintegerNoFilter by team id
tzstringNoTimezone for dates (e.g. Europe/Warsaw). See Timezone Support
Response fields
FieldTypeDescription
eventobjectMatch info: id, api_id, home_team, away_team, event_date, home_score, away_score
General
minutes_playedintegerMinutes on the pitch
ratingfloat | nullMatch rating (1-10 scale)
touchesintegerTotal ball touches
Attack
goalsintegerGoals scored
goal_assistintegerAssists
expected_goalsfloat | nullxG
expected_assistsfloat | nullxA
total_shotsintegerTotal shots
shots_on_targetintegerShots on target
Passing
total_passintegerTotal passes attempted
accurate_passintegerAccurate passes
key_passintegerKey passes (leading to a shot)
total_crossintegerCrosses attempted
accurate_crossintegerAccurate crosses
total_long_ballsintegerLong balls attempted
accurate_long_ballsintegerAccurate long balls
Duels
duel_wonintegerDuels won
duel_lostintegerDuels lost
aerial_wonintegerAerial duels won
aerial_lostintegerAerial duels lost
Defense
total_tackleintegerTackles attempted
won_tackleintegerTackles won
total_clearanceintegerClearances
interceptionintegerInterceptions
ball_recoveryintegerBall recoveries
Discipline & Other
dispossessedintegerTimes dispossessed
possession_lostintegerPossession lost
was_fouledintegerFouls suffered
foulsintegerFouls committed
yellow_cardintegerYellow cards
red_cardintegerRed cards
Goalkeeper
savesintegerSaves made
goals_concededintegerGoals conceded
Example
# Get all stats for a player
curl -H "Authorization: Token YOUR_API_KEY" \
     "https://sports.bzzoiro.com/api/player-stats/?player=1234"

# Get all player stats for a specific match
curl -H "Authorization: Token YOUR_API_KEY" \
     "https://sports.bzzoiro.com/api/player-stats/?event=917"
{
  "count": 31,
  "results": [
    {
      "event": {
        "id": 3746,
        "api_id": 14059824,
        "home_team": "Swansea City",
        "away_team": "Sheffield Wednesday",
        "event_date": "2026-02-08T12:00:00Z",
        "home_score": 4,
        "away_score": 0
      },
      "minutes_played": 90,
      "rating": 7.8,
      "goals": 1,
      "goal_assist": 1,
      "expected_goals": 0.85,
      "expected_assists": 0.32,
      "total_shots": 3,
      "shots_on_target": 2,
      "total_pass": 41,
      "accurate_pass": 32,
      "key_pass": 2,
      "touches": 56,
      "duel_won": 4,
      "duel_lost": 2,
      "total_tackle": 1,
      "won_tackle": 1,
      "yellow_card": 0,
      "red_card": 0,
      "saves": 0,
      "goals_conceded": 0,
      ...
    }
  ]
}
Detail: GET /api/player-stats/{id}/ returns a single stat record.
Tip: Combine ?player= with the player id from /api/players/ to get a player's full match history.
GET/img/{type}/{api_id}/

Returns PNG images for teams, leagues, and players. No authentication required — images are public. Cached on disk for 365 days.

URL parameters
ParamTypeDescription
typestringImage type: team, league, or player
api_idintegerThe api_id of the team, league, or player
Response

Returns a image/png binary response. Returns 404 if the image is not found.

Response header: Cache-Control: public, max-age=31536000 (365 days).

Examples (curl)
# No authentication needed
curl -o real_madrid.png "https://sports.bzzoiro.com/img/team/2829/"
curl -o premier_league.png "https://sports.bzzoiro.com/img/league/17/"
curl -o player.png "https://sports.bzzoiro.com/img/player/990724/"
Usage in HTML
<!-- Team logo -->
<img src="https://sports.bzzoiro.com/img/team/2829/" width="32" height="32" alt="Real Madrid">

<!-- League logo -->
<img src="https://sports.bzzoiro.com/img/league/17/" width="24" height="24" alt="Premier League">

<!-- Player photo -->
<img src="https://sports.bzzoiro.com/img/player/990724/" width="48" height="48" alt="Player">
Usage with API data
# Python: fetch events and display with logos
import requests

TOKEN = "YOUR_API_KEY"
BASE = "https://sports.bzzoiro.com"
headers = {"Authorization": f"Token {TOKEN}"}

events = requests.get(f"{BASE}/api/events/", headers=headers).json()

for event in events["results"]:
    league = event["league"]
    home = event.get("home_team_obj")
    away = event.get("away_team_obj")

    # Image URLs are public — no token needed
    league_logo = f"{BASE}/img/league/{league['api_id']}/"
    home_logo = f"{BASE}/img/team/{home['api_id']}/" if home else None
    away_logo = f"{BASE}/img/team/{away['api_id']}/" if away else None

    print(f"League: {league['name']} (logo: {league_logo})")
    print(f"  {event['home_team']} vs {event['away_team']}")
    if home_logo:
        print(f"  Home logo: {home_logo}")
    if away_logo:
        print(f"  Away logo: {away_logo}")
No auth required. Image endpoints are public — use them directly in <img> tags without exposing your API token. Use the api_id field from league, team, or player objects returned by the API. Images are cached server-side for 365 days.

🎾 Tennis BETA

Beta: Tennis endpoints are functional but may change. Data covers ATP & WTA circuits with 4,700+ players, 23,000+ matches, and ML predictions.
GET/api/tennis/tournaments/

Returns tennis tournaments. Cached 5 min.

Query parameters
ParamTypeRequiredDescription
circuitstringNoATP or WTA
categorystringNogrand_slam, masters_1000, atp_500, atp_250, wta_1000, etc.
Response fields
FieldTypeDescription
idintegerTournament ID
namestringTournament name
categorystringgrand_slam, masters_1000, atp_500, etc.
surfacestringhard, clay, grass, carpet
circuitstringATP or WTA
countrystringHost country
citystringHost city
GET/api/tennis/players/

Returns tennis player profiles. 4,700+ players. Cached 5 min.

Query parameters
ParamTypeRequiredDescription
genderstringNoM or F
countrystringNoCountry code (e.g. ES, US)
searchstringNoSearch by name
GET/api/tennis/matches/

Returns tennis matches with scores and stats. Defaults to next 7 days. Cached 2 min.

Query parameters
ParamTypeRequiredDescription
date_fromdateNoStart date (YYYY-MM-DD)
date_todateNoEnd date (YYYY-MM-DD)
tournamentintegerNoFilter by tournament id
playerintegerNoFilter by player id
statusstringNoscheduled, live, finished
Key response fields
FieldTypeDescription
player1_obj / player2_objobjectNested player with ranking
tournamentobjectTournament info
player1_sets / player2_setsintegerSets won
sets_detailarrayPer-set scores [{p1, p2, tiebreak}]
odds_player1 / odds_player2floatMatch odds
p1_aces, p1_double_faults, ...integer/floatServe/return stats per player
GET/api/tennis/live/

Returns only live tennis matches with real-time scores, current set/game/point, and serving player. Cached 30 sec.

GET/api/tennis/predictions/

Returns ML predictions for tennis matches. Defaults to upcoming. Cached 2 min.

Query parameters
ParamTypeRequiredDescription
upcomingbooleanNoDefault true. Set false for past.
date_fromdateNoStart date (YYYY-MM-DD)
date_todateNoEnd date (YYYY-MM-DD)
Key response fields
FieldTypeDescription
prob_player1_wins / prob_player2_winsfloatWin probability (0-100)
predicted_winnerinteger1 or 2
confidencefloatModel confidence
expected_total_setsfloatExpected number of sets
expected_total_gamesfloatExpected total games
prob_over_22_5_gamesfloatP(total games > 22.5)
GET/api/tennis/rankings/

Returns ATP/WTA rankings. Latest snapshot by default. Cached 5 min.

Query parameters
ParamTypeRequiredDescription
typestringNoATP (default) or WTA
datedateNoRanking date. Default: latest.
topintegerNoLimit to top N (e.g. ?top=100)
Example
curl -H "Authorization: Token YOUR_API_KEY" \
     "https://sports.bzzoiro.com/api/tennis/rankings/?type=ATP&top=10"

🎮 CS2 BETA

Beta: CS2 endpoints are functional but may change. Data covers Counter-Strike tournaments with 400+ teams, 2,800+ matches, and ML predictions.
GET/api/csgo/tournaments/

Returns CS2 tournaments. Cached 5 min.

GET/api/csgo/teams/

Returns CS2 teams. 400+ teams. Cached 5 min.

Query parameters
ParamTypeRequiredDescription
searchstringNoSearch by name
countrystringNoFilter by country code
GET/api/csgo/players/

Returns CS2 player profiles. Cached 5 min.

Query parameters
ParamTypeRequiredDescription
teamintegerNoFilter by team id
searchstringNoSearch by nickname
GET/api/csgo/matches/

Returns CS2 matches with map results. Defaults to next 7 days. Cached 2 min.

Query parameters
ParamTypeRequiredDescription
date_fromdateNoStart date (YYYY-MM-DD)
date_todateNoEnd date (YYYY-MM-DD)
tournamentintegerNoFilter by tournament id
teamintegerNoFilter by team id
statusstringNonotstarted, inprogress, finished
Key response fields
FieldTypeDescription
home_team / away_teamobjectNested team objects
home_score / away_scoreintegerMaps won
best_ofintegerBo1, Bo3, Bo5
mapsarrayPer-map results [{map_name, home_score, away_score, halves}]
GET/api/csgo/predictions/

Returns ML predictions for CS2 matches. Defaults to upcoming. Cached 2 min.

Query parameters
ParamTypeRequiredDescription
upcomingbooleanNoDefault true. Set false for past.
date_fromdateNoStart date (YYYY-MM-DD)
date_todateNoEnd date (YYYY-MM-DD)
Key response fields
FieldTypeDescription
home_win_prob / away_win_probfloatWin probability (0-1)
predicted_winnerstringhome or away
confidencefloatModel confidence

Guides

Quick Start
  1. Register: Create a free account at /register/
  2. Get your token: After registering you'll be redirected to your dashboard where you can copy your API token.
  3. Make a request:
    curl -H "Authorization: Token YOUR_API_KEY" https://sports.bzzoiro.com/api/leagues/
  4. Explore: Use the endpoints above to fetch teams, events, live scores, and ML predictions.
Python Example
import requests

API_TOKEN = "YOUR_API_KEY"
BASE_URL = "https://sports.bzzoiro.com/api"
headers = {"Authorization": f"Token {API_TOKEN}"}

# Get upcoming predictions
resp = requests.get(f"{BASE_URL}/predictions/", headers=headers)
data = resp.json()

for pred in data["results"]:
    event = pred["event"]
    print(f"{event['home_team']} vs {event['away_team']}")
    print(f"  Predicted: {pred['predicted_result']} "
          f"(H:{pred['prob_home_win']:.1f}% "
          f"D:{pred['prob_draw']:.1f}% "
          f"A:{pred['prob_away_win']:.1f}%)")
    print(f"  Over 2.5: {pred['prob_over_25']:.1f}%  "
          f"BTTS: {pred['prob_btts_yes']:.1f}%")
    print()

# Get live scores
live = requests.get(f"{BASE_URL}/live/", headers=headers).json()
for match in live["results"]:
    print(f"LIVE {match['current_minute']}' "
          f"{match['home_team']} {match['home_score']}-"
          f"{match['away_score']} {match['away_team']}")
JavaScript Example
const API_TOKEN = "YOUR_API_KEY";
const BASE_URL = "https://sports.bzzoiro.com/api";
const headers = { "Authorization": `Token ${API_TOKEN}` };

// Get upcoming events
const resp = await fetch(`${BASE_URL}/events/`, { headers });
const data = await resp.json();

data.results.forEach(event => {
    console.log(`${event.home_team} vs ${event.away_team}`);
    console.log(`  ${event.event_date} | ${event.league?.name}`);
});

// Poll live scores every 30s
setInterval(async () => {
    const live = await fetch(`${BASE_URL}/live/`, { headers });
    const { results } = await live.json();
    results.forEach(m => {
        console.log(`${m.current_minute}' ${m.home_team} ${m.home_score}-${m.away_score} ${m.away_team}`);
    });
}, 30000);

100% free · Unlimited requests · No credit card required

Get Your Free API Key