Sports & Fitness — entry 020 of 34
OpenLigaDB
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.
GreatAPIs Score
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.
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Get a Bundesliga matchday's results
GEThttps://api.openligadb.de/getmatchdata/bl1/2024/1
[{"matchID":72214,"matchDateTime":"2024-08-23T20:30:00","timeZoneID":"W. Europe Standard Time","leagueId":4741,"leagueName":"1. Fußball-Bundesliga 2024/2025","leagueSeason":2024,"leagueShortcut":"bl1","matchDateTimeUTC":"2024-08-23T18:30:00Z","group":{"groupName":"1. Spieltag","groupOrderID":1,"groupID":45117},"team1":{"teamId":87,"teamName":"Borussia Mönchengladbach","shortName":"Gladbach","teamIconUrl":"https://i.imgur.com/KSIk0Eu.png","teamGroupName":null},"team2":{"teamId":6,"teamName":"Bayer 04 Leverkusen","shortName":"Leverkusen","teamIconUrl":"https://www.bundesliga-reisefuehrer.de/sites/default/files/B04_Standard_Logo_RGB.png","teamGroupName":null},"lastUpdateDateTime":"2024-08-24T11:29:10.647","matchIsFinished":true,"matchResults":[{"resultID":111413,"resultName":"Halbzeitergebnis","pointsTeam1":0,"pointsTeam2":2,"resultOrderID":1,"resultTypeID":1,"resultDescription":"Ergebnis nach Ende der ersten Halbzeit"},{"resultID":111414,"resultName":"Endergebnis","pointsTeam1":2,"pointsTeam2":3,"resultOrderID":2,"resultTypeID":2,"resultDescription":"Ergebnis nach Ende der offiziellen Spielzeit"}],"goals":[{"goalID":116409,"scoreTeam1":0,"scoreTeam2":1,"matchMinute":12,"goalGetterID":14289,"goalGetterName":"Granit Xhaka","scoringTeamId":6,"isPenalty":false,"isOwnGoal":false,"isOvertime":false,"comment":null},{"...":"4 more goals, same shape"}],"location":{"locationID":32,"locationCity":"Mönchengladbach","locationStadium":"Borussia Park"},"numberOfViewers":null},{"...":"8 more matches in matchday 1, same shape"}]Try it
Developer reference
https://api.openligadb.de- GET/getmatchdata/{league}/{season}/{matchday}
- GET/getbltable/{league}/{season}
- GET/getcurrentgroup/{league}
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.