Research use case

Football API for betting models
with joins that survive a provider change.

Fixtures, results, team and player match statistics and standings, keyed by identifiers that stay constant — the input layer underneath odds, not the odds themselves.

Why Stats API

Clean match inputs for model research.

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.

01

Reproducible inputs

Stable IDs help join match results across collection runs.

02

Explicit boundaries

No implied betting edge, prediction claim, or undocumented odds field.

03

Export-friendly JSON

Date filters support incremental server-side research collection.

Research scope

Model inputs today; odds are not published.

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.

Model inputs
Available now
Fixtures and results Scheduled and completed matches filterable by competition, season, team and UTC date.
Team match statistics Corners, shots, possession, cards and expected goals per side.
Player match statistics Per-appearance rows for minutes, shots, passing, duels and expected goals.
Standings League tables by season or team for form and position features.
Stable identifiers Locally generated IDs, so a historical series stays joinable across provider changes.
Source elsewhere
Not published today
Bookmaker odds No prices, markets, or closing lines.
Predictions No model output, ratings, or betting signals.
Shot and heat maps Positional data is not published.
Uniform statistics coverage Statistics reach fewer competitions than fixtures. Filter on the coverage flag.
Research workflow

Build a reproducible training set.

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 →
1 · Find a competition ID
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"
2 · Fetch its completed matches
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"
Build with football data

One key. One contract.
A clearer path to production.

View pricing