# Football API for betting models

Build research pipelines on versioned results, season statistics and explicitly dated odds observations.

Canonical URL: https://stats-api.com/use-cases/betting-models

Research use case

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

Fixtures, results, match and season statistics, standings, and dated odds observations joined through stable identifiers.

[Start building →](https://stats-api.com/auth?mode=signup) [Explore endpoints](https://stats-api.com/docs)

Why Stats API

## Clean match inputs for model research.

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.

**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 with explicit availability.

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.

**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 and duels where observed.

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

Complete odds history **—** Current observations are not a guaranteed archive of closing lines or every bookmaker.

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 →](https://stats-api.com/docs/endpoints/matches)

1 · Find a competition ID

```bash
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

```bash
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"
```

Research building blocks

## Coverage, contract, and durable joins.

These pages show which competitions carry statistics, the exact field semantics, and why identifiers are generated locally rather than passed through.

Coverage ledger

### [What is covered](https://stats-api.com/coverage)

Per-competition statistics availability and observed ingestion times.

Endpoint reference

### [Match endpoint guide](https://stats-api.com/docs/endpoints/matches)

Documented filters, pagination and field semantics.

Engineering guide

### [Keep football IDs stable](https://stats-api.com/blog/stable-football-ids-provider-replacement)

Why a backtest joined on provider identifiers quietly fragments.

Build with football data

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

[View pricing →](https://stats-api.com/pricing)

---

Markdown version of https://stats-api.com/use-cases/betting-models. Site index: https://stats-api.com/llms.txt · Full documentation and OpenAPI contract: https://stats-api.com/llms-full.txt · AI usage policy: https://stats-api.com/ai.txt
