{"openapi":"3.1.1","info":{"title":"runde.tips API","version":"1.0.0","description":"Öffentliche, nur lesende API für Frontend-Clients der Haus23 Tipprunde."},"servers":[{"url":"/","description":"Aktueller Unterbau-Server"}],"tags":[{"name":"Stammdaten","description":"Turnierübergreifende Stammdaten."},{"name":"Turniere","description":"Veröffentlichte Turniere und ihre aufbereiteten Daten."}],"paths":{"/api/v1/accounts":{"get":{"operationId":"getAccounts","summary":"Mitglieder auflisten","description":"Liefert die Mitglieder der Tipprunde. Der historische Routenname `accounts` bleibt aus Kompatibilitätsgründen bestehen.","tags":["Stammdaten"],"responses":{"200":{"description":"Die Mitglieder der Tipprunde.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Accounts"}}}},"500":{"description":"Die Anfrage konnte nicht verarbeitet werden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/championships":{"get":{"operationId":"getChampionships","summary":"Turniere auflisten","description":"Liefert alle veröffentlichten Turniere, absteigend nach ihrer laufenden Nummer.","tags":["Turniere"],"responses":{"200":{"description":"Die veröffentlichten Turniere.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Championships"}}}},"500":{"description":"Die Anfrage konnte nicht verarbeitet werden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/leagues":{"get":{"operationId":"getLeagues","summary":"Ligen auflisten","tags":["Stammdaten"],"responses":{"200":{"description":"Die verfügbaren Ligen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Leagues"}}}},"500":{"description":"Die Anfrage konnte nicht verarbeitet werden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/rules":{"get":{"operationId":"getRules","summary":"Regelwerke auflisten","tags":["Stammdaten"],"responses":{"200":{"description":"Die verfügbaren Regelwerke.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rules"}}}},"500":{"description":"Die Anfrage konnte nicht verarbeitet werden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/teams":{"get":{"operationId":"getTeams","summary":"Teams auflisten","tags":["Stammdaten"],"responses":{"200":{"description":"Die verfügbaren Teams.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Teams"}}}},"500":{"description":"Die Anfrage konnte nicht verarbeitet werden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/championships/{id}/players":{"get":{"operationId":"getChampionshipPlayers","summary":"Turnierteilnehmer auflisten","description":"Liefert die Teilnehmer und ihre Mitgliedsdaten. Rang und Punkte fehlen, solange noch keine Wertung vorliegt.","tags":["Turniere"],"parameters":[{"name":"id","in":"path","required":true,"description":"Turnier-ID aus zwei Kleinbuchstaben und vier Ziffern.","example":"em2024","schema":{"type":"string","pattern":"^[a-z]{2}\\d{4}$"}}],"responses":{"200":{"description":"Die Teilnehmer des Turniers einschließlich ihrer Mitgliedsdaten.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChampionshipPlayers"}}}},"404":{"description":"Das Turnier wurde nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"406":{"description":"Die Turnier-ID hat ein ungültiges Format.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Die Anfrage konnte nicht verarbeitet werden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/championships/{id}/matches":{"get":{"operationId":"getChampionshipMatches","summary":"Turnierspiele auflisten","description":"Liefert Runden und Spiele sowie die darin tatsächlich verwendeten Teams und Ligen.","tags":["Turniere"],"parameters":[{"name":"id","in":"path","required":true,"description":"Turnier-ID aus zwei Kleinbuchstaben und vier Ziffern.","example":"em2024","schema":{"type":"string","pattern":"^[a-z]{2}\\d{4}$"}}],"responses":{"200":{"description":"Die Spiele und zugehörigen Stammdaten des Turniers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChampionshipMatches"}}}},"404":{"description":"Das Turnier wurde nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"406":{"description":"Die Turnier-ID hat ein ungültiges Format.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Die Anfrage konnte nicht verarbeitet werden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/championships/{id}/current-tips":{"get":{"operationId":"getChampionshipCurrentTips","summary":"Aktuelle Tipps abrufen","description":"Liefert einen Ausschnitt aus vier aktuellen Spielen mit den Tipps aller Teilnehmer. Für abgeschlossene Turniere wird eine leere Liste geliefert.","tags":["Turniere"],"parameters":[{"name":"id","in":"path","required":true,"description":"Turnier-ID aus zwei Kleinbuchstaben und vier Ziffern.","example":"em2024","schema":{"type":"string","pattern":"^[a-z]{2}\\d{4}$"}}],"responses":{"200":{"description":"Die aktuellen Spiele und Tipps.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChampionshipCurrentTips"}}}},"404":{"description":"Das Turnier wurde nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"406":{"description":"Die Turnier-ID hat ein ungültiges Format.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Die Anfrage konnte nicht verarbeitet werden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/championships/{id}/player-tips":{"get":{"operationId":"getChampionshipPlayerTips","summary":"Tipps eines Teilnehmers abrufen","description":"Liefert die Tipps eines über `name` ausgewählten Mitglieds. Ohne Parameter wird der erste Teilnehmer des Turniers verwendet.","tags":["Turniere"],"parameters":[{"name":"id","in":"path","required":true,"description":"Turnier-ID aus zwei Kleinbuchstaben und vier Ziffern.","example":"em2024","schema":{"type":"string","pattern":"^[a-z]{2}\\d{4}$"}},{"name":"name","in":"query","required":false,"description":"ID des Mitglieds.","schema":{"type":"string"}}],"responses":{"200":{"description":"Die nach Spiel-ID indizierten Tipps des Teilnehmers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChampionshipPlayerTips"}}}},"400":{"description":"Das Turnier hat keine Teilnehmer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Das Turnier oder der ausgewählte Teilnehmer wurde nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"406":{"description":"Die Turnier-ID oder die Mitglieds-ID ist ungültig.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Die Anfrage konnte nicht verarbeitet werden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/championships/{id}/match-tips":{"get":{"operationId":"getChampionshipMatchTips","summary":"Tipps eines Spiels abrufen","description":"Liefert die Tipps zu einem über `nr` ausgewählten Spiel. Ohne Parameter wird das zuletzt ausgewertete oder andernfalls das erste Spiel verwendet.","tags":["Turniere"],"parameters":[{"name":"id","in":"path","required":true,"description":"Turnier-ID aus zwei Kleinbuchstaben und vier Ziffern.","example":"em2024","schema":{"type":"string","pattern":"^[a-z]{2}\\d{4}$"}},{"name":"nr","in":"query","required":false,"description":"Laufende Nummer des Spiels.","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Die nach Teilnehmer-ID indizierten Tipps des Spiels.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChampionshipMatchTips"}}}},"400":{"description":"Das Turnier hat keine Spiele.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Das Turnier oder das ausgewählte Spiel wurde nicht gefunden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"406":{"description":"Die Turnier-ID hat ein ungültiges Format.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Die Anfrage konnte nicht verarbeitet werden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Accounts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9-]+$"},"name":{"type":"string","minLength":1},"email":{"anyOf":[{"const":""},{"type":"string","format":"email"}],"default":"","description":"Kontaktadresse für Benachrichtigungen. Der Unterbau ersetzt sie in öffentlichen API-Antworten durch einen leeren String."}},"required":["id","name"]}},"Championships":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z]{2}\\d{4}$"},"name":{"type":"string","minLength":1},"nr":{"type":"integer","minimum":1},"rulesId":{"type":"string","pattern":"^[a-z0-9-]+$"},"published":{"type":"boolean","description":"Gibt das Turnier für die öffentliche Anzeige frei. In Antworten der öffentlichen Unterbau-API ist dieser Wert immer true, da unveröffentlichte Turniere nicht ausgeliefert werden."},"extraPointsPublished":{"type":"boolean","description":"Steuert, ob Zusatzpunkte öffentlich sichtbar sind und in die Gesamtpunktzahl sowie das Ranking einfließen."},"completed":{"type":"boolean","description":"Kennzeichnet das Turnier als abgeschlossen. Für abgeschlossene Turniere werden keine aktuellen Tipps mehr ausgegeben."}},"required":["id","name","nr","rulesId","published","extraPointsPublished","completed"]}},"Leagues":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9-]+$"},"name":{"type":"string","minLength":1},"shortname":{"type":"string","minLength":1}},"required":["id","name","shortname"]}},"Rules":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9-]+$"},"name":{"type":"string","minLength":1},"description":{"type":"string","minLength":1},"extraQuestionsRuleId":{"enum":["keine-zusatzfragen","mit-zusatzfragen"],"type":"string"},"matchRuleId":{"enum":["keine-besonderheiten","alleiniger-treffer-drei-punkte"],"type":"string"},"roundRuleId":{"enum":["keine-besonderheiten","alles-verdoppelt"],"type":"string"},"tipRuleId":{"enum":["drei-oder-ein-punkt-joker-verdoppelt","drei-zwei-oder-ein-punkt-joker-verdoppelt"],"type":"string"}},"required":["id","name","description","extraQuestionsRuleId","matchRuleId","roundRuleId","tipRuleId"]}},"Teams":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9-]+$"},"name":{"type":"string","minLength":1},"shortname":{"type":"string","minLength":1}},"required":["id","name","shortname"]}},"ChampionshipPlayers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"playerId":{"type":"string","pattern":"^[a-z0-9-]+$"},"nr":{"type":"integer","minimum":1},"rank":{"type":"integer","minimum":1,"description":"Aktueller Rang des Teilnehmers. Fehlt, solange noch kein Spiel ausgewertet wurde."},"points":{"type":"number","description":"Summe der für alle Tipps berechneten Punkte ohne Zusatzpunkte. Fehlt, solange noch kein Spiel ausgewertet wurde."},"extraPoints":{"type":"number","description":"Punkte aus den Zusatzfragen des Turniers."},"totalPoints":{"type":"number","description":"Für das Ranking verwendete Gesamtpunktzahl. Sie enthält die Zusatzpunkte nur, wenn diese veröffentlicht sind, und fehlt vor der ersten Spielauswertung."},"account":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9-]+$"},"name":{"type":"string","minLength":1},"email":{"anyOf":[{"const":""},{"type":"string","format":"email"}],"default":"","description":"Kontaktadresse für Benachrichtigungen. Der Unterbau ersetzt sie in öffentlichen API-Antworten durch einen leeren String."}},"required":["id","name"]}},"required":["id","playerId","nr","account"]}},"ChampionshipMatches":{"type":"object","properties":{"rounds":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"nr":{"type":"integer","minimum":1},"isDoubleRound":{"type":"boolean","default":false,"description":"Kennzeichnet eine Runde mit doppelter Wertung. Die Verdopplung gilt beim entsprechenden Runden-Regelwerk zusätzlich zu einem gesetzten Joker."}},"required":["id","nr"]}},"matches":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"nr":{"type":"integer","minimum":1},"date":{"type":"string","pattern":"^\\d{4}-[01]\\d-[0-3]\\d$|^$","default":""},"result":{"type":"string","pattern":"^\\d{1,2}:\\d{1,2}$|^$","default":""},"points":{"type":"number","minimum":0,"description":"Summe der für alle Tipps dieses Spiels vergebenen Punkte. Fehlt, solange das Spiel nicht ausgewertet wurde."},"roundId":{"type":"string","minLength":1},"leagueId":{"anyOf":[{"anyOf":[{"const":""},{"type":"string","pattern":"^[a-z0-9-]+$"}]},{"type":"null"}],"default":""},"hometeamId":{"anyOf":[{"anyOf":[{"const":""},{"type":"string","pattern":"^[a-z0-9-]+$"}]},{"type":"null"}],"default":""},"awayteamId":{"anyOf":[{"anyOf":[{"const":""},{"type":"string","pattern":"^[a-z0-9-]+$"}]},{"type":"null"}],"default":""}},"required":["id","nr","roundId"]}},"teams":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9-]+$"},"name":{"type":"string","minLength":1},"shortname":{"type":"string","minLength":1}},"required":["id","name","shortname"]},"title":"Teams nach Team-ID","description":"Objekt mit der Team-ID als Schlüssel und dem zugehörigen Team als Wert."},"leagues":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9-]+$"},"name":{"type":"string","minLength":1},"shortname":{"type":"string","minLength":1}},"required":["id","name","shortname"]},"title":"Ligen nach Liga-ID","description":"Objekt mit der Liga-ID als Schlüssel und der zugehörigen Liga als Wert."}},"required":["rounds","matches","teams","leagues"]},"ChampionshipCurrentTips":{"type":"array","items":{"type":"object","properties":{"matchId":{"type":"string","minLength":1},"nr":{"type":"integer","minimum":1},"hometeam":{"type":"string","default":""},"awayteam":{"type":"string","default":""},"result":{"type":"string","pattern":"^\\d{1,2}:\\d{1,2}$|^$","default":""},"tips":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"id":{"type":"string","minLength":1},"tip":{"type":"string","pattern":"^\\d{1,2}:\\d{1,2}$|^$"},"joker":{"type":"boolean","description":"Kennzeichnet einen gesetzten Joker, der die reguläre Punktzahl des Tipps verdoppelt."},"points":{"type":"number","minimum":0,"description":"Berechnete Punktzahl einschließlich Joker-, Runden- und möglichem Alleintreffer-Bonus. Fehlt, solange das Spiel nicht ausgewertet wurde."},"lonelyHit":{"type":"boolean","description":"Ist ausschließlich true, wenn nur dieser Tipp für das Spiel Punkte erzielt hat und deshalb den Alleintreffer-Bonus erhält."},"matchId":{"type":"string","minLength":1},"playerId":{"type":"string","minLength":1}},"required":["id","tip","joker","matchId","playerId"]},"title":"Tipps nach Spieler-ID","description":"Objekt mit der Spieler-ID als Schlüssel und dem zugehörigen Tipp als Wert."}},"required":["matchId","nr","tips"]}},"ChampionshipPlayerTips":{"type":"object","properties":{"playerId":{"type":"string","minLength":1},"tips":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"id":{"type":"string","minLength":1},"tip":{"type":"string","pattern":"^\\d{1,2}:\\d{1,2}$|^$"},"joker":{"type":"boolean","description":"Kennzeichnet einen gesetzten Joker, der die reguläre Punktzahl des Tipps verdoppelt."},"points":{"type":"number","minimum":0,"description":"Berechnete Punktzahl einschließlich Joker-, Runden- und möglichem Alleintreffer-Bonus. Fehlt, solange das Spiel nicht ausgewertet wurde."},"lonelyHit":{"type":"boolean","description":"Ist ausschließlich true, wenn nur dieser Tipp für das Spiel Punkte erzielt hat und deshalb den Alleintreffer-Bonus erhält."},"matchId":{"type":"string","minLength":1},"playerId":{"type":"string","minLength":1}},"required":["id","tip","joker","matchId","playerId"]},"title":"Tipps nach Spiel-ID","description":"Objekt mit der Spiel-ID als Schlüssel und dem zugehörigen Tipp als Wert."}},"required":["playerId","tips"]},"ChampionshipMatchTips":{"type":"object","properties":{"matchId":{"type":"string","minLength":1},"tips":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"id":{"type":"string","minLength":1},"tip":{"type":"string","pattern":"^\\d{1,2}:\\d{1,2}$|^$"},"joker":{"type":"boolean","description":"Kennzeichnet einen gesetzten Joker, der die reguläre Punktzahl des Tipps verdoppelt."},"points":{"type":"number","minimum":0,"description":"Berechnete Punktzahl einschließlich Joker-, Runden- und möglichem Alleintreffer-Bonus. Fehlt, solange das Spiel nicht ausgewertet wurde."},"lonelyHit":{"type":"boolean","description":"Ist ausschließlich true, wenn nur dieser Tipp für das Spiel Punkte erzielt hat und deshalb den Alleintreffer-Bonus erhält."},"matchId":{"type":"string","minLength":1},"playerId":{"type":"string","minLength":1}},"required":["id","tip","joker","matchId","playerId"]},"title":"Tipps nach Spieler-ID","description":"Objekt mit der Spieler-ID als Schlüssel und dem zugehörigen Tipp als Wert."}},"required":["matchId","tips"]},"Error":{"type":"object","required":["status","error"],"properties":{"status":{"type":"integer","minimum":400,"maximum":599},"error":{"type":"string"}}}}}}