Football API · Access open

Football data foryour 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.

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

GET /demo/latest-results LIVE SAMPLE
{
    "data": [
        {
            "id": "match_d4c8d951ab420fe260d3",
            "competition": {
                "name": "Eerste Divisie"
            },
            "starts_at": "2026-10-31T20:30:00+00:00",
            "status": "finished",
            "home_team": {
                "name": "Notch",
                "score": 2
            },
            "away_team": {
                "name": "Robin Hood",
                "score": 2
            },
            "details_available": {
                "timeline": false,
                "lineups": false,
                "statistics": false,
                "player_statistics": false
            }
        },
        {
            "id": "match_c527f9a3869868566cbf",
            "competition": {
                "name": "Primera División"
            },
            "starts_at": "2026-10-31T20:30:00+00:00",
            "status": "finished",
            "home_team": {
                "name": "Alianza Atletico",
                "score": 1
            },
            "away_team": {
                "name": "Juan Pablo II College",
                "score": 0
            },
            "details_available": {
                "timeline": true,
                "lineups": true,
                "statistics": true,
                "player_statistics": true
            }
        },
        {
            "id": "match_80fd04b426f59cbdff2a",
            "competition": {
                "name": "Primeira Liga"
            },
            "starts_at": "2026-10-31T20:30:00+00:00",
            "status": "finished",
            "home_team": {
                "name": "FC Porto",
                "score": 4
            },
            "away_team": {
                "name": "Estoril",
                "score": 0
            },
            "details_available": {
                "timeline": true,
                "lineups": true,
                "statistics": true,
                "player_statistics": true
            }
        },
        {
            "id": "match_0f0a5274377c7b9c5449",
            "competition": {
                "name": "Serie B"
            },
            "starts_at": "2026-10-31T20:30:00+00:00",
            "status": "finished",
            "home_team": {
                "name": "Vila Nova",
                "score": 2
            },
            "away_team": {
                "name": "Juventude",
                "score": 2
            },
            "details_available": {
                "timeline": true,
                "lineups": true,
                "statistics": true,
                "player_statistics": true
            }
        },
        {
            "id": "match_c1d0fc2d66ced522b2a1",
            "competition": {
                "name": "Segunda División"
            },
            "starts_at": "2026-10-31T20:15:00+00:00",
            "status": "finished",
            "home_team": {
                "name": "Deportiva Agropecuaria",
                "score": 5
            },
            "away_team": {
                "name": "Sport Huancayo 2",
                "score": 1
            },
            "details_available": {
                "timeline": true,
                "lineups": false,
                "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-01T00:48:22+00:00"
    }
}
Real finished matches LIVE Trimmed sample · a key returns full objects
1,255CompetitionsAcross enabled sources
14,519TeamsAcross current coverage
151,326MatchesFixtures and full-time results
32Available operationsDocumented 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 IDsfor competitions, seasons, teams, and matches
Explicit headersfor cache state, quotas, and rate limits
Visible provenancefor every enabled historical dataset
Availability flagson every match, so you know which details exist before you ask
What the latest finished matches hold
MatchTimelineLineupsTeam statsPlayer stats
Notch 2–2 Robin HoodEerste Divisie No No No No
Alianza Atletico 1–0 Juan Pablo II CollegePrimera División Yes Yes Yes Yes
FC Porto 4–0 EstorilPrimeira Liga Yes Yes Yes Yes
Vila Nova 2–2 JuventudeSerie B Yes Yes Yes Yes
Deportiva Agropecuaria 5–1 Sport Huancayo 2Segunda División Yes No 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.1JSONUTC

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.txtA plain-text map of the API for language models
  • /openapi.jsonEvery operation and response field, OpenAPI 3.1
  • /index.mdEvery 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.

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.

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 →

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

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 →

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
A few useful answers

Before your first request.

From available data to choosing a plan.

Read all FAQs →
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.

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 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. 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 →