Normalized football model
Competitions, seasons, teams, and matches use Stats API IDs. Identical imports keep them unchanged; ambiguous source corrections remain explicitly best effort.
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.
{
"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"
}
}
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.
| Match | Timeline | Lineups | Team stats | Player 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 |
Provider IDs, outages, retrieval schedules, and schema differences stop at our ingestion boundary. Your integration gets one predictable contract while coverage remains explicit.
Competitions, seasons, teams, and matches use Stats API IDs. Identical imports keep them unchanged; ambiguous source corrections remain explicitly best effort.
Customer calls never depend on a live upstream fetch. Hot responses come from Redis; scheduled ingestion runs independently.
Typed schemas, consistent errors, pagination, quota headers, and copy-ready examples for every available operation.
Create a key in your dashboard, then send it on every call as Authorization: Bearer $KEY.
Search the catalog once and keep its stable ID.
GET /api/v1/football/competitions?q=premier
Fixtures and results, each saying which details it holds.
GET /api/v1/football/matches?competition_id={competition_id}
Timeline, lineups, statistics and odds, where the match has them.
GET /api/v1/football/matches/{match_id}/timeline
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.
/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 addressStart with one useful feature. Add more as your product grows.
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-statsGET /api/v1/football/teams/{team_id}/playersBring 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/matchesGET /api/v1/football/matches/{match_id}/timelineExplore 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}/seasonsGET /api/v1/football/matches/{match_id}/statsGive 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/leaguesExamples use the currently available API. Data availability varies by league, season, and match.
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.
For prototypes and focused football products.
7-day FREE trialEvery plan includes
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 trialFor production apps with growing traffic.
7-day FREE trialEvery plan includes
Coverage varies by league, season, match, bookmaker and market. Check 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 trialFor high-volume products and agent workloads.
7-day FREE trialEvery plan includes
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 trialFrom available data to choosing a plan.
Read all FAQs →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.
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.
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.
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.
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.
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.