Reproducible inputs
Stable IDs help join match results across collection runs.
Fixtures, results, team and player match statistics and standings, keyed by identifiers that stay constant — the input layer underneath odds, not the odds themselves.
Odds are not published yet, and that is stated rather than implied. What is available is the input layer a model needs underneath odds: fixtures, results, team and player match statistics including expected goals, and standings — all keyed by identifiers that survive a provider change.
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.
The beta does not sell odds, expected goals, lineups, or betting signals. Those capabilities remain unavailable until backed by a feed with explicit commercial redistribution rights.
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.
Odds and predictions are absent and stated as absent. What is here is the feature layer a model is fitted on, with the coverage flag exposed so a training join cannot silently fill with nulls.
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 →