Sports & Fitness — entry 019 of 33

OpenLigaDB

Verified Aug 2026

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.

footballsoccerbundesligacrowd-sourcedgermany
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

Scored 94 on greatapis.com
<a href="https://greatapis.com/api/openligadb/"><img src="https://greatapis.com/badge/openligadb.svg" alt="Scored 94 on greatapis.com"></a>

Auth quickstart

  1. 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
NameInRequiredType
leagueShortcutpathyesstring
leagueSeasonpathyesinteger
Responses
StatusDescriptionSchema
200OK
GET/getavailableleagues
Responses
StatusDescriptionSchema
200OK
GET/getavailableleagues/{season}
Parameters
NameInRequiredType
seasonpathyesinteger
Responses
StatusDescriptionSchema
200OK
GET/getavailablesports
Responses
StatusDescriptionSchema
200OK
GET/getavailableteams/{leagueShortcut}/{leagueSeason}Eine Liste der Teams der als Parameter zu übergebenden Liga + Saison
Parameters
NameInRequiredType
leagueShortcutpathyesstring
leagueSeasonpathyesinteger
Responses
StatusDescriptionSchema
200OK
GET/getbltable/{leagueShortcut}/{leagueSeason}returns the table
Parameters
NameInRequiredType
leagueShortcutpathyesstring
leagueSeasonpathyesinteger
Responses
StatusDescriptionSchema
200OK
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
NameInRequiredType
leagueShortcutpathyesstring
Responses
StatusDescriptionSchema
200OKGroup
GET/getgoalgetters/{leagueShortcut}/{leagueSeason}Eine Liste der Spiel-Einteilungen (Spieltag, Vorrunde, Finale, ...) der als Parameter zu übergebenden Liga + Saison
Parameters
NameInRequiredType
leagueShortcutpathyesstring
leagueSeasonpathyesinteger
Responses
StatusDescriptionSchema
200OK
GET/getgrouptable/{leagueShortcut}/{leagueSeason}returns the table
Parameters
NameInRequiredType
leagueShortcutpathyesstring
leagueSeasonpathyesinteger
Responses
StatusDescriptionSchema
200OK
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
NameInRequiredType
leagueShortcutpathyesstring
leagueSeasonpathyesinteger
groupOrderIdpathyesinteger
Responses
StatusDescriptionSchema
200OK
GET/getlastmatchbyleagueshortcut/{leagueShortcut}Gibt das letzte Spiel des übergebenen LigaShortcuts zurueck.
Parameters
NameInRequiredType
leagueShortcutpathyesstring
Responses
StatusDescriptionSchema
200OKMatch
GET/getlastmatchbyleagueteam/{leagueId}/{teamId}Gibt das letzte zurückliegende Spiel der übergebenen Liga (leagueId) des übergebenen Teams (teamId) zurueck.
Parameters
NameInRequiredType
leagueIdpathyesinteger
teamIdpathyesinteger
Responses
StatusDescriptionSchema
200OKMatch
GET/getmatchdata/{leagueShortcut}/{leagueSeason}Gibt eine Struktur von Spieldaten aller Spiele der übergebenen Liga (leagueShortcut) für die gesamte übergebene Saison (leagueSeason) zurueck.
Parameters
NameInRequiredType
leagueShortcutpathyesstring
leagueSeasonpathyesinteger
Responses
StatusDescriptionSchema
200OK
GET/getmatchdata/{leagueShortcut}/{leagueSeason}/{groupOrderId}
Parameters
NameInRequiredType
leagueShortcutpathyesstring
leagueSeasonpathyesinteger
groupOrderIdpathyesinteger
Responses
StatusDescriptionSchema
200OK
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
NameInRequiredType
leagueShortcutpathyesstring
leagueSeasonpathyesinteger
teamFilterstringpathyesstring
Responses
StatusDescriptionSchema
200OK
GET/getmatchdata/{matchId}
Parameters
NameInRequiredType
matchIdpathyesinteger
Responses
StatusDescriptionSchema
200OKMatch
GET/getmatchdata/{teamId1}/{teamId2}Gibt eine Struktur von Matches zurück, bei welchen die als Parameter übergebenen Teams gegeneinander spielen.
Parameters
NameInRequiredType
teamId1pathyesinteger
teamId2pathyesinteger
Responses
StatusDescriptionSchema
200OK
GET/getmatchesbyteam/{teamFilterstring}/{weekCountPast}/{weekCountFuture}
Parameters
NameInRequiredType
teamFilterstringpathyesstring
weekCountPastpathyesinteger
weekCountFuturepathyesinteger
Responses
StatusDescriptionSchema
200OK
GET/getmatchesbyteamid/{teamId}/{weekCountPast}/{weekCountFuture}
Parameters
NameInRequiredType
teamIdpathyesinteger
weekCountPastpathyesinteger
weekCountFuturepathyesinteger
Responses
StatusDescriptionSchema
200OK
GET/getnextmatchbyleagueshortcut/{leagueShortcut}Gibt das nächste folgende Spiel des übergebenen LigaShortcuts zurueck.
Parameters
NameInRequiredType
leagueShortcutpathyesstring
Responses
StatusDescriptionSchema
200OKMatch
GET/getnextmatchbyleagueteam/{leagueId}/{teamId}Gibt das nächste folgende Spiel der übergebenen Liga (leagueId) des übergebenen Teams (teamId) zurueck.
Parameters
NameInRequiredType
leagueIdpathyesinteger
teamIdpathyesinteger
Responses
StatusDescriptionSchema
200OKMatch
GET/getresultinfos/{leagueId}Gibt die für diese Liga konfigurierten Ergebnistypen zurück!
Parameters
NameInRequiredType
leagueIdpathyesinteger
Responses
StatusDescriptionSchema
200OKResultInfo
GET/getresulttypesGibt die globalen, Liga-übergreifenden Ergebnistypen zurück, inklusive ihrer maschinenlesbaren Bedeutung (Kind: "HalfTime", "After90Minutes", "AfterExtraTime", "AfterPenalties" oder "Unknown").
Responses
StatusDescriptionSchema
200OK

Try it

Developer reference

Base URLhttps://api.openligadb.de
Key endpoints
  • GET/getmatchdata/{leagueShortcut}/{leagueSeason}/{groupOrderId}
  • GET/getbltable/{leagueShortcut}/{leagueSeason}
  • GET/getcurrentgroup/{leagueShortcut}

Gotchas & limits

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

Changelog

Spec versionv1
Tracked paths23
  • Aug 2026gained an OpenAPI spec

Tracking since Sep 2026. See every tracked change ↗ ·Subscribe with RSS ↗