Make your first request in seconds.
OpenFootAPI exposes football fixtures, results, live events, confirmed lineups, Expected Goals (xG) and derived match intelligence through a clean REST interface.
No key required to start testing
curl "https://openfootapi.com/v1/matches?date=2026-08-28" \
-H "Accept: application/json" \
-H "Authorization: Bearer of_demo_openfootapi_docs"Response
{
"data": [
{
"id": "match_olg_83156",
"competitionId": "comp_bundesliga_de",
"status": "scheduled",
"kickoffAt": "2026-08-28T18:30:00.000Z",
"homeTeam": { "id": "team_olg_40", "name": "FC Bayern München" },
"awayTeam": { "name": "VfB Stuttgart" }
}
],
"meta": {
"count": 1,
"environment": "beta",
"access": { "authenticated": false, "plan": "public" }
}
}Bearer API keys
Every endpoint requires a key. A free Starter key covers fixtures, competitions, standings and search with 5,000 requests a month and takes a minute to create. A Developer key adds live events, lineups, xG shot maps and odds, with 250,000 requests a month. Raw keys start with of_live_; OpenFootAPI stores only a SHA-256 hash.
Authorization: Bearer of_live_your_api_keyof_demo_openfootapi_docs, which is public on purpose. It covers the same endpoints as Starter, is limited to 30 requests a minute per address so it stays usable for everyone, and is not meant to be built on. Get your own free key from pricing.What is actually available
OpenLigaDB + ESPN · ODbL / OpenReal-time fixtures, lineups & commentary
Current fixtures, live score clocks, incident timelines (goals, cards, substitutions, VAR) and confirmed starting XI rosters.
Football-Data.co.uk · Free Open DataRomanian and expanded European match data
Superliga României, Eredivisie, Primeira Liga, Süper Lig, Belgium's Pro League and the Scottish Premiership, filtered by season.
FotMob + Market BenchmarkExpected Goals (xG), shot maps & odds
Granular shot coordinates, individual shot expectancy, team xG totals, and implied fair win probabilities.
OpenFootball · CC0-1.0Four league archives
Premier League, La Liga, Serie A and Ligue 1 historical files with standardized team mappings.
Every relevant response includes source and license metadata.
match_fmb_* identifiers.• Premier League backward compatibility: Legacy
match_of_epl_* IDs continue to resolve transparently via compatibility aliases across /context, /xg, and /lineups.• Retired OpenFootball prefixes: Legacy OpenFootball prefixes for other leagues (
match_of_es1_*, match_of_it1_*, match_of_fr1_*) are deprecated and return 404. Romance-language club naming variations (CF, RCD, AC, Inter, AS, OGC, RC, OL, de Madrid) produce high failure rates under token normalization, and broader heuristics cause ambiguous collisions (such as Real Madrid vs Real Sociedad).• 1. Bundesliga provider migration: 1. Bundesliga now uses canonical
match_fmb_de1_* IDs. Legacy match_olg_* IDs resolve basic context strictly for current-season fixtures (e.g. match_olg_83156); prior archive seasons (e.g. match_olg_77256) return 404 feature_not_available. Historical fixtures across the 17-season archive require canonical match_fmb_de1_* identifiers. match_olg_* remains the active canonical prefix for 2. Bundesliga, 3. Liga, and DFB-Pokal.• What to use: Interrogate matches via
/v1/matches?competition=comp_...&season=YYYY/YY to retrieve canonical match_fmb_{league}_{season}_{date}_{home}_{away} IDs.Endpoints
/v1/healthAPI health
Current service, API version and active provider state.
/v1/competitionsCompetitions
Coverage flags, seasons, source and license for each competition.
/v1/scorers?competition={id}Top scorers & assists
League leaders ranking, goal tallies, assists, cards, and participant clubs.
/v1/teams/{id}/squadTeam squad roster
Full player roster with jersey numbers, positions, ages, nationalities, and coaching staff.
/v1/teams/{id}/h2h?opponent={id}Head-to-head clash history
Multi-year historical meetings, win/draw rates, goal totals, and recent encounter logs.
/v1/standings?competition={id}League standings
Full league table with overall, home, away splits, goal difference, points, and recent 5-match form.
/v1/matchesMatches
Fixtures and results filtered by date, competition, team, status or season.
/v1/matches/{id}/contextMatch context
Derived form, Elo, rest, table position, venue record, head-to-head and freshness.
/v1/matches/{id}/eventsMatch events & commentary
Incident timeline (goals, cards, substitutions, penalties, VAR) and minute-by-minute text commentary.
/v1/matches/{id}/lineupsLineups & formations
Confirmed starting XI, substitutes, player positions, jersey numbers, and tactical formations.
/v1/matches/{id}/xgMatch shot map & xG
Granular shot locations (x, y coordinates), shot types, situations, individual xG values and team totals.
/v1/analytics/xg?league={league}&season={season}League xG table
League-wide Expected Goals, xG conceded and xG difference per team, for the current season or any of the 17 archived ones.
/v1/odds?matchId={id}Odds & probabilities
Model fair-odds benchmarks and implied fair win probabilities.
/v1/search?q={query}Entity search
Resolve team and competition names to stable OpenFootAPI IDs.
/v1/live/streamReal-time Live Stream (SSE)
Server-Sent Events persistent stream delivering instant goal alerts, status changes, and periodic match ticks.
/v1/webhooksWebhooks management
Register, list, test, and delete HTTPS webhook subscriptions for automated goal, kickoff, and fulltime push notifications.
Filter matches without learning provider IDs
Filters can be combined. Dates are interpreted as UTC calendar dates and entity filters use stable OpenFootAPI IDs returned by search.
| Parameter | Type | Required | Description |
|---|---|---|---|
date | date | No | Kickoff date in YYYY-MM-DD. |
competition | string | No | Stable OpenFootAPI competition ID. |
team | string | No | Stable OpenFootAPI team ID. |
status | enum | No | scheduled, live, finished or postponed. |
season | string | No | Season label such as 2026/27. |
kickoffAt. Convert it to the viewer's timezone in the client.Use the same endpoint from any stack
Select any endpoint and programming language below to view production-ready boilerplate with authentication, error handling, and response processing.
Retrieve fixtures across 120+ global competitions with live scores and venue data.
// TypeScript / Modern Node.js (Fetch)
const url = "https://openfootapi.com/v1/matches?date=2026-08-28&status=scheduled";
const headers: Record<string, string> = {
"Accept": "application/json",
};
async function fetchFootballData() {
try {
const response = await fetch(url, { headers });
if (!response.ok) {
const err = await response.json();
throw new Error(err.error?.message || `HTTP ${response.status}`);
}
const payload = await response.json();
console.log("Success:", payload.data);
return payload.data;
} catch (error) {
console.error("API Request Error:", error);
}
}
fetchFootballData();One envelope across every endpoint
Successful requests return data and meta. Failed requests return error and a request ID that can be used for support and log tracing.
dataThe requested resourceAn object or array with normalized field types.metaHow the response was producedRequest ID, generation time, access tier, sources and count.errorA stable failure shapeMachine-readable code plus a human-readable message.200Request completed400Invalid filters401Invalid API key403Plan restriction404Resource missing429Quota exhausted502Source unavailableMatch context & Intelligence
The context and analytics endpoints compute an integration-ready snapshot from available match history, tactical models and live streams.
home.formUp to five completed matcheshome.eloDerived strength ratinganalytics.expectedGoalsxG models and goal expectancyanalytics.oddsBenchmarkProjected fair odds & win percentagesanalytics.momentumAttack pressure index and fatigue riskheadToHeadAvailable previous meetingsTyped, predictable errors
Errors use stable codes, including invalid_api_key, monthly_quota_exceeded, api_key_required, match_not_found and source_unavailable. Requests querying nonexistent matches or retired non-EPL legacy OpenFootball prefixes (such as match_of_es1_*) return HTTP 404 with match_not_found.
{ "error": { "code": "api_key_required", "message": "Use a Developer API key for this match context." } }Live API
Run a public-preview endpoint from this deployment and inspect the real JSON response.
/v1/matches/match_olg_83156/contextSelect an endpoint and run the request.