# Football Stats API for Developers & AI Agents

Build football apps and AI agents with fast access to fixtures, results, competitions, and teams through a cache-first JSON REST API.

Canonical URL: https://stats-api.com/

Football API · Access open

## Football data for *your next app.*

Fixtures, results, standings, lineups and player match stats for your next product. Every match tells you which details it has. [Coverage varies by league and match.](https://stats-api.com/coverage)

[Get your free API key →](https://stats-api.com/auth?mode=signup) See how it works

200 free requests once. No card, renewal, or expiry. Paid plans from $19.50 a month.

GET /demo/latest-results LIVE SAMPLE

```json
{
    "data": [
        {
            "id": "match_1eea8fbd1de659dfeba4",
            "competition": {
                "name": "Liga MX Femenil"
            },
            "starts_at": "2026-10-31T21:40:00+00:00",
            "status": "finished",
            "home_team": {
                "name": "Querétaro W",
                "score": 0
            },
            "away_team": {
                "name": "Pachuca W",
                "score": 5
            },
            "details_available": {
                "timeline": true,
                "lineups": false,
                "statistics": false,
                "player_statistics": false
            }
        },
        {
            "id": "match_8d4446fd99a2260fb803",
            "competition": {
                "name": "Primera Premier"
            },
            "starts_at": "2026-10-31T21:30:00+00:00",
            "status": "finished",
            "home_team": {
                "name": "Zacatepec 1948",
                "score": 1
            },
            "away_team": {
                "name": "Racing de Veracruz",
                "score": 5
            },
            "details_available": {
                "timeline": true,
                "lineups": false,
                "statistics": false,
                "player_statistics": false
            }
        },
        {
            "id": "match_6f2905fcbee59be00bda",
            "competition": {
                "name": "Primera Premier"
            },
            "starts_at": "2026-10-31T21:30:00+00:00",
            "status": "finished",
            "home_team": {
                "name": "Cordobés",
                "score": 2
            },
            "away_team": {
                "name": "Jaguares de Chiapas",
                "score": 2
            },
            "details_available": {
                "timeline": true,
                "lineups": false,
                "statistics": false,
                "player_statistics": false
            }
        },
        {
            "id": "match_688702fc4c1ba099bdbf",
            "competition": {
                "name": "Liga Premier Serie A"
            },
            "starts_at": "2026-10-31T21:30:00+00:00",
            "status": "finished",
            "home_team": {
                "name": "Ciervos",
                "score": 0
            },
            "away_team": {
                "name": "FC Santiago",
                "score": 3
            },
            "details_available": {
                "timeline": true,
                "lineups": false,
                "statistics": false,
                "player_statistics": false
            }
        },
        {
            "id": "match_2388bc0b6ab641db6faa",
            "competition": {
                "name": "Primera División"
            },
            "starts_at": "2026-10-31T21:30:00+00:00",
            "status": "finished",
            "home_team": {
                "name": "Puerto Cabello",
                "score": 0
            },
            "away_team": {
                "name": "Deportivo Tachira FC",
                "score": 1
            },
            "details_available": {
                "timeline": true,
                "lineups": true,
                "statistics": false,
                "player_statistics": false
            }
        }
    ],
    "meta": {
        "sample": true,
        "note": "Real finished matches from the Stats API database, trimmed to a few fields. An API key returns the full objects from GET /api/v1/football/matches.",
        "generated_at": "2026-11-01T01:41:28+00:00"
    }
}
```

Real finished matches **LIVE** Trimmed sample · a key returns full objects

**1,255** Competitions Across enabled sources

**14,519** Teams Across current coverage

**151,327** Matches Fixtures and full-time results

**32** Available operations Documented in OpenAPI

Contract-first by design

## Know what a match holds before you ask for it.

Coverage varies by league, season and match, and we say so instead of hiding it: every match carries availability flags. The executable OpenAPI contract documents the exact fields available today.

**Stable IDs** for competitions, seasons, teams, and matches

**Explicit headers** for cache state, quotas, and rate limits

**Visible provenance** for every enabled historical dataset

**Availability flags** on every match, so you know which details exist before you ask

What the latest finished matches hold

| Match | Timeline | Lineups | Team stats | Player stats |
| --- | --- | --- | --- | --- |
| **Querétaro W 0–5 Pachuca W** Liga MX Femenil | Yes | No | No | No |
| **Zacatepec 1948 1–5 Racing de Veracruz** Primera Premier | Yes | No | No | No |
| **Cordobés 2–2 Jaguares de Chiapas** Primera Premier | Yes | No | No | No |
| **Ciervos 0–3 FC Santiago** Liga Premier Serie A | Yes | No | No | No |
| **Puerto Cabello 0–1 Deportivo Tachira FC** Primera División | Yes | Yes | No | No |

The reliable layer

## Your app talks to us. We handle the messy parts.

Provider IDs, outages, retrieval schedules, and schema differences stop at our ingestion boundary. Your integration gets one predictable contract while coverage remains explicit.

01

### Normalized football model

Competitions, seasons, teams, and matches use Stats API IDs. Identical imports keep them unchanged; ambiguous source corrections remain explicitly best effort.

02

request *→* **Redis** *→* MySQL

### Cache-first by design

Customer calls never depend on a live upstream fetch. Hot responses come from Redis; scheduled ingestion runs independently.

03

OPENAPI 3.1 JSON UTC

### A contract you can inspect

Typed schemas, consistent errors, pagination, quota headers, and copy-ready examples for every available operation.

Three calls to kickoff

## From API key to match data in minutes.

Create a key in your dashboard, then send it on every call as `Authorization: Bearer $KEY`.

1. 1

   **Find the competition**

   Search the catalog once and keep its stable ID.

   `GET /api/v1/football/competitions?q=premier`
2. 2

   **List its matches**

   Fixtures and results, each saying which details it holds.

   `GET /api/v1/football/matches?competition_id={competition_id}`
3. 3

   **Open one match**

   Timeline, lineups, statistics and odds, where the match has them.

   `GET /api/v1/football/matches/{match_id}/timeline`

Build with AI

## Describe your football app. Your coding agent builds it.

Write what you want to build and copy a brief for the coding agent you already use. It points the agent at the contract and the rules that keep its code honest.

1. **Describe it.** Your idea, your stack and the data you need. The brief changes as you type.
2. **Hand it to your agent.** It starts from llms.txt and the OpenAPI contract, not from guesses.
3. **Approve the plan first.** The brief asks for the data flow and the exact endpoints before any code.

- [`/llms.txt`](https://stats-api.com/llms.txt) A plain-text map of the API for language models
- [`/openapi.json`](https://stats-api.com/openapi.json) Every operation and response field, OpenAPI 3.1
- [`/index.md`](https://stats-api.com/index.md) Every public page as Markdown: add .md to its address

Required data

brief.md · paste it into your coding agent

```
Read the current Stats API reference before coding:
https://stats-api.com/llms.txt
https://stats-api.com/openapi.json

Build: A match-day dashboard for Premier League fans
Preferred stack: PHP + vanilla JavaScript
Required data: fixtures, results

Implementation rules:
- Keep STATS_API_KEY in a server-side environment variable.
- Use only operations and response fields present in the OpenAPI contract.
- Send the key as: Authorization: Bearer $STATS_API_KEY.
- Handle 401, 404, 429, and 503 responses explicitly.
- Respect X-RateLimit-* and X-Quota-* response headers.
- Treat all timestamps as UTC and render the user's local timezone in the UI.
- Add loading, empty, stale-data, and error states.
- Do not assume players, standings, live events, advanced stats, or odds are available unless the coverage response says so.
- Cache appropriate responses in the application without extending live-data freshness.

First propose the page/data flow and exact endpoints. Wait for approval before writing the implementation.
```

Built around your idea

## What you can build

Start with one useful feature. Add more as your product grows.

### [Fantasy scoring](https://stats-api.com/use-cases/fantasy-football)

Apply your own scoring rules to available player match statistics, and use the started and played flags to know who took the pitch. Connect performances to player profiles and team squads.

`GET /api/v1/football/matches/{match_id}/player-stats` `GET /api/v1/football/teams/{team_id}/players`

### [Matchday dashboards](https://stats-api.com/football-api)

Bring fixtures, scores, and available match events into one view, ordered the way the provider reported them. Check which details a match has before you ask. Show your users when data was last updated.

`GET /api/v1/football/matches` `GET /api/v1/football/matches/{match_id}/timeline`

### [Football research](https://stats-api.com/use-cases/betting-models)

Explore results, compare team performance, and test your own models. Check each competition’s available seasons before you begin.

`GET /api/v1/football/competitions/{competition_id}/seasons` `GET /api/v1/football/matches/{match_id}/stats`

### [Sports content & AI](https://stats-api.com/use-cases/ai-agents)

Give match previews, roundups, and AI tools a structured source. Ground every answer in returned data and make missing coverage clear.

`GET /api/v1/football/matches/{match_id}` `GET /api/v1/coverage/leagues`

Examples use the currently available API. Data availability varies by league, season, and match.

Simple, transparent pricing

## Every available endpoint. Pay for volume.

New accounts start with 200 free requests, with no card required. Choose a paid plan when you need more volume. A separate seven-day trial is available to eligible subscribers.

## Free starter · $0

200 requests once per new account, shared across all API keys. 30 requests per minute. All currently available endpoints, with coverage varying by league and match. No card, renewal, or expiry.

[Start with 200 free requests →](https://stats-api.com/auth?mode=signup)

Prices are in USD for new subscriptions only. Existing subscriptions retain their original rate.

## Starter

For prototypes and focused football products.

7-day FREE trial

**$19.50** / month

- **100,000** requests / month
- **120** requests / minute

Every plan includes

- Fixtures, results & live match updates
- Competitions, seasons, teams & player profiles
- Squads, confirmed lineups, benches & formations
- Goals, cards, substitutions & VAR events
- Match venue names & referee assignments
- Team match statistics, with xG where available
- Player match & season statistics
- Team season totals, home/away breakdowns & form
- Standings, season groups, injuries & suspensions
- Current prematch & live odds; Bet365 & Pinnacle prematch
- 1X2, Asian handicap, totals, BTTS & corners; live draw-no-bet (DNB)
- Supported prematch goal-scorer markets
- Build with AI: API docs & OpenAPI
- Dashboard usage, API keys & support chat

Coverage varies by league, season, match, bookmaker and market. [Check coverage →](https://stats-api.com/coverage)

Then $19.50 USD/month. Renews automatically unless canceled before the trial ends. Eligibility and billing details are confirmed at checkout.

[Start 7-day FREE trial](https://stats-api.com/auth?mode=signup&plan=starter)

More room to grow

## Growth

For production apps with growing traffic.

7-day FREE trial

**$49.50** / month

- **500,000** requests / month
- **300** requests / minute

Every plan includes

- Fixtures, results & live match updates
- Competitions, seasons, teams & player profiles
- Squads, confirmed lineups, benches & formations
- Goals, cards, substitutions & VAR events
- Match venue names & referee assignments
- Team match statistics, with xG where available
- Player match & season statistics
- Team season totals, home/away breakdowns & form
- Standings, season groups, injuries & suspensions
- Current prematch & live odds; Bet365 & Pinnacle prematch
- 1X2, Asian handicap, totals, BTTS & corners; live draw-no-bet (DNB)
- Supported prematch goal-scorer markets
- Build with AI: API docs & OpenAPI
- Dashboard usage, API keys & support chat

Coverage varies by league, season, match, bookmaker and market. [Check coverage →](https://stats-api.com/coverage)

Then $49.50 USD/month. Renews automatically unless canceled before the trial ends. Eligibility and billing details are confirmed at checkout.

[Start 7-day FREE trial](https://stats-api.com/auth?mode=signup&plan=growth)

## Scale

For high-volume products and agent workloads.

7-day FREE trial

**$149.50** / month

- **5,000,000** requests / month
- **1,000** requests / minute

Every plan includes

- Fixtures, results & live match updates
- Competitions, seasons, teams & player profiles
- Squads, confirmed lineups, benches & formations
- Goals, cards, substitutions & VAR events
- Match venue names & referee assignments
- Team match statistics, with xG where available
- Player match & season statistics
- Team season totals, home/away breakdowns & form
- Standings, season groups, injuries & suspensions
- Current prematch & live odds; Bet365 & Pinnacle prematch
- 1X2, Asian handicap, totals, BTTS & corners; live draw-no-bet (DNB)
- Supported prematch goal-scorer markets
- Build with AI: API docs & OpenAPI
- Dashboard usage, API keys & support chat

Coverage varies by league, season, match, bookmaker and market. [Check coverage →](https://stats-api.com/coverage)

Then $149.50 USD/month. Renews automatically unless canceled before the trial ends. Eligibility and billing details are confirmed at checkout.

[Start 7-day FREE trial](https://stats-api.com/auth?mode=signup&plan=scale)

A few useful answers

## Before your first request.

From available data to choosing a plan.

[Read all FAQs →](https://stats-api.com/faq)

### How do I get started?

Create an account, generate an API key, and try a request in the dashboard. New accounts receive 200 requests once, shared across all keys, with no card, expiry, or monthly reset. [Open the quickstart.](https://stats-api.com/docs)

### What football data is available?

The API includes fixtures, results, standings, squads, player profiles, match and player match statistics, lineups, and injury availability. Every match reports which details are stored, and player statistics say who started and who played. Coverage varies by league and match. Check the [coverage page](https://stats-api.com/coverage) and documented response fields for your use case.

### Which leagues and historical seasons can I use?

Use the coverage endpoint to find competitions, then list the seasons available for each one. Historical depth and detailed statistics vary; do not assume the same seasons or fields exist across every league.

### How fresh is the match data?

Match data is updated through scheduled polling. Check the returned timestamps and coverage for the match you need. A cache hit describes how a response was served, not when the underlying football data changed.

### What happens when I need more requests?

All keys share your account allowance. The free allowance does not reset; paid plans provide larger monthly request limits and higher request rates. Review usage and current upgrade options in [Plans & billing](https://stats-api.com/dashboard/billing). Each plan includes the same available endpoints.

### How do paid trials and cancellation work?

Eligible subscribers can start a separate seven-day paid-plan trial. Checkout confirms eligibility and renewal terms. Cancel before the trial ends to avoid its renewal charge, using the secure subscription management link in Plans & billing. Creating a free account does not automatically start a paid subscription.

Ready when you are

## Build the football product you keep thinking about.

[Create your account →](https://stats-api.com/auth?mode=signup)

*The live page also has interactive controls that need a browser: https://stats-api.com/*

---

Markdown version of https://stats-api.com/. 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
