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.
Every response carries explicit source and ingestion timestamps. Statistics, lineups, timelines, standings, squads and injuries are available where the coverage flag says so — and the flag is in the payload, so a gap is never something you have to guess at. Odds, heat maps and season player aggregates are not published yet.
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.
Corners, possession, shots, cards and expected goals per team and per appearance.
Every statistics response states whether the competition is covered and when it was last observed.
OpenAPI 3.1, predictable errors, pagination, UTC timestamps, and copy-ready requests make integration behavior visible.
The public contract and coverage ledger are the source of truth. Every statistics response carries a coverage flag and an observed ingestion time, so a gap is always visible in the payload rather than inferred.
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 →