Reproducible inputs
Stable IDs help join match results across collection runs.
Fixtures, results, match and season statistics, standings, and dated odds observations joined through stable identifiers.
Join fixtures, results, match and season statistics, standings and locally collected odds through the documented Stats API competition, season, team, player and match IDs. Inspect null fields, availability and observation times before including a row in research.
That last point is the one that bites researchers. A backtest joined on team names or upstream identifiers quietly fragments when a provider renumbers or renames, and the damage is invisible until results stop reproducing. Stats API identifiers are generated locally and mapped internally, so a historical series stays joinable.
Treat coverage explicitly in the feature pipeline. Statistics reach far fewer competitions than fixtures do, so a naive join produces silent nulls that a model will happily learn from. Filter on the coverage flag, and record which competitions contributed to a fitted parameter.
Use scheduled fixtures and completed scores as reproducible inputs for research, feature engineering, and evaluation pipelines.
Odds, lineups and nullable expected goals are available where observed. Predictions and betting signals are not supplied. Named bookmaker and player-market coverage varies; the live odds feed has no verified bookmaker attribution.
Stable IDs help join match results across collection runs.
No implied betting edge, prediction claim, or undocumented odds field.
Date filters support incremental server-side research collection.
Build from observed football records and odds snapshots. Keep missing fields, source timestamps, expiry and market suspension visible. Predictions and a betting edge are not supplied.
Pull completed matches for a season, join team statistics on the match ID, and record which competitions carried statistics. That last column is what makes a backtest reproducible a year later.
Review the match contract →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"
These pages show which competitions carry statistics, the exact field semantics, and why identifiers are generated locally rather than passed through.
Per-competition statistics availability and observed ingestion times.
Read more → Endpoint referenceDocumented filters, pagination and field semantics.
Read more → Engineering guideWhy a backtest joined on provider identifiers quietly fragments.
Read more →