OpenLigaDB is a free, community-maintained JSON API for German football and other league results -- Bundesliga, 2. Bundesliga, and dozens of amateur/regional competitions -- with matches, tables, and goal-getters contributed and corrected by its own user community rather than an official league feed. No registration or API key is required to read from it, only for submitting corrections. A live probe of the real `api.openligadb.de` host reconfirmed keyless access and a wildcard `Access-Control-Allow-Origin`.
OpenLigaDB serves German football (and other league) results through path-segment REST routes — /getmatchdata/{league}/{season}/{matchday} for a matchday's fixtures, /getbltable/{league}/{season} for the current table — returning deeply nested JSON objects with inconsistent ID casing across levels. A live GET this run confirmed keyless access and a wildcard CORS header on the real api.openligadb.de host.
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSONResponses can be requested as JSON.
GreatAPIs Score
Score94out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs20/20Machine-readable spec file bundled
Formats9/15Single response format
Freshness20/20Verified within 6 months
Embed this badge
<a href="https://greatapis.com/api/openligadb/"><img src="https://greatapis.com/badge/openligadb.svg" alt="Scored 94 on greatapis.com"></a>
Auth quickstart
No API key, signup, or credit card required for any read route. A live GET against the real host this run confirmed keyless access with access-control-allow-origin: *, reconfirming the stored auth: None / cors: yes fields. Only submitting corrections to match data requires a separate community login, which is out of scope for reading data.
Stored keyNo key stored
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Endpoints
Matchdata23
GET/getavailablegroups/{leagueShortcut}/{leagueSeason}Eine Liste der Spiel-Einteilungen (Spieltag, Vorrunde, Finale, ...) der als Parameter zu übergebenden Liga + Saison
Parameters
Name
In
Required
Type
leagueShortcut
path
yes
string
leagueSeason
path
yes
integer
Responses
Status
Description
Schema
200
OK
—
GET/getavailableleagues
Responses
Status
Description
Schema
200
OK
—
GET/getavailableleagues/{season}
Parameters
Name
In
Required
Type
season
path
yes
integer
Responses
Status
Description
Schema
200
OK
—
GET/getavailablesports
Responses
Status
Description
Schema
200
OK
—
GET/getavailableteams/{leagueShortcut}/{leagueSeason}Eine Liste der Teams der als Parameter zu übergebenden Liga + Saison
Parameters
Name
In
Required
Type
leagueShortcut
path
yes
string
leagueSeason
path
yes
integer
Responses
Status
Description
Schema
200
OK
—
GET/getbltable/{leagueShortcut}/{leagueSeason}returns the table
Parameters
Name
In
Required
Type
leagueShortcut
path
yes
string
leagueSeason
path
yes
integer
Responses
Status
Description
Schema
200
OK
—
GET/getcurrentgroup/{leagueShortcut}Gibt die aktuelle Group (entspricht z.B. bei der Fussball-Bundesliga dem 'Spieltag') des als Parameter zu übergebenden leagueShortcuts (z.B. 'bl1') aus. Der aktuelle Spieltag
wird jeweils zur Hälfte der Zeit zwischen dem letzten Spiel des letzten Spieltages und dem ersten Spiel des nächsten Spieltages erhöht.
Parameters
Name
In
Required
Type
leagueShortcut
path
yes
string
Responses
Status
Description
Schema
200
OK
Group
GET/getgoalgetters/{leagueShortcut}/{leagueSeason}Eine Liste der Spiel-Einteilungen (Spieltag, Vorrunde, Finale, ...) der als Parameter zu übergebenden Liga + Saison
Parameters
Name
In
Required
Type
leagueShortcut
path
yes
string
leagueSeason
path
yes
integer
Responses
Status
Description
Schema
200
OK
—
GET/getgrouptable/{leagueShortcut}/{leagueSeason}returns the table
Parameters
Name
In
Required
Type
leagueShortcut
path
yes
string
leagueSeason
path
yes
integer
Responses
Status
Description
Schema
200
OK
—
GET/getlastchangedate/{leagueShortcut}/{leagueSeason}/{groupOrderId}Gibt ein DateTime-Objekt der letzten Änderung der Daten der übergebenen Liga (leagueShortcut) für die übergebene Saison (leagueSeason) für den übergebenen Spieltag (groupOrderId) zurueck.
Parameters
Name
In
Required
Type
leagueShortcut
path
yes
string
leagueSeason
path
yes
integer
groupOrderId
path
yes
integer
Responses
Status
Description
Schema
200
OK
—
GET/getlastmatchbyleagueshortcut/{leagueShortcut}Gibt das letzte Spiel des übergebenen LigaShortcuts zurueck.
Parameters
Name
In
Required
Type
leagueShortcut
path
yes
string
Responses
Status
Description
Schema
200
OK
Match
GET/getlastmatchbyleagueteam/{leagueId}/{teamId}Gibt das letzte zurückliegende Spiel der übergebenen Liga (leagueId) des übergebenen Teams (teamId) zurueck.
Parameters
Name
In
Required
Type
leagueId
path
yes
integer
teamId
path
yes
integer
Responses
Status
Description
Schema
200
OK
Match
GET/getmatchdata/{leagueShortcut}/{leagueSeason}Gibt eine Struktur von Spieldaten aller Spiele der übergebenen Liga (leagueShortcut) für die gesamte übergebene Saison (leagueSeason) zurueck.
GET/getmatchdata/{leagueShortcut}/{leagueSeason}/{teamFilterstring}Gibt eine Struktur von Spieldaten aller Spiele eines Teams der übergebenen Liga (leagueShortcut) für die gesamte übergebene Saison (leagueSeason) für das im "teamFilterstring" übergebene Team zurueck.
Hier reicht ein Teil des Vereinsnamen aus.
Parameters
Name
In
Required
Type
leagueShortcut
path
yes
string
leagueSeason
path
yes
integer
teamFilterstring
path
yes
string
Responses
Status
Description
Schema
200
OK
—
GET/getmatchdata/{matchId}
Parameters
Name
In
Required
Type
matchId
path
yes
integer
Responses
Status
Description
Schema
200
OK
Match
GET/getmatchdata/{teamId1}/{teamId2}Gibt eine Struktur von Matches zurück, bei welchen die als Parameter übergebenen Teams gegeneinander spielen.
GET/getnextmatchbyleagueshortcut/{leagueShortcut}Gibt das nächste folgende Spiel des übergebenen LigaShortcuts zurueck.
Parameters
Name
In
Required
Type
leagueShortcut
path
yes
string
Responses
Status
Description
Schema
200
OK
Match
GET/getnextmatchbyleagueteam/{leagueId}/{teamId}Gibt das nächste folgende Spiel der übergebenen Liga (leagueId) des übergebenen Teams (teamId) zurueck.
Parameters
Name
In
Required
Type
leagueId
path
yes
integer
teamId
path
yes
integer
Responses
Status
Description
Schema
200
OK
Match
GET/getresultinfos/{leagueId}Gibt die für diese Liga konfigurierten Ergebnistypen zurück!
Parameters
Name
In
Required
Type
leagueId
path
yes
integer
Responses
Status
Description
Schema
200
OK
ResultInfo
GET/getresulttypesGibt die globalen, Liga-übergreifenden Ergebnistypen zurück, inklusive ihrer
maschinenlesbaren Bedeutung (Kind: "HalfTime", "After90Minutes", "AfterExtraTime",
"AfterPenalties" oder "Unknown").
An unknown league or an out-of-range matchday doesn't 404 — it returns HTTP 200 with a bare empty array: a live GET /getmatchdata/doesnotexist/2024/1 and a live GET /getmatchdata/bl1/2024/999 this run both returned [] at 200, so an empty array means "no such league/matchday," not a request error.
ID field casing is inconsistent within the same response: this run's transcript above shows matchID (capital ID) at the top level, leagueId and teamId (lowercase d) one level down, and timeZoneID (capital ID again) beside them — don't assume one casing convention holds across the whole object graph.
A not-yet-played match has matchIsFinished: false with matchResults and goals as empty arrays and location: null, not omitted fields: a live GET /getmatchdata/bl1/2026/1 this run (the 2026/2027 season, not yet started) returned exactly that shape for every upcoming fixture.
matchResults holds both the halftime and full-time score in the same array, distinguished only by resultTypeID (1 = Halbzeitergebnis/halftime, 2 = Endergebnis/full-time) — reading the last array entry happens to work for finished matches in this transcript but only because full-time is always ordered after halftime, not because the array is guaranteed length 2.
CORS is wide open: a live GET with Origin: https://greatapis.com this run returned access-control-allow-origin: *, reconfirming the stored cors: yes field.