One JSON API for football statistics: player season and per-match lines, expected goals, shotmaps, lineups, standings and decades of historical seasons. Free key, no SDK, live in a single curl.
Most football APIs stop at fixtures and results. Ours exposes the same statistical layer analysts use: per-player expected goals, shot locations, duel and pass volumes, and season aggregates you can join straight into a model.
// Player season statistics — Premier League
const res = await fetch(
"https://v2.football.sportsapipro.com/api/players/" +
"1116/tournament/17/season/61627/statistics",
{ headers: { "x-api-key": process.env.SPORTS_API_KEY } }
);
const { statistics } = await res.json();
console.log(statistics.goals); // 18
console.log(statistics.expectedGoals); // 16.42
console.log(statistics.assists); // 7
console.log(statistics.rating); // 7.61Every group below is available on the same key and the same base URL, https://api.sportsapipro.com/v2/football.
Season aggregates and per-match lines: goals, assists, expected goals (xG), expected assists, shots, key passes, duels, tackles, minutes, and ratings.
Team season stats, form, standings, rounds, knockout brackets, top scorers, and team-of-the-week for every competition in the catalogue.
Lineups and formations, incidents, substitutions, full match statistics, shotmaps, heatmaps, momentum graphs, and head-to-head history.
Season-by-season archives for backtesting and modelling. Top-flight leagues reach 20-60 seasons; tiers 3-5 typically hold 5-19 seasons.
Competition access does not depend on your plan — every subscriber sees the same catalogue and the plan only sets your daily request quota. Archive depth, however, scales with the tier of the competition:
| Competition tier | Typical archive | Advanced metrics |
|---|---|---|
| Top flight (e.g. Premier League, Eredivisie) | 20-60 seasons | Full xG, shotmaps, heatmaps |
| Tier 2 (e.g. Championship, 2. Bundesliga) | 20-40 seasons | Usually full |
| Tiers 3-5 (e.g. Regionalliga) | 5-19 seasons | Partial |
| Amateur divisions | Current season | Scores and lineups |
Discover the competition, list its seasons, then pull the statistics. IDs are numeric and should always be discovered rather than hardcoded.
# 1. Find the competition curl "https://api.sportsapipro.com/v2/football/api/search?q=premier%20league" \ -H "x-api-key: $SPORTS_API_KEY" # 2. List its seasons (returns the full archive depth) curl "https://api.sportsapipro.com/v2/football/api/tournaments/17/seasons" \ -H "x-api-key: $SPORTS_API_KEY" # 3. Pull the season stats table curl "https://api.sportsapipro.com/v2/football/api/tournament/17/season/61627/top-players" \ -H "x-api-key: $SPORTS_API_KEY"
A like-for-like look at what most football statistics providers charge for versus what is included here by default.
| Capability | SportsAPI Pro | Typical alternative |
|---|---|---|
| Football competitions covered | 6,400+ (incl. amateur tiers) | Typically 100-1,000 on entry plans |
| Expected goals (xG) & shotmaps | Included on all paid plans | Usually a premium add-on |
| Historical seasons | Up to 60 seasons on major leagues | Often gated behind enterprise tiers |
| Real-time delivery | REST + WebSocket push | Polling only on lower tiers |
| Other sports on the same key | 30+ sports, one API key | Football-only or per-sport pricing |
| Entry paid plan | $45 / month (Pro) | Comparable depth commonly $100+ |
Plans differ only by daily request quota. Nothing in the football statistics catalogue is gated behind a higher tier.
Best starting point for small teams
Higher quota for production traffic
Bulk backfills and heavy polling
Yes. Every account starts with a free key that includes 100 requests per day against the full football catalogue, so you can evaluate the exact endpoints and payloads before paying anything. Paid plans start at $45/month (Pro) and only raise your request quota — no data is locked behind a higher tier.
The flat football catalogue currently holds over 6,400 competitions, from the Premier League, La Liga, Serie A, Bundesliga, Ligue 1, MLS and international tournaments down to national amateur divisions such as the Dutch Derde Divisie and German Regionalliga. Coverage is identical on every plan; you can enumerate the whole catalogue yourself via the countries and tournaments endpoints.
Archive depth scales with the tier of the competition. Major European leagues typically expose 20-60 seasons (Eredivisie, for example, returns 39), tiers 3-5 hold roughly 5-19 seasons, and the lowest amateur divisions are current-season only. Call /tournaments/{id}/seasons on any competition to see its exact depth before you plan a backfill.
Yes for competitions where the underlying data is collected — that includes xG, expected assists, shotmaps, heatmaps, duels, and momentum graphs. Advanced metrics are competition-dependent rather than plan-dependent: they are available on the same endpoints for every subscriber, but not every lower-tier league is tracked at that depth.
Quotas are daily and reset at 00:00 UTC. Free keys get 100 requests/day; Pro, Ultra and Mega scale up from there. Exceeding your quota returns HTTP 429. WebSocket streaming is not metered — only REST lookups count against your daily quota.
Yes. Poll the live endpoints for a simple integration, or open a WebSocket connection and subscribe to the live-scores channel for pushed updates. Score and incident updates arrive within roughly 300ms of the source event; odds follow a change-gated cadence of about 30 seconds.
Yes. All paid plans include commercial use for websites, mobile apps, dashboards, and internal models. If you need bulk historical extraction for a one-off backfill, contact support and we can raise your quota temporarily.
Plain JSON over HTTPS, authenticated with an x-api-key header. No SDK is required — any HTTP client works. Timestamps on V2 are Unix epoch (startTimestamp); V1 and V3 use ISO 8601.
Free key includes 100 requests a day against the full catalogue — enough to build and validate your integration before you pay anything.