The Best Free Football API
61826+ matches with 15 years of history. Multi-bookmaker odds, manager intelligence, per-shot xG, ML predictions, live scores — all free with no rate limits.
Multi-Bookmaker Odds
15+ bookmakers across 32 leagues. 1X2, Over/Under, BTTS, Double Chance, Handicap, Correct Score, Player Props. Best-odds comparison. Coverage map
Manager Intelligence
787+ coaches with tactical profiles, preferred formations, win rates, avg goals, xG, discipline stats. Embedded in every match response. Stats
ML Predictions
CatBoost v5.0 ensemble (XGBoost + LightGBM + CatBoost) for 8 markets. 163 features including spatial data and Elo ratings. Retrained weekly.
Pre-Match Data
Unavailable players (injuries, suspensions, doubtful) per match. Official lineups fetched 1h before kick-off. Head coaches for both teams.
47957+ Players
Full profiles: position, nationality, market value, height, preferred foot, contract, transfers with fees. 30+ per-match stats including xG, xA, heatmaps.
Live Scores + Spatial
Real-time scores (30s cache). Shot maps with per-shot xG, momentum graphs, average positions, goal build-up sequences with passing chains.
15 Years of History
61826+ matches since 2004. Premier League, La Liga, Serie A, Bundesliga, Ligue 1, Championship, Liga Portugal, Eredivisie. All via the same endpoints.
3,500+ with xG Shotmaps
Professional-grade spatial data: per-shot xG, shot coordinates, lineups with formations, goal/card/substitution incidents. Free.
How BSD Compares to Other Football APIs
| Feature | BSD (Free) | football-data.org | API-Football | SportMonks |
|---|---|---|---|---|
| Price | Free | Free (limited) | $0-$200+/mo | $20-$100+/mo |
| Rate Limits | None | 10 req/min | 100 req/day (free) | Tier-based |
| Multi-Bookmaker Odds | 15+ bookmakers | No | Yes (paid) | Yes (paid) |
| Manager/Coach Profiles | 787+ with stats | Name only | Name only | Basic |
| ML Predictions | CatBoost ensemble | No | No | No |
| Injuries / Suspensions | Per match | No | Yes (paid) | Yes (paid) |
| Pre-Match Lineups | 1h before kick-off | No | Yes | Yes (paid) |
| Shot Maps / xG per shot | Yes | No | No | No |
| Player Stats (per match) | 30+ fields + heatmap | No | Yes (paid) | Yes (paid) |
| Live Scores | 30s refresh | Yes | Yes | Yes |
| Leagues | 48+ | 12 (free) | 800+ | 1500+ |
| Historical Data | 15 years (46k+ matches) | 4 years | 10+ years (paid) | 10+ years (paid) |
| Referee Stats | Cards/match, fouls | No | No | Basic |
| Transfer History | Full with fees | No | Yes (paid) | Yes (paid) |
| OpenAPI / Swagger | Yes | No | Yes | Yes |
Quick Start
Get match odds with coach profiles in 3 lines:
import requests
headers = {"Authorization": "Token YOUR_API_KEY"}
events = requests.get("https://sports.bzzoiro.com/api/events/", headers=headers).json()
for e in events["results"]:
coach = e.get("home_coach", {}) or {}
print(f"{e['home_team']} ({coach.get('profile','?')}) vs {e['away_team']}")
print(f" Odds: H={e.get('odds_home')} D={e.get('odds_draw')} A={e.get('odds_away')}")
if e.get("unavailable_players"):
injured = e["unavailable_players"]["home"]
print(f" Unavailable: {', '.join(p['name'] for p in injured)}")
FAQ
100% free · No rate limits · No credit card