Stable resource IDs
Competition, season, team, and match IDs stay inside the public contract instead of exposing source-specific identifiers.
Query football fixtures, results, competitions, seasons, teams and match statistics — corners, shots, possession, cards and expected goals — through a stable JSON REST API. Every dataset and unavailable capability is described before you integrate.
Stats API turns enabled sources into normalized competition, season, team, fixture, result, statistic, lineup, timeline, standing, and player resources. Search by a human name once, retain the stable Stats API IDs, and use those IDs in later filters and joins.
Statistics, lineups, timelines, standings, squads and injuries have explicit coverage or observation fields. Team and player season summaries preserve missing values and transfer splits. Odds responses include source and observation times plus availability and expiry. Heat maps and shot maps remain unavailable.
Competition, season, team, and match IDs stay inside the public contract instead of exposing source-specific identifiers.
Query matches by competition, season, team, status, or an inclusive UTC date window.
Team match statistics with nullable expected goals, plus separate per-player appearance statistics.
Match statistics report coverage; season summaries report available and support_status. Read the documented timing fields where present.
OpenAPI 3.1, predictable errors, pagination, UTC timestamps, and copy-ready requests make integration behavior visible.
Use the public contract and the availability fields of the requested resource. Match statistics have coverage flags; season summaries distinguish missing and explicitly empty observations. Timing fields describe stored observations and do not establish complete or current coverage.
Search by a human competition name once. Store the returned Stats API ID, pass it to the matches endpoint, and paginate using the documented response metadata.
Read the match endpoint guide →curl --silent --show-error \
"https://stats-api.com/api/v1/football/competitions?q=Premier%20League" \
-H "Authorization: Bearer ${STATS_API_KEY}" \
-H "Accept: application/json"
curl --silent --show-error \
"https://stats-api.com/api/v1/football/matches?competition_id=${COMPETITION_ID}&status=finished" \
-H "Authorization: Bearer ${STATS_API_KEY}" \
-H "Accept: application/json"
Each page documents one enabled historical beta dataset, its exact season and record scope, copy-ready discovery calls, and the fields that still require a licensed provider.
2025/26 · 20 teams · 380 matches
Explore coverage → Spain2025/26 · 20 teams · 380 matches
Explore coverage → Germany2025/26 · 18 teams · 306 matches
Explore coverage → Italy2025/26 · 20 teams · 380 matches
Explore coverage → France2025/26 · 18 teams · 306 matches
Explore coverage → International2026 · 48 teams · 104 matches
Explore coverage →Use the endpoint reference, current coverage ledger, and an engineering-reviewed guide to make supported fields and durable identifiers explicit.
Review every supported match filter, status, response field, and error.
Read more → AvailabilityCheck enabled datasets, observed ingestion times, and freshness boundaries.
Read more → Engineering guideSee how a public ID layer protects applications during source replacement.
Read more →