API Documentation
Complete reference for the BSD Public API. Free, no rate limits, no credit card.
The BSD API provides read-only access to football data and machine learning predictions. All responses are JSON.
| Base URL | https://sports.bzzoiro.com/api/ |
| Format | JSON |
| Auth | Token-based (see below) |
| Methods | GET only (read-only API) |
| Price | Free |
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/
401 Unauthorized.
You can view and regenerate your token at /dashboard/.
All list endpoints return paginated results with 50 items per page.
{
"count": 243,
"next": "https://sports.bzzoiro.com/api/events/?page=2",
"previous": null,
"results": [ ... ]
}
| Field | Type | Description |
|---|---|---|
count | integer | Total number of results |
next | string | null | URL to the next page |
previous | string | null | URL to the previous page |
results | array | Array of objects for the current page |
Use ?page=N to navigate pages.
| Code | Meaning | Example |
|---|---|---|
401 | Unauthorized | Missing or invalid token |
404 | Not Found | Invalid endpoint or object ID |
500 | Server Error | Unexpected server issue |
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.
| Param | Type | Description |
|---|---|---|
tz | string | IANA timezone name (e.g. Europe/Warsaw, America/New_York, UTC) |
When provided, the tz parameter:
- Converts
event_dateand other datetime fields to the specified timezone - Adjusts
date_from/date_tofilters 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
Returns all active leagues/tournaments. Cached for 5 minutes.
Parameters
None. Returns all active leagues.
Response fields
| Field | Type | Description |
|---|---|---|
id | integer | Internal league ID |
api_id | integer | External league ID |
name | string | League name (e.g. "Premier League") |
country | string | Country (e.g. "England") |
season_id | integer | Current 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
},
...
]
}
GET /api/leagues/{id}/ returns a single league by its id.
Returns all teams. Cached for 5 minutes.
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
country | string | No | Filter by country (case-insensitive). E.g. ?country=Spain |
league | integer | No | Filter by league id. Returns all teams that play in that league. E.g. ?league=1 |
Response fields
| Field | Type | Description |
|---|---|---|
id | integer | Internal team ID |
api_id | integer | External team ID |
name | string | Full team name |
short_name | string | Short name (e.g. "FCB") |
country | string | Country of origin |
Example
curl -H "Authorization: Token YOUR_API_KEY" \
"https://sports.bzzoiro.com/api/teams/?country=Spain"
GET /api/teams/{id}/ returns a single team.
Returns matches. Cached for 2 minutes.
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
| Param | Type | Required | Description |
|---|---|---|---|
date_from | date | No | Start date (YYYY-MM-DD). If omitted (and no date_to), defaults to today |
date_to | date | No | End date (YYYY-MM-DD). If omitted (and no date_from), defaults to today + 7 days |
league | integer | No | Filter by league id (get IDs from /api/leagues/) |
team | string | No | Filter by team name (case-insensitive, partial match). E.g. ?team=Madrid |
status | string | No | Filter by status (see values below) |
tz | string | No | Timezone for dates (e.g. Europe/Warsaw). See Timezone Support |
Status values
Response fields
| Field | Type | Description |
|---|---|---|
id | integer | Internal event ID |
api_id | integer | External event ID |
league | object | Nested league (id, api_id, name, country, season_id) |
home_team | string | Home team name |
away_team | string | Away team name |
home_team_obj | object | null | Nested team object |
away_team_obj | object | null | Nested team object |
event_date | datetime | Kick-off time (ISO 8601) |
round_number | integer | null | Matchday / round number |
status | string | Match status |
home_score | integer | null | Home goals (full-time) |
away_score | integer | null | Away goals (full-time) |
home_score_ht | integer | null | Home goals at half-time (derived from incidents, null if 1st half or not started) |
away_score_ht | integer | null | Away goals at half-time (derived from incidents, null if 1st half or not started) |
current_minute | integer | null | Current minute (live only) |
period | string | Period: 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"
GET /api/events/{id}/ returns a single event.
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
📈 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
]
}
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.
Returns only matches currently in play with real-time scores, minute, incidents (goals, cards, substitutions) and live statistics. Cached for 30 seconds.
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
tz | string | No | Timezone for dates (e.g. Europe/Warsaw). See Timezone Support |
Response fields
Same fields as Events, plus:
| Field | Type | Description |
|---|---|---|
incidents | array | null | List of match incidents. Each item has type ("goal", "card", "substitution"), minute, player_name, is_home |
live_stats | object | null | Live 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"},
...
}
]
}
incidents and live_stats fields may be null for matches that just started.
Returns CatBoost ML predictions for football matches. Defaults to upcoming matches. Cached for 2 minutes.
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
upcoming | boolean | No | Default true. Set false to include past predictions. Ignored when date_from or date_to is set. |
date_from | date | No | Start date (YYYY-MM-DD). Overrides upcoming filter. |
date_to | date | No | End date (YYYY-MM-DD). Overrides upcoming filter. |
league | integer | No | Filter by league id (get IDs from /api/leagues/) |
tz | string | No | Timezone for dates (e.g. Europe/Warsaw). See Timezone Support |
Response fields
| Field | Type | Description |
|---|---|---|
id | integer | Prediction ID |
event | object | Full nested event object (see Events) |
created_at | datetime | When the prediction was generated |
| 1X2 Probabilities | ||
prob_home_win | float | Probability of home win (0-100) |
prob_draw | float | Probability of draw (0-100) |
prob_away_win | float | Probability of away win (0-100) |
predicted_result | string | H (Home), D (Draw), or A (Away) |
| Expected Goals | ||
expected_home_goals | float | Expected goals for home team |
expected_away_goals | float | Expected goals for away team |
| Over/Under Markets | ||
prob_over_15 | float | null | P(total goals > 1.5) (0-100) |
prob_over_25 | float | P(total goals > 2.5) (0-100) |
prob_over_35 | float | null | P(total goals > 3.5) (0-100) |
prob_btts_yes | float | P(both teams score) (0-100) |
| Recommendations | ||
confidence | float | Model confidence (0-1) |
model_version | string | ML model version |
most_likely_score | string | Most probable scoreline (e.g. "2-1") |
favorite | string | null | H or A — which team is favored |
favorite_prob | float | null | Favorite's win probability |
favorite_recommend | boolean | Model recommends betting on the favorite |
over_15_recommend | boolean | Model recommends Over 1.5 |
over_25_recommend | boolean | Model recommends Over 2.5 |
over_35_recommend | boolean | Model recommends Over 3.5 |
btts_recommend | boolean | Model recommends BTTS |
winner_recommend | boolean | Model 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,
...
}
]
}
GET /api/predictions/{id}/ returns a single prediction.
Past results: Use
?upcoming=false to get predictions for finished matches.
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
| Param | Type | Required | Description |
|---|---|---|---|
team | integer | No | Filter by club team id. E.g. ?team=44 (Barcelona) |
national_team | integer | No | Filter by national team id. E.g. ?national_team=475 (Spain) |
nationality | string | No | Filter by nationality (case-insensitive). E.g. ?nationality=Brazil |
position | string | No | Filter by position: G (Goalkeeper), D (Defender), M (Midfielder), F (Forward) |
Response fields
| Field | Type | Description |
|---|---|---|
id | integer | Internal player ID |
api_id | integer | External player ID (use for /img/player/{api_id}/) |
name | string | Full name |
short_name | string | Short name (e.g. "M. Salah") |
position | string | G, D, M, or F |
jersey_number | integer | null | Shirt number |
height | integer | null | Height in cm |
date_of_birth | date | null | Date of birth (YYYY-MM-DD) |
nationality | string | Country of nationality |
market_value | integer | null | Market value in EUR |
current_team | object | null | Club team — nested team object (id, api_id, name, short_name, country) |
national_team | object | null | National 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"
}
},
...
]
}
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).
Returns per-match player statistics. 139,000+ stat records across all covered leagues. Cached for 5 minutes.
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
player | integer | No | Filter by player id |
event | integer | No | Filter by event id (all player stats for a match) |
team | integer | No | Filter by team id |
tz | string | No | Timezone for dates (e.g. Europe/Warsaw). See Timezone Support |
Response fields
| Field | Type | Description |
|---|---|---|
event | object | Match info: id, api_id, home_team, away_team, event_date, home_score, away_score |
| General | ||
minutes_played | integer | Minutes on the pitch |
rating | float | null | Match rating (1-10 scale) |
touches | integer | Total ball touches |
| Attack | ||
goals | integer | Goals scored |
goal_assist | integer | Assists |
expected_goals | float | null | xG |
expected_assists | float | null | xA |
total_shots | integer | Total shots |
shots_on_target | integer | Shots on target |
| Passing | ||
total_pass | integer | Total passes attempted |
accurate_pass | integer | Accurate passes |
key_pass | integer | Key passes (leading to a shot) |
total_cross | integer | Crosses attempted |
accurate_cross | integer | Accurate crosses |
total_long_balls | integer | Long balls attempted |
accurate_long_balls | integer | Accurate long balls |
| Duels | ||
duel_won | integer | Duels won |
duel_lost | integer | Duels lost |
aerial_won | integer | Aerial duels won |
aerial_lost | integer | Aerial duels lost |
| Defense | ||
total_tackle | integer | Tackles attempted |
won_tackle | integer | Tackles won |
total_clearance | integer | Clearances |
interception | integer | Interceptions |
ball_recovery | integer | Ball recoveries |
| Discipline & Other | ||
dispossessed | integer | Times dispossessed |
possession_lost | integer | Possession lost |
was_fouled | integer | Fouls suffered |
fouls | integer | Fouls committed |
yellow_card | integer | Yellow cards |
red_card | integer | Red cards |
| Goalkeeper | ||
saves | integer | Saves made |
goals_conceded | integer | Goals 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,
...
}
]
}
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.
Returns PNG images for teams, leagues, and players. No authentication required — images are public. Cached on disk for 365 days.
URL parameters
| Param | Type | Description |
|---|---|---|
type | string | Image type: team, league, or player |
api_id | integer | The 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}")
<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
Returns tennis tournaments. Cached 5 min.
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
circuit | string | No | ATP or WTA |
category | string | No | grand_slam, masters_1000, atp_500, atp_250, wta_1000, etc. |
Response fields
| Field | Type | Description |
|---|---|---|
id | integer | Tournament ID |
name | string | Tournament name |
category | string | grand_slam, masters_1000, atp_500, etc. |
surface | string | hard, clay, grass, carpet |
circuit | string | ATP or WTA |
country | string | Host country |
city | string | Host city |
Returns tennis player profiles. 4,700+ players. Cached 5 min.
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
gender | string | No | M or F |
country | string | No | Country code (e.g. ES, US) |
search | string | No | Search by name |
Returns tennis matches with scores and stats. Defaults to next 7 days. Cached 2 min.
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
date_from | date | No | Start date (YYYY-MM-DD) |
date_to | date | No | End date (YYYY-MM-DD) |
tournament | integer | No | Filter by tournament id |
player | integer | No | Filter by player id |
status | string | No | scheduled, live, finished |
Key response fields
| Field | Type | Description |
|---|---|---|
player1_obj / player2_obj | object | Nested player with ranking |
tournament | object | Tournament info |
player1_sets / player2_sets | integer | Sets won |
sets_detail | array | Per-set scores [{p1, p2, tiebreak}] |
odds_player1 / odds_player2 | float | Match odds |
p1_aces, p1_double_faults, ... | integer/float | Serve/return stats per player |
Returns only live tennis matches with real-time scores, current set/game/point, and serving player. Cached 30 sec.
Returns ML predictions for tennis matches. Defaults to upcoming. Cached 2 min.
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
upcoming | boolean | No | Default true. Set false for past. |
date_from | date | No | Start date (YYYY-MM-DD) |
date_to | date | No | End date (YYYY-MM-DD) |
Key response fields
| Field | Type | Description |
|---|---|---|
prob_player1_wins / prob_player2_wins | float | Win probability (0-100) |
predicted_winner | integer | 1 or 2 |
confidence | float | Model confidence |
expected_total_sets | float | Expected number of sets |
expected_total_games | float | Expected total games |
prob_over_22_5_games | float | P(total games > 22.5) |
Returns ATP/WTA rankings. Latest snapshot by default. Cached 5 min.
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
type | string | No | ATP (default) or WTA |
date | date | No | Ranking date. Default: latest. |
top | integer | No | Limit 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
Returns CS2 tournaments. Cached 5 min.
Returns CS2 teams. 400+ teams. Cached 5 min.
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
search | string | No | Search by name |
country | string | No | Filter by country code |
Returns CS2 player profiles. Cached 5 min.
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
team | integer | No | Filter by team id |
search | string | No | Search by nickname |
Returns CS2 matches with map results. Defaults to next 7 days. Cached 2 min.
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
date_from | date | No | Start date (YYYY-MM-DD) |
date_to | date | No | End date (YYYY-MM-DD) |
tournament | integer | No | Filter by tournament id |
team | integer | No | Filter by team id |
status | string | No | notstarted, inprogress, finished |
Key response fields
| Field | Type | Description |
|---|---|---|
home_team / away_team | object | Nested team objects |
home_score / away_score | integer | Maps won |
best_of | integer | Bo1, Bo3, Bo5 |
maps | array | Per-map results [{map_name, home_score, away_score, halves}] |
Returns ML predictions for CS2 matches. Defaults to upcoming. Cached 2 min.
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
upcoming | boolean | No | Default true. Set false for past. |
date_from | date | No | Start date (YYYY-MM-DD) |
date_to | date | No | End date (YYYY-MM-DD) |
Key response fields
| Field | Type | Description |
|---|---|---|
home_win_prob / away_win_prob | float | Win probability (0-1) |
predicted_winner | string | home or away |
confidence | float | Model confidence |
Guides
- Register: Create a free account at /register/
- Get your token: After registering you'll be redirected to your dashboard where you can copy your API token.
- Make a request:
curl -H "Authorization: Token YOUR_API_KEY" https://sports.bzzoiro.com/api/leagues/ - Explore: Use the endpoints above to fetch teams, events, live scores, and ML predictions.
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']}")
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