{"openapi":"3.1.0","info":{"title":"Dart Backend API","description":"Erweiterbares Backend fuer Training, lokale 1vs1-Spiele, Wettbewerb, Vereine und Ranglisten.","version":"0.1.0"},"paths":{"/players/":{"post":{"tags":["Players"],"summary":"Spieler anlegen","description":"Minimaltest in Swagger: alias, first_name und optional email setzen.","operationId":"create_player_players__post","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Players"],"summary":"Alle Spieler laden","description":"Schnelltest: einfach ausfuehren, um alle bereits angelegten Spieler zu sehen.","operationId":"get_players_players__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"club_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlayerRead"},"title":"Response Get Players Players  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/players/list":{"get":{"tags":["Players"],"summary":"Spielerliste mit Meta laden","description":"Frontend-freundlicher Wrapper fuer Listenansichten mit items und meta.","operationId":"get_players_list_players_list_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"club_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/players/me/stats/dashboard":{"get":{"tags":["Players"],"summary":"Spieler-Statistik-Dashboard laden","description":"Liefert eine umfassende Statistik-Zusammenfassung für das iOS-Dashboard. window: all | month | year. mode_name: 301 | 501 | 701 | 1001 (optional).","operationId":"get_player_stats_dashboard_players_me_stats_dashboard_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Window"}},{"name":"mode_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerStatsDashboardSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/players/me/notification-preferences":{"get":{"tags":["Players"],"summary":"Eigene Notification-Praeferenzen laden","operationId":"get_my_notification_preferences_players_me_notification_preferences_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerNotificationPreferencesRead"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["Players"],"summary":"Eigene Notification-Praeferenzen aktualisieren (partial)","operationId":"patch_my_notification_preferences_players_me_notification_preferences_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerNotificationPreferencesPatch"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerNotificationPreferencesRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/players/compare/{player_one_id}/{player_two_id}":{"get":{"tags":["Players"],"summary":"Direkter Vergleich zweier Spieler","description":"Vergleicht zwei Spieler auf Basis gemeinsamer abgeschlossener Sessions.","operationId":"compare_players_players_compare__player_one_id___player_two_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_one_id","in":"path","required":true,"schema":{"type":"integer","title":"Player One Id"}},{"name":"player_two_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Two Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeadToHeadRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/players/{player_id}":{"get":{"tags":["Players"],"summary":"Einzelnen Spieler laden","description":"Schnelltest: player_id z. B. 1 verwenden, nachdem ein Spieler angelegt wurde.","operationId":"get_player_players__player_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/players/{player_id}/profile":{"put":{"tags":["Players"],"summary":"Spielerprofil anlegen oder aktualisieren","description":"Minimaltest: nickname setzen; player_id vorher ueber POST /players erzeugen.","operationId":"upsert_profile_players__player_id__profile_put","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerProfileUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerProfileRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/players/{player_id}/extended-profile":{"put":{"tags":["Players"],"summary":"Ausfuehrliches Spielerprofil anlegen oder aktualisieren","description":"Pflegt tiefergehende Spielerangaben wie Lieblingsdoppel, Trainingsfokus oder Material.","operationId":"upsert_extended_profile_players__player_id__extended_profile_put","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerExtendedProfileUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerExtendedProfileRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/players/{player_id}/stats":{"get":{"tags":["Players"],"summary":"Spielerstatistiken abrufen","description":"Schnelltest: player_id eines vorhandenen Spielers eintragen. Nach ersten Visits werden Werte sichtbar.","operationId":"get_player_stats_players__player_id__stats_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerStatsRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/players/{player_id}/stats-window":{"get":{"tags":["Players"],"summary":"Spielerstatistik fuer ein Zeitfenster laden","description":"Unterstuetzt 7d, 30d, 90d und 365d fuer den StartView des Frontends.","operationId":"get_player_stats_window_players__player_id__stats_window_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}},{"name":"window","in":"query","required":false,"schema":{"enum":["7d","30d","90d","365d"],"type":"string","default":"30d","title":"Window"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerStatsWindowRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/players/{player_id}/full-profile":{"get":{"tags":["Players"],"summary":"Ausfuehrliches Spieler-Vollprofil abrufen","description":"Liefert Stammdaten, Basisprofil, Zusatzprofil, Statistik und Vereinszuordnungen eines Spielers.","operationId":"get_player_full_profile_players__player_id__full_profile_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerFullProfileRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Players"],"summary":"Komplettes Spielerprofil aktualisieren","description":"Pflegt Stammdaten, Profil, erweitertes Profil und optional den aktiven Verein in einem API-Call.","operationId":"update_player_full_profile_players__player_id__full_profile_put","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerFullProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerFullProfileRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/players/{player_id}/stats/snapshot":{"post":{"tags":["Players"],"summary":"Statistik-Snapshot erzeugen","description":"Erstellt einen gespeicherten Snapshot der aktuellen Spielerstatistik.","operationId":"create_stats_snapshot_players__player_id__stats_snapshot_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerStatsRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/players/me/dartsets":{"get":{"tags":["Players"],"summary":"Eigene Dartsets auflisten","operationId":"list_my_dartsets_players_me_dartsets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerDartSetListResponse"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["Players"],"summary":"Dartset erstellen","operationId":"create_my_dartset_players_me_dartsets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerDartSetCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerDartSetRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/players/me/dartsets/{dartset_id}":{"patch":{"tags":["Players"],"summary":"Dartset aktualisieren (partial)","operationId":"update_my_dartset_players_me_dartsets__dartset_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"dartset_id","in":"path","required":true,"schema":{"type":"integer","title":"Dartset Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerDartSetUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerDartSetRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Players"],"summary":"Dartset löschen (soft delete)","operationId":"delete_my_dartset_players_me_dartsets__dartset_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"dartset_id","in":"path","required":true,"schema":{"type":"integer","title":"Dartset Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/players/me/dartsets/{dartset_id}/set-active":{"post":{"tags":["Players"],"summary":"Dartset als aktiv markieren","operationId":"set_active_dartset_players_me_dartsets__dartset_id__set_active_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"dartset_id","in":"path","required":true,"schema":{"type":"integer","title":"Dartset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerDartSetRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"tags":["Auth"],"summary":"Aktuellen Account laden","operationId":"get_me_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthMeRead"}}}}},"security":[{"BearerAuth":[]}]}},"/auth/refresh":{"post":{"tags":["Auth"],"summary":"Session erneuern","description":"Rotiert ein Refresh-Token-Paar.\n\nErwartet den Refresh Token im Authorization Bearer Header.\nReuse Detection: wenn ein bereits revoked_at-gesetzter Refresh Token\npraesentiert wird, wird die gesamte Family widerrufen.","operationId":"refresh_session_auth_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"BearerAuth":[]}]}},"/auth/logout":{"post":{"tags":["Auth"],"summary":"Session beenden","description":"Widerruft die aktuelle Session anhand des Access Tokens (serverseitig).","operationId":"logout_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"BearerAuth":[]}]}},"/auth/me/dashboard":{"get":{"tags":["Auth"],"summary":"StartView-Dashboard des aktuellen Spielers laden","operationId":"get_my_dashboard_auth_me_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerHomeDashboardRead"}}}}},"security":[{"BearerAuth":[]}]}},"/auth/players/register":{"post":{"tags":["Auth"],"summary":"Spieler registrieren","description":"Registrierung mit E-Mail und Passwort. Legt Spieler, Basisprofil, ausfuehrliches Profil und Account an.","operationId":"register_player_auth_players_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerAccountRegister"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerAuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/players/login":{"post":{"tags":["Auth"],"summary":"Spieler einloggen","description":"Login fuer registrierte Spieleraccounts per E-Mail und Passwort.","operationId":"login_player_auth_players_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerAuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/players/oauth":{"post":{"tags":["Auth"],"summary":"Spieler per Google oder Apple/Game Center registrieren oder einloggen","description":"Erwartet bereits im Frontend verifizierte Providerdaten. Im Backend wird die externe Identitaet gespeichert.","operationId":"oauth_player_auth_players_oauth_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerOAuthRegister"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerAuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/players/{player_id}/account":{"put":{"tags":["Auth"],"summary":"Spieler-Stammdaten aktualisieren","description":"Bearbeitet Alias, Vorname, Nachname, E-Mail und Geburtsdatum eines Spielers.","operationId":"update_player_account_auth_players__player_id__account_put","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerAccountUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerAuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/players/{player_id}/change-password":{"post":{"tags":["Auth"],"summary":"Spieler-Passwort aendern","description":"Aendert das Passwort nach erfolgreicher Authentifizierung.","operationId":"change_player_password_auth_players__player_id__change_password_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChangeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/players/forgot-password":{"post":{"tags":["Auth"],"summary":"Passwort-Reset fuer Spieler anfragen","description":"Sendet eine Reset-E-Mail mit einem einmaligen Link, falls ein Account existiert. Die Antwort ist identisch, unabhaengig davon ob die E-Mail bekannt ist (Account-Enumeration-Schutz).","operationId":"forgot_player_password_auth_players_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/players/reset-password":{"post":{"tags":["Auth"],"summary":"Spieler-Passwort per Reset-Token setzen","description":"Setzt das Passwort mit einem gueltigen Reset-Token. Der Token ist einmalig und 20 Minuten gueltig. Bestehende Sessions werden nach erfolgreichem Reset widerrufen.","operationId":"reset_player_password_auth_players_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirm"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/players/me/club-team-history":{"get":{"tags":["Auth"],"summary":"Eigene Mannschafts-Mitgliedschaftshistorie","description":"Gibt alle Mannschaftsmitgliedschaften des eingeloggten Spielers zurück (aktiv + historisch).","operationId":"get_my_club_team_history_auth_players_me_club_team_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PlayerClubTeamHistoryRead"},"type":"array","title":"Response Get My Club Team History Auth Players Me Club Team History Get"}}}}},"security":[{"BearerAuth":[]}]}},"/auth/players/me/export":{"get":{"tags":["Auth"],"summary":"Eigene Daten exportieren (DSGVO Art. 20)","description":"Gibt alle personenbezogenen Daten des eingeloggten Spielers als JSON zurück. Erfordert gültigen Bearer Token. Anonymisierte/gelöschte Accounts können nicht exportiert werden (Token ist bei Löschung bereits widerrufen). Keine Passwort-Hashes, Tokens oder fremde personenbezogene Daten im Export.","operationId":"export_player_data_auth_players_me_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"BearerAuth":[]}]}},"/auth/players/me":{"delete":{"tags":["Auth"],"summary":"Account loeschen (Anonymisierung)","description":"Loescht den eigenen Spieleraccount gemaess Apple Review Guideline 5.1.1(v). Persoenliche Daten (Name, E-Mail, Passwort, Profil) werden sofort entfernt. Die anonymisierte Spielhistorie (Match-Daten) bleibt fuer andere Teilnehmer erhalten. Alle aktiven Sessions werden sofort widerrufen — der Token ist danach unguelig.","operationId":"delete_player_me_auth_players_me_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"BearerAuth":[]}]}},"/auth/social/identities":{"get":{"tags":["Auth"],"summary":"Verknüpfte Social Identities auflisten","description":"Gibt alle verknüpften Social Provider (Google, Apple) des aktuellen Spielers zurück. Provider Subjects werden nicht ausgegeben. can_unlink zeigt an, ob der Provider getrennt werden darf, ohne den Account zu sperren.","operationId":"list_social_identities_auth_social_identities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SocialIdentityRead"},"type":"array","title":"Response List Social Identities Auth Social Identities Get"}}}}},"security":[{"BearerAuth":[]}]}},"/auth/social/link/{provider}":{"post":{"tags":["Auth"],"summary":"Social Provider verknüpfen","description":"Verknüpft einen Social Provider (google oder apple_game_center) mit dem eingeloggten Spieler-Account. Idempotent: wird derselbe Provider Subject erneut gesendet, wird der bestehende Eintrag zurückgegeben. Fehler 409, wenn der Provider Subject bereits zu einem anderen Throwly-Account gehört. Kein E-Mail-basiertes Auto-Linking.","operationId":"link_social_provider_auth_social_link__provider__post","security":[{"BearerAuth":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialLinkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/social/identities/{provider}":{"delete":{"tags":["Auth"],"summary":"Social Provider trennen","description":"Entfernt die Verknüpfung mit einem Social Provider. Nicht möglich, wenn dies die einzige verbleibende Login-Methode wäre (409). 404, wenn der Provider nicht verknüpft ist.","operationId":"unlink_social_provider_auth_social_identities__provider__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialUnlinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/clubs/register":{"post":{"tags":["Auth"],"summary":"Verein mit Adminzugang registrieren","description":"Legt Verein, Vereinsprofil und den ersten Vereinsadmin mit separatem Zugang an.","operationId":"register_club_auth_clubs_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubAdminRegister"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubAdminAuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/clubs/oauth":{"post":{"tags":["Auth"],"summary":"Vereinsadmin per Google oder Apple/Game Center registrieren oder einloggen","description":"Erwartet bereits im Frontend verifizierte Providerdaten und erstellt den separaten Vereinsadminzugang.","operationId":"oauth_club_admin_auth_clubs_oauth_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubAdminOAuthRegister"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubAdminAuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/clubs/login":{"post":{"tags":["Auth"],"summary":"Vereinsadmin einloggen","description":"Separater Login fuer Vereinsadmins. Token ist fuer Freigaben und Verwaltung gedacht.","operationId":"login_club_admin_auth_clubs_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubAdminAuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/clubs/{club_id}/account":{"put":{"tags":["Auth"],"summary":"Vereins- und Admin-Stammdaten aktualisieren","description":"Bearbeitet Verein, Vereinsprofil und die Stammdaten des zustaendigen Vereinsadmins.","operationId":"update_club_account_auth_clubs__club_id__account_put","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubAdminAccountUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubAdminAuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/clubs/{club_id}/change-password":{"post":{"tags":["Auth"],"summary":"Vereinsadmin-Passwort aendern","description":"Aendert das Passwort des angemeldeten Vereinsadmins.","operationId":"change_club_admin_password_auth_clubs__club_id__change_password_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChangeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/clubs/forgot-password":{"post":{"tags":["Auth"],"summary":"Passwort-Reset fuer Vereinsadmin anfragen","description":"Sendet eine Reset-E-Mail mit einem einmaligen Link, falls ein Admin-Account existiert. Die Antwort ist identisch, unabhaengig davon ob die E-Mail bekannt ist (Account-Enumeration-Schutz).","operationId":"forgot_club_admin_password_auth_clubs_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/clubs/reset-password":{"post":{"tags":["Auth"],"summary":"Vereinsadmin-Passwort per Reset-Token setzen","description":"Setzt das Passwort mit einem gueltigen Reset-Token. Der Token ist einmalig und 20 Minuten gueltig. Bestehende Sessions werden nach erfolgreichem Reset widerrufen.","operationId":"reset_club_admin_password_auth_clubs_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirm"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/":{"post":{"tags":["Clubs"],"summary":"Verein anlegen","description":"Erfordert Spieler-Token. Legt den Verein an und traegt den aufrufenden Spieler als aktives Mitglied mit Rolle admin ein. Club-Admin-Portal-Tokens (Vereinsadmin) sind nicht zulaessig — nutze dafuer den separaten Registrierungsflow.","operationId":"create_club_clubs__post","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Clubs"],"summary":"Alle Vereine laden","description":"Stammdaten-Kurzliste (id, name, short_name, city, country_code, description). Keine Mitgliedschaften, Kontakte, Events oder Profilfelder (18N).","operationId":"list_clubs_clubs__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"city","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"}},{"name":"country_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"}},{"name":"recruiting","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Recruiting"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClubSummaryRead"},"title":"Response List Clubs Clubs  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/list":{"get":{"tags":["Clubs"],"summary":"Vereinsliste mit Meta laden","description":"Frontend-freundlicher Wrapper mit `items` und `meta`. Items sind Kurzstammdaten wie bei GET /clubs/ (18N, keine sensiblen Listen).","operationId":"list_clubs_wrapped_clubs_list_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"city","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"}},{"name":"country_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"}},{"name":"recruiting","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Recruiting"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/ranking":{"get":{"tags":["Clubs"],"summary":"Vereins-Ranking","description":"Ranking aller Vereine nach Rating-Summe, Mitgliederzahl, Team-Durchschnitt, Siegquote, Match-Anzahl oder Name (ohne Spieler-Ranking; gleiche KPI-Definition wie bei der Vereins-Public-Overview). Erfordert Bearer-Auth; keine Listen sensibler personenbezogener Daten.","operationId":"get_clubs_ranking_clubs_ranking_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"metric","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ClubRankingMetric","default":"team_average"}},{"name":"mode","in":"query","required":false,"schema":{"enum":["top_n","around_club"],"type":"string","default":"top_n","title":"Mode"}},{"name":"club_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"city","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"}},{"name":"country_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubRankingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/mine":{"get":{"tags":["Clubs"],"summary":"Eigene aktive Vereinsmitgliedschaften","description":"Liste aller aktiven Mitgliedschaften des Spielers mit Rolle, Status sowie Flags fuer bevorzugten (`is_preferred`) und effektiv aktiven Club-Hub-Verein (`is_active`). Nur Spieler-App-Token.","operationId":"list_my_clubs_clubs_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/MyClubMembershipRead"},"type":"array","title":"Response List My Clubs Clubs Mine Get"}}}}},"security":[{"BearerAuth":[]}]}},"/clubs/mine/active":{"patch":{"tags":["Clubs"],"summary":"Bevorzugten Verein fuer den Club Hub setzen","description":"Setzt `preferred_club_id`, sofern der Verein existiert und eine aktive Mitgliedschaft besteht. Nur Spieler-App-Token. Ungueltige `club_id`: 404; ohne Mitgliedschaft: 403.","operationId":"patch_my_active_club_clubs_mine_active_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPlayerPreferredClubBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActiveClubRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/clubs/{club_id}":{"get":{"tags":["Clubs"],"summary":"Einzelnen Verein laden","description":"Schnelltest: club_id aus POST /clubs/ verwenden.","operationId":"get_club_clubs__club_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Clubs"],"summary":"Vereins-Stammdaten aktualisieren","description":"Aktualisiert Name, Kuerzel, Stadt, Land (ISO-2) und Beschreibung. Nur gesetzte Felder werden geaendert. Vereins-Manager/Admins; Duplikate von Name/Kuerzel werden abgelehnt.","operationId":"patch_club_identity_clubs__club_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubIdentityUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/profile":{"put":{"tags":["Clubs"],"summary":"Vereinsprofil anlegen oder aktualisieren","description":"Pflegt tiefere Vereinsangaben wie Heimspielstaette, Trainingstage oder Liga.","operationId":"upsert_club_profile_clubs__club_id__profile_put","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubProfileUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubProfileRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/full-profile":{"get":{"tags":["Clubs"],"summary":"Ausfuehrliches Vereins-Vollprofil laden","description":"Liefert Stammdaten, Profil, Admins, Kontakte, Events, Mitglieder und offene Anfragen.","operationId":"get_club_full_profile_clubs__club_id__full_profile_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubFullProfileRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/dashboard":{"get":{"tags":["Clubs"],"summary":"Frontend-fertiges Club-Dashboard laden","description":"Kompakte Club-KPIs fuer eingeloggte aktive Mitglieder oder Vereins-Administration. Sonst 403 (18N).","operationId":"get_club_dashboard_clubs__club_id__dashboard_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubDashboardRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/overview":{"get":{"tags":["Clubs"],"summary":"Vereinsuebersicht (aggregiert)","description":"Interne Uebersicht fuer Club-Home (Stammdaten, KPIs, Kontakte, Mitgliedervorschau, Termine). Nur fuer aktive Vereinsmitglieder oder Vereins-Administration; sonst 403 — fuer fremde Vereine GET /clubs/{club_id}/public-overview nutzen. Erfordert Bearer-Auth.","operationId":"get_club_overview_clubs__club_id__overview_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"club_season_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Season Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubOverviewRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/public-overview":{"get":{"tags":["Clubs"],"summary":"Oeffentliche Vereinsuebersicht (eingeloggt)","description":"Kompakte, oeffentliche Vereinsdaten fuer fremde Vereine: keine Admins, Kontakte, Mitgliedervorschau oder interne Befugnisse. Erfordert Bearer-Auth (viewer-Flags).","operationId":"get_club_public_overview_clubs__club_id__public_overview_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicClubOverviewRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/matches":{"get":{"tags":["Clubs"],"summary":"Club-Match-Historie laden","description":"Gibt Matches des Clubs zurueck, sortiert nach started_at DESC. Nur aktive Mitglieder oder Vereins-Administration. Filter: limit (max 100), offset, mode_name (301|501|701|1001), from_date, to_date.","operationId":"get_club_match_history_clubs__club_id__matches_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"mode_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode Name"}},{"name":"from_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From Date"}},{"name":"to_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMatchHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/activity":{"get":{"tags":["Clubs"],"summary":"Club-Aktivitätsübersicht","description":"Kompakte Aktivitätszusammenfassung eines Clubs: Gesamt-Matches, Matches der letzten 7/30 Tage, aktive Spieler (30 Tage), letztes Match und Modus-Aufteilung. Nur aktive Mitglieder oder Vereins-Administration. Nicht-Mitglieder: 403. Unbekannter Club: 404.","operationId":"get_club_activity_clubs__club_id__activity_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubActivitySummaryRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/team-standings":{"get":{"tags":["Clubs"],"summary":"Club-interne Team-Tabelle laden","operationId":"get_club_team_standings_clubs__club_id__team_standings_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"club_season_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Season Id"}},{"name":"club_competition_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Competition Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTeamStandingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/teams":{"get":{"tags":["Clubs"],"summary":"Mannschaften eines Vereins laden","operationId":"list_club_teams_clubs__club_id__teams_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"club_season_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Season Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClubTeamRead"},"title":"Response List Club Teams Clubs  Club Id  Teams Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Clubs"],"summary":"Mannschaft anlegen","operationId":"create_club_team_clubs__club_id__teams_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTeamCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTeamRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/teams/{team_id}":{"get":{"tags":["Clubs"],"summary":"Mannschaftsdetails laden","operationId":"get_club_team_clubs__club_id__teams__team_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}},{"name":"club_season_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Season Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTeamRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Clubs"],"summary":"Mannschaft aktualisieren","operationId":"patch_club_team_clubs__club_id__teams__team_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTeamUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTeamRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Clubs"],"summary":"Mannschaft deaktivieren","operationId":"delete_club_team_clubs__club_id__teams__team_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTeamRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/teams/{team_id}/members":{"get":{"tags":["Clubs"],"summary":"Mannschaftsmitglieder laden (aktiv + historisch)","operationId":"list_team_members_clubs__club_id__teams__team_id__members_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClubTeamMembersListRead"},"title":"Response List Team Members Clubs  Club Id  Teams  Team Id  Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Clubs"],"summary":"Spieler zu Mannschaft hinzufügen","operationId":"add_player_to_team_clubs__club_id__teams__team_id__members_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTeamMemberCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTeamMemberRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/teams/{team_id}/player-stats":{"get":{"tags":["Clubs"],"summary":"Spieler-Einsatzstatistiken für eine Mannschaft laden","operationId":"get_club_team_player_stats_clubs__club_id__teams__team_id__player_stats_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}},{"name":"club_season_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Season Id"}},{"name":"include_former_members","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Former Members"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTeamPlayerStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/seasons":{"get":{"tags":["Clubs"],"summary":"Club-Saisons laden","operationId":"list_club_seasons_clubs__club_id__seasons_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ClubSeasonStatus"},{"type":"null"}],"title":"Status"}},{"name":"season_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ClubSeasonType"},{"type":"null"}],"title":"Season Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClubSeasonRead"},"title":"Response List Club Seasons Clubs  Club Id  Seasons Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Clubs"],"summary":"Club-Saison erstellen","operationId":"create_club_season_clubs__club_id__seasons_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubSeasonCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubSeasonRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/seasons/{season_id}":{"patch":{"tags":["Clubs"],"summary":"Club-Saison aktualisieren","operationId":"patch_club_season_clubs__club_id__seasons__season_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"season_id","in":"path","required":true,"schema":{"type":"integer","title":"Season Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubSeasonUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubSeasonRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/seasons/{season_id}/teams/{team_id}":{"post":{"tags":["Clubs"],"summary":"Team in Club-Saison enrollen","operationId":"enroll_team_in_club_season_clubs__club_id__seasons__season_id__teams__team_id__post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"season_id","in":"path","required":true,"schema":{"type":"integer","title":"Season Id"}},{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubSeasonTeamRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Clubs"],"summary":"Team aus Club-Saison austragen","operationId":"unenroll_team_from_club_season_clubs__club_id__seasons__season_id__teams__team_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"season_id","in":"path","required":true,"schema":{"type":"integer","title":"Season Id"}},{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubSeasonTeamRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/teams/{team_id}/members/{player_id}":{"delete":{"tags":["Clubs"],"summary":"Spieler aus Mannschaft entfernen","operationId":"remove_player_from_team_clubs__club_id__teams__team_id__members__player_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"team_id","in":"path","required":true,"schema":{"type":"integer","title":"Team Id"}},{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTeamMemberRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/team-head-to-head":{"get":{"tags":["Clubs"],"summary":"Direktvergleich zweier Mannschaften","operationId":"get_team_head_to_head_clubs__club_id__team_head_to_head_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"team_a_id","in":"query","required":true,"schema":{"type":"integer","description":"ID der ersten Mannschaft","title":"Team A Id"},"description":"ID der ersten Mannschaft"},{"name":"team_b_id","in":"query","required":true,"schema":{"type":"integer","description":"ID der zweiten Mannschaft","title":"Team B Id"},"description":"ID der zweiten Mannschaft"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTeamHeadToHeadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/competitions":{"get":{"tags":["Clubs"],"summary":"Club-Competitions laden","operationId":"list_club_competitions_clubs__club_id__competitions_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ClubCompetitionStatus"},{"type":"null"}],"title":"Status"}},{"name":"competition_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ClubCompetitionType"},{"type":"null"}],"title":"Competition Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClubCompetitionRead"},"title":"Response List Club Competitions Clubs  Club Id  Competitions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Clubs"],"summary":"Club-Competition erstellen","operationId":"create_club_competition_clubs__club_id__competitions_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubCompetitionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubCompetitionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/competitions/{competition_id}":{"get":{"tags":["Clubs"],"summary":"Club-Competition abrufen","operationId":"get_club_competition_detail_clubs__club_id__competitions__competition_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"competition_id","in":"path","required":true,"schema":{"type":"integer","title":"Competition Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubCompetitionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Clubs"],"summary":"Club-Competition aktualisieren","operationId":"patch_club_competition_clubs__club_id__competitions__competition_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"competition_id","in":"path","required":true,"schema":{"type":"integer","title":"Competition Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubCompetitionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubCompetitionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/seasons/{season_id}/competition":{"patch":{"tags":["Clubs"],"summary":"Club-Competition einer Club-Saison zuweisen/entfernen","operationId":"patch_club_season_competition_clubs__club_id__seasons__season_id__competition_patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"season_id","in":"path","required":true,"schema":{"type":"integer","title":"Season Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubSeasonCompetitionAssign"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubSeasonRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/tournaments":{"get":{"tags":["Clubs"],"summary":"Club Turniere laden","operationId":"list_club_tournaments_clubs__club_id__tournaments_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/TournamentStatus"},{"type":"null"}],"title":"Status"}},{"name":"club_season_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Season Id"}},{"name":"club_competition_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Competition Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClubTournamentRead"},"title":"Response List Club Tournaments Clubs  Club Id  Tournaments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Clubs"],"summary":"Club Turnier anlegen","operationId":"create_club_tournament_clubs__club_id__tournaments_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTournamentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTournamentRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/tournaments/{tournament_id}":{"get":{"tags":["Clubs"],"summary":"Club Turnierdetails laden","operationId":"get_club_tournament_detail_clubs__club_id__tournaments__tournament_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTournamentDetailRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Clubs"],"summary":"Club Turnier aktualisieren","operationId":"patch_club_tournament_clubs__club_id__tournaments__tournament_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTournamentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTournamentRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/tournaments/{tournament_id}/participants":{"post":{"tags":["Clubs"],"summary":"Club Turnier-Teilnehmer hinzufuegen","operationId":"add_club_tournament_participant_clubs__club_id__tournaments__tournament_id__participants_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTournamentParticipantCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentParticipantRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/tournaments/{tournament_id}/participants/{participant_id}":{"delete":{"tags":["Clubs"],"summary":"Club Turnier-Teilnehmer entfernen","operationId":"remove_club_tournament_participant_clubs__club_id__tournaments__tournament_id__participants__participant_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}},{"name":"participant_id","in":"path","required":true,"schema":{"type":"integer","title":"Participant Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/tournaments/{tournament_id}/generate-plan":{"post":{"tags":["Clubs"],"summary":"Club Turnier-Spielplan generieren","operationId":"generate_club_tournament_plan_clubs__club_id__tournaments__tournament_id__generate_plan_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTournamentDetailRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/tournaments/{tournament_id}/finish":{"post":{"tags":["Clubs"],"summary":"Club Turnier manuell abschliessen","operationId":"finish_club_tournament_clubs__club_id__tournaments__tournament_id__finish_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTournamentDetailRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/tournaments/{tournament_id}/start":{"post":{"tags":["Clubs"],"summary":"Club Turnier starten","operationId":"start_club_tournament_clubs__club_id__tournaments__tournament_id__start_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubTournamentDetailRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/tournaments/{tournament_id}/matches/{match_id}/join":{"post":{"tags":["Clubs"],"summary":"Club-Paarung als bereit markieren (Join)","operationId":"join_club_tournament_match_clubs__club_id__tournaments__tournament_id__matches__match_id__join_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentMatchJoinRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentMatchRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/tournaments/{tournament_id}/matches/{match_id}/leave":{"post":{"tags":["Clubs"],"summary":"Club-Paarung Ready-State zuruecknehmen (Leave)","operationId":"leave_club_tournament_match_clubs__club_id__tournaments__tournament_id__matches__match_id__leave_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentMatchJoinRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentMatchRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/tournaments/{tournament_id}/matches/{match_id}/start-session":{"post":{"tags":["Clubs"],"summary":"Turnier-Paarung Session starten","operationId":"start_tournament_match_session_clubs__club_id__tournaments__tournament_id__matches__match_id__start_session_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentMatchRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/tournaments/{tournament_id}/matches/{match_id}/link-session":{"post":{"tags":["Clubs"],"summary":"Turnier-Paarung mit vorhandener Session verknuepfen","operationId":"link_tournament_match_session_clubs__club_id__tournaments__tournament_id__matches__match_id__link_session_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentMatchSessionLinkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentMatchRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/tournaments/{tournament_id}/matches/{match_id}/sync-result":{"post":{"tags":["Clubs"],"summary":"Turnier-Paarung Ergebnis aus Session synchronisieren","operationId":"sync_tournament_match_result_clubs__club_id__tournaments__tournament_id__matches__match_id__sync_result_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentMatchRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/finance/summary":{"get":{"tags":["Clubs"],"summary":"Finanzzusammenfassung laden","operationId":"get_finance_summary_clubs__club_id__finance_summary_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubFinanceSummaryRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/finance/transactions":{"get":{"tags":["Clubs"],"summary":"Kassenbuch laden","operationId":"list_transactions_clubs__club_id__finance_transactions_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"transaction_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/FinanceTransactionType"},{"type":"null"}],"title":"Transaction Type"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/FinanceCategory"},{"type":"null"}],"title":"Category"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/FinanceTransactionStatus"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClubFinanceTransactionRead"},"title":"Response List Transactions Clubs  Club Id  Finance Transactions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Clubs"],"summary":"Kassenbuchung anlegen","operationId":"create_transaction_clubs__club_id__finance_transactions_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubFinanceTransactionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubFinanceTransactionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/finance/transactions/{transaction_id}":{"patch":{"tags":["Clubs"],"summary":"Kassenbuchung Metadaten aktualisieren","operationId":"update_transaction_clubs__club_id__finance_transactions__transaction_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"transaction_id","in":"path","required":true,"schema":{"type":"integer","title":"Transaction Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubFinanceTransactionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubFinanceTransactionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/finance/transactions/{transaction_id}/cancel":{"post":{"tags":["Clubs"],"summary":"Kassenbuchung stornieren","operationId":"cancel_transaction_clubs__club_id__finance_transactions__transaction_id__cancel_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"transaction_id","in":"path","required":true,"schema":{"type":"integer","title":"Transaction Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubFinanceTransactionCancel"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubFinanceTransactionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/finance/contributions/mine":{"get":{"tags":["Clubs"],"summary":"Eigene Beitraege laden (Member-Self-Service)","operationId":"list_my_contributions_clubs__club_id__finance_contributions_mine_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClubMemberContributionRead"},"title":"Response List My Contributions Clubs  Club Id  Finance Contributions Mine Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/finance/contributions":{"get":{"tags":["Clubs"],"summary":"Alle Beitraege laden (Finance Manager)","operationId":"list_contributions_clubs__club_id__finance_contributions_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ContributionStatus"},{"type":"null"}],"title":"Status"}},{"name":"membership_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Membership Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClubMemberContributionRead"},"title":"Response List Contributions Clubs  Club Id  Finance Contributions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Clubs"],"summary":"Beitrag anlegen","operationId":"create_contribution_clubs__club_id__finance_contributions_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMemberContributionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMemberContributionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/finance/contributions/{contribution_id}":{"patch":{"tags":["Clubs"],"summary":"Beitrag Metadaten aktualisieren","operationId":"update_contribution_clubs__club_id__finance_contributions__contribution_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"contribution_id","in":"path","required":true,"schema":{"type":"integer","title":"Contribution Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMemberContributionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMemberContributionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/finance/contributions/{contribution_id}/mark-paid":{"post":{"tags":["Clubs"],"summary":"Beitrag als bezahlt markieren","operationId":"mark_contribution_paid_clubs__club_id__finance_contributions__contribution_id__mark_paid_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"contribution_id","in":"path","required":true,"schema":{"type":"integer","title":"Contribution Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMemberContributionMarkPaid"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMemberContributionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/finance/contributions/{contribution_id}/waive":{"post":{"tags":["Clubs"],"summary":"Beitrag erlassen","operationId":"waive_contribution_clubs__club_id__finance_contributions__contribution_id__waive_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"contribution_id","in":"path","required":true,"schema":{"type":"integer","title":"Contribution Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMemberContributionWaive"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMemberContributionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/finance/contributions/{contribution_id}/cancel":{"post":{"tags":["Clubs"],"summary":"Beitrag stornieren","operationId":"cancel_contribution_clubs__club_id__finance_contributions__contribution_id__cancel_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"contribution_id","in":"path","required":true,"schema":{"type":"integer","title":"Contribution Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMemberContributionCancel"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMemberContributionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/premium/status":{"get":{"tags":["Clubs"],"summary":"Club Premium Status (Mitglieder)","description":"Gibt den aktuellen Premium-Status eines Clubs zurück. Alle aktiven Mitglieder und Club-Admins dürfen lesen. is_enforced=False: Limits sind vor echtem IAP-Rollout informativ.","operationId":"get_club_premium_status_clubs__club_id__premium_status_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubPremiumStatusRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Clubs"],"summary":"Club Premium Status setzen (Club-Admin-Portal)","description":"Manuelles Setzen des Premium-Status. Nur Club-Admin-Portal-Tokens erlaubt. Erlaubte source-Werte: manual, dev, admin_grant. Keine Payment-/StoreKit-/Play-Billing-Semantik.","operationId":"patch_club_premium_status_clubs__club_id__premium_status_patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubPremiumStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubPremiumEntitlementRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/premium/entitlements":{"get":{"tags":["Clubs"],"summary":"Club Premium Entitlements (Manager/Admin)","description":"Gibt den detaillierten Entitlement-Status inkl. Source, Gültigkeit und Notes zurück. Nur Manager, Admin und Club-Admin-Portal dürfen diesen Endpoint lesen.","operationId":"get_club_premium_entitlements_clubs__club_id__premium_entitlements_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubPremiumEntitlementRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/contacts":{"post":{"tags":["Clubs"],"summary":"Ansprechpartner fuer Verein anlegen","description":"Minimaltest: name und optional Rolle, Mail oder Telefon uebergeben.","operationId":"add_club_contact_clubs__club_id__contacts_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubContactCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubContactRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Clubs"],"summary":"Club-Kontakte laden","operationId":"list_club_contacts_clubs__club_id__contacts_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClubContactRead"},"title":"Response List Club Contacts Clubs  Club Id  Contacts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/contacts/{contact_id}":{"delete":{"tags":["Clubs"],"summary":"Club-Kontakt entfernen","operationId":"delete_club_contact_clubs__club_id__contacts__contact_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"contact_id","in":"path","required":true,"schema":{"type":"integer","title":"Contact Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubContactRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/events":{"post":{"tags":["Clubs"],"summary":"Upcoming Event fuer Verein anlegen","description":"Minimaltest: Titel und Startzeit angeben, damit das Event in Uebersicht und Dashboard sichtbar wird.","operationId":"add_club_event_clubs__club_id__events_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubEventCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubEventRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Clubs"],"summary":"Club-Events laden","operationId":"list_club_events_clubs__club_id__events_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClubEventRead"},"title":"Response List Club Events Clubs  Club Id  Events Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/events/{event_id}":{"patch":{"tags":["Clubs"],"summary":"Club-Event bearbeiten","description":"Aktualisiert Terminfelder. Nur Manager/Admins. Nur gesetzte Felder; Titel darf nach Trim nicht leer sein. Mit Start- und Endzeit muss Ende nicht vor Beginn liegen.","operationId":"patch_club_event_clubs__club_id__events__event_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubEventUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubEventRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Clubs"],"summary":"Club-Event entfernen","operationId":"delete_club_event_clubs__club_id__events__event_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubEventRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/event-series":{"post":{"tags":["Clubs"],"summary":"Woechentliche Terminserie erstellen (MVP)","operationId":"create_club_event_series_clubs__club_id__event_series_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubEventSeriesCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubEventSeriesRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/event-series/{series_id}":{"patch":{"tags":["Clubs"],"summary":"Terminserie bearbeiten (MVP)","operationId":"patch_club_event_series_clubs__club_id__event_series__series_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"series_id","in":"path","required":true,"schema":{"type":"integer","title":"Series Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubEventSeriesUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubEventSeriesRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Clubs"],"summary":"Terminserie loeschen (MVP)","operationId":"delete_club_event_series_clubs__club_id__event_series__series_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"series_id","in":"path","required":true,"schema":{"type":"integer","title":"Series Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubEventSeriesRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/events/{event_id}/attendance":{"patch":{"tags":["Clubs"],"summary":"Zu-/Absage fuer Club-Termin setzen","operationId":"patch_club_event_attendance_clubs__club_id__events__event_id__attendance_patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubEventAttendanceUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubEventAttendanceRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Clubs"],"summary":"Vollstaendige Attendance-Liste fuer Club-Termin","operationId":"list_club_event_attendance_clubs__club_id__events__event_id__attendance_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClubEventAttendanceRead"},"title":"Response List Club Event Attendance Clubs  Club Id  Events  Event Id  Attendance Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/events/{event_id}/attendance/me":{"get":{"tags":["Clubs"],"summary":"Eigene Zu-/Absage zu Club-Termin","operationId":"get_club_event_attendance_me_clubs__club_id__events__event_id__attendance_me_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubEventAttendanceSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/requests/mine":{"get":{"tags":["Clubs"],"summary":"Eigene Beitrittsanfragen laden","description":"Liefert alle Mitgliedsanfragen des eingeloggten Spielers (alle Status), neueste zuerst. Nur Spieler-App-Token.","operationId":"list_my_club_membership_requests_clubs_requests_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ClubMembershipRequestMineRead"},"type":"array","title":"Response List My Club Membership Requests Clubs Requests Mine Get"}}}}},"security":[{"BearerAuth":[]}]}},"/clubs/{club_id}/invite-codes":{"post":{"tags":["Clubs"],"summary":"Invite-Code fuer Club erstellen","description":"Nur fuer Club-Management (Admin/Manager oder Club-Admin-Portal).","operationId":"create_club_invite_code_clubs__club_id__invite_codes_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubInviteCodeCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubInviteCodeRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Clubs"],"summary":"Invite-Codes eines Clubs laden","description":"Nur fuer Club-Management (Admin/Manager oder Club-Admin-Portal).","operationId":"list_club_invite_codes_clubs__club_id__invite_codes_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClubInviteCodeRead"},"title":"Response List Club Invite Codes Clubs  Club Id  Invite Codes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/invite-codes/{invite_id}":{"patch":{"tags":["Clubs"],"summary":"Invite-Code aktualisieren","description":"Nur fuer Club-Management (Admin/Manager oder Club-Admin-Portal).","operationId":"update_club_invite_code_clubs__club_id__invite_codes__invite_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"invite_id","in":"path","required":true,"schema":{"type":"integer","title":"Invite Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubInviteCodeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubInviteCodeRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Clubs"],"summary":"Invite-Code deaktivieren","description":"Soft delete via is_active=false. Nur fuer Club-Management.","operationId":"deactivate_club_invite_code_clubs__club_id__invite_codes__invite_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"invite_id","in":"path","required":true,"schema":{"type":"integer","title":"Invite Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubInviteCodeRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/invite-codes/{code}/preview":{"get":{"tags":["Clubs"],"summary":"Invite-Code Vorschau laden","description":"Authenticated preview fuer Player-Token.","operationId":"preview_club_invite_code_clubs_invite_codes__code__preview_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubInvitePreviewRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/join-by-code":{"post":{"tags":["Clubs"],"summary":"Per Invite-Code einem Club beitreten (request-basiert)","description":"Erzeugt eine ClubMembershipRequest. Keine direkte Membership im MVP.","operationId":"join_club_by_code_clubs_join_by_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JoinClubByCodeRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JoinClubByCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/clubs/{club_id}/memberships":{"post":{"tags":["Clubs"],"summary":"Spieler einem Verein zuweisen","description":"Minimaltest: player_id eines vorhandenen Spielers uebergeben.","operationId":"add_membership_clubs__club_id__memberships_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMembershipCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMembershipRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/members":{"get":{"tags":["Clubs"],"summary":"Aktive Vereinsmitglieder laden","description":"Liefert strukturierte Memberdaten fuer das Frontend inklusive Profil-Absprung.","operationId":"list_club_members_clubs__club_id__members_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMembersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/memberships/{membership_id}":{"patch":{"tags":["Clubs"],"summary":"Rolle einer Vereinsmitgliedschaft aendern","description":"Nur fuer Vereins-Manager/Admins. Der letzte aktive Admin kann seine Admin-Rolle nicht verlieren.","operationId":"update_membership_role_clubs__club_id__memberships__membership_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"membership_id","in":"path","required":true,"schema":{"type":"integer","title":"Membership Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMembershipRoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMembershipRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Clubs"],"summary":"Mitglied aus Verein entfernen","description":"Beendet eine aktive Vereinsmitgliedschaft. Nur fuer Vereinsadmins des betreffenden Clubs.","operationId":"remove_membership_clubs__club_id__memberships__membership_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"membership_id","in":"path","required":true,"schema":{"type":"integer","title":"Membership Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMembershipRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/requests":{"post":{"tags":["Clubs"],"summary":"Mitgliedsanfrage an Verein senden","description":"Spieler koennen einem Verein Beitrittsanfragen schicken, die spaeter vom Vereinsadmin freigegeben werden.","operationId":"create_membership_request_clubs__club_id__requests_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMembershipRequestCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMembershipRequestRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Clubs"],"summary":"Offene Mitgliedsanfragen eines Vereins laden","description":"Benutzt den Bearer-Token eines Vereinsadmins, um offene oder historische Anfragen zu laden.","operationId":"list_membership_requests_clubs__club_id__requests_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClubMembershipRequestRead"},"title":"Response List Membership Requests Clubs  Club Id  Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/invitations":{"post":{"tags":["Clubs"],"summary":"Direkte Club-Einladung fuer Spieler erstellen","description":"Nur fuer Club-Management. Erzeugt eine pending Einladung als ClubMembershipRequest; keine automatische Mitgliedschaft.","operationId":"create_direct_club_invitation_clubs__club_id__invitations_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DirectClubInvitationCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMembershipRequestRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/requests/{request_id}/respond":{"post":{"tags":["Clubs"],"summary":"Direkte Club-Einladung annehmen oder ablehnen","description":"Nur der eingeladene Spieler kann eine direkte Club-Einladung beantworten.","operationId":"respond_to_direct_club_invitation_clubs_requests__request_id__respond_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMembershipRequestRespond"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMembershipRequestRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}/requests/{request_id}/review":{"post":{"tags":["Clubs"],"summary":"Mitgliedsanfrage freigeben oder ablehnen","description":"Geschuetzter Endpunkt fuer Vereinsadmins. Bei Freigabe wird das Mitglied automatisch zugeordnet.","operationId":"review_membership_request_clubs__club_id__requests__request_id__review_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"integer","title":"Club Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMembershipRequestReview"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubMembershipRequestRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/friends":{"get":{"tags":["Friends"],"summary":"Freundesliste laden","operationId":"list_friends_friends_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FriendListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/friends/requests":{"get":{"tags":["Friends"],"summary":"Freundesanfragen laden","operationId":"list_friend_requests_friends_requests_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/FriendRequestRead"},"type":"array","title":"Response List Friend Requests Friends Requests Get"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["Friends"],"summary":"Freundesanfrage senden","operationId":"create_friend_request_friends_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FriendRequestCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FriendRequestRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/friends/requests/{request_id}/accept":{"post":{"tags":["Friends"],"summary":"Freundesanfrage annehmen","operationId":"accept_friend_request_friends_requests__request_id__accept_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FriendRequestRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/friends/requests/{request_id}/decline":{"post":{"tags":["Friends"],"summary":"Freundesanfrage ablehnen","operationId":"decline_friend_request_friends_requests__request_id__decline_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FriendRequestRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/friends/{friend_id}":{"delete":{"tags":["Friends"],"summary":"Freund entfernen","operationId":"delete_friend_friends__friend_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"friend_id","in":"path","required":true,"schema":{"type":"integer","title":"Friend Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/friends/invites":{"get":{"tags":["Friends"],"summary":"Match-Einladungen laden","operationId":"list_match_invites_friends_invites_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchInviteListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Friends"],"summary":"Match-Einladung senden","operationId":"create_match_invite_friends_invites_post","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchInviteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchInviteRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/friends/invites/{invite_id}/accept":{"post":{"tags":["Friends"],"summary":"Match-Einladung annehmen","operationId":"accept_match_invite_friends_invites__invite_id__accept_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"invite_id","in":"path","required":true,"schema":{"type":"integer","title":"Invite Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchInviteRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/friends/invites/{invite_id}/decline":{"post":{"tags":["Friends"],"summary":"Match-Einladung ablehnen","operationId":"decline_match_invite_friends_invites__invite_id__decline_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"invite_id","in":"path","required":true,"schema":{"type":"integer","title":"Invite Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchInviteRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/games/sync":{"post":{"tags":["Sessions"],"summary":"Offline-First-Spielsync einreichen","description":"MVP-Ingestion fuer Offline-First-Payloads. Speichert den Rohpayload idempotent pro user_id+client_game_id.","operationId":"sync_game_submission_games_sync_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSyncPayloadIn"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSyncResponseOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/games/sync/submissions":{"get":{"tags":["Sessions"],"summary":"Eigene Offline-Sync-Submissions auflisten (Diagnostics)","description":"Gibt eine Metadaten-Zusammenfassung aller eigenen Offline-Sync-Submissions zurueck. Kein raw_payload, keine Dart-Werte, keine Spielernamen. Nur zur Diagnose/Support.","operationId":"list_sync_submissions_games_sync_submissions_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfflineGameSyncSubmissionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/games/sync/submissions/{client_game_id}":{"get":{"tags":["Sessions"],"summary":"Einzelne Offline-Sync-Submission pruefen (Diagnostics)","description":"Gibt Metadaten einer gespeicherten Offline-Sync-Submission zurueck. Nur eigene Submissions. Kein raw_payload, keine Dart-Werte.","operationId":"get_sync_submission_games_sync_submissions__client_game_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"client_game_id","in":"path","required":true,"schema":{"type":"string","title":"Client Game Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfflineGameSyncSubmissionSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/games/sync/submissions/{client_game_id}/status":{"get":{"tags":["Sessions"],"summary":"Status einer Offline-Sync-Submission abfragen","description":"Schlanker Status-Endpunkt gemaess OFFLINE_FIRST.md §4. Gibt Metadaten zurueck (status, processed_at, rejected_reason, validation_warnings). Nur eigene Submissions. Kein raw_payload.","operationId":"get_sync_submission_status_games_sync_submissions__client_game_id__status_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"client_game_id","in":"path","required":true,"schema":{"type":"string","title":"Client Game Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfflineGameSyncSubmissionSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions":{"post":{"tags":["Sessions"],"summary":"Session anlegen","description":"Minimaltest: zwei Teilnehmer, local_1v1 oder competitive, Modus 501.","operationId":"create_session_sessions_post","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSessionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSessionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Sessions"],"summary":"Eigene Sessions laden","description":"Gibt alle Sessions zurueck, an denen der authentifizierte Spieler teilnimmt.","operationId":"list_sessions_sessions_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"context","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/GameContext"},{"type":"null"}],"title":"Context"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/SessionState"},{"type":"null"}],"title":"State"}},{"name":"club_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"}},{"name":"season_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"include_visits","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Visits"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GameSessionRead"},"title":"Response List Sessions Sessions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/list":{"get":{"tags":["Sessions"],"summary":"Eigene Sessionliste mit Meta laden","description":"Frontend-freundlicher Wrapper: gibt nur Sessions zurueck, an denen der Spieler teilnimmt.","operationId":"list_sessions_wrapped_sessions_list_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"context","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/GameContext"},{"type":"null"}],"title":"Context"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/SessionState"},{"type":"null"}],"title":"State"}},{"name":"club_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"}},{"name":"season_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"include_visits","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Visits"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}":{"get":{"tags":["Sessions"],"summary":"Eine Session laden","description":"Liefert die vollstaendige Session. Nur zugaenglich fuer Teilnehmer der Session.","operationId":"get_session_sessions__session_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}},{"name":"include_visits","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Visits"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSessionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Sessions"],"summary":"Session korrigieren","description":"Erlaubt fachliche Korrekturen an Status, Zeitpunkten, Metadaten und Gewinner.","operationId":"update_session_sessions__session_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSessionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/snapshot":{"get":{"tags":["Sessions"],"summary":"Sichere Match-Scoreboard-Abfrage","description":"Read-only Scoreboard-Snapshot fuer Polling und spaeteres SSE. Keine extra_data, keine Dart-Details, keine Skill/Rating-Felder. Nur zugaenglich fuer Teilnehmer der Session.","operationId":"get_match_snapshot_sessions__session_id__snapshot_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchSnapshotRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/snapshot/stream":{"get":{"tags":["Sessions"],"summary":"Live Match Snapshot Stream (SSE, Bearer)","description":"Read-only SSE Stream fuer MatchSnapshotRead. Nur zugaenglich fuer Teilnehmer der Session. Mutationen bleiben HTTP POST-only.","operationId":"stream_match_snapshot_sessions__session_id__snapshot_stream_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}},{"name":"Last-Event-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last-Event-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/spectator-grants":{"post":{"tags":["Sessions"],"summary":"Spectator-Grant fuer Session ausstellen","description":"Erzeugt einen opaquen, revokablen Read-only Token fuer /public/match-snapshot. Raw-Token wird nur in dieser Antwort einmal geliefert.","operationId":"create_spectator_grant_sessions__session_id__spectator_grants_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpectatorGrantCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpectatorGrantIssueRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/spectator-grants/{grant_id}/revoke":{"post":{"tags":["Sessions"],"summary":"Spectator-Grant widerrufen","description":"Revoked einen Spectator-Grant, sodass der Token sofort ungueltig wird.","operationId":"revoke_spectator_grant_spectator_grants__grant_id__revoke_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"grant_id","in":"path","required":true,"schema":{"type":"integer","title":"Grant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpectatorGrantRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/participants":{"post":{"tags":["Sessions"],"summary":"Teilnehmer zu Session hinzufuegen","description":"Nur zugaenglich fuer Teilnehmer oder Creator der Session.","operationId":"add_participant_sessions__session_id__participants_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionParticipantCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionParticipantRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/legs":{"post":{"tags":["Sessions"],"summary":"Leg anlegen","description":"Nur zugaenglich fuer Teilnehmer der Session.","operationId":"create_leg_sessions__session_id__legs_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/rematch":{"post":{"tags":["Sessions"],"summary":"Revanche erstellen","description":"Nur zugaenglich fuer Teilnehmer der Session.","operationId":"create_rematch_sessions__session_id__rematch_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RematchCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSessionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/legs/{leg_id}/visits":{"post":{"tags":["Sessions"],"summary":"Visit mit einzelnen Darts speichern","description":"Minimaltest: session_participant_id plus 1 bis 3 Darts als single/double/triple uebergeben.","operationId":"add_visit_legs__leg_id__visits_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"leg_id","in":"path","required":true,"schema":{"type":"integer","title":"Leg Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"x-access-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Access-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisitCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisitRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Sessions"],"summary":"Alle Visits eines Legs laden","description":"Liefert die komplette Aufnahmehistorie eines Legs. Nur zugaenglich fuer Teilnehmer der Session.","operationId":"list_leg_visits_legs__leg_id__visits_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"leg_id","in":"path","required":true,"schema":{"type":"integer","title":"Leg Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VisitRead"},"title":"Response List Leg Visits Legs  Leg Id  Visits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/visits/{visit_id}":{"patch":{"tags":["Sessions"],"summary":"Visit korrigieren","description":"Ersetzt die Darts einer bestehenden Aufnahme und berechnet das gesamte Leg konsistent neu.","operationId":"update_visit_visits__visit_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"visit_id","in":"path","required":true,"schema":{"type":"integer","title":"Visit Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisitUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisitRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Sessions"],"summary":"Visit loeschen","description":"Entfernt eine Aufnahme inklusive Darts und berechnet das Leg anschliessend neu.","operationId":"delete_visit_visits__visit_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"visit_id","in":"path","required":true,"schema":{"type":"integer","title":"Visit Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/finish":{"post":{"tags":["Sessions"],"summary":"Session abschliessen","description":"Minimaltest: winner_player_id oder winner_session_participant_id setzen oder automatisch aus gewonnenen Legs bestimmen lassen.","operationId":"finish_session_sessions__session_id__finish_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionFinishRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSessionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/reopen":{"post":{"tags":["Sessions"],"summary":"Session wieder oeffnen","description":"Setzt eine abgeschlossene Session wieder auf aktiv, damit Legs und Visits korrigiert werden koennen.","operationId":"reopen_session_sessions__session_id__reopen_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSessionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sessions/{session_id}/sync":{"get":{"tags":["Sessions"],"summary":"Leichten Session-Sync fuer Polling laden","description":"Liefert nur bei veraenderter Revision den kompletten Session-Zustand. Nur fuer Teilnehmer.","operationId":"sync_session_sessions__session_id__sync_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}},{"name":"since_revision","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Since Revision"}},{"name":"include_visits","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Visits"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionSyncRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/games/sync/process-pending":{"post":{"tags":["Internal"],"summary":"Intern: Queued Offline-Sync-Submissions validieren","description":"Verarbeitet bis zu `limit` Submissions mit Status queued_for_validation synchron: validiert den raw_payload und setzt accepted oder rejected. Geschuetzt per X-Admin-Key. Kein raw_payload in der Response.","operationId":"process_pending_sync_submissions_internal_games_sync_process_pending_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ProcessPendingRequestIn"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Process Pending Sync Submissions Internal Games Sync Process Pending Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/games/sync/retry-failed":{"post":{"tags":["Internal"],"summary":"Intern: failed_retryable Submissions zurueck auf queued setzen","description":"Setzt Submissions mit Status failed_retryable zurueck auf queued_for_validation, damit der naechste process-pending-Lauf sie erneut verarbeiten kann. Optional: nur eine bestimmte Submission via client_game_id. Keine direkte Verarbeitung. Geschuetzt per X-Admin-Key.","operationId":"retry_failed_sync_submissions_internal_games_sync_retry_failed_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RetryFailedRequestIn"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Retry Failed Sync Submissions Internal Games Sync Retry Failed Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/games/sync/diagnostics/summary":{"get":{"tags":["Internal"],"summary":"Intern: Sync-Gesundheitsübersicht","description":"Aggregierte Metriken: Status-Counts, älteste queued/processing Submission, Stale-Processing-Erkennung, materialisierte Sessions. Kein raw_payload. Nur für Admins via X-Admin-Key.","operationId":"get_sync_diagnostics_summary_internal_games_sync_diagnostics_summary_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSyncDiagnosticsSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/games/sync/diagnostics/rejections":{"get":{"tags":["Internal"],"summary":"Intern: Rejection-Diagnose mit Pagination und Filter","description":"Rejection-Reason-Counts und paginierte Liste der Rejections. Filter: reason, since/until (auf updated_at), limit/offset. Kein raw_payload, keine Dart-Events. Nur für Admins via X-Admin-Key.","operationId":"get_sync_diagnostics_rejections_internal_games_sync_diagnostics_rejections_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"reason","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Until"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSyncDiagnosticsRejections"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/games/sync/diagnostics/submissions":{"get":{"tags":["Internal"],"summary":"Intern: Sichere Admin-Übersicht aller Submissions","description":"Paginierte Liste sicherer Submission-Summaries. Filter: status, client_game_id, user_id, since/until (auf created_at), limit/offset. Kein raw_payload, keine Dart-Events, keine Tokens. Nur für Admins via X-Admin-Key.","operationId":"get_sync_diagnostics_submissions_list_internal_games_sync_diagnostics_submissions_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"client_game_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Game Id"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Until"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSubmissionsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/games/sync/diagnostics/submissions/{client_game_id}":{"get":{"tags":["Internal"],"summary":"Intern: Sichere Metadaten einer Submission","description":"Gibt sichere Metadaten einer Submission zurück: client_game_id, user_id, status, schema/rules/session_context, timestamps, rejected_reason, validation_warnings, training flags. Kein raw_payload, keine Dart-Events. Nur für Admins via X-Admin-Key.","operationId":"get_sync_diagnostics_submission_internal_games_sync_diagnostics_submissions__client_game_id__get","parameters":[{"name":"client_game_id","in":"path","required":true,"schema":{"type":"string","title":"Client Game Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSubmissionDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/games/sync/diagnostics/reset-stale-processing":{"post":{"tags":["Internal"],"summary":"Intern: Stale-Processing-Submissions zurücksetzen","description":"Setzt Submissions zurück, die länger als threshold_seconds im Status 'processing' feststecken. Nur 'processing' wird zurückgesetzt — accepted/rejected bleiben unberührt. Gibt Liste der betroffenen client_game_ids zurück. Nur für Admins via X-Admin-Key.","operationId":"reset_stale_processing_submissions_internal_games_sync_diagnostics_reset_stale_processing_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AdminResetStaleProcessingRequestIn"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminResetStaleProcessingResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/match-snapshot":{"get":{"tags":["Public Snapshot"],"summary":"Public read-only Match Snapshot via spectator grant token","description":"Akzeptiert Authorization: Spectator <token> oder X-Spectator-Token. Token ist read-only und an eine Session gebunden.","operationId":"get_public_match_snapshot_public_match_snapshot_get","parameters":[{"name":"spectator_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Spectator Token"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-spectator-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Spectator-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMatchSnapshotRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/match-snapshot/stream":{"get":{"tags":["Public Snapshot"],"summary":"Public read-only Match Snapshot Stream via spectator token (SSE)","description":"Akzeptiert Authorization: Spectator <token>, X-Spectator-Token oder spectator_token Query (fuer Browser EventSource).","operationId":"stream_public_match_snapshot_public_match_snapshot_stream_get","parameters":[{"name":"spectator_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Spectator Token"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-spectator-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Spectator-Token"}},{"name":"Last-Event-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last-Event-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lobbies":{"get":{"tags":["Online"],"summary":"Online-Lobbys laden","operationId":"list_lobbies_lobbies_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/LobbyStatus"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnlineLobbyListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Online"],"summary":"Lobby anlegen","operationId":"create_lobby_lobbies_post","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnlineLobbyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnlineLobbyRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lobbies/{lobby_id}":{"get":{"tags":["Online"],"summary":"Lobbydetails laden","operationId":"get_lobby_lobbies__lobby_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"lobby_id","in":"path","required":true,"schema":{"type":"integer","title":"Lobby Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnlineLobbyRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lobbies/{lobby_id}/join":{"post":{"tags":["Online"],"summary":"Lobby beitreten","operationId":"join_lobby_lobbies__lobby_id__join_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"lobby_id","in":"path","required":true,"schema":{"type":"integer","title":"Lobby Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnlineLobbyRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/lobbies/join-by-code":{"post":{"tags":["Online"],"summary":"Lobby per Room-Code beitreten","operationId":"join_lobby_by_code_lobbies_join_by_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LobbyJoinByCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnlineLobbyRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/lobbies/{lobby_id}/leave":{"post":{"tags":["Online"],"summary":"Lobby verlassen","operationId":"leave_lobby_lobbies__lobby_id__leave_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"lobby_id","in":"path","required":true,"schema":{"type":"integer","title":"Lobby Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/matchmaking/queue":{"post":{"tags":["Online"],"summary":"In Ranked Queue einreihen","operationId":"enqueue_matchmaking_matchmaking_queue_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchmakingQueueCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchmakingQueueRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/matchmaking/queue/cancel":{"post":{"tags":["Online"],"summary":"Queue verlassen","operationId":"cancel_matchmaking_matchmaking_queue_cancel_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"BearerAuth":[]}]}},"/matchmaking/status":{"get":{"tags":["Online"],"summary":"Queue-Status laden","operationId":"matchmaking_status_matchmaking_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MatchmakingStatusRead"},{"type":"null"}],"title":"Response Matchmaking Status Matchmaking Status Get"}}}}},"security":[{"BearerAuth":[]}]}},"/me/messages/threads":{"get":{"tags":["Messages"],"summary":"Eigene Message-Threads laden","operationId":"list_threads_me_messages_threads_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/MessageThreadSummary"},"type":"array","title":"Response List Threads Me Messages Threads Get"}}}}},"security":[{"BearerAuth":[]}]}},"/me/messages/players/{player_id}/thread":{"post":{"tags":["Messages"],"summary":"Thread mit Spieler erstellen oder laden","operationId":"get_or_create_thread_me_messages_players__player_id__thread_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageThreadDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/messages/threads/{thread_id}":{"get":{"tags":["Messages"],"summary":"Message-Thread-Detail laden","operationId":"get_thread_detail_me_messages_threads__thread_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"thread_id","in":"path","required":true,"schema":{"type":"integer","title":"Thread Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageThreadDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/messages/threads/{thread_id}/messages":{"post":{"tags":["Messages"],"summary":"Nachricht in Thread senden","operationId":"send_message_me_messages_threads__thread_id__messages_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"thread_id","in":"path","required":true,"schema":{"type":"integer","title":"Thread Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMessageRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerMessageRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/messages/players/{player_id}/block":{"post":{"tags":["Messages"],"summary":"Spieler fuer Messages blockieren","operationId":"block_player_me_messages_players__player_id__block_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockedPlayerRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Messages"],"summary":"Message-Blockierung entfernen","operationId":"unblock_player_me_messages_players__player_id__block_delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnblockPlayerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/messages/blocked-players":{"get":{"tags":["Messages"],"summary":"Eigene blockierte Spieler laden","operationId":"list_blocked_players_me_messages_blocked_players_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BlockedPlayerRead"},"type":"array","title":"Response List Blocked Players Me Messages Blocked Players Get"}}}}},"security":[{"BearerAuth":[]}]}},"/notifications":{"get":{"tags":["Notifications"],"summary":"Inbox laden","operationId":"list_notifications_notifications_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications/{notification_id}/read":{"post":{"tags":["Notifications"],"summary":"Benachrichtigung als gelesen markieren","operationId":"read_notification_notifications__notification_id__read_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"integer","title":"Notification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications/read-all":{"post":{"tags":["Notifications"],"summary":"Alle Benachrichtigungen als gelesen markieren","operationId":"read_all_notifications_notifications_read_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"BearerAuth":[]}]}},"/rankings/boards":{"post":{"tags":["Rankings"],"summary":"Ranking-Board anlegen","description":"Minimaltest: fuer global reicht name plus scope=global.","operationId":"create_ranking_board_rankings_boards_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RankingBoardCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RankingBoardRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Rankings"],"summary":"Alle Ranking-Boards laden","description":"Schnelltest: listet globale und vereinsbezogene Ranglisten-Definitionen. R8: hat jetzt ein Default-Limit (50) damit die Antwort nicht unbegrenzt groß wird.","operationId":"list_ranking_boards_rankings_boards_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RankingBoardRead"},"title":"Response List Ranking Boards Rankings Boards Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rankings/boards/list":{"get":{"tags":["Rankings"],"summary":"Ranking-Boards mit Meta laden","operationId":"list_ranking_boards_wrapped_rankings_boards_list_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RankingBoardListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rankings/boards/{board_id}":{"get":{"tags":["Rankings"],"summary":"Ein Ranking-Board laden","description":"Schnelltest: board_id aus POST /rankings/boards verwenden.","operationId":"get_ranking_board_rankings_boards__board_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"board_id","in":"path","required":true,"schema":{"type":"integer","title":"Board Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RankingBoardRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rankings/monthly/current":{"get":{"tags":["Rankings"],"summary":"Aktuelles Monats-Ranking-Board","description":"Stellt sicher, dass fuer die laufende Berlin-Monats-LeagueSeason ein globales Board existiert. Kein automatischer Rebuild.","operationId":"get_current_monthly_ranking_board_rankings_monthly_current_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RankingBoardRead"}}}}},"security":[{"BearerAuth":[]}]}},"/rankings/monthly/current/rebuild":{"post":{"tags":["Rankings"],"summary":"Aktuelles Monats-Ranking neu berechnen","description":"Wie POST /rankings/boards/{id}/rebuild, aber fuer das aktuelle globale Monats-Board. Erfordert X-Admin-Key (wie Rating-Admin-Rebuilds), kein Bearer-Token.","operationId":"post_rebuild_current_monthly_ranking_board_rankings_monthly_current_rebuild_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RankingBoardRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rankings/monthly":{"get":{"tags":["Rankings"],"summary":"Monats-Ranking-Board fuer Jahr/Monat (Berlin)","operationId":"get_monthly_ranking_board_rankings_monthly_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"year","in":"query","required":true,"schema":{"type":"integer","maximum":2100,"minimum":2000,"title":"Year"}},{"name":"month","in":"query","required":true,"schema":{"type":"integer","maximum":12,"minimum":1,"title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RankingBoardRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rankings/boards/{board_id}/rebuild":{"post":{"tags":["Rankings"],"summary":"Ranking neu berechnen","description":"Berechnet Season-Points-Standings fuer das Board neu. Beruecksichtigt nur v1.1-eligible finished Sessions (x01, contexts competitive/local_1v1/club, genau zwei eligible Human-Teilnehmer, keine Guest-Shadow-Teilnehmer) innerhalb des Board-Scopes (optional Season/Club). Pro ungeordnetem Spielerpaar zaehlen nur die ersten drei eligible Matches in deterministischer Reihenfolge (finished_at, dann session_id).","operationId":"rebuild_ranking_board_rankings_boards__board_id__rebuild_post","parameters":[{"name":"board_id","in":"path","required":true,"schema":{"type":"integer","title":"Board Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RankingBoardRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rankings/season/seasons":{"get":{"tags":["Rankings"],"summary":"Monats-Seasons (Global Monthly)","description":"Nur ``Global Monthly Seasons``. Aktuellste zuerst. Read-only, kein Rebuild.","operationId":"get_global_monthly_season_list_rankings_season_seasons_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200,"minimum":1},{"type":"null"}],"description":"Maximale Anzahl Seasons (optionaler Cut).","title":"Limit"},"description":"Maximale Anzahl Seasons (optionaler Cut)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeasonListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rankings/season/window":{"get":{"tags":["Rankings"],"summary":"Season-Points: Fenster (Top n oder around_me)","description":"Stellt das globale Monatsboard sicher, ohne Rebuild. Read-only.","operationId":"get_season_ranking_window_rankings_season_window_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"mode","in":"query","required":false,"schema":{"enum":["around_me","top_n"],"type":"string","default":"around_me","title":"Mode"}},{"name":"scope","in":"query","required":false,"schema":{"enum":["global","friends","club"],"type":"string","description":"`global` = full board; `friends` = viewer and friends with a season entry; `club` = aktive Vereinsmitglieder mit Entry (`club_id` erforderlich), Fokus ist Bearer.","default":"global","title":"Scope"},"description":"`global` = full board; `friends` = viewer and friends with a season entry; `club` = aktive Vereinsmitglieder mit Entry (`club_id` erforderlich), Fokus ist Bearer."},{"name":"club_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Pflicht bei scope=club: Vereins-ID.","title":"Club Id"},"description":"Pflicht bei scope=club: Vereins-ID."},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":2000},{"type":"null"}],"description":"Optional mit ``month``; fehlt beides, wird der aktuelle Berlin-Monat genutzt.","title":"Year"},"description":"Optional mit ``month``; fehlt beides, wird der aktuelle Berlin-Monat genutzt."},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"description":"1–12; beide (year+month) oder keines setzen.","title":"Month"},"description":"1–12; beide (year+month) oder keines setzen."},{"name":"above","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":0,"default":12,"title":"Above"}},{"name":"below","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":0,"default":12,"title":"Below"}},{"name":"n","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":25,"title":"N"}},{"name":"player_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Fokus-Spieler; Standard ist der eingeloggte Spieler.","title":"Player Id"},"description":"Fokus-Spieler; Standard ist der eingeloggte Spieler."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RankingWindowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rankings/season/search":{"get":{"tags":["Rankings"],"summary":"Season-Points: Suche im Monatsboard","description":"Read-only, kein Rebuild. Teilstring in Alias/Vorname/Nachname/Nickname.","operationId":"get_season_ranking_search_rankings_season_search_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":200,"default":"","title":"Q"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":2000},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"title":"Month"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RankingWindowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/competitions":{"post":{"tags":["Ratings"],"summary":"Competition oder Liga anlegen","operationId":"create_competition_competitions_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeagueCompetitionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeagueCompetitionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Ratings"],"summary":"Competitions laden","operationId":"list_competitions_competitions_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"club_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeagueCompetitionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/seasons":{"post":{"tags":["Ratings"],"summary":"Season anlegen","operationId":"create_season_seasons_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeagueSeasonCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeagueSeasonRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Ratings"],"summary":"Seasons laden","operationId":"list_seasons_seasons_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"competition_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Competition Id"}},{"name":"active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeagueSeasonListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/competitions/{competition_id}":{"get":{"tags":["Ratings"],"summary":"Competition laden","operationId":"get_competition_competitions__competition_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"competition_id","in":"path","required":true,"schema":{"type":"integer","title":"Competition Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeagueCompetitionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/seasons/{season_id}":{"get":{"tags":["Ratings"],"summary":"Season laden","operationId":"get_season_seasons__season_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"season_id","in":"path","required":true,"schema":{"type":"integer","title":"Season Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeagueSeasonRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/players/{player_id}/rating":{"get":{"tags":["Ratings"],"summary":"Aktuelles Spieler-Rating laden","description":"Gibt das gespeicherte Rating zurueck oder 404. Kein automatischer Rebuild — nutze POST /ratings/rebuild/player/{player_id} (Admin).","operationId":"get_player_rating_players__player_id__rating_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerRatingRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/players/{player_id}/rating/components":{"get":{"tags":["Ratings"],"summary":"Rolling-Komponentenstatistik fuer einen Spieler laden","description":"Gibt gespeicherte Komponentenstatistik zurueck oder 404. Kein automatischer Rebuild.","operationId":"get_player_rating_components_players__player_id__rating_components_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerRollingStatsRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/players/{player_id}/rating/history":{"get":{"tags":["Ratings"],"summary":"Rating-Historie eines Spielers laden","description":"Gibt gespeicherte Rating-Historie zurueck. Kein automatischer Rebuild.","operationId":"get_player_rating_history_players__player_id__rating_history_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlayerRatingHistoryRead"},"title":"Response Get Player Rating History Players  Player Id  Rating History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ratings/leaderboard":{"get":{"tags":["Ratings"],"summary":"Rating-Leaderboard laden","operationId":"get_rating_leaderboard_ratings_leaderboard_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerRatingLeaderboardRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ratings/leaderboard/window":{"get":{"tags":["Ratings"],"summary":"Skill-Leaderboard: Fenster (Top n oder um einen Spieler)","description":"Read-only. Kein Rating-Rebuild. Sortierung identisch zu GET /ratings/leaderboard.","operationId":"get_ratings_leaderboard_window_ratings_leaderboard_window_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"mode","in":"query","required":false,"schema":{"enum":["around_me","top_n","around_rank"],"type":"string","default":"around_me","title":"Mode"}},{"name":"scope","in":"query","required":false,"schema":{"enum":["global","friends","club"],"type":"string","description":"global: alle Spieler; friends: eingeloggter Spieler und Freunde; club: aktive Vereinsmitglieder mit Skill (club_id erforderlich). Bei friends und club sind die Ränge weiterhin global; Fokusspieler ist immer der Bearer.","default":"global","title":"Scope"},"description":"global: alle Spieler; friends: eingeloggter Spieler und Freunde; club: aktive Vereinsmitglieder mit Skill (club_id erforderlich). Bei friends und club sind die Ränge weiterhin global; Fokusspieler ist immer der Bearer."},{"name":"above","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":0,"default":12,"title":"Above"}},{"name":"below","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":0,"default":12,"title":"Below"}},{"name":"n","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":25,"title":"N"}},{"name":"player_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Zielspieler fuer scope=global; sonst ignoriert (friends/club: immer Bearer).","title":"Player Id"},"description":"Zielspieler fuer scope=global; sonst ignoriert (friends/club: immer Bearer)."},{"name":"club_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Pflicht bei scope=club: Vereins-ID.","title":"Club Id"},"description":"Pflicht bei scope=club: Vereins-ID."},{"name":"center_rank","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Position search anchor for mode=around_rank. 1-based; clamped silently to [1, total_count] for global, [1, scope_count] for friends/club.","title":"Center Rank"},"description":"Position search anchor for mode=around_rank. 1-based; clamped silently to [1, total_count] for global, [1, scope_count] for friends/club."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RankingWindowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ratings/leaderboard/search":{"get":{"tags":["Ratings"],"summary":"Skill-Leaderboard: Namenssuche mit globalem Rang","description":"Read-only. Trifft auf alias/Vorname/Nachname zu (siehe Spielerliste).","operationId":"get_ratings_leaderboard_search_ratings_leaderboard_search_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":200,"description":"Teilstring fuer Alias oder Namen","default":"","title":"Q"},"description":"Teilstring fuer Alias oder Namen"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RankingWindowResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ratings/rebuild/player/{player_id}":{"post":{"tags":["Ratings"],"summary":"Rating eines einzelnen Spielers neu berechnen","operationId":"rebuild_player_rating_endpoint_ratings_rebuild_player__player_id__post","security":[{"BearerAuth":[]}],"parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"integer","title":"Player Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerRatingRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ratings/rebuild/all":{"post":{"tags":["Ratings"],"summary":"Alle Ratings neu berechnen","operationId":"rebuild_all_ratings_endpoint_ratings_rebuild_all_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerRatingLeaderboardRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ratings/backfill/visits":{"post":{"tags":["Ratings"],"summary":"Fehlende Visit-Hilfsdaten nachziehen","operationId":"backfill_visits_endpoint_ratings_backfill_visits_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ratings/admin/competitive-skill/shadow-v0/rebuild":{"post":{"tags":["Ratings"],"summary":"Intern: Competitive Skill Shadow v0 komplett neu aufspielen (Skill-Tabellen)","description":"Leert **alle** Zeilen in `player_competitive_skill_current` und `player_competitive_skill_snapshots`, spielt dann eligible Outcomes erneut ab (ohne Query: alle Zeiten; mit `season_id`: nur diese Saison). Composite `player_current_ratings` bleibt unveraendert.","operationId":"competitive_skill_shadow_v0_rebuild_ratings_admin_competitive_skill_shadow_v0_rebuild_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"season_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Optional: nur Matches dieser Saison replayen; weglassen = global/all-time.","title":"Season Id"},"description":"Optional: nur Matches dieser Saison replayen; weglassen = global/all-time."},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ratings/admin/competitive-skill/shadow-v0/diagnostics":{"get":{"tags":["Ratings"],"summary":"Intern: Diagnosepaket fuer Shadow-v0 Skill-Tabellen (read-only)","description":"Liest nur `player_competitive_skill_current` (optional gefiltert nach `season_id`) und vergleicht mit `player_current_ratings`. Keine Neuberechnung, keine Writes.","operationId":"competitive_skill_shadow_v0_diagnostics_ratings_admin_competitive_skill_shadow_v0_diagnostics_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"season_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Optional: nur Zeilen mit diesem `season_id` in der Skill-Current-Tabelle.","title":"Season Id"},"description":"Optional: nur Zeilen mit diesem `season_id` in der Skill-Current-Tabelle."},{"name":"sample_n","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Anzahl Spieler in Top-/Bottom-Stichprobe nach display_score.","default":5,"title":"Sample N"},"description":"Anzahl Spieler in Top-/Bottom-Stichprobe nach display_score."},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments":{"post":{"tags":["Tournaments"],"summary":"Turnier anlegen","operationId":"create_tournament_tournaments_post","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Tournaments"],"summary":"Turniere laden","operationId":"list_tournaments_tournaments_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/TournamentStatus"},{"type":"null"}],"title":"Status"}},{"name":"club_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"}},{"name":"season_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/{tournament_id}":{"get":{"tags":["Tournaments"],"summary":"Turnierdetails laden","operationId":"get_tournament_tournaments__tournament_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentDetailRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Tournaments"],"summary":"Turnier aktualisieren","operationId":"update_tournament_tournaments__tournament_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/{tournament_id}/participants":{"post":{"tags":["Tournaments"],"summary":"Teilnehmer hinzufuegen","operationId":"add_tournament_participant_tournaments__tournament_id__participants_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentParticipantCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentParticipantRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Tournaments"],"summary":"Teilnehmerliste laden","operationId":"list_tournament_participants_tournaments__tournament_id__participants_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TournamentParticipantRead"},"title":"Response List Tournament Participants Tournaments  Tournament Id  Participants Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/{tournament_id}/participants/{participant_id}":{"delete":{"tags":["Tournaments"],"summary":"Teilnehmer entfernen","operationId":"delete_tournament_participant_tournaments__tournament_id__participants__participant_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}},{"name":"participant_id","in":"path","required":true,"schema":{"type":"integer","title":"Participant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Tournaments"],"summary":"Gast-Teilnehmer umbenennen","operationId":"update_tournament_participant_tournaments__tournament_id__participants__participant_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}},{"name":"participant_id","in":"path","required":true,"schema":{"type":"integer","title":"Participant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentParticipantUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentParticipantRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/{tournament_id}/bracket":{"get":{"tags":["Tournaments"],"summary":"Bracket laden","operationId":"get_tournament_bracket_tournaments__tournament_id__bracket_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentBracketRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/{tournament_id}/standings":{"get":{"tags":["Tournaments"],"summary":"Standings laden","operationId":"get_tournament_standings_tournaments__tournament_id__standings_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentStandingsRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/{tournament_id}/generate-plan":{"post":{"tags":["Tournaments"],"summary":"Spielplan erzeugen","operationId":"generate_tournament_plan_tournaments__tournament_id__generate_plan_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentDetailRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/{tournament_id}/start":{"post":{"tags":["Tournaments"],"summary":"Turnier starten","operationId":"start_tournament_tournaments__tournament_id__start_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentDetailRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/{tournament_id}/matches/{match_id}/join":{"post":{"tags":["Tournaments"],"summary":"Paarung als bereit markieren (Join)","operationId":"join_tournament_match_tournaments__tournament_id__matches__match_id__join_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentMatchJoinRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentMatchRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/{tournament_id}/matches/{match_id}/leave":{"post":{"tags":["Tournaments"],"summary":"Paarung Ready-State zuruecknehmen (Leave)","operationId":"leave_tournament_match_tournaments__tournament_id__matches__match_id__leave_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentMatchJoinRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentMatchRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/{tournament_id}/matches/{match_id}/start-session":{"post":{"tags":["Tournaments"],"summary":"Globale Paarung Session starten","operationId":"start_global_tournament_match_session_tournaments__tournament_id__matches__match_id__start_session_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentMatchRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/{tournament_id}/matches/{match_id}/link-session":{"post":{"tags":["Tournaments"],"summary":"Globale Paarung mit vorhandener Session verknuepfen","operationId":"link_global_tournament_match_session_tournaments__tournament_id__matches__match_id__link_session_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentMatchSessionLinkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentMatchRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/{tournament_id}/matches/{match_id}/sync-result":{"post":{"tags":["Tournaments"],"summary":"Globale Paarung Ergebnis aus Session synchronisieren","operationId":"sync_global_tournament_match_result_tournaments__tournament_id__matches__match_id__sync_result_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentMatchRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/{tournament_id}/matches/{match_id}/manual-result":{"post":{"tags":["Tournaments"],"summary":"Paarung manuell werten","operationId":"submit_tournament_manual_result_tournaments__tournament_id__matches__match_id__manual_result_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}},{"name":"match_id","in":"path","required":true,"schema":{"type":"integer","title":"Match Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentManualResultRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentDetailRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/{tournament_id}/finish":{"post":{"tags":["Tournaments"],"summary":"Turnier beenden","operationId":"finish_tournament_tournaments__tournament_id__finish_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentDetailRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/{tournament_id}/join-code":{"get":{"tags":["Tournaments"],"summary":"Join-Code laden","operationId":"get_tournament_join_code_tournaments__tournament_id__join_code_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentJoinCodeRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Tournaments"],"summary":"Join-Code deaktivieren","operationId":"deactivate_tournament_join_code_tournaments__tournament_id__join_code_delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentJoinCodeRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/{tournament_id}/join-code/regenerate":{"post":{"tags":["Tournaments"],"summary":"Join-Code neu erzeugen","operationId":"regenerate_tournament_join_code_tournaments__tournament_id__join_code_regenerate_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"integer","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentJoinCodeRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tournaments/join-by-code":{"post":{"tags":["Tournaments"],"summary":"Per Join-Code Turnier beitreten","operationId":"join_tournament_by_code_tournaments_join_by_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentJoinByCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TournamentDetailRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/training/drills":{"get":{"tags":["Training"],"summary":"Trainings-Drills laden","operationId":"list_training_drills_training_drills_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TrainingDrillRead"},"type":"array","title":"Response List Training Drills Training Drills Get"}}}}},"security":[{"BearerAuth":[]}]}},"/training/drills/list":{"get":{"tags":["Training"],"summary":"Trainings-Drills mit Meta laden","operationId":"list_training_drills_wrapped_training_drills_list_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingDrillListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/training/sessions":{"get":{"tags":["Training"],"summary":"Eigene Trainings-Sessions laden","operationId":"list_training_sessions_training_sessions_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GameSessionRead"},"title":"Response List Training Sessions Training Sessions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Training"],"summary":"Trainings-Session anlegen","operationId":"create_training_session_training_sessions_post","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingSessionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSessionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/training/sessions/list":{"get":{"tags":["Training"],"summary":"Eigene Trainings-Sessions mit Meta laden","operationId":"list_training_sessions_wrapped_training_sessions_list_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingSessionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/training/shanghai/sessions":{"post":{"tags":["Training"],"summary":"Abgeschlossene Shanghai-Session speichern","operationId":"create_shanghai_training_session_training_shanghai_sessions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShanghaiTrainingSessionCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSessionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/training/around-the-clock/sessions":{"post":{"tags":["Training"],"summary":"Abgeschlossene Around-the-Clock-Session speichern","operationId":"create_around_the_clock_training_session_training_around_the_clock_sessions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AroundTheClockTrainingSessionCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSessionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/training/halve-it/sessions":{"post":{"tags":["Training"],"summary":"Abgeschlossene Halve-It-Session speichern","operationId":"create_halve_it_training_session_training_halve_it_sessions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HalveItTrainingSessionCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSessionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/training/cricket/sessions":{"post":{"tags":["Training"],"summary":"Abgeschlossene Cricket-Session speichern","operationId":"create_cricket_training_session_training_cricket_sessions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CricketTrainingSessionCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSessionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/training/scoring-100-plus/sessions":{"post":{"tags":["Training"],"summary":"Abgeschlossene 100+-Scoring-Session speichern","operationId":"create_scoring_100_plus_training_session_training_scoring_100_plus_sessions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scoring100PlusTrainingSessionCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSessionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/training/checkouts-61-80/sessions":{"post":{"tags":["Training"],"summary":"Abgeschlossene Checkouts-61-80-Session speichern","operationId":"create_checkouts_61_80_training_session_training_checkouts_61_80_sessions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Checkouts6180TrainingSessionCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSessionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/training/bull-master/sessions":{"post":{"tags":["Training"],"summary":"Abgeschlossene Bull-Master-Session speichern","operationId":"create_bull_master_training_session_training_bull_master_sessions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BullMasterTrainingSessionCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSessionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/training/sessions/{session_id}":{"get":{"tags":["Training"],"summary":"Trainings-Session laden","operationId":"get_training_session_training_sessions__session_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameSessionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["Root"],"summary":"Health-Check","description":"Leichter Probe-Endpunkt fuer Mobile-Clients und Monitoring.\n\nBewusst ohne DB-Check — bleibt schnell und unabhaengig vom DB-Status,\ndamit Container-Orchestratoren zwischen Liveness und Readiness unterscheiden\nkoennen. Fuer einen DB-gestuetzten Check: GET /ready.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthCheckRead"}}}}}}},"/ready":{"get":{"tags":["Root"],"summary":"Readiness-Check (inkl. DB und optionalem Redis)","description":"Prueft, ob der Prozess bereit ist, Requests zu verarbeiten. Prueft immer die DB-Verbindung. Wenn RATE_LIMIT_BACKEND=redis gesetzt ist, wird Redis zusaetzlich gepingt: bei fail-closed Redis-Ausfall gibt der Endpunkt HTTP 503 zurueck. Kein Auth erforderlich.","operationId":"readiness_check_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadinessCheckRead"}}}}}}}},"components":{"schemas":{"ActiveClubRead":{"properties":{"club_id":{"type":"integer","title":"Club Id"},"club_name":{"type":"string","title":"Club Name"},"club_alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Alias"}},"type":"object","required":["club_id","club_name"],"title":"ActiveClubRead"},"AdminRejectionSample":{"properties":{"client_game_id":{"type":"string","title":"Client Game Id"},"rejected_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejected Reason"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"processed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Processed At"}},"type":"object","required":["client_game_id","rejected_reason","created_at","updated_at"],"title":"AdminRejectionSample"},"AdminResetStaleProcessingRequestIn":{"properties":{"threshold_seconds":{"type":"integer","minimum":1.0,"title":"Threshold Seconds","default":3600},"limit":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Limit","default":50}},"type":"object","title":"AdminResetStaleProcessingRequestIn"},"AdminResetStaleProcessingResult":{"properties":{"reset_count":{"type":"integer","title":"Reset Count"},"client_game_ids":{"items":{"type":"string"},"type":"array","title":"Client Game Ids"},"threshold_seconds":{"type":"integer","title":"Threshold Seconds"}},"type":"object","required":["reset_count","client_game_ids","threshold_seconds"],"title":"AdminResetStaleProcessingResult"},"AdminSubmissionDetail":{"properties":{"client_game_id":{"type":"string","title":"Client Game Id"},"user_id":{"type":"integer","title":"User Id"},"status":{"type":"string","title":"Status"},"schema_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schema Version"},"rules_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rules Version"},"session_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Context"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"processed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Processed At"},"backend_session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Backend Session Id"},"rejected_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejected Reason"},"validation_warnings":{"items":{"type":"string"},"type":"array","title":"Validation Warnings"},"has_training_metrics":{"type":"boolean","title":"Has Training Metrics"},"training_mode_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Mode Name"}},"type":"object","required":["client_game_id","user_id","status","created_at","has_training_metrics"],"title":"AdminSubmissionDetail","description":"Safe admin-only metadata for one submission. Never includes raw_payload."},"AdminSubmissionSummary":{"properties":{"client_game_id":{"type":"string","title":"Client Game Id"},"user_id":{"type":"integer","title":"User Id"},"status":{"type":"string","title":"Status"},"session_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Context"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"processed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Processed At"},"backend_session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Backend Session Id"},"rejected_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejected Reason"},"validation_warnings":{"items":{"type":"string"},"type":"array","title":"Validation Warnings"},"has_training_metrics":{"type":"boolean","title":"Has Training Metrics"}},"type":"object","required":["client_game_id","user_id","status","created_at","updated_at","has_training_metrics"],"title":"AdminSubmissionSummary","description":"Safe admin-only list item — no raw_payload, no tokens, no event logs."},"AdminSubmissionsListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminSubmissionSummary"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["items","total","offset","limit"],"title":"AdminSubmissionsListResponse"},"AdminSyncDiagnosticsRejections":{"properties":{"rejection_reason_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Rejection Reason Counts"},"items":{"items":{"$ref":"#/components/schemas/AdminRejectionSample"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["rejection_reason_counts","items","total","offset","limit"],"title":"AdminSyncDiagnosticsRejections"},"AdminSyncDiagnosticsSummary":{"properties":{"counts_by_status":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts By Status"},"oldest_queued_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Oldest Queued Seconds"},"oldest_processing_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Oldest Processing Seconds"},"stale_processing_count":{"type":"integer","title":"Stale Processing Count"},"stale_processing_threshold_seconds":{"type":"integer","title":"Stale Processing Threshold Seconds"},"retryable_failure_count":{"type":"integer","title":"Retryable Failure Count"},"materialized_session_count":{"type":"integer","title":"Materialized Session Count"},"accepted_with_backend_session_count":{"type":"integer","title":"Accepted With Backend Session Count"},"rejection_count_by_reason":{"additionalProperties":{"type":"integer"},"type":"object","title":"Rejection Count By Reason"},"last_accepted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Accepted At"},"last_rejected_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Rejected At"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"}},"type":"object","required":["counts_by_status","oldest_queued_seconds","oldest_processing_seconds","stale_processing_count","stale_processing_threshold_seconds","retryable_failure_count","materialized_session_count","accepted_with_backend_session_count","generated_at"],"title":"AdminSyncDiagnosticsSummary","description":"Aggregate health summary for admin sync diagnostics."},"AroundTheClockFinalScoreEntry":{"properties":{"slot":{"type":"integer","title":"Slot"},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"score":{"type":"integer","title":"Score"}},"type":"object","required":["slot","display_name","score"],"title":"AroundTheClockFinalScoreEntry"},"AroundTheClockSessionConfigCreate":{"properties":{"hit_rule":{"type":"string","enum":["all","doublesOnly","triplesOnly"],"title":"Hit Rule","default":"all"},"extra_dart_rule":{"type":"boolean","title":"Extra Dart Rule","default":true},"miss_penalty":{"type":"string","enum":["none","stepBack"],"title":"Miss Penalty","default":"none"}},"type":"object","title":"AroundTheClockSessionConfigCreate"},"AroundTheClockSessionParticipantCreate":{"properties":{"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"slot":{"type":"integer","title":"Slot"},"is_bot":{"type":"boolean","title":"Is Bot","default":false},"bot_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Version"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["display_name","slot"],"title":"AroundTheClockSessionParticipantCreate"},"AroundTheClockTrainingSessionCreate":{"properties":{"name":{"type":"string","title":"Name","default":"Around The Clock Training"},"created_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Player Id"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"participants":{"items":{"$ref":"#/components/schemas/AroundTheClockSessionParticipantCreate"},"type":"array","maxItems":4,"minItems":1,"title":"Participants"},"config":{"$ref":"#/components/schemas/AroundTheClockSessionConfigCreate"},"finish_reason":{"type":"string","title":"Finish Reason"},"final_scores":{"items":{"$ref":"#/components/schemas/AroundTheClockFinalScoreEntry"},"type":"array","title":"Final Scores"},"winner_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Player Id"},"winner_slot":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Slot"},"progression_summary":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Progression Summary"},"turns_count":{"type":"integer","title":"Turns Count","default":0},"darts_count":{"type":"integer","title":"Darts Count","default":0},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["participants","config","finish_reason"],"title":"AroundTheClockTrainingSessionCreate","example":{"config":{"extra_dart_rule":true,"hit_rule":"all","miss_penalty":"none"},"darts_count":36,"extra_data":{"source":"ios_around_the_clock_mvp"},"final_scores":[{"display_name":"maxcheckout","player_id":7,"score":21,"slot":1},{"display_name":"Guest Bob","score":18,"slot":2}],"finish_reason":"reached_bull","name":"Around The Clock Session","participants":[{"display_name":"maxcheckout","player_id":7,"slot":1},{"display_name":"Guest Bob","slot":2}],"progression_summary":[],"turns_count":14,"winner_player_id":7,"winner_slot":1}},"AuthMeRead":{"properties":{"session":{"$ref":"#/components/schemas/AuthSessionRead"},"subject_kind":{"type":"string","enum":["player","club_admin"],"title":"Subject Kind"},"player":{"anyOf":[{"$ref":"#/components/schemas/PlayerRead"},{"type":"null"}]},"club":{"anyOf":[{"$ref":"#/components/schemas/ClubRead"},{"type":"null"}]},"profile":{"anyOf":[{"$ref":"#/components/schemas/PlayerProfileRead"},{"type":"null"}]},"extended_profile":{"anyOf":[{"$ref":"#/components/schemas/PlayerExtendedProfileRead"},{"type":"null"}]},"active_club":{"anyOf":[{"$ref":"#/components/schemas/ActiveClubRead"},{"type":"null"}]},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"}},"type":"object","required":["session","subject_kind"],"title":"AuthMeRead","example":{"active_club":{"club_alias":"DCB","club_id":2,"club_name":"DC Berlin"},"player":{"alias":"maxcheckout","birthdate":"1995-04-18","country_code":"DE","created_at":"2026-04-01T10:00:00","email":"max@example.com","extra_data":{},"first_name":"Max","id":7,"is_active":true,"last_name":"Muster","updated_at":"2026-04-10T10:00:00"},"profile":{"extra_data":{},"handedness":"right","id":3,"nickname":"The Finisher","phone":"+49 170 1234567","player_id":7},"roles":["player"],"session":{"access_token":"token-value","expires_at":"2026-04-18T12:00:00","requires_password_change":false,"subject_id":7,"subject_kind":"player","token_type":"bearer"},"subject_kind":"player"}},"AuthProvider":{"type":"string","enum":["email","google","apple_game_center"],"title":"AuthProvider"},"AuthSessionRead":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"subject_id":{"type":"integer","title":"Subject Id"},"subject_kind":{"type":"string","title":"Subject Kind"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"requires_password_change":{"type":"boolean","title":"Requires Password Change","default":false},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"expires_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In"},"access_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Access Expires At"}},"type":"object","required":["access_token","subject_id","subject_kind","expires_at"],"title":"AuthSessionRead"},"BlockedPlayerRead":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"blocked_at":{"type":"string","format":"date-time","title":"Blocked At"}},"type":"object","required":["player_id","display_name","blocked_at"],"title":"BlockedPlayerRead"},"BullMasterFinalScoreEntry":{"properties":{"slot":{"type":"integer","title":"Slot"},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"bull_points":{"type":"integer","title":"Bull Points"},"bull_hits":{"type":"integer","title":"Bull Hits"},"misses":{"type":"integer","title":"Misses"}},"type":"object","required":["slot","display_name","bull_points","bull_hits","misses"],"title":"BullMasterFinalScoreEntry"},"BullMasterSessionConfigCreate":{"properties":{"total_turns":{"type":"integer","title":"Total Turns"},"throws_per_turn":{"type":"integer","title":"Throws Per Turn"},"single_bull_points":{"type":"integer","title":"Single Bull Points"},"double_bull_points":{"type":"integer","title":"Double Bull Points"}},"type":"object","required":["total_turns","throws_per_turn","single_bull_points","double_bull_points"],"title":"BullMasterSessionConfigCreate"},"BullMasterSessionParticipantCreate":{"properties":{"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"slot":{"type":"integer","title":"Slot"},"is_bot":{"type":"boolean","title":"Is Bot","default":false},"bot_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Version"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["display_name","slot"],"title":"BullMasterSessionParticipantCreate"},"BullMasterTrainingSessionCreate":{"properties":{"name":{"type":"string","title":"Name","default":"Bull Master Training"},"created_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Player Id"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"participants":{"items":{"$ref":"#/components/schemas/BullMasterSessionParticipantCreate"},"type":"array","maxItems":4,"minItems":1,"title":"Participants"},"config":{"$ref":"#/components/schemas/BullMasterSessionConfigCreate"},"finish_reason":{"type":"string","title":"Finish Reason"},"final_scores":{"items":{"$ref":"#/components/schemas/BullMasterFinalScoreEntry"},"type":"array","title":"Final Scores"},"winner_player_ids":{"items":{"type":"integer"},"type":"array","title":"Winner Player Ids"},"winner_slots":{"items":{"type":"integer"},"type":"array","title":"Winner Slots"},"turns_summary":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Turns Summary"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["participants","config","finish_reason"],"title":"BullMasterTrainingSessionCreate"},"Checkouts6180FinalScoreEntry":{"properties":{"slot":{"type":"integer","title":"Slot"},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"successful_checkouts":{"type":"integer","title":"Successful Checkouts"},"failed_attempts":{"type":"integer","title":"Failed Attempts"},"darts_used":{"type":"integer","title":"Darts Used"}},"type":"object","required":["slot","display_name","successful_checkouts","failed_attempts","darts_used"],"title":"Checkouts6180FinalScoreEntry"},"Checkouts6180SessionConfigCreate":{"properties":{"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset"},"start_target":{"type":"integer","title":"Start Target"},"end_target":{"type":"integer","title":"End Target"},"throws_per_attempt":{"type":"integer","title":"Throws Per Attempt"},"requires_double_out":{"type":"boolean","title":"Requires Double Out"}},"type":"object","required":["start_target","end_target","throws_per_attempt","requires_double_out"],"title":"Checkouts6180SessionConfigCreate"},"Checkouts6180SessionParticipantCreate":{"properties":{"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"slot":{"type":"integer","title":"Slot"},"is_bot":{"type":"boolean","title":"Is Bot","default":false},"bot_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Version"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["display_name","slot"],"title":"Checkouts6180SessionParticipantCreate"},"Checkouts6180TrainingSessionCreate":{"properties":{"name":{"type":"string","title":"Name","default":"Checkouts 61-80 Training"},"created_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Player Id"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"participants":{"items":{"$ref":"#/components/schemas/Checkouts6180SessionParticipantCreate"},"type":"array","maxItems":4,"minItems":1,"title":"Participants"},"config":{"$ref":"#/components/schemas/Checkouts6180SessionConfigCreate"},"finish_reason":{"type":"string","title":"Finish Reason"},"final_scores":{"items":{"$ref":"#/components/schemas/Checkouts6180FinalScoreEntry"},"type":"array","title":"Final Scores"},"winner_player_ids":{"items":{"type":"integer"},"type":"array","title":"Winner Player Ids"},"winner_slots":{"items":{"type":"integer"},"type":"array","title":"Winner Slots"},"attempts_summary":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Attempts Summary"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["participants","config","finish_reason"],"title":"Checkouts6180TrainingSessionCreate"},"ClubActivityModeCount":{"properties":{"mode_name":{"type":"string","title":"Mode Name"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["mode_name","count"],"title":"ClubActivityModeCount"},"ClubActivitySummaryRead":{"properties":{"club_id":{"type":"integer","title":"Club Id"},"total_matches":{"type":"integer","title":"Total Matches"},"matches_last_7_days":{"type":"integer","title":"Matches Last 7 Days"},"matches_last_30_days":{"type":"integer","title":"Matches Last 30 Days"},"active_players_last_30_days":{"type":"integer","title":"Active Players Last 30 Days"},"latest_match_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latest Match At"},"mode_counts":{"items":{"$ref":"#/components/schemas/ClubActivityModeCount"},"type":"array","title":"Mode Counts"},"finished_matches":{"type":"integer","title":"Finished Matches","default":0}},"type":"object","required":["club_id","total_matches","matches_last_7_days","matches_last_30_days","active_players_last_30_days"],"title":"ClubActivitySummaryRead"},"ClubAdminAccountUpdate":{"properties":{"club_name":{"type":"string","title":"Club Name"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"admin_display_name":{"type":"string","title":"Admin Display Name"},"admin_email":{"type":"string","format":"email","title":"Admin Email"},"admin_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Phone"},"profile":{"$ref":"#/components/schemas/ClubProfileUpsert"}},"type":"object","required":["club_name","admin_display_name","admin_email"],"title":"ClubAdminAccountUpdate","example":{"admin_display_name":"Claudia Vorstand","admin_email":"vorstand@dcn.de","admin_phone":"+49 170 1234567","city":"Hamburg","club_name":"DC Nordsterne","description":"Ligaverein mit Training am Mittwoch.","profile":{"home_venue":"Nordhalle","phone":"+49 40 123456","training_days":"Mittwoch"},"short_name":"DCN"}},"ClubAdminAuthResponse":{"properties":{"session":{"$ref":"#/components/schemas/AuthSessionRead"},"club":{"$ref":"#/components/schemas/ClubRead"},"admin":{"$ref":"#/components/schemas/ClubAdminRead"}},"type":"object","required":["session","club","admin"],"title":"ClubAdminAuthResponse"},"ClubAdminOAuthRegister":{"properties":{"provider":{"$ref":"#/components/schemas/AuthProvider"},"id_token":{"type":"string","minLength":20,"title":"Id Token"},"nonce":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nonce"},"club_name":{"type":"string","title":"Club Name"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"admin_display_name":{"type":"string","title":"Admin Display Name"},"admin_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Phone"},"profile":{"$ref":"#/components/schemas/ClubProfileUpsert"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["provider","id_token","club_name","admin_display_name"],"title":"ClubAdminOAuthRegister","example":{"admin_display_name":"Jana Verein","admin_phone":"+49 171 7654321","club_name":"DC Sternwurf","id_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6IkVYQU1QTEUifQ.example.payload.signature","nonce":"club-admin-login-123","provider":"google","short_name":"DCS"}},"ClubAdminRead":{"properties":{"id":{"type":"integer","title":"Id"},"club_id":{"type":"integer","title":"Club Id"},"email":{"type":"string","title":"Email"},"display_name":{"type":"string","title":"Display Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"role_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Label"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","club_id","email","display_name","is_active","created_at","updated_at"],"title":"ClubAdminRead"},"ClubAdminRegister":{"properties":{"club_name":{"type":"string","title":"Club Name"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"admin_display_name":{"type":"string","title":"Admin Display Name"},"admin_email":{"type":"string","format":"email","title":"Admin Email"},"password":{"type":"string","minLength":8,"title":"Password"},"admin_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Phone"},"profile":{"$ref":"#/components/schemas/ClubProfileUpsert"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["club_name","admin_display_name","admin_email","password"],"title":"ClubAdminRegister","example":{"admin_display_name":"Claudia Vorstand","admin_email":"vorstand@dcn.de","admin_phone":"+49 170 1234567","city":"Hamburg","club_name":"DC Nordsterne","password":"VereinPasswort123","profile":{"home_venue":"Nordhalle","phone":"+49 40 123456","training_days":"Mittwoch"},"short_name":"DCN"}},"ClubCompetitionCreate":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"competition_type":{"$ref":"#/components/schemas/ClubCompetitionType","default":"league"},"status":{"$ref":"#/components/schemas/ClubCompetitionStatus","default":"draft"}},"type":"object","required":["name"],"title":"ClubCompetitionCreate"},"ClubCompetitionRead":{"properties":{"id":{"type":"integer","title":"Id"},"club_id":{"type":"integer","title":"Club Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"competition_type":{"$ref":"#/components/schemas/ClubCompetitionType"},"status":{"$ref":"#/components/schemas/ClubCompetitionStatus"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","club_id","name","competition_type","status","created_at","updated_at"],"title":"ClubCompetitionRead"},"ClubCompetitionStatus":{"type":"string","enum":["draft","active","archived"],"title":"ClubCompetitionStatus"},"ClubCompetitionType":{"type":"string","enum":["league","cup","friendly"],"title":"ClubCompetitionType"},"ClubCompetitionUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"competition_type":{"anyOf":[{"$ref":"#/components/schemas/ClubCompetitionType"},{"type":"null"}]},"status":{"anyOf":[{"$ref":"#/components/schemas/ClubCompetitionStatus"},{"type":"null"}]}},"type":"object","title":"ClubCompetitionUpdate"},"ClubContactCreate":{"properties":{"name":{"type":"string","title":"Name"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"is_primary":{"type":"boolean","title":"Is Primary","default":false},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["name"],"title":"ClubContactCreate","example":{"email":"sabine@verein.de","is_primary":true,"name":"Sabine Muster","phone":"+49 170 1234567","role":"Sportwartin"}},"ClubContactRead":{"properties":{"name":{"type":"string","title":"Name"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"is_primary":{"type":"boolean","title":"Is Primary","default":false},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"id":{"type":"integer","title":"Id"},"club_id":{"type":"integer","title":"Club Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["name","id","club_id","created_at","updated_at"],"title":"ClubContactRead","example":{"email":"sabine@verein.de","is_primary":true,"name":"Sabine Muster","phone":"+49 170 1234567","role":"Sportwartin"}},"ClubCreate":{"properties":{"name":{"type":"string","title":"Name"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_recruiting":{"type":"boolean","title":"Is Recruiting","default":false},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["name"],"title":"ClubCreate","example":{"city":"Berlin","name":"DC Berlin","short_name":"DCB"}},"ClubDashboardEventRead":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"}},"type":"object","required":["id","title","starts_at"],"title":"ClubDashboardEventRead"},"ClubDashboardRead":{"properties":{"club_id":{"type":"integer","title":"Club Id"},"name":{"type":"string","title":"Name"},"founded_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Founded Year"},"member_count":{"type":"integer","title":"Member Count"},"team_average":{"type":"number","title":"Team Average"},"matches_count":{"type":"integer","title":"Matches Count"},"club_rank":{"type":"integer","title":"Club Rank"},"active_season_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Season Name"},"next_event":{"anyOf":[{"$ref":"#/components/schemas/ClubDashboardEventRead"},{"type":"null"}]}},"type":"object","required":["club_id","name","member_count","team_average","matches_count","club_rank"],"title":"ClubDashboardRead","example":{"active_season_name":"Berlin Liga 2026","club_id":3,"club_rank":2,"founded_year":2008,"matches_count":44,"member_count":18,"name":"DC Berlin","next_event":{"id":9,"location":"Vereinsheim Berlin","starts_at":"2026-05-03T14:00:00","title":"Ligaspieltag"},"team_average":58.91}},"ClubEventAttendanceCounts":{"properties":{"accepted":{"type":"integer","title":"Accepted","default":0},"declined":{"type":"integer","title":"Declined","default":0}},"type":"object","title":"ClubEventAttendanceCounts"},"ClubEventAttendanceRead":{"properties":{"id":{"type":"integer","title":"Id"},"club_event_id":{"type":"integer","title":"Club Event Id"},"player_id":{"type":"integer","title":"Player Id"},"status":{"$ref":"#/components/schemas/ClubEventAttendanceStatus"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","club_event_id","player_id","status","created_at","updated_at"],"title":"ClubEventAttendanceRead"},"ClubEventAttendanceStatus":{"type":"string","enum":["accepted","declined"],"title":"ClubEventAttendanceStatus"},"ClubEventAttendanceSummary":{"properties":{"my_attendance_status":{"anyOf":[{"$ref":"#/components/schemas/ClubEventAttendanceStatus"},{"type":"null"}]},"counts":{"$ref":"#/components/schemas/ClubEventAttendanceCounts"}},"type":"object","title":"ClubEventAttendanceSummary"},"ClubEventAttendanceUpsert":{"properties":{"status":{"$ref":"#/components/schemas/ClubEventAttendanceStatus"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["status"],"title":"ClubEventAttendanceUpsert"},"ClubEventCreate":{"properties":{"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At"},"is_public":{"type":"boolean","title":"Is Public","default":true},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["title","starts_at"],"title":"ClubEventCreate","example":{"ends_at":"2026-05-02T22:00:00","is_public":true,"location":"Vereinsheim Berlin","starts_at":"2026-05-02T19:00:00","title":"Trainingsabend"}},"ClubEventRead":{"properties":{"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At"},"is_public":{"type":"boolean","title":"Is Public","default":true},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"id":{"type":"integer","title":"Id"},"club_id":{"type":"integer","title":"Club Id"},"my_attendance_status":{"anyOf":[{"$ref":"#/components/schemas/ClubEventAttendanceStatus"},{"type":"null"}]},"attendance_counts":{"$ref":"#/components/schemas/ClubEventAttendanceCounts"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["title","starts_at","id","club_id","created_at","updated_at"],"title":"ClubEventRead","example":{"ends_at":"2026-05-02T22:00:00","is_public":true,"location":"Vereinsheim Berlin","starts_at":"2026-05-02T19:00:00","title":"Trainingsabend"}},"ClubEventSeriesCreate":{"properties":{"title":{"type":"string","title":"Title"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"weekday":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Weekday"},"start_time":{"type":"string","format":"time","title":"Start Time"},"duration_minutes":{"type":"integer","exclusiveMinimum":0.0,"title":"Duration Minutes"},"start_date":{"type":"string","format":"date","title":"Start Date"},"until_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Until Date"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["title","weekday","start_time","duration_minutes","start_date"],"title":"ClubEventSeriesCreate"},"ClubEventSeriesRead":{"properties":{"title":{"type":"string","title":"Title"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"weekday":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Weekday"},"start_time":{"type":"string","format":"time","title":"Start Time"},"duration_minutes":{"type":"integer","exclusiveMinimum":0.0,"title":"Duration Minutes"},"start_date":{"type":"string","format":"date","title":"Start Date"},"until_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Until Date"},"is_active":{"type":"boolean","title":"Is Active","default":true},"id":{"type":"integer","title":"Id"},"club_id":{"type":"integer","title":"Club Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["title","weekday","start_time","duration_minutes","start_date","id","club_id","created_at","updated_at"],"title":"ClubEventSeriesRead"},"ClubEventSeriesUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"weekday":{"anyOf":[{"type":"integer","maximum":6.0,"minimum":0.0},{"type":"null"}],"title":"Weekday"},"start_time":{"anyOf":[{"type":"string","format":"time"},{"type":"null"}],"title":"Start Time"},"duration_minutes":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Duration Minutes"},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"until_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Until Date"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"ClubEventSeriesUpdate"},"ClubEventUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":180},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"location":{"anyOf":[{"type":"string","maxLength":180},{"type":"null"}],"title":"Location"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At"},"is_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public"},"extra_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra Data"}},"type":"object","title":"ClubEventUpdate","description":"PATCH body for `/clubs/{club_id}/events/{event_id}`. Nur gesetzte Felder werden geaendert."},"ClubFinanceSummaryRead":{"properties":{"total_income_cents":{"type":"integer","title":"Total Income Cents"},"total_expense_cents":{"type":"integer","title":"Total Expense Cents"},"balance_cents":{"type":"integer","title":"Balance Cents"},"currency":{"type":"string","title":"Currency"},"open_contributions_count":{"type":"integer","title":"Open Contributions Count"},"open_contributions_cents":{"type":"integer","title":"Open Contributions Cents"},"overdue_contributions_count":{"type":"integer","title":"Overdue Contributions Count"}},"type":"object","required":["total_income_cents","total_expense_cents","balance_cents","currency","open_contributions_count","open_contributions_cents","overdue_contributions_count"],"title":"ClubFinanceSummaryRead"},"ClubFinanceTransactionCancel":{"properties":{"cancel_reason":{"type":"string","maxLength":500,"minLength":1,"title":"Cancel Reason"}},"type":"object","required":["cancel_reason"],"title":"ClubFinanceTransactionCancel"},"ClubFinanceTransactionCreate":{"properties":{"transaction_type":{"$ref":"#/components/schemas/FinanceTransactionType"},"category":{"$ref":"#/components/schemas/FinanceCategory"},"amount_cents":{"type":"integer","title":"Amount Cents"},"currency":{"type":"string","title":"Currency","default":"EUR"},"description":{"type":"string","maxLength":500,"minLength":1,"title":"Description"},"occurred_at":{"type":"string","format":"date","title":"Occurred At"},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"}},"type":"object","required":["transaction_type","category","amount_cents","description","occurred_at"],"title":"ClubFinanceTransactionCreate"},"ClubFinanceTransactionRead":{"properties":{"id":{"type":"integer","title":"Id"},"club_id":{"type":"integer","title":"Club Id"},"transaction_type":{"$ref":"#/components/schemas/FinanceTransactionType"},"category":{"$ref":"#/components/schemas/FinanceCategory"},"amount_cents":{"type":"integer","title":"Amount Cents"},"currency":{"type":"string","title":"Currency"},"description":{"type":"string","title":"Description"},"occurred_at":{"type":"string","format":"date","title":"Occurred At"},"created_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Player Id"},"status":{"$ref":"#/components/schemas/FinanceTransactionStatus"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancelled At"},"cancelled_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cancelled By Player Id"},"cancel_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel Reason"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","club_id","transaction_type","category","amount_cents","currency","description","occurred_at","created_by_player_id","status","cancelled_at","cancelled_by_player_id","cancel_reason","note","created_at","updated_at"],"title":"ClubFinanceTransactionRead"},"ClubFinanceTransactionUpdate":{"properties":{"description":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Description"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"ClubFinanceTransactionUpdate"},"ClubFullProfileRead":{"properties":{"club":{"$ref":"#/components/schemas/ClubRead"},"profile":{"anyOf":[{"$ref":"#/components/schemas/ClubProfileRead"},{"type":"null"}]},"admins":{"items":{"$ref":"#/components/schemas/ClubAdminRead"},"type":"array","title":"Admins"},"pending_requests":{"items":{"$ref":"#/components/schemas/ClubMembershipRequestRead"},"type":"array","title":"Pending Requests"},"member_aliases":{"items":{"type":"string"},"type":"array","title":"Member Aliases"},"members":{"items":{"$ref":"#/components/schemas/ClubMemberRead"},"type":"array","title":"Members"},"stats":{"anyOf":[{"$ref":"#/components/schemas/ClubDashboardRead"},{"type":"null"}]}},"type":"object","required":["club"],"title":"ClubFullProfileRead"},"ClubIdentityUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":150,"minLength":1},{"type":"null"}],"title":"Name"},"short_name":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Short Name"},"city":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"City"},"country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_recruiting":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Recruiting"}},"type":"object","title":"ClubIdentityUpdate","description":"PATCH body for `/clubs/{club_id}` (Stammdaten). Nur gesetzte Felder werden aktualisiert."},"ClubInviteCodeCreate":{"properties":{"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"max_uses":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":1.0},{"type":"null"}],"title":"Max Uses"}},"type":"object","title":"ClubInviteCodeCreate"},"ClubInviteCodeRead":{"properties":{"id":{"type":"integer","title":"Id"},"club_id":{"type":"integer","title":"Club Id"},"code":{"type":"string","title":"Code"},"role_on_join":{"$ref":"#/components/schemas/MembershipRole"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"max_uses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Uses"},"uses_count":{"type":"integer","title":"Uses Count"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","club_id","code","role_on_join","uses_count","is_active","created_at","updated_at"],"title":"ClubInviteCodeRead"},"ClubInviteCodeUpdate":{"properties":{"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"max_uses":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":1.0},{"type":"null"}],"title":"Max Uses"}},"type":"object","title":"ClubInviteCodeUpdate"},"ClubInvitePreviewRead":{"properties":{"club_id":{"type":"integer","title":"Club Id"},"club_name":{"type":"string","title":"Club Name"},"club_short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Short Name"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"member_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Member Count"}},"type":"object","required":["club_id","club_name"],"title":"ClubInvitePreviewRead"},"ClubListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ClubSummaryRead"},"type":"array","title":"Items"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["meta"],"title":"ClubListResponse"},"ClubMatchHistoryResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ClubMatchSummaryRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["total","limit","offset"],"title":"ClubMatchHistoryResponse"},"ClubMatchParticipantSummary":{"properties":{"slot":{"type":"integer","title":"Slot"},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"is_winner":{"type":"boolean","title":"Is Winner"}},"type":"object","required":["slot","is_winner"],"title":"ClubMatchParticipantSummary"},"ClubMatchSummaryRead":{"properties":{"id":{"type":"integer","title":"Id"},"mode_name":{"type":"string","title":"Mode Name"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"state":{"$ref":"#/components/schemas/SessionState"},"source":{"$ref":"#/components/schemas/MatchSource"},"context":{"$ref":"#/components/schemas/GameContext"},"best_of_legs":{"type":"integer","title":"Best Of Legs"},"winner_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Player Id"},"participants":{"items":{"$ref":"#/components/schemas/ClubMatchParticipantSummary"},"type":"array","title":"Participants"},"opponent_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opponent Type"},"is_bot_involved":{"type":"boolean","title":"Is Bot Involved","default":false}},"type":"object","required":["id","mode_name","state","source","context","best_of_legs"],"title":"ClubMatchSummaryRead"},"ClubMemberContributionCancel":{"properties":{"cancel_reason":{"type":"string","maxLength":500,"minLength":1,"title":"Cancel Reason"}},"type":"object","required":["cancel_reason"],"title":"ClubMemberContributionCancel"},"ClubMemberContributionCreate":{"properties":{"membership_id":{"type":"integer","title":"Membership Id"},"period_label":{"type":"string","maxLength":20,"minLength":1,"title":"Period Label"},"amount_cents":{"type":"integer","title":"Amount Cents"},"currency":{"type":"string","title":"Currency","default":"EUR"},"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date"},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"}},"type":"object","required":["membership_id","period_label","amount_cents"],"title":"ClubMemberContributionCreate"},"ClubMemberContributionMarkPaid":{"properties":{"paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paid At"}},"type":"object","title":"ClubMemberContributionMarkPaid"},"ClubMemberContributionRead":{"properties":{"id":{"type":"integer","title":"Id"},"club_id":{"type":"integer","title":"Club Id"},"membership_id":{"type":"integer","title":"Membership Id"},"period_label":{"type":"string","title":"Period Label"},"amount_cents":{"type":"integer","title":"Amount Cents"},"currency":{"type":"string","title":"Currency"},"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date"},"status":{"$ref":"#/components/schemas/ContributionStatus"},"paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paid At"},"paid_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Paid By Player Id"},"waived_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Waived At"},"waived_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Waived By Player Id"},"waive_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Waive Reason"},"cancelled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancelled At"},"cancelled_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cancelled By Player Id"},"cancel_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel Reason"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","club_id","membership_id","period_label","amount_cents","currency","due_date","status","paid_at","paid_by_player_id","waived_at","waived_by_player_id","waive_reason","cancelled_at","cancelled_by_player_id","cancel_reason","note","created_at","updated_at"],"title":"ClubMemberContributionRead"},"ClubMemberContributionUpdate":{"properties":{"due_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date"},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"}},"type":"object","title":"ClubMemberContributionUpdate"},"ClubMemberContributionWaive":{"properties":{"waive_reason":{"type":"string","maxLength":500,"minLength":1,"title":"Waive Reason"}},"type":"object","required":["waive_reason"],"title":"ClubMemberContributionWaive"},"ClubMemberRead":{"properties":{"membership_id":{"type":"integer","title":"Membership Id"},"player_id":{"type":"integer","title":"Player Id"},"player_name":{"type":"string","title":"Player Name"},"alias":{"type":"string","title":"Alias"},"role":{"type":"string","title":"Role"},"joined_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Joined On"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"player_profile_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player Profile Url"}},"type":"object","required":["membership_id","player_id","player_name","alias","role"],"title":"ClubMemberRead"},"ClubMembersResponse":{"properties":{"club_id":{"type":"integer","title":"Club Id"},"club_name":{"type":"string","title":"Club Name"},"members":{"items":{"$ref":"#/components/schemas/ClubMemberRead"},"type":"array","title":"Members"}},"type":"object","required":["club_id","club_name"],"title":"ClubMembersResponse"},"ClubMembershipCreate":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"role":{"$ref":"#/components/schemas/MembershipRole","default":"member"},"status":{"$ref":"#/components/schemas/MembershipStatus","default":"active"},"joined_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Joined On"},"left_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Left On"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["player_id"],"title":"ClubMembershipCreate","example":{"player_id":1,"role":"member","status":"active"}},"ClubMembershipRead":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"role":{"$ref":"#/components/schemas/MembershipRole","default":"member"},"status":{"$ref":"#/components/schemas/MembershipStatus","default":"active"},"joined_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Joined On"},"left_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Left On"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"id":{"type":"integer","title":"Id"},"club_id":{"type":"integer","title":"Club Id"}},"type":"object","required":["player_id","id","club_id"],"title":"ClubMembershipRead","example":{"player_id":1,"role":"member","status":"active"}},"ClubMembershipRequestCreate":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"requested_role":{"$ref":"#/components/schemas/MembershipRole","default":"member"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["player_id"],"title":"ClubMembershipRequestCreate","example":{"message":"Ich wuerde gern am Ligabetrieb teilnehmen.","player_id":1,"requested_role":"member"}},"ClubMembershipRequestMineRead":{"properties":{"request_id":{"type":"integer","title":"Request Id"},"club_id":{"type":"integer","title":"Club Id"},"club_name":{"type":"string","title":"Club Name"},"status":{"$ref":"#/components/schemas/MembershipRequestStatus"},"requested_role":{"$ref":"#/components/schemas/MembershipRole"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["request_id","club_id","club_name","status","requested_role","created_at"],"title":"ClubMembershipRequestMineRead","description":"Eine Beitrittsanfrage des eingeloggten Spielers (`GET /clubs/requests/mine`)."},"ClubMembershipRequestRead":{"properties":{"id":{"type":"integer","title":"Id"},"player_id":{"type":"integer","title":"Player Id"},"club_id":{"type":"integer","title":"Club Id"},"requested_role":{"$ref":"#/components/schemas/MembershipRole"},"status":{"$ref":"#/components/schemas/MembershipRequestStatus"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"reviewed_by_admin_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reviewed By Admin Id"},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","player_id","club_id","requested_role","status","extra_data","created_at","updated_at"],"title":"ClubMembershipRequestRead"},"ClubMembershipRequestRespond":{"properties":{"approve":{"type":"boolean","title":"Approve"}},"type":"object","required":["approve"],"title":"ClubMembershipRequestRespond","description":"Player response to a direct club invitation.","example":{"approve":true}},"ClubMembershipRequestReview":{"properties":{"approve":{"type":"boolean","title":"Approve"},"role":{"$ref":"#/components/schemas/MembershipRole","default":"member"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["approve"],"title":"ClubMembershipRequestReview","example":{"approve":true,"note":"Willkommen im Verein.","role":"member"}},"ClubMembershipRoleUpdate":{"properties":{"role":{"$ref":"#/components/schemas/MembershipRole"}},"type":"object","required":["role"],"title":"ClubMembershipRoleUpdate","description":"PATCH body for `/clubs/{club_id}/memberships/{membership_id}`.","example":{"role":"manager"}},"ClubOverviewCapabilitiesRead":{"properties":{"is_club_admin":{"type":"boolean","title":"Is Club Admin","default":false},"is_active_member":{"type":"boolean","title":"Is Active Member","default":false},"can_manage_members":{"type":"boolean","title":"Can Manage Members","default":false},"can_edit_club_profile":{"type":"boolean","title":"Can Edit Club Profile","default":false},"can_create_events":{"type":"boolean","title":"Can Create Events","default":false},"can_view_sensitive_member_fields":{"type":"boolean","title":"Can View Sensitive Member Fields","default":false},"can_manage_tournaments":{"type":"boolean","title":"Can Manage Tournaments","default":false},"can_manage_finance":{"type":"boolean","title":"Can Manage Finance","default":false},"can_view_own_contributions":{"type":"boolean","title":"Can View Own Contributions","default":false}},"type":"object","title":"ClubOverviewCapabilitiesRead"},"ClubOverviewClubRead":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_recruiting":{"type":"boolean","title":"Is Recruiting","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","created_at","updated_at"],"title":"ClubOverviewClubRead"},"ClubOverviewInsightsRead":{"properties":{"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"highlights":{"items":{"type":"string"},"type":"array","title":"Highlights"}},"type":"object","title":"ClubOverviewInsightsRead"},"ClubOverviewKPIsRead":{"properties":{"member_count":{"type":"integer","title":"Member Count"},"team_average":{"type":"number","title":"Team Average"},"matches_count":{"type":"integer","title":"Matches Count"},"club_rank":{"type":"integer","title":"Club Rank"},"win_rate":{"type":"number","title":"Win Rate"},"wins":{"type":"integer","title":"Wins"},"losses":{"type":"integer","title":"Losses"},"active_season_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Season Name"},"next_event":{"anyOf":[{"$ref":"#/components/schemas/ClubDashboardEventRead"},{"type":"null"}]}},"type":"object","required":["member_count","team_average","matches_count","club_rank","win_rate","wins","losses"],"title":"ClubOverviewKPIsRead"},"ClubOverviewLeadershipRead":{"properties":{"admins":{"items":{"$ref":"#/components/schemas/ClubAdminRead"},"type":"array","title":"Admins"},"primary_contact":{"anyOf":[{"$ref":"#/components/schemas/ClubContactRead"},{"type":"null"}]}},"type":"object","title":"ClubOverviewLeadershipRead"},"ClubOverviewMembersPreviewRead":{"properties":{"total_count":{"type":"integer","title":"Total Count","default":0},"preview":{"items":{"$ref":"#/components/schemas/ClubMemberRead"},"type":"array","title":"Preview"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","title":"ClubOverviewMembersPreviewRead"},"ClubOverviewPerformerRead":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"stat_kind":{"type":"string","title":"Stat Kind"},"stat_value":{"type":"number","title":"Stat Value"},"wins":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wins"},"three_dart_average":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Three Dart Average"}},"type":"object","required":["player_id","display_name","stat_kind","stat_value"],"title":"ClubOverviewPerformerRead"},"ClubOverviewProfileSnippet":{"properties":{"founding_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Founding Year"},"home_venue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Venue"},"training_days":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Days"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"instagram_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram Handle"},"league_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},"type":"object","title":"ClubOverviewProfileSnippet"},"ClubOverviewRead":{"properties":{"club":{"$ref":"#/components/schemas/ClubOverviewClubRead"},"profile":{"anyOf":[{"$ref":"#/components/schemas/ClubOverviewProfileSnippet"},{"type":"null"}]},"kpis":{"$ref":"#/components/schemas/ClubOverviewKPIsRead"},"leadership":{"$ref":"#/components/schemas/ClubOverviewLeadershipRead"},"contacts":{"items":{"$ref":"#/components/schemas/ClubContactRead"},"type":"array","title":"Contacts"},"teams":{"items":{"$ref":"#/components/schemas/ClubOverviewTeamSnippet"},"type":"array","title":"Teams"},"members_preview":{"$ref":"#/components/schemas/ClubOverviewMembersPreviewRead"},"upcoming_events":{"items":{"$ref":"#/components/schemas/ClubEventRead"},"type":"array","title":"Upcoming Events"},"recent_results":{"items":{"$ref":"#/components/schemas/ClubOverviewRecentResultRead"},"type":"array","title":"Recent Results"},"top_performers":{"items":{"$ref":"#/components/schemas/ClubOverviewPerformerRead"},"type":"array","title":"Top Performers"},"insights":{"$ref":"#/components/schemas/ClubOverviewInsightsRead"},"capabilities":{"$ref":"#/components/schemas/ClubOverviewCapabilitiesRead"},"season_context":{"anyOf":[{"$ref":"#/components/schemas/ClubOverviewSeasonContextRead"},{"type":"null"}]}},"type":"object","required":["club","kpis","leadership","members_preview","insights","capabilities"],"title":"ClubOverviewRead"},"ClubOverviewRecentResultRead":{"properties":{"session_id":{"type":"integer","title":"Session Id"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"result_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result Summary"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"},"outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outcome"},"opponent_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opponent Summary"}},"type":"object","required":["session_id"],"title":"ClubOverviewRecentResultRead"},"ClubOverviewSeasonContextRead":{"properties":{"club_season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Season Id"},"club_season_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Season Name"},"club_competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Competition Id"},"club_competition_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Competition Name"}},"type":"object","title":"ClubOverviewSeasonContextRead"},"ClubOverviewTeamSnippet":{"properties":{"team_id":{"type":"integer","title":"Team Id"},"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"name":{"type":"string","title":"Name"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtitle"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name"},"league_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Name"},"season_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season Name"},"captain_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captain Name"},"is_active":{"type":"boolean","title":"Is Active","default":true},"member_count":{"type":"integer","title":"Member Count","default":0},"matches_count":{"type":"integer","title":"Matches Count","default":0},"wins":{"type":"integer","title":"Wins","default":0},"losses":{"type":"integer","title":"Losses","default":0},"win_rate":{"type":"number","title":"Win Rate","default":0.0}},"type":"object","required":["team_id","name"],"title":"ClubOverviewTeamSnippet"},"ClubPremiumEntitlementRead":{"properties":{"club_id":{"type":"integer","title":"Club Id"},"plan":{"type":"string","title":"Plan"},"status":{"type":"string","title":"Status"},"is_premium":{"type":"boolean","title":"Is Premium"},"features":{"$ref":"#/components/schemas/ClubPremiumFeaturesRead"},"limits":{"$ref":"#/components/schemas/ClubPremiumLimitsRead"},"is_enforced":{"type":"boolean","title":"Is Enforced","default":false},"paywall_available":{"type":"boolean","title":"Paywall Available","default":true},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"source":{"type":"string","title":"Source"},"valid_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid From"},"valid_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid Until"},"granted_by_admin_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Granted By Admin Id"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["club_id","plan","status","is_premium","features","limits","source"],"title":"ClubPremiumEntitlementRead","description":"Extended entitlement detail for manager/admin. Adds operational fields."},"ClubPremiumFeaturesRead":{"properties":{"club_finance":{"type":"boolean","title":"Club Finance","default":false},"export":{"type":"boolean","title":"Export","default":false},"advanced_stats":{"type":"boolean","title":"Advanced Stats","default":false},"custom_branding":{"type":"boolean","title":"Custom Branding","default":false},"priority_support":{"type":"boolean","title":"Priority Support","default":false}},"type":"object","title":"ClubPremiumFeaturesRead","description":"Which premium features are available for this club."},"ClubPremiumLimitsRead":{"properties":{"max_club_members":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Club Members","default":25},"max_club_teams":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Club Teams","default":2},"max_active_tournaments":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Active Tournaments","default":1},"max_events_per_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Events Per Month","default":5}},"type":"object","title":"ClubPremiumLimitsRead","description":"Numeric limits for this club. null = unlimited."},"ClubPremiumStatusRead":{"properties":{"club_id":{"type":"integer","title":"Club Id"},"plan":{"type":"string","title":"Plan"},"status":{"type":"string","title":"Status"},"is_premium":{"type":"boolean","title":"Is Premium"},"features":{"$ref":"#/components/schemas/ClubPremiumFeaturesRead"},"limits":{"$ref":"#/components/schemas/ClubPremiumLimitsRead"},"is_enforced":{"type":"boolean","title":"Is Enforced","default":false},"paywall_available":{"type":"boolean","title":"Paywall Available","default":true},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["club_id","plan","status","is_premium","features","limits"],"title":"ClubPremiumStatusRead","description":"Compact premium status for all club members.\n\nis_enforced=False documents that limits are informational-only before\nreal IAP rollout. paywall_available=True signals the iOS shell can show\nan upgrade prompt."},"ClubPremiumStatusUpdate":{"properties":{"plan":{"type":"string","pattern":"^(free|premium|trial|manual_grant)$","title":"Plan"},"status":{"type":"string","pattern":"^(active|inactive|trialing|grace_period|canceled)$","title":"Status"},"source":{"type":"string","pattern":"^(manual|dev|admin_grant)$","title":"Source"},"valid_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid Until"},"notes":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Notes"},"entitlements_override":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Entitlements Override"},"limits_override":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Limits Override"}},"type":"object","required":["plan","status","source"],"title":"ClubPremiumStatusUpdate","description":"Manual status update for Club Admin portal.\n\nOnly source values manual/dev/admin_grant are permitted via this endpoint.\nstorekit and play_billing are reserved for future automated flows."},"ClubProfileRead":{"properties":{"founding_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Founding Year"},"home_venue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Venue"},"training_days":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Days"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"instagram_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram Handle"},"league_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Name"},"member_fee_info":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Fee Info"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"capacity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Capacity"},"application_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Application Notes"},"colors":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Colors"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"id":{"type":"integer","title":"Id"},"club_id":{"type":"integer","title":"Club Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","club_id","created_at","updated_at"],"title":"ClubProfileRead","example":{"founding_year":2008,"home_venue":"Dartkeller Nord","league_name":"Bezirksliga Nord","training_days":"Dienstag, Donnerstag"}},"ClubProfileUpsert":{"properties":{"founding_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Founding Year"},"home_venue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Venue"},"training_days":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Days"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"instagram_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram Handle"},"league_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Name"},"member_fee_info":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Fee Info"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"capacity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Capacity"},"application_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Application Notes"},"colors":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Colors"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","title":"ClubProfileUpsert","example":{"founding_year":2008,"home_venue":"Dartkeller Nord","league_name":"Bezirksliga Nord","training_days":"Dienstag, Donnerstag"}},"ClubRankingItem":{"properties":{"rank":{"type":"integer","title":"Rank"},"club_id":{"type":"integer","title":"Club Id"},"club_name":{"type":"string","title":"Club Name"},"club_alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Alias"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"member_count":{"type":"integer","title":"Member Count"},"total_rating":{"type":"integer","title":"Total Rating","default":0},"average_rating":{"type":"number","title":"Average Rating","default":0.0},"team_average":{"type":"number","title":"Team Average"},"wins":{"type":"integer","title":"Wins"},"losses":{"type":"integer","title":"Losses"},"win_rate":{"type":"number","title":"Win Rate"},"matches_count":{"type":"integer","title":"Matches Count"},"is_recruiting":{"type":"boolean","title":"Is Recruiting"},"is_self":{"type":"boolean","title":"Is Self","default":false}},"type":"object","required":["rank","club_id","club_name","member_count","team_average","wins","losses","win_rate","matches_count","is_recruiting"],"title":"ClubRankingItem","description":"Eine Zeile im Vereins-Ranking (keine personenbezogenen Einzeldaten)."},"ClubRankingMetric":{"type":"string","enum":["rating","members","name","team_average","win_rate","matches_count"],"title":"ClubRankingMetric","description":"Sortier-/Kennzahl für ``GET /clubs/ranking``."},"ClubRankingResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ClubRankingItem"},"type":"array","title":"Items"},"meta":{"$ref":"#/components/schemas/PaginationMeta"},"my_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"My Rank"}},"type":"object","required":["meta"],"title":"ClubRankingResponse"},"ClubRead":{"properties":{"name":{"type":"string","title":"Name"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_recruiting":{"type":"boolean","title":"Is Recruiting","default":false},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"id":{"type":"integer","title":"Id"},"profile":{"anyOf":[{"$ref":"#/components/schemas/ClubProfileRead"},{"type":"null"}]},"memberships":{"items":{"$ref":"#/components/schemas/ClubMembershipRead"},"type":"array","title":"Memberships"},"contacts":{"items":{"$ref":"#/components/schemas/ClubContactRead"},"type":"array","title":"Contacts"},"events":{"items":{"$ref":"#/components/schemas/ClubEventRead"},"type":"array","title":"Events"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["name","id","created_at","updated_at"],"title":"ClubRead","example":{"city":"Berlin","name":"DC Berlin","short_name":"DCB"}},"ClubSeasonCompetitionAssign":{"properties":{"club_competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Competition Id"}},"type":"object","title":"ClubSeasonCompetitionAssign"},"ClubSeasonCreate":{"properties":{"name":{"type":"string","title":"Name"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"},"season_type":{"$ref":"#/components/schemas/ClubSeasonType","default":"default"},"status":{"$ref":"#/components/schemas/ClubSeasonStatus","default":"draft"}},"type":"object","required":["name","starts_at","ends_at"],"title":"ClubSeasonCreate"},"ClubSeasonRead":{"properties":{"id":{"type":"integer","title":"Id"},"club_id":{"type":"integer","title":"Club Id"},"club_competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Competition Id"},"club_competition":{"anyOf":[{"$ref":"#/components/schemas/ClubCompetitionRead"},{"type":"null"}]},"name":{"type":"string","title":"Name"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"},"status":{"$ref":"#/components/schemas/ClubSeasonStatus"},"season_type":{"$ref":"#/components/schemas/ClubSeasonType"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","club_id","name","starts_at","ends_at","status","season_type","created_at","updated_at"],"title":"ClubSeasonRead"},"ClubSeasonStatus":{"type":"string","enum":["draft","active","closed"],"title":"ClubSeasonStatus"},"ClubSeasonTeamRead":{"properties":{"id":{"type":"integer","title":"Id"},"club_season_id":{"type":"integer","title":"Club Season Id"},"team_id":{"type":"integer","title":"Team Id"},"enrolled_at":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Enrolled At"},"left_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Left On"},"is_active":{"type":"boolean","title":"Is Active","default":true},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","club_season_id","team_id","created_at","updated_at"],"title":"ClubSeasonTeamRead"},"ClubSeasonType":{"type":"string","enum":["default","league","cup"],"title":"ClubSeasonType"},"ClubSeasonUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At"},"status":{"anyOf":[{"$ref":"#/components/schemas/ClubSeasonStatus"},{"type":"null"}]}},"type":"object","title":"ClubSeasonUpdate"},"ClubSummaryRead":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_recruiting":{"type":"boolean","title":"Is Recruiting","default":false}},"type":"object","required":["id","name"],"title":"ClubSummaryRead","description":"Öffentliche Vereins-Kurzinfo für `GET /clubs/` und `GET /clubs/list` (keine Listen, kein Profil)."},"ClubTeamCreate":{"properties":{"name":{"type":"string","title":"Name"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name"},"league_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Name"},"season_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season Name"},"captain_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Captain Player Id"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name"],"title":"ClubTeamCreate"},"ClubTeamHeadToHeadMatchRow":{"properties":{"session_id":{"type":"integer","title":"Session Id"},"played_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Played At"},"winner_team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Team Id"},"winner_team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Winner Team Name"}},"type":"object","required":["session_id"],"title":"ClubTeamHeadToHeadMatchRow"},"ClubTeamHeadToHeadResponse":{"properties":{"club_id":{"type":"integer","title":"Club Id"},"team_a_id":{"type":"integer","title":"Team A Id"},"team_a_name":{"type":"string","title":"Team A Name"},"team_b_id":{"type":"integer","title":"Team B Id"},"team_b_name":{"type":"string","title":"Team B Name"},"matches_total":{"type":"integer","title":"Matches Total"},"wins_a":{"type":"integer","title":"Wins A"},"wins_b":{"type":"integer","title":"Wins B"},"no_result":{"type":"integer","title":"No Result"},"last_played_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Played At"},"matches":{"items":{"$ref":"#/components/schemas/ClubTeamHeadToHeadMatchRow"},"type":"array","title":"Matches"},"data_quality_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Quality Note"}},"type":"object","required":["club_id","team_a_id","team_a_name","team_b_id","team_b_name","matches_total","wins_a","wins_b","no_result"],"title":"ClubTeamHeadToHeadResponse"},"ClubTeamMemberCreate":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"joined_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Joined On"}},"type":"object","required":["player_id"],"title":"ClubTeamMemberCreate"},"ClubTeamMemberRead":{"properties":{"id":{"type":"integer","title":"Id"},"team_id":{"type":"integer","title":"Team Id"},"player_id":{"type":"integer","title":"Player Id"},"player_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player Name"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"joined_on":{"type":"string","format":"date","title":"Joined On"},"left_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Left On"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","team_id","player_id","joined_on","created_at","updated_at"],"title":"ClubTeamMemberRead"},"ClubTeamMembersListRead":{"properties":{"id":{"type":"integer","title":"Id"},"player_id":{"type":"integer","title":"Player Id"},"player_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player Name"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"joined_on":{"type":"string","format":"date","title":"Joined On"},"left_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Left On"},"is_active":{"type":"boolean","title":"Is Active"},"is_captain":{"type":"boolean","title":"Is Captain"}},"type":"object","required":["id","player_id","joined_on","is_active","is_captain"],"title":"ClubTeamMembersListRead","description":"CT2 — one entry in GET /clubs/{club_id}/teams/{team_id}/members (active + historical)."},"ClubTeamPlayerStatRow":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"matches_played":{"type":"integer","title":"Matches Played"},"wins":{"type":"integer","title":"Wins"},"losses":{"type":"integer","title":"Losses"},"win_rate":{"type":"number","title":"Win Rate"},"last_played_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Played At"},"is_current_member":{"type":"boolean","title":"Is Current Member"}},"type":"object","required":["player_id","display_name","matches_played","wins","losses","win_rate","is_current_member"],"title":"ClubTeamPlayerStatRow"},"ClubTeamPlayerStatsResponse":{"properties":{"club_id":{"type":"integer","title":"Club Id"},"team_id":{"type":"integer","title":"Team Id"},"team_name":{"type":"string","title":"Team Name"},"club_season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Season Id"},"items":{"items":{"$ref":"#/components/schemas/ClubTeamPlayerStatRow"},"type":"array","title":"Items"},"data_quality_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Quality Note"}},"type":"object","required":["club_id","team_id","team_name"],"title":"ClubTeamPlayerStatsResponse"},"ClubTeamRead":{"properties":{"id":{"type":"integer","title":"Id"},"club_id":{"type":"integer","title":"Club Id"},"name":{"type":"string","title":"Name"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name"},"league_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Name"},"season_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season Name"},"captain_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Captain Player Id"},"captain_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captain Name"},"is_active":{"type":"boolean","title":"Is Active"},"member_count":{"type":"integer","title":"Member Count","default":0},"matches_count":{"type":"integer","title":"Matches Count","default":0},"wins":{"type":"integer","title":"Wins","default":0},"losses":{"type":"integer","title":"Losses","default":0},"win_rate":{"type":"number","title":"Win Rate","default":0.0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","club_id","name","is_active","created_at","updated_at"],"title":"ClubTeamRead"},"ClubTeamStandingRow":{"properties":{"rank":{"type":"integer","title":"Rank"},"team_id":{"type":"integer","title":"Team Id"},"team_name":{"type":"string","title":"Team Name"},"matches_played":{"type":"integer","title":"Matches Played"},"wins":{"type":"integer","title":"Wins"},"losses":{"type":"integer","title":"Losses"},"points":{"type":"integer","title":"Points"},"win_rate":{"type":"number","title":"Win Rate"},"data_quality_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Quality Note"}},"type":"object","required":["rank","team_id","team_name","matches_played","wins","losses","points","win_rate"],"title":"ClubTeamStandingRow"},"ClubTeamStandingsResponse":{"properties":{"club_id":{"type":"integer","title":"Club Id"},"club_season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Season Id"},"club_competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Competition Id"},"rows":{"items":{"$ref":"#/components/schemas/ClubTeamStandingRow"},"type":"array","title":"Rows"}},"type":"object","required":["club_id"],"title":"ClubTeamStandingsResponse"},"ClubTeamUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name"},"league_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Name"},"season_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season Name"},"captain_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Captain Player Id"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"ClubTeamUpdate"},"ClubTournamentCreate":{"properties":{"name":{"type":"string","title":"Name"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"tournament_format":{"$ref":"#/components/schemas/TournamentFormat","default":"single_elimination"},"participant_type":{"type":"string","enum":["player","team"],"title":"Participant Type","default":"player"},"game_settings":{"$ref":"#/components/schemas/ClubTournamentGameSettings"},"club_season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Season Id"},"club_competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Competition Id"},"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id"},"max_participants":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Participants"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["name","game_settings"],"title":"ClubTournamentCreate"},"ClubTournamentDetailRead":{"properties":{"tournament":{"$ref":"#/components/schemas/ClubTournamentRead"},"participants":{"items":{"$ref":"#/components/schemas/TournamentParticipantRead"},"type":"array","title":"Participants"},"matches":{"items":{"$ref":"#/components/schemas/TournamentMatchRead"},"type":"array","title":"Matches"}},"type":"object","required":["tournament"],"title":"ClubTournamentDetailRead"},"ClubTournamentGameSettings":{"properties":{"mode_name":{"type":"string","enum":["301","501","701","1001"],"title":"Mode Name","default":"501"},"start_rule":{"$ref":"#/components/schemas/StartRule","default":"straight_in"},"finish_rule":{"$ref":"#/components/schemas/FinishRule","default":"double_out"},"best_of_legs":{"type":"integer","enum":[1,3,5],"title":"Best Of Legs","default":1}},"type":"object","title":"ClubTournamentGameSettings"},"ClubTournamentParticipantCreate":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["player_id"],"title":"ClubTournamentParticipantCreate"},"ClubTournamentRead":{"properties":{"name":{"type":"string","title":"Name"},"format":{"$ref":"#/components/schemas/TournamentFormat","default":"single_elimination"},"status":{"$ref":"#/components/schemas/TournamentStatus","default":"draft"},"mode_name":{"type":"string","enum":["301","501","701","1001"],"title":"Mode Name","default":"501"},"start_rule":{"anyOf":[{"$ref":"#/components/schemas/StartRule"},{"type":"null"}]},"finish_rule":{"anyOf":[{"$ref":"#/components/schemas/FinishRule"},{"type":"null"}]},"best_of_legs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Best Of Legs"},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Name"},"club_alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Alias"},"competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Competition Id"},"season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season Id"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"max_participants":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Participants"},"display_club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Display Club Id"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"id":{"type":"integer","title":"Id"},"club_season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Season Id"},"club_competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Competition Id"},"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id"},"participant_type":{"type":"string","title":"Participant Type","default":"player"},"join_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Join Code"},"join_code_active":{"type":"boolean","title":"Join Code Active","default":false},"join_code_created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Join Code Created At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"current_round":{"type":"integer","title":"Current Round"},"winner_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Player Id"},"created_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Player Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"display_club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Club Name"},"participants_count":{"type":"integer","title":"Participants Count","default":0}},"type":"object","required":["name","id","current_round","created_at","updated_at"],"title":"ClubTournamentRead"},"ClubTournamentUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"tournament_format":{"anyOf":[{"$ref":"#/components/schemas/TournamentFormat"},{"type":"null"}]},"participant_type":{"anyOf":[{"type":"string","enum":["player","team"]},{"type":"null"}],"title":"Participant Type"},"game_settings":{"anyOf":[{"$ref":"#/components/schemas/ClubTournamentGameSettings"},{"type":"null"}]},"club_season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Season Id"},"club_competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Competition Id"},"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id"},"max_participants":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Participants"},"status":{"anyOf":[{"$ref":"#/components/schemas/TournamentStatus"},{"type":"null"}]},"extra_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra Data"}},"type":"object","title":"ClubTournamentUpdate"},"CompetitionKind":{"type":"string","enum":["league","tournament","friendly"],"title":"CompetitionKind"},"ContributionStatus":{"type":"string","enum":["open","paid","waived","cancelled"],"title":"ContributionStatus"},"CreateMessageRequest":{"properties":{"body":{"type":"string","maxLength":2000,"title":"Body"}},"type":"object","required":["body"],"title":"CreateMessageRequest"},"CricketFinalScoreEntry":{"properties":{"slot":{"type":"integer","title":"Slot"},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"score":{"type":"integer","title":"Score"}},"type":"object","required":["slot","display_name","score"],"title":"CricketFinalScoreEntry"},"CricketPlayerMarksSummaryEntry":{"properties":{"slot":{"type":"integer","title":"Slot"},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"marks_by_target":{"additionalProperties":{"type":"integer"},"type":"object","title":"Marks By Target"}},"type":"object","required":["slot","display_name"],"title":"CricketPlayerMarksSummaryEntry"},"CricketSessionParticipantCreate":{"properties":{"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"slot":{"type":"integer","title":"Slot"},"is_bot":{"type":"boolean","title":"Is Bot","default":false},"bot_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Version"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["display_name","slot"],"title":"CricketSessionParticipantCreate"},"CricketTrainingSessionCreate":{"properties":{"name":{"type":"string","title":"Name","default":"Cricket Training"},"created_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Player Id"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"participants":{"items":{"$ref":"#/components/schemas/CricketSessionParticipantCreate"},"type":"array","maxItems":4,"minItems":1,"title":"Participants"},"variant":{"type":"string","enum":["standard","noScore","cutThroat"],"title":"Variant","default":"standard"},"targets":{"items":{"type":"string"},"type":"array","title":"Targets"},"finish_reason":{"type":"string","title":"Finish Reason"},"final_scores":{"items":{"$ref":"#/components/schemas/CricketFinalScoreEntry"},"type":"array","title":"Final Scores"},"winner_player_ids":{"items":{"type":"integer"},"type":"array","title":"Winner Player Ids"},"winner_slots":{"items":{"type":"integer"},"type":"array","title":"Winner Slots"},"marks_summary":{"items":{"$ref":"#/components/schemas/CricketPlayerMarksSummaryEntry"},"type":"array","title":"Marks Summary"},"rounds_summary":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Rounds Summary"},"turns_count":{"type":"integer","title":"Turns Count","default":0},"darts_count":{"type":"integer","title":"Darts Count","default":0},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["participants","finish_reason"],"title":"CricketTrainingSessionCreate","example":{"darts_count":40,"extra_data":{"source":"ios_cricket_mvp"},"final_scores":[{"display_name":"maxcheckout","player_id":7,"score":45,"slot":1},{"display_name":"Guest Bob","score":28,"slot":2}],"finish_reason":"all_targets_closed","marks_summary":[{"display_name":"maxcheckout","marks_by_target":{"15":3,"16":3,"17":3,"18":3,"19":3,"20":3,"bull":3},"player_id":7,"slot":1}],"name":"Cricket Session","participants":[{"display_name":"maxcheckout","player_id":7,"slot":1},{"display_name":"Guest Bob","slot":2}],"rounds_summary":[],"targets":["20","19","18","17","16","15","bull"],"turns_count":16,"variant":"standard","winner_player_ids":[7],"winner_slots":[1]}},"DartInput":{"properties":{"segment":{"type":"integer","maximum":25.0,"minimum":0.0,"title":"Segment"},"multiplier":{"$ref":"#/components/schemas/ThrowMultiplier"},"bed":{"$ref":"#/components/schemas/ThrowBed"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["segment","multiplier","bed"],"title":"DartInput","example":{"bed":"triple","multiplier":"triple","segment":20}},"DartSetSummary":{"properties":{"brand":{"type":"string","title":"Brand"},"model_name":{"type":"string","title":"Model Name"},"weight_grams":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Weight Grams"},"tip_type":{"type":"string","title":"Tip Type"}},"type":"object","required":["brand","model_name","tip_type"],"title":"DartSetSummary","description":"Minimal dart-set summary embedded in ranking entries."},"DartThrowRead":{"properties":{"id":{"type":"integer","title":"Id"},"dart_index":{"type":"integer","title":"Dart Index"},"segment":{"type":"integer","title":"Segment"},"multiplier":{"$ref":"#/components/schemas/ThrowMultiplier"},"bed":{"$ref":"#/components/schemas/ThrowBed"},"label":{"type":"string","title":"Label"},"points":{"type":"integer","title":"Points"},"counts_for_score":{"type":"boolean","title":"Counts For Score"},"is_checkout_dart":{"type":"boolean","title":"Is Checkout Dart"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["id","dart_index","segment","multiplier","bed","label","points","counts_for_score","is_checkout_dart","extra_data"],"title":"DartThrowRead"},"DirectClubInvitationCreate":{"properties":{"player_id":{"type":"integer","title":"Player Id"}},"type":"object","required":["player_id"],"title":"DirectClubInvitationCreate","description":"Request body for manager-created direct club invitations.","example":{"player_id":42}},"FinanceCategory":{"type":"string","enum":["contribution","equipment","venue","tournament","other"],"title":"FinanceCategory"},"FinanceTransactionStatus":{"type":"string","enum":["active","cancelled"],"title":"FinanceTransactionStatus"},"FinanceTransactionType":{"type":"string","enum":["income","expense"],"title":"FinanceTransactionType"},"FinishRule":{"type":"string","enum":["straight_out","double_out","master_out"],"title":"FinishRule"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest","example":{"email":"max@example.com"}},"FriendListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/FriendRead"},"type":"array","title":"Items"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["meta"],"title":"FriendListResponse"},"FriendRead":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"name":{"type":"string","title":"Name","description":"Stabiler Listenname fuer den Friends-Screen, meist Nickname oder Alias."},"alias":{"type":"string","title":"Alias"},"display_name":{"type":"string","title":"Display Name","description":"UI-bevorzugter Anzeigename. Wenn kein Nickname existiert, identisch zu alias/name."},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"is_online":{"type":"boolean","title":"Is Online","default":false},"presence_state":{"type":"string","enum":["online","offline","in_game"],"title":"Presence State","default":"offline"},"three_dart_average":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Three Dart Average"},"checkout_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Checkout Percentage"},"current_session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Session Id"},"current_lobby_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Lobby Id"},"last_activity_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Activity At"},"last_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen At"},"player_profile_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player Profile Url"}},"type":"object","required":["player_id","name","alias","display_name"],"title":"FriendRead"},"FriendRequestCreate":{"properties":{"receiver_player_id":{"type":"integer","title":"Receiver Player Id"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["receiver_player_id"],"title":"FriendRequestCreate"},"FriendRequestRead":{"properties":{"id":{"type":"integer","title":"Id"},"sender_player_id":{"type":"integer","title":"Sender Player Id"},"receiver_player_id":{"type":"integer","title":"Receiver Player Id"},"sender_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Display Name"},"status":{"$ref":"#/components/schemas/FriendRequestStatus"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","sender_player_id","receiver_player_id","status","extra_data","created_at","updated_at"],"title":"FriendRequestRead"},"FriendRequestStatus":{"type":"string","enum":["pending","accepted","declined","cancelled"],"title":"FriendRequestStatus"},"GameContext":{"type":"string","enum":["training","local_1v1","competitive","club"],"title":"GameContext"},"GameSessionCreate":{"properties":{"name":{"type":"string","title":"Name"},"context":{"$ref":"#/components/schemas/GameContext"},"scoring_variant":{"$ref":"#/components/schemas/ScoringVariant","default":"x01"},"mode_name":{"type":"string","enum":["301","501","701","1001"],"title":"Mode Name","default":"501"},"start_rule":{"$ref":"#/components/schemas/StartRule","default":"straight_in"},"finish_rule":{"$ref":"#/components/schemas/FinishRule","default":"double_out"},"starting_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Starting Score","default":501},"best_of_legs":{"type":"integer","enum":[1,3,5],"title":"Best Of Legs","default":1},"state":{"$ref":"#/components/schemas/SessionState","default":"scheduled"},"scheduled_for":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled For"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"match_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Format"},"source":{"$ref":"#/components/schemas/MatchSource","default":"manual"},"import_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Import Source"},"competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Competition Id"},"season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season Id"},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"club_season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Season Id"},"host_team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Host Team Id"},"club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Name"},"club_alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Alias"},"created_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Player Id"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"participants":{"items":{"$ref":"#/components/schemas/SessionParticipantCreate"},"type":"array","title":"Participants"}},"type":"object","required":["name","context"],"title":"GameSessionCreate","example":{"best_of_legs":3,"club_name":"DC Berlin","context":"local_1v1","finish_rule":"double_out","match_format":"best_of_3_legs","mode_name":"501","name":"Testmatch 501","participants":[{"is_home":true,"player_id":1,"slot":1},{"is_home":false,"player_id":2,"slot":2}],"scoring_variant":"x01","start_rule":"straight_in","starting_score":501,"state":"active"}},"GameSessionRead":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"context":{"$ref":"#/components/schemas/GameContext"},"scoring_variant":{"$ref":"#/components/schemas/ScoringVariant"},"mode_name":{"type":"string","title":"Mode Name"},"start_rule":{"$ref":"#/components/schemas/StartRule"},"finish_rule":{"$ref":"#/components/schemas/FinishRule"},"starting_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Starting Score"},"best_of_legs":{"type":"integer","title":"Best Of Legs"},"state":{"$ref":"#/components/schemas/SessionState"},"scheduled_for":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled For"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"match_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Format"},"source":{"$ref":"#/components/schemas/MatchSource"},"import_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Import Source"},"competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Competition Id"},"season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season Id"},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"club_season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Season Id"},"host_team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Host Team Id"},"club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Name"},"created_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Player Id"},"winner_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Player Id"},"winner_session_participant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Session Participant Id"},"revision":{"type":"integer","title":"Revision","default":1},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"participants":{"items":{"$ref":"#/components/schemas/SessionParticipantRead"},"type":"array","title":"Participants"},"legs":{"items":{"$ref":"#/components/schemas/LegRead"},"type":"array","title":"Legs"}},"type":"object","required":["id","name","context","scoring_variant","mode_name","start_rule","finish_rule","best_of_legs","state","source","created_at","updated_at","extra_data"],"title":"GameSessionRead"},"GameSyncPayloadIn":{"properties":{"client_game_id":{"type":"string","minLength":1,"title":"Client Game Id"},"session_context":{"type":"string","minLength":1,"title":"Session Context"},"counts_toward_competitive_rating":{"type":"boolean","title":"Counts Toward Competitive Rating","default":false},"counts_toward_season_points":{"type":"boolean","title":"Counts Toward Season Points","default":false},"counts_toward_public_ranking":{"type":"boolean","title":"Counts Toward Public Ranking","default":false},"training_metrics":{"anyOf":[{"$ref":"#/components/schemas/GameSyncTrainingMetricsIn"},{"type":"null"}]}},"additionalProperties":true,"type":"object","required":["client_game_id","session_context"],"title":"GameSyncPayloadIn"},"GameSyncResponseOut":{"properties":{"status":{"type":"string","title":"Status"},"backend_session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Backend Session Id"},"client_game_id":{"type":"string","title":"Client Game Id"},"rejected_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejected Reason"},"validation_warnings":{"items":{"type":"string"},"type":"array","title":"Validation Warnings"}},"type":"object","required":["status","client_game_id"],"title":"GameSyncResponseOut"},"GameSyncTrainingMetricsIn":{"properties":{"mode_name":{"type":"string","minLength":1,"title":"Mode Name"},"reason":{"type":"string","minLength":1,"title":"Reason"},"metrics_by_slot":{"additionalProperties":{"additionalProperties":{"type":"number"},"type":"object"},"type":"object","title":"Metrics By Slot"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"additionalProperties":false,"type":"object","required":["mode_name","reason","created_at"],"title":"GameSyncTrainingMetricsIn"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HalveItFinalScoreEntry":{"properties":{"slot":{"type":"integer","title":"Slot"},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"score":{"type":"integer","title":"Score"}},"type":"object","required":["slot","display_name","score"],"title":"HalveItFinalScoreEntry"},"HalveItSessionParticipantCreate":{"properties":{"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"slot":{"type":"integer","title":"Slot"},"is_bot":{"type":"boolean","title":"Is Bot","default":false},"bot_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Version"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["display_name","slot"],"title":"HalveItSessionParticipantCreate"},"HalveItTrainingSessionCreate":{"properties":{"name":{"type":"string","title":"Name","default":"Halve It Training"},"created_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Player Id"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"participants":{"items":{"$ref":"#/components/schemas/HalveItSessionParticipantCreate"},"type":"array","maxItems":4,"minItems":1,"title":"Participants"},"starting_score":{"type":"integer","title":"Starting Score","default":40},"target_sequence":{"items":{"type":"string"},"type":"array","title":"Target Sequence"},"finish_reason":{"type":"string","title":"Finish Reason"},"final_scores":{"items":{"$ref":"#/components/schemas/HalveItFinalScoreEntry"},"type":"array","title":"Final Scores"},"winner_player_ids":{"items":{"type":"integer"},"type":"array","title":"Winner Player Ids"},"winner_slots":{"items":{"type":"integer"},"type":"array","title":"Winner Slots"},"rounds_summary":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Rounds Summary"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["participants","finish_reason"],"title":"HalveItTrainingSessionCreate","example":{"extra_data":{"source":"ios_halve_it_mvp"},"final_scores":[{"display_name":"maxcheckout","player_id":7,"score":116,"slot":1},{"display_name":"Guest Bob","score":92,"slot":2}],"finish_reason":"final_round_completed","name":"Halve It Session","participants":[{"display_name":"maxcheckout","player_id":7,"slot":1},{"display_name":"Guest Bob","slot":2}],"rounds_summary":[],"starting_score":40,"target_sequence":["single:20","single:19","anyDouble","single:18","single:17","anyTriple","bull"],"winner_player_ids":[7],"winner_slots":[1]}},"HeadToHeadRead":{"properties":{"player_one_id":{"type":"integer","title":"Player One Id"},"player_two_id":{"type":"integer","title":"Player Two Id"},"player_one_name":{"type":"string","title":"Player One Name"},"player_two_name":{"type":"string","title":"Player Two Name"},"matches_played":{"type":"integer","title":"Matches Played"},"player_one_wins":{"type":"integer","title":"Player One Wins"},"player_two_wins":{"type":"integer","title":"Player Two Wins"},"legs_player_one":{"type":"integer","title":"Legs Player One"},"legs_player_two":{"type":"integer","title":"Legs Player Two"},"visits_player_one":{"type":"integer","title":"Visits Player One"},"visits_player_two":{"type":"integer","title":"Visits Player Two"},"average_player_one":{"type":"number","title":"Average Player One"},"average_player_two":{"type":"number","title":"Average Player Two"},"checkout_percentage_player_one":{"type":"number","title":"Checkout Percentage Player One"},"checkout_percentage_player_two":{"type":"number","title":"Checkout Percentage Player Two"}},"type":"object","required":["player_one_id","player_two_id","player_one_name","player_two_name","matches_played","player_one_wins","player_two_wins","legs_player_one","legs_player_two","visits_player_one","visits_player_two","average_player_one","average_player_two","checkout_percentage_player_one","checkout_percentage_player_two"],"title":"HeadToHeadRead"},"HealthCheckRead":{"properties":{"status":{"type":"string","title":"Status","description":"Kurzer Lebenszeichen-Status des Backends.","default":"ok","examples":["ok"]},"service":{"type":"string","title":"Service","description":"Technischer Name des API-Dienstes.","default":"dart-backend","examples":["dart-backend"]},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"UTC-Zeitpunkt der Health-Antwort.","examples":["2026-04-18T06:20:00"]}},"type":"object","required":["timestamp"],"title":"HealthCheckRead"},"JoinClubByCodeRequest":{"properties":{"code":{"type":"string","maxLength":64,"minLength":4,"title":"Code"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["code"],"title":"JoinClubByCodeRequest"},"JoinClubByCodeResponse":{"properties":{"request_id":{"type":"integer","title":"Request Id"},"club_id":{"type":"integer","title":"Club Id"},"status":{"$ref":"#/components/schemas/MembershipRequestStatus"}},"type":"object","required":["request_id","club_id","status"],"title":"JoinClubByCodeResponse"},"LeagueCompetitionCreate":{"properties":{"name":{"type":"string","title":"Name"},"kind":{"$ref":"#/components/schemas/CompetitionKind","default":"league"},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"ruleset_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ruleset Name"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["name"],"title":"LeagueCompetitionCreate"},"LeagueCompetitionListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/LeagueCompetitionRead"},"type":"array","title":"Items"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["meta"],"title":"LeagueCompetitionListResponse"},"LeagueCompetitionRead":{"properties":{"name":{"type":"string","title":"Name"},"kind":{"$ref":"#/components/schemas/CompetitionKind","default":"league"},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"ruleset_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ruleset Name"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["name","id","created_at","updated_at"],"title":"LeagueCompetitionRead"},"LeagueSeasonCreate":{"properties":{"competition_id":{"type":"integer","title":"Competition Id"},"name":{"type":"string","title":"Name"},"starts_on":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts On"},"ends_on":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends On"},"is_active":{"type":"boolean","title":"Is Active","default":true},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["competition_id","name"],"title":"LeagueSeasonCreate"},"LeagueSeasonListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/LeagueSeasonRead"},"type":"array","title":"Items"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["meta"],"title":"LeagueSeasonListResponse"},"LeagueSeasonRead":{"properties":{"competition_id":{"type":"integer","title":"Competition Id"},"name":{"type":"string","title":"Name"},"starts_on":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts On"},"ends_on":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends On"},"is_active":{"type":"boolean","title":"Is Active","default":true},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["competition_id","name","id","created_at","updated_at"],"title":"LeagueSeasonRead"},"LegCreate":{"properties":{"leg_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Leg Number"},"starting_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Starting Player Id"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","title":"LegCreate","example":{"starting_player_id":1}},"LegRead":{"properties":{"id":{"type":"integer","title":"Id"},"session_id":{"type":"integer","title":"Session Id"},"leg_number":{"type":"integer","title":"Leg Number"},"state":{"$ref":"#/components/schemas/SessionState"},"starting_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Starting Player Id"},"winner_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Player Id"},"starting_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Starting Score"},"darts_to_finish":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Darts To Finish"},"checkout_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Checkout Value"},"successful_checkout":{"type":"boolean","title":"Successful Checkout","default":false},"checkout_attempts":{"type":"integer","title":"Checkout Attempts","default":0},"high_finish":{"type":"integer","title":"High Finish","default":0},"is_complete":{"type":"boolean","title":"Is Complete","default":false},"revision":{"type":"integer","title":"Revision","default":1},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"visits":{"items":{"$ref":"#/components/schemas/VisitRead"},"type":"array","title":"Visits"}},"type":"object","required":["id","session_id","leg_number","state","created_at","updated_at","extra_data"],"title":"LegRead"},"LobbyJoinByCodeRequest":{"properties":{"room_code":{"type":"string","maxLength":12,"minLength":4,"title":"Room Code"}},"type":"object","required":["room_code"],"title":"LobbyJoinByCodeRequest"},"LobbyStatus":{"type":"string","enum":["open","matched","closed"],"title":"LobbyStatus"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","minLength":8,"title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest","example":{"email":"max@example.com","password":"SicheresPasswort123"}},"MatchInviteCreate":{"properties":{"receiver_player_id":{"type":"integer","title":"Receiver Player Id"},"session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Session Id"},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"context":{"$ref":"#/components/schemas/GameContext","default":"local_1v1"},"mode_name":{"type":"string","title":"Mode Name","default":"501"},"scheduled_for":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled For"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["receiver_player_id"],"title":"MatchInviteCreate"},"MatchInviteListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MatchInviteRead"},"type":"array","title":"Items"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["meta"],"title":"MatchInviteListResponse"},"MatchInviteRead":{"properties":{"id":{"type":"integer","title":"Id"},"sender_player_id":{"type":"integer","title":"Sender Player Id"},"receiver_player_id":{"type":"integer","title":"Receiver Player Id"},"session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Session Id"},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"status":{"$ref":"#/components/schemas/MatchInviteStatus"},"context":{"$ref":"#/components/schemas/GameContext"},"mode_name":{"type":"string","title":"Mode Name"},"scheduled_for":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled For"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","sender_player_id","receiver_player_id","status","context","mode_name","extra_data","created_at","updated_at"],"title":"MatchInviteRead"},"MatchInviteStatus":{"type":"string","enum":["pending","accepted","declined","expired"],"title":"MatchInviteStatus"},"MatchSnapshotCurrentLeg":{"properties":{"leg_id":{"type":"integer","title":"Leg Id"},"leg_number":{"type":"integer","title":"Leg Number"},"leg_state":{"$ref":"#/components/schemas/SessionState"},"leg_revision":{"type":"integer","title":"Leg Revision"},"current_turn_participant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Turn Participant Id"},"current_turn_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Turn Player Id"}},"type":"object","required":["leg_id","leg_number","leg_state","leg_revision","current_turn_participant_id","current_turn_player_id"],"title":"MatchSnapshotCurrentLeg","description":"Active (or last displayed) leg metadata plus derived turn, matching visit validation order."},"MatchSnapshotParticipant":{"properties":{"participant_id":{"type":"integer","title":"Participant Id"},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"slot":{"type":"integer","title":"Slot"},"remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining"},"legs_won":{"type":"integer","title":"Legs Won"},"is_current_turn":{"type":"boolean","title":"Is Current Turn"},"is_winner":{"type":"boolean","title":"Is Winner"}},"type":"object","required":["participant_id","slot","legs_won","is_current_turn","is_winner"],"title":"MatchSnapshotParticipant","description":"Per-side scoreboard line for a session participant (no extra_data)."},"MatchSnapshotRead":{"properties":{"schema_version":{"type":"integer","title":"Schema Version","default":1},"session_id":{"type":"integer","title":"Session Id"},"session_revision":{"type":"integer","title":"Session Revision"},"status":{"$ref":"#/components/schemas/SessionState"},"context":{"$ref":"#/components/schemas/GameContext"},"scoring_variant":{"$ref":"#/components/schemas/ScoringVariant"},"mode_name":{"type":"string","title":"Mode Name"},"start_rule":{"$ref":"#/components/schemas/StartRule"},"finish_rule":{"$ref":"#/components/schemas/FinishRule"},"starting_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Starting Score"},"best_of_legs":{"type":"integer","title":"Best Of Legs"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"current_leg":{"anyOf":[{"$ref":"#/components/schemas/MatchSnapshotCurrentLeg"},{"type":"null"}]},"participants":{"items":{"$ref":"#/components/schemas/MatchSnapshotParticipant"},"type":"array","title":"Participants"},"recent_visits":{"items":{"$ref":"#/components/schemas/MatchSnapshotRecentVisit"},"type":"array","title":"Recent Visits"},"winner_participant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Participant Id"},"winner_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Player Id"}},"type":"object","required":["session_id","session_revision","status","context","scoring_variant","mode_name","start_rule","finish_rule","best_of_legs","updated_at","current_leg"],"title":"MatchSnapshotRead","description":"Safe scoreboard read model for polling and future SSE; authenticated clients only in v1.\nExcludes extra_data, dart throws, and any rating/skill data."},"MatchSnapshotRecentVisit":{"properties":{"visit_id":{"type":"integer","title":"Visit Id"},"participant_id":{"type":"integer","title":"Participant Id"},"visit_number":{"type":"integer","title":"Visit Number"},"score_applied":{"type":"integer","title":"Score Applied"},"remaining_after":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining After"},"bust":{"type":"boolean","title":"Bust"},"checkout":{"type":"boolean","title":"Checkout"}},"type":"object","required":["visit_id","participant_id","visit_number","score_applied","remaining_after","bust","checkout"],"title":"MatchSnapshotRecentVisit","description":"One visit in the current leg; subset of Visit (no darts, no extra_data)."},"MatchSource":{"type":"string","enum":["manual","import_source","league","tournament"],"title":"MatchSource"},"MatchmakingQueueCreate":{"properties":{"context":{"$ref":"#/components/schemas/GameContext","default":"competitive"},"mode_name":{"type":"string","enum":["301","501","701","1001"],"title":"Mode Name","default":"501"},"best_of_legs":{"type":"integer","enum":[1,3,5],"title":"Best Of Legs","default":1},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","title":"MatchmakingQueueCreate"},"MatchmakingQueueRead":{"properties":{"id":{"type":"integer","title":"Id"},"player_id":{"type":"integer","title":"Player Id"},"context":{"$ref":"#/components/schemas/GameContext"},"mode_name":{"type":"string","title":"Mode Name"},"status":{"$ref":"#/components/schemas/MatchmakingQueueStatus"},"matched_lobby_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Matched Lobby Id"},"matched_session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Matched Session Id"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","player_id","context","mode_name","status","extra_data","created_at","updated_at"],"title":"MatchmakingQueueRead"},"MatchmakingQueueStatus":{"type":"string","enum":["queued","matched","cancelled"],"title":"MatchmakingQueueStatus"},"MatchmakingStatusRead":{"properties":{"id":{"type":"integer","title":"Id"},"player_id":{"type":"integer","title":"Player Id"},"context":{"$ref":"#/components/schemas/GameContext"},"mode_name":{"type":"string","title":"Mode Name"},"status":{"$ref":"#/components/schemas/MatchmakingQueueStatus"},"matched_lobby_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Matched Lobby Id"},"matched_session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Matched Session Id"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"estimated_wait_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Wait Seconds"},"queue_position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Queue Position"},"rating_bucket":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rating Bucket"},"opponent_band":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opponent Band"}},"type":"object","required":["id","player_id","context","mode_name","status","extra_data","created_at","updated_at"],"title":"MatchmakingStatusRead","example":{"context":"competitive","estimated_wait_seconds":90,"id":12,"mode_name":"501","opponent_band":"nahe Ratingklasse","player_id":7,"queue_position":3,"rating_bucket":"3000-3999","status":"queued"}},"MembershipRequestStatus":{"type":"string","enum":["pending","approved","rejected"],"title":"MembershipRequestStatus"},"MembershipRole":{"type":"string","enum":["member","captain","manager","admin","tournament_manager"],"title":"MembershipRole"},"MembershipStatus":{"type":"string","enum":["pending","active","inactive"],"title":"MembershipStatus"},"MessageThreadDetail":{"properties":{"id":{"type":"integer","title":"Id"},"other_player_id":{"type":"integer","title":"Other Player Id"},"other_display_name":{"type":"string","title":"Other Display Name"},"last_message_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Message Preview"},"last_message_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Message At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"is_blocked_by_me":{"type":"boolean","title":"Is Blocked By Me"},"messages":{"items":{"$ref":"#/components/schemas/PlayerMessageRead"},"type":"array","title":"Messages"}},"type":"object","required":["id","other_player_id","other_display_name","updated_at","is_blocked_by_me"],"title":"MessageThreadDetail"},"MessageThreadSummary":{"properties":{"id":{"type":"integer","title":"Id"},"other_player_id":{"type":"integer","title":"Other Player Id"},"other_display_name":{"type":"string","title":"Other Display Name"},"last_message_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Message Preview"},"last_message_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Message At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"is_blocked_by_me":{"type":"boolean","title":"Is Blocked By Me"}},"type":"object","required":["id","other_player_id","other_display_name","updated_at","is_blocked_by_me"],"title":"MessageThreadSummary"},"MyClubMembershipRead":{"properties":{"club_id":{"type":"integer","title":"Club Id"},"club_name":{"type":"string","title":"Club Name"},"club_alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Alias"},"role":{"$ref":"#/components/schemas/MembershipRole"},"status":{"$ref":"#/components/schemas/MembershipStatus"},"is_preferred":{"type":"boolean","title":"Is Preferred"},"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["club_id","club_name","role","status","is_preferred","is_active"],"title":"MyClubMembershipRead","description":"Aktive Vereinsmitgliedschaften des Spielers inkl. Hub-Auswahl-Flags."},"NotificationListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/NotificationRead"},"type":"array","title":"Items"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["meta"],"title":"NotificationListResponse"},"NotificationRead":{"properties":{"id":{"type":"integer","title":"Id"},"type":{"$ref":"#/components/schemas/NotificationType"},"title":{"type":"string","title":"Title"},"message":{"type":"string","title":"Message"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtitle"},"icon_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Key"},"accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Color"},"sender_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Display Name"},"sender_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sender Player Id"},"deeplink":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deeplink"},"action_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Type"},"action_target_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Action Target Id"},"is_read":{"type":"boolean","title":"Is Read"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["id","type","title","message","is_read","created_at","extra_data"],"title":"NotificationRead","example":{"accent_color":"#2563eb","action_target_id":21,"action_type":"friend_request","created_at":"2026-04-17T11:30:00","deeplink":"/friend_request/21","extra_data":{},"icon_key":"person.badge.plus","id":21,"is_read":false,"message":"Max moechte dich als Freund hinzufuegen.","sender_display_name":"maxcheckout","sender_player_id":7,"subtitle":"Social","title":"Neue Freundesanfrage","type":"friend_request"}},"NotificationType":{"type":"string","enum":["friend_request","friend_accept","match_invite","match_invite_accept","match_invite_decline","club_request","club_request_review","club_join_request_created","club_join_request_reviewed","club_event_created","club_event_updated","club_event_deleted","club_member_role_changed","club_member_removed","finance_contribution_created","finance_contribution_paid","finance_contribution_waived","auth_password_changed","tournament","session","system","messenger_message"],"title":"NotificationType"},"OfflineGameSyncSubmissionListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OfflineGameSyncSubmissionSummary"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"OfflineGameSyncSubmissionListResponse"},"OfflineGameSyncSubmissionSummary":{"properties":{"client_game_id":{"type":"string","title":"Client Game Id"},"status":{"type":"string","title":"Status"},"session_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Context"},"rules_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rules Version"},"has_training_metrics":{"type":"boolean","title":"Has Training Metrics"},"training_mode_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Mode Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"rejected_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejected Reason"},"validation_warnings":{"items":{"type":"string"},"type":"array","title":"Validation Warnings"},"processed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Processed At"},"backend_session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Backend Session Id"}},"type":"object","required":["client_game_id","status","has_training_metrics","created_at","updated_at"],"title":"OfflineGameSyncSubmissionSummary","description":"Safe metadata-only view of a stored offline sync submission.\n\nNever exposes raw_payload, dart values, player names, or metrics_by_slot."},"OnlineLobbyCreate":{"properties":{"name":{"type":"string","title":"Name"},"context":{"$ref":"#/components/schemas/GameContext","default":"competitive"},"mode_name":{"type":"string","enum":["301","501","701","1001"],"title":"Mode Name","default":"501"},"max_players":{"type":"integer","title":"Max Players","default":2},"room_code":{"anyOf":[{"type":"string","maxLength":12,"minLength":4},{"type":"null"}],"title":"Room Code"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"start_rule":{"$ref":"#/components/schemas/StartRule","default":"straight_in"},"finish_rule":{"$ref":"#/components/schemas/FinishRule","default":"double_out"},"best_of_legs":{"type":"integer","enum":[1,3,5],"title":"Best Of Legs","default":1}},"type":"object","required":["name"],"title":"OnlineLobbyCreate","example":{"best_of_legs":1,"context":"competitive","finish_rule":"double_out","max_players":2,"mode_name":"501","name":"Private 501","room_code":"AB12CD","start_rule":"straight_in"}},"OnlineLobbyListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OnlineLobbyRead"},"type":"array","title":"Items"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["meta"],"title":"OnlineLobbyListResponse"},"OnlineLobbyParticipantRead":{"properties":{"id":{"type":"integer","title":"Id"},"lobby_id":{"type":"integer","title":"Lobby Id"},"player_id":{"type":"integer","title":"Player Id"},"is_ready":{"type":"boolean","title":"Is Ready","description":"Primäres Bereitschaftsflag fuer bestehende Clients."},"ready_state":{"type":"boolean","title":"Ready State","description":"Alias fuer is_ready, damit neue Clients semantisch klar lesen koennen.","default":false},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["id","lobby_id","player_id","is_ready","extra_data"],"title":"OnlineLobbyParticipantRead"},"OnlineLobbyRead":{"properties":{"id":{"type":"integer","title":"Id"},"owner_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Owner Player Id"},"name":{"type":"string","title":"Name"},"context":{"$ref":"#/components/schemas/GameContext"},"mode_name":{"type":"string","title":"Mode Name"},"status":{"$ref":"#/components/schemas/LobbyStatus"},"max_players":{"type":"integer","title":"Max Players"},"room_code":{"type":"string","title":"Room Code"},"owner_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Display Name"},"session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Session Id"},"created_session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created Session Id"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"participants":{"items":{"$ref":"#/components/schemas/OnlineLobbyParticipantRead"},"type":"array","title":"Participants"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","context","mode_name","status","max_players","room_code","extra_data","created_at","updated_at"],"title":"OnlineLobbyRead"},"PaginationMeta":{"properties":{"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["page","limit","total"],"title":"PaginationMeta"},"PasswordChangeRequest":{"properties":{"current_password":{"type":"string","minLength":8,"title":"Current Password"},"new_password":{"type":"string","minLength":12,"title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"PasswordChangeRequest","example":{"current_password":"AltesSicheresPasswort123","new_password":"NeuesSehrSicheresPasswort456!"}},"PasswordResetConfirm":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","minLength":12,"title":"New Password"}},"type":"object","required":["token","new_password"],"title":"PasswordResetConfirm","example":{"new_password":"NeuesSehrSicheresPasswort456!","token":"dGhpcyBpcyBhIHNhbXBsZSB0b2tlbg"}},"PasswordResetResponse":{"properties":{"message":{"type":"string","title":"Message"},"delivery_mode":{"type":"string","title":"Delivery Mode"}},"type":"object","required":["message","delivery_mode"],"title":"PasswordResetResponse"},"PlayerAccountRegister":{"properties":{"alias":{"type":"string","maxLength":60,"minLength":3,"title":"Alias"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","minLength":1,"title":"Last Name"},"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","minLength":8,"title":"Password"},"birthdate":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birthdate"},"country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country Code"},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Name"},"club_alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Alias"},"profile":{"$ref":"#/components/schemas/PlayerProfileUpsert"},"extended_profile":{"$ref":"#/components/schemas/PlayerExtendedProfileUpsert"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["alias","first_name","last_name","email","password"],"title":"PlayerAccountRegister","example":{"alias":"maxcheckout","club_name":"DC Berlin","email":"max@example.com","extended_profile":{"city":"Berlin","favorite_double":"D20","preferred_game_mode":"X01 501"},"first_name":"Max","last_name":"Muster","password":"SicheresPasswort123","profile":{"handedness":"right","nickname":"The Finisher"}}},"PlayerAccountUpdate":{"properties":{"alias":{"type":"string","maxLength":60,"minLength":3,"title":"Alias"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","minLength":1,"title":"Last Name"},"email":{"type":"string","format":"email","title":"Email"},"birthdate":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birthdate"},"country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country Code"}},"type":"object","required":["alias","first_name","last_name","email"],"title":"PlayerAccountUpdate","example":{"alias":"maxcheckout","birthdate":"1995-04-18","country_code":"DE","email":"max@example.com","first_name":"Max","last_name":"Muster"}},"PlayerAuthResponse":{"properties":{"session":{"$ref":"#/components/schemas/AuthSessionRead"},"player":{"$ref":"#/components/schemas/PlayerRead"},"profile":{"anyOf":[{"$ref":"#/components/schemas/PlayerProfileRead"},{"type":"null"}]},"extended_profile":{"anyOf":[{"$ref":"#/components/schemas/PlayerExtendedProfileRead"},{"type":"null"}]}},"type":"object","required":["session","player"],"title":"PlayerAuthResponse"},"PlayerClubTeamHistoryRead":{"properties":{"team_id":{"type":"integer","title":"Team Id"},"team_name":{"type":"string","title":"Team Name"},"club_id":{"type":"integer","title":"Club Id"},"club_name":{"type":"string","title":"Club Name"},"league_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Name"},"season_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season Name"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"joined_on":{"type":"string","format":"date","title":"Joined On"},"left_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Left On"},"is_active":{"type":"boolean","title":"Is Active"},"is_captain":{"type":"boolean","title":"Is Captain"}},"type":"object","required":["team_id","team_name","club_id","club_name","joined_on","is_active","is_captain"],"title":"PlayerClubTeamHistoryRead","description":"CT2 — one entry in GET /auth/players/me/club-team-history."},"PlayerCreate":{"properties":{"alias":{"type":"string","maxLength":60,"minLength":3,"title":"Alias"},"first_name":{"type":"string","title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"birthdate":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birthdate"},"country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country Code"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["alias","first_name"],"title":"PlayerCreate","example":{"alias":"dart_tester","email":"max@example.com","first_name":"Max"}},"PlayerDartSetCreate":{"properties":{"brand":{"type":"string","maxLength":80,"minLength":1,"title":"Brand"},"model_name":{"type":"string","maxLength":120,"minLength":1,"title":"Model Name"},"weight_grams":{"anyOf":[{"type":"number","maximum":80.0,"minimum":1.0},{"type":"null"}],"title":"Weight Grams"},"tip_type":{"type":"string","enum":["steel","soft"],"title":"Tip Type","default":"steel"},"barrel":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Barrel"},"shaft":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Shaft"},"flight":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Flight"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"},"is_active":{"type":"boolean","title":"Is Active","default":false}},"type":"object","required":["brand","model_name"],"title":"PlayerDartSetCreate"},"PlayerDartSetListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PlayerDartSetRead"},"type":"array","title":"Items"}},"type":"object","title":"PlayerDartSetListResponse"},"PlayerDartSetRead":{"properties":{"id":{"type":"integer","title":"Id"},"player_id":{"type":"integer","title":"Player Id"},"brand":{"type":"string","title":"Brand"},"model_name":{"type":"string","title":"Model Name"},"weight_grams":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Weight Grams"},"tip_type":{"type":"string","title":"Tip Type"},"barrel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Barrel"},"shaft":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shaft"},"flight":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flight"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","player_id","brand","model_name","tip_type","is_active","created_at","updated_at"],"title":"PlayerDartSetRead","description":"Full dart-set response for the owning player."},"PlayerDartSetSummaryRead":{"properties":{"brand":{"type":"string","title":"Brand"},"model_name":{"type":"string","title":"Model Name"},"weight_grams":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Weight Grams"},"tip_type":{"type":"string","title":"Tip Type"}},"type":"object","required":["brand","model_name","tip_type"],"title":"PlayerDartSetSummaryRead","description":"Minimal dart-set summary for public profile and ranking contexts."},"PlayerDartSetUpdate":{"properties":{"brand":{"anyOf":[{"type":"string","maxLength":80,"minLength":1},{"type":"null"}],"title":"Brand"},"model_name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Model Name"},"weight_grams":{"anyOf":[{"type":"number","maximum":80.0,"minimum":1.0},{"type":"null"}],"title":"Weight Grams"},"tip_type":{"anyOf":[{"type":"string","enum":["steel","soft"]},{"type":"null"}],"title":"Tip Type"},"barrel":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Barrel"},"shaft":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Shaft"},"flight":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Flight"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"PlayerDartSetUpdate"},"PlayerExtendedProfileRead":{"properties":{"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"favorite_double":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Favorite Double"},"favorite_checkout":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Favorite Checkout"},"preferred_game_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Game Mode"},"experience_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Experience Level"},"darts_brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Darts Brand"},"darts_weight_grams":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Darts Weight Grams"},"training_focus":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Focus"},"achievements":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Achievements"},"goals":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Goals"},"favorite_opponent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Favorite Opponent"},"instagram_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram Handle"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"id":{"type":"integer","title":"Id"},"player_id":{"type":"integer","title":"Player Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","player_id","created_at","updated_at"],"title":"PlayerExtendedProfileRead","example":{"city":"Berlin","darts_brand":"Target","darts_weight_grams":23.0,"experience_level":"Liga","favorite_double":"D16","preferred_game_mode":"X01 501"}},"PlayerExtendedProfileUpsert":{"properties":{"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"favorite_double":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Favorite Double"},"favorite_checkout":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Favorite Checkout"},"preferred_game_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Game Mode"},"experience_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Experience Level"},"darts_brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Darts Brand"},"darts_weight_grams":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Darts Weight Grams"},"training_focus":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Focus"},"achievements":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Achievements"},"goals":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Goals"},"favorite_opponent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Favorite Opponent"},"instagram_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram Handle"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","title":"PlayerExtendedProfileUpsert","example":{"city":"Berlin","darts_brand":"Target","darts_weight_grams":23.0,"experience_level":"Liga","favorite_double":"D16","preferred_game_mode":"X01 501"}},"PlayerFullProfileRead":{"properties":{"player":{"$ref":"#/components/schemas/PlayerRead"},"profile":{"anyOf":[{"$ref":"#/components/schemas/PlayerProfileRead"},{"type":"null"}]},"extended_profile":{"anyOf":[{"$ref":"#/components/schemas/PlayerExtendedProfileRead"},{"type":"null"}]},"stats":{"$ref":"#/components/schemas/PlayerStatsRead"},"club":{"anyOf":[{"$ref":"#/components/schemas/ActiveClubRead"},{"type":"null"}]},"club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Name"},"stats_snapshot":{"anyOf":[{"$ref":"#/components/schemas/PlayerStatsWindowRead"},{"type":"null"}]},"active_clubs":{"items":{"type":"string"},"type":"array","title":"Active Clubs"},"pending_requests":{"items":{"type":"string"},"type":"array","title":"Pending Requests"},"active_dartset":{"anyOf":[{"$ref":"#/components/schemas/PlayerDartSetSummaryRead"},{"type":"null"}]}},"type":"object","required":["player","stats"],"title":"PlayerFullProfileRead"},"PlayerFullProfileUpdate":{"properties":{"alias":{"type":"string","maxLength":60,"minLength":3,"title":"Alias"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","minLength":1,"title":"Last Name"},"email":{"type":"string","format":"email","title":"Email"},"birthdate":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birthdate"},"country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country Code"},"profile":{"$ref":"#/components/schemas/PlayerProfileUpsert"},"extended_profile":{"$ref":"#/components/schemas/PlayerExtendedProfileUpsert"},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Name"},"club_alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Alias"}},"type":"object","required":["alias","first_name","last_name","email"],"title":"PlayerFullProfileUpdate","example":{"alias":"maxcheckout","birthdate":"1995-04-18","club_name":"DC Berlin","country_code":"DE","email":"max@example.com","extended_profile":{"city":"Berlin","favorite_double":"D16","preferred_game_mode":"X01 501"},"first_name":"Max","last_name":"Muster","profile":{"home_venue":"Trainingskeller","nickname":"The Finisher","phone":"+49 170 1234567"}}},"PlayerHomeDashboardRead":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"alias":{"type":"string","title":"Alias"},"club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Name"},"active_window":{"type":"string","enum":["7d","30d","90d","365d"],"title":"Active Window","default":"30d"},"stats_windows":{"items":{"$ref":"#/components/schemas/StatsWindowEntryRead"},"type":"array","title":"Stats Windows"},"notification_count":{"type":"integer","title":"Notification Count","default":0},"rating_leaderboard_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rating Leaderboard Rank"}},"type":"object","required":["player_id","display_name","alias"],"title":"PlayerHomeDashboardRead","example":{"active_window":"30d","alias":"maxcheckout","club_name":"DC Berlin","display_name":"The Finisher","notification_count":4,"player_id":7,"rating_leaderboard_rank":12,"stats_windows":[{"average":56.2,"checkout_percentage":28.5,"high_score":140,"legs_won":6,"one_eighties":0,"window":"7d","wins":2},{"average":58.3,"checkout_percentage":31.25,"high_score":180,"legs_won":18,"one_eighties":3,"window":"30d","wins":6}]}},"PlayerListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PlayerRead"},"type":"array","title":"Items"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["meta"],"title":"PlayerListResponse"},"PlayerMessageRead":{"properties":{"id":{"type":"integer","title":"Id"},"thread_id":{"type":"integer","title":"Thread Id"},"sender_player_id":{"type":"integer","title":"Sender Player Id"},"body":{"type":"string","title":"Body"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_mine":{"type":"boolean","title":"Is Mine"}},"type":"object","required":["id","thread_id","sender_player_id","body","created_at","is_mine"],"title":"PlayerMessageRead"},"PlayerNotificationPreferencesPatch":{"properties":{"friends":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Friends"},"club_activity":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Club Activity"},"tournaments":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Tournaments"},"finance":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Finance"},"system":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"System"}},"additionalProperties":false,"type":"object","title":"PlayerNotificationPreferencesPatch"},"PlayerNotificationPreferencesRead":{"properties":{"friends":{"type":"boolean","title":"Friends"},"club_activity":{"type":"boolean","title":"Club Activity"},"tournaments":{"type":"boolean","title":"Tournaments"},"finance":{"type":"boolean","title":"Finance"},"system":{"type":"boolean","title":"System"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["friends","club_activity","tournaments","finance","system","updated_at"],"title":"PlayerNotificationPreferencesRead"},"PlayerOAuthRegister":{"properties":{"provider":{"$ref":"#/components/schemas/AuthProvider"},"id_token":{"type":"string","minLength":20,"title":"Id Token"},"nonce":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nonce"},"alias":{"type":"string","maxLength":60,"minLength":3,"title":"Alias"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","minLength":1,"title":"Last Name"},"birthdate":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birthdate"},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Name"},"club_alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Alias"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"profile":{"$ref":"#/components/schemas/PlayerProfileUpsert"},"extended_profile":{"$ref":"#/components/schemas/PlayerExtendedProfileUpsert"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["provider","id_token","alias","first_name","last_name"],"title":"PlayerOAuthRegister","example":{"alias":"googlecheckout","birthdate":"1995-04-18","club_alias":"DCB","display_name":"Max G","first_name":"Max","id_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6IkVYQU1QTEUifQ.example.payload.signature","last_name":"Muster","nonce":"login-nonce-123","provider":"google"}},"PlayerProfileRead":{"properties":{"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"handedness":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handedness"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"home_venue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Venue"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"id":{"type":"integer","title":"Id"},"player_id":{"type":"integer","title":"Player Id"}},"type":"object","required":["id","player_id"],"title":"PlayerProfileRead","example":{"handedness":"right","home_venue":"Trainingskeller","nickname":"The Finisher"}},"PlayerProfileUpsert":{"properties":{"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"handedness":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handedness"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"home_venue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Venue"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","title":"PlayerProfileUpsert","example":{"handedness":"right","home_venue":"Trainingskeller","nickname":"The Finisher"}},"PlayerRatingHistoryRead":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"rating_score":{"type":"integer","title":"Rating Score"},"league_tier":{"type":"string","title":"League Tier"},"matches_sampled":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Matches Sampled"},"legs_sampled":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Legs Sampled"},"rating_model_version":{"type":"string","title":"Rating Model Version"},"calculated_at":{"type":"string","format":"date-time","title":"Calculated At"},"metadata_json":{"additionalProperties":true,"type":"object","title":"Metadata Json"},"skill_display_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Skill Display Score"},"skill_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skill Tier"},"skill_mu":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Skill Mu"},"skill_phi":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Skill Phi"},"snapshot_id":{"type":"integer","title":"Snapshot Id"},"valid_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid From"},"valid_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid To"}},"type":"object","required":["player_id","rating_score","league_tier","rating_model_version","calculated_at","snapshot_id"],"title":"PlayerRatingHistoryRead"},"PlayerRatingLeaderboardEntry":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"player_name":{"type":"string","title":"Player Name"},"rating_score":{"type":"integer","title":"Rating Score"},"league_tier":{"type":"string","title":"League Tier"},"confidence_score":{"type":"number","title":"Confidence Score"},"matches_sampled":{"type":"integer","title":"Matches Sampled"},"legs_sampled":{"type":"integer","title":"Legs Sampled"},"rating_model_version":{"type":"string","title":"Rating Model Version"}},"type":"object","required":["player_id","player_name","rating_score","league_tier","confidence_score","matches_sampled","legs_sampled","rating_model_version"],"title":"PlayerRatingLeaderboardEntry"},"PlayerRatingLeaderboardRead":{"properties":{"entries":{"items":{"$ref":"#/components/schemas/PlayerRatingLeaderboardEntry"},"type":"array","title":"Entries"},"total":{"type":"integer","title":"Total"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"}},"type":"object","required":["total","generated_at"],"title":"PlayerRatingLeaderboardRead"},"PlayerRatingRead":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"rating_score":{"type":"integer","title":"Rating Score"},"league_tier":{"type":"string","title":"League Tier"},"matches_sampled":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Matches Sampled"},"legs_sampled":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Legs Sampled"},"rating_model_version":{"type":"string","title":"Rating Model Version"},"calculated_at":{"type":"string","format":"date-time","title":"Calculated At"},"metadata_json":{"additionalProperties":true,"type":"object","title":"Metadata Json"},"skill_display_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Skill Display Score"},"skill_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skill Tier"},"skill_mu":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Skill Mu"},"skill_phi":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Skill Phi"}},"type":"object","required":["player_id","rating_score","league_tier","rating_model_version","calculated_at"],"title":"PlayerRatingRead"},"PlayerRead":{"properties":{"alias":{"type":"string","maxLength":60,"minLength":3,"title":"Alias"},"first_name":{"type":"string","title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"birthdate":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Birthdate"},"country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country Code"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"id":{"type":"integer","title":"Id"},"is_active":{"type":"boolean","title":"Is Active"},"preferred_club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Preferred Club Id"},"profile":{"anyOf":[{"$ref":"#/components/schemas/PlayerProfileRead"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["alias","first_name","id","is_active","created_at","updated_at"],"title":"PlayerRead","example":{"alias":"dart_tester","email":"max@example.com","first_name":"Max"}},"PlayerRollingStatsRead":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"window_key":{"type":"string","title":"Window Key"},"matches_sampled":{"type":"integer","title":"Matches Sampled"},"legs_sampled":{"type":"integer","title":"Legs Sampled"},"visits_sampled":{"type":"integer","title":"Visits Sampled"},"darts_sampled":{"type":"integer","title":"Darts Sampled"},"three_dart_average":{"type":"number","title":"Three Dart Average"},"first_nine_average":{"type":"number","title":"First Nine Average"},"checkout_percentage":{"type":"number","title":"Checkout Percentage"},"double_attempts_per_leg":{"type":"number","title":"Double Attempts Per Leg"},"scoring_100_plus_rate":{"type":"number","title":"Scoring 100 Plus Rate"},"scoring_140_plus_rate":{"type":"number","title":"Scoring 140 Plus Rate"},"scoring_180_rate":{"type":"number","title":"Scoring 180 Rate"},"short_leg_rate_15":{"type":"number","title":"Short Leg Rate 15"},"short_leg_rate_18":{"type":"number","title":"Short Leg Rate 18"},"short_leg_rate_21":{"type":"number","title":"Short Leg Rate 21"},"points_std_dev":{"type":"number","title":"Points Std Dev"},"points_median":{"type":"number","title":"Points Median"},"activity_score":{"type":"number","title":"Activity Score"},"opponent_strength_average":{"type":"number","title":"Opponent Strength Average"},"confidence_score":{"type":"number","title":"Confidence Score"},"last_match_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Match At"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["player_id","window_key","matches_sampled","legs_sampled","visits_sampled","darts_sampled","three_dart_average","first_nine_average","checkout_percentage","double_attempts_per_leg","scoring_100_plus_rate","scoring_140_plus_rate","scoring_180_rate","short_leg_rate_15","short_leg_rate_18","short_leg_rate_21","points_std_dev","points_median","activity_score","opponent_strength_average","confidence_score"],"title":"PlayerRollingStatsRead"},"PlayerStatsDashboardSummary":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"window":{"type":"string","title":"Window","default":"all"},"mode_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode Name"},"matches_played":{"type":"integer","title":"Matches Played","default":0},"wins":{"type":"integer","title":"Wins","default":0},"losses":{"type":"integer","title":"Losses","default":0},"win_rate":{"type":"number","title":"Win Rate","default":0.0},"legs_played":{"type":"integer","title":"Legs Played","default":0},"legs_won":{"type":"integer","title":"Legs Won","default":0},"legs_lost":{"type":"integer","title":"Legs Lost","default":0},"leg_win_rate":{"type":"number","title":"Leg Win Rate","default":0.0},"total_darts_thrown":{"type":"integer","title":"Total Darts Thrown","default":0},"avg_darts_per_leg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Darts Per Leg"},"three_dart_average":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Three Dart Average"},"checkout_attempts":{"type":"integer","title":"Checkout Attempts","default":0},"checkouts_hit":{"type":"integer","title":"Checkouts Hit","default":0},"checkout_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Checkout Rate"},"highest_checkout":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Highest Checkout"},"scores_100_plus":{"type":"integer","title":"Scores 100 Plus","default":0},"scores_140_plus":{"type":"integer","title":"Scores 140 Plus","default":0},"scores_180":{"type":"integer","title":"Scores 180","default":0},"highest_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Highest Score"},"recent_form_last_5":{"items":{"$ref":"#/components/schemas/PlayerStatsRecentFormItem"},"type":"array","title":"Recent Form Last 5","default":[]},"data_quality_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Quality Note"}},"type":"object","required":["player_id"],"title":"PlayerStatsDashboardSummary"},"PlayerStatsRead":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"matches_played":{"type":"integer","title":"Matches Played"},"wins":{"type":"integer","title":"Wins"},"losses":{"type":"integer","title":"Losses"},"legs_won":{"type":"integer","title":"Legs Won"},"legs_lost":{"type":"integer","title":"Legs Lost"},"visits":{"type":"integer","title":"Visits"},"darts_thrown":{"type":"integer","title":"Darts Thrown"},"total_scored_points":{"type":"integer","title":"Total Scored Points"},"three_dart_average":{"type":"number","title":"Three Dart Average"},"first_nine_average":{"type":"number","title":"First Nine Average"},"checkout_attempts":{"type":"integer","title":"Checkout Attempts"},"successful_checkouts":{"type":"integer","title":"Successful Checkouts"},"checkout_percentage":{"type":"number","title":"Checkout Percentage"},"one_eighties":{"type":"integer","title":"One Eighties"},"high_finish":{"type":"integer","title":"High Finish"},"context_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Context Counts"}},"type":"object","required":["player_id","matches_played","wins","losses","legs_won","legs_lost","visits","darts_thrown","total_scored_points","three_dart_average","first_nine_average","checkout_attempts","successful_checkouts","checkout_percentage","one_eighties","high_finish"],"title":"PlayerStatsRead"},"PlayerStatsRecentFormItem":{"properties":{"session_id":{"type":"integer","title":"Session Id"},"played_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Played At"},"result":{"type":"string","enum":["win","loss","unknown"],"title":"Result"},"mode_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode Name"},"opponent_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opponent Label"}},"type":"object","required":["session_id","played_at","result"],"title":"PlayerStatsRecentFormItem"},"PlayerStatsWindowRead":{"properties":{"player_id":{"type":"integer","title":"Player Id"},"window":{"type":"string","enum":["7d","30d","90d","365d"],"title":"Window"},"average":{"type":"number","title":"Average"},"checkout_percentage":{"type":"number","title":"Checkout Percentage"},"high_score":{"type":"integer","title":"High Score"},"one_eighties":{"type":"integer","title":"One Eighties","default":0},"wins":{"type":"integer","title":"Wins","default":0},"legs_won":{"type":"integer","title":"Legs Won","default":0}},"type":"object","required":["player_id","window","average","checkout_percentage","high_score"],"title":"PlayerStatsWindowRead","example":{"average":58.33,"checkout_percentage":31.25,"high_score":180,"legs_won":18,"one_eighties":3,"player_id":7,"window":"30d","wins":6}},"ProcessPendingRequestIn":{"properties":{"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","default":50}},"type":"object","title":"ProcessPendingRequestIn"},"PublicClubOverviewClubRead":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"short_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Name"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["id","name"],"title":"PublicClubOverviewClubRead"},"PublicClubOverviewEventRead":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At"}},"type":"object","required":["id","title","starts_at"],"title":"PublicClubOverviewEventRead"},"PublicClubOverviewKPIsRead":{"properties":{"member_count":{"type":"integer","title":"Member Count"},"team_average":{"type":"number","title":"Team Average"},"matches_count":{"type":"integer","title":"Matches Count"},"wins":{"type":"integer","title":"Wins"},"losses":{"type":"integer","title":"Losses"},"win_rate":{"type":"number","title":"Win Rate"}},"type":"object","required":["member_count","team_average","matches_count","wins","losses","win_rate"],"title":"PublicClubOverviewKPIsRead"},"PublicClubOverviewPerformerRead":{"properties":{"display_name":{"type":"string","title":"Display Name"},"stat_kind":{"type":"string","title":"Stat Kind"},"stat_value":{"type":"number","title":"Stat Value"},"display_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Display Score"}},"type":"object","required":["display_name","stat_kind","stat_value"],"title":"PublicClubOverviewPerformerRead"},"PublicClubOverviewRead":{"properties":{"club":{"$ref":"#/components/schemas/PublicClubOverviewClubRead"},"profile":{"anyOf":[{"$ref":"#/components/schemas/PublicClubProfileSnippet"},{"type":"null"}]},"kpis":{"$ref":"#/components/schemas/PublicClubOverviewKPIsRead"},"upcoming_events":{"items":{"$ref":"#/components/schemas/PublicClubOverviewEventRead"},"type":"array","title":"Upcoming Events"},"recent_results":{"items":{"$ref":"#/components/schemas/PublicClubOverviewRecentResultRead"},"type":"array","title":"Recent Results"},"top_performers":{"items":{"$ref":"#/components/schemas/PublicClubOverviewPerformerRead"},"type":"array","title":"Top Performers"},"viewer":{"$ref":"#/components/schemas/PublicClubOverviewViewerRead"}},"type":"object","required":["club","kpis","viewer"],"title":"PublicClubOverviewRead"},"PublicClubOverviewRecentResultRead":{"properties":{"session_id":{"type":"integer","title":"Session Id"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"result_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result Summary"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"},"outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outcome"}},"type":"object","required":["session_id"],"title":"PublicClubOverviewRecentResultRead"},"PublicClubOverviewViewerRead":{"properties":{"is_active_member":{"type":"boolean","title":"Is Active Member","default":false},"can_request_membership":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Request Membership"}},"type":"object","title":"PublicClubOverviewViewerRead"},"PublicClubProfileSnippet":{"properties":{"founding_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Founding Year"},"home_venue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Venue"},"league_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Name"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"instagram_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram Handle"}},"type":"object","title":"PublicClubProfileSnippet"},"PublicMatchSnapshotCurrentLeg":{"properties":{"leg_id":{"type":"integer","title":"Leg Id"},"leg_number":{"type":"integer","title":"Leg Number"},"leg_state":{"$ref":"#/components/schemas/SessionState"},"leg_revision":{"type":"integer","title":"Leg Revision"},"current_turn_participant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Turn Participant Id"}},"type":"object","required":["leg_id","leg_number","leg_state","leg_revision","current_turn_participant_id"],"title":"PublicMatchSnapshotCurrentLeg","description":"Public current-leg metadata; current_turn_player_id is intentionally omitted."},"PublicMatchSnapshotParticipant":{"properties":{"participant_id":{"type":"integer","title":"Participant Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"slot":{"type":"integer","title":"Slot"},"remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining"},"legs_won":{"type":"integer","title":"Legs Won"},"is_current_turn":{"type":"boolean","title":"Is Current Turn"},"is_winner":{"type":"boolean","title":"Is Winner"}},"type":"object","required":["participant_id","slot","legs_won","is_current_turn","is_winner"],"title":"PublicMatchSnapshotParticipant","description":"Public scoreboard participant row; player_id is intentionally omitted."},"PublicMatchSnapshotRead":{"properties":{"schema_version":{"type":"integer","title":"Schema Version","default":1},"session_id":{"type":"integer","title":"Session Id"},"session_revision":{"type":"integer","title":"Session Revision"},"status":{"$ref":"#/components/schemas/SessionState"},"context":{"$ref":"#/components/schemas/GameContext"},"scoring_variant":{"$ref":"#/components/schemas/ScoringVariant"},"mode_name":{"type":"string","title":"Mode Name"},"start_rule":{"$ref":"#/components/schemas/StartRule"},"finish_rule":{"$ref":"#/components/schemas/FinishRule"},"starting_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Starting Score"},"best_of_legs":{"type":"integer","title":"Best Of Legs"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"current_leg":{"anyOf":[{"$ref":"#/components/schemas/PublicMatchSnapshotCurrentLeg"},{"type":"null"}]},"participants":{"items":{"$ref":"#/components/schemas/PublicMatchSnapshotParticipant"},"type":"array","title":"Participants"},"recent_visits":{"items":{"$ref":"#/components/schemas/MatchSnapshotRecentVisit"},"type":"array","title":"Recent Visits"},"winner_participant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Participant Id"}},"type":"object","required":["session_id","session_revision","status","context","scoring_variant","mode_name","start_rule","finish_rule","best_of_legs","updated_at","current_leg"],"title":"PublicMatchSnapshotRead","description":"Public spectator snapshot shape (read-only, no player_id fields)."},"RankingBoardCreate":{"properties":{"name":{"type":"string","title":"Name"},"scope":{"$ref":"#/components/schemas/RankingScope"},"season_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season Label"},"league_season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"League Season Id"},"ruleset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ruleset"},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["name","scope"],"title":"RankingBoardCreate","example":{"league_season_id":3,"name":"Global Ranking","scope":"global","season_label":"2026"}},"RankingBoardListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RankingBoardRead"},"type":"array","title":"Items"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["meta"],"title":"RankingBoardListResponse"},"RankingBoardRead":{"properties":{"name":{"type":"string","title":"Name"},"scope":{"$ref":"#/components/schemas/RankingScope"},"season_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season Label"},"league_season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"League Season Id"},"ruleset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ruleset"},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"id":{"type":"integer","title":"Id"},"entries":{"items":{"$ref":"#/components/schemas/RankingEntryRead"},"type":"array","title":"Entries"}},"type":"object","required":["name","scope","id"],"title":"RankingBoardRead","example":{"league_season_id":3,"name":"Global Ranking","scope":"global","season_label":"2026"}},"RankingEntryRead":{"properties":{"id":{"type":"integer","title":"Id"},"player_id":{"type":"integer","title":"Player Id"},"player_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player Name"},"position":{"type":"integer","title":"Position"},"points":{"type":"integer","title":"Points","description":"Season-Points fuer dieses Board-Entry (v1.1: 3 fuer Sieg, 1 fuer Niederlage in eligible Matches)."},"matches_played":{"type":"integer","title":"Matches Played","description":"Anzahl der fuer dieses Board tatsaechlich gezaehlten eligible Matches (inkl. v1.1 Pair-Cap)."},"wins":{"type":"integer","title":"Wins"},"losses":{"type":"integer","title":"Losses"},"legs_won":{"type":"integer","title":"Legs Won"},"legs_lost":{"type":"integer","title":"Legs Lost"},"three_dart_average":{"type":"number","title":"Three Dart Average"},"checkout_percentage":{"type":"number","title":"Checkout Percentage"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["id","player_id","position","points","matches_played","wins","losses","legs_won","legs_lost","three_dart_average","checkout_percentage","extra_data"],"title":"RankingEntryRead"},"RankingScope":{"type":"string","enum":["global","club"],"title":"RankingScope"},"RankingWindowItem":{"properties":{"rank":{"type":"integer","title":"Rank"},"player_id":{"type":"integer","title":"Player Id"},"player_name":{"type":"string","title":"Player Name"},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Name"},"club_alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Alias"},"is_self":{"type":"boolean","title":"Is Self"},"season":{"anyOf":[{"$ref":"#/components/schemas/RankingWindowSeasonBlock"},{"type":"null"}]},"skill":{"anyOf":[{"$ref":"#/components/schemas/RankingWindowSkillBlock"},{"type":"null"}]},"active_dartset_summary":{"anyOf":[{"$ref":"#/components/schemas/DartSetSummary"},{"type":"null"}]},"scope_position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scope Position","description":"1-based position within the selected scope list (e.g. friends or club), in scope sort order; omitted when not applicable (e.g. global all-time/season list)."}},"type":"object","required":["rank","player_id","player_name","is_self"],"title":"RankingWindowItem"},"RankingWindowMeta":{"properties":{"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"stale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Stale"}},"type":"object","required":["generated_at"],"title":"RankingWindowMeta"},"RankingWindowResponse":{"properties":{"source":{"type":"string","enum":["season_points","skill"],"title":"Source"},"scope":{"type":"string","enum":["global","friends","club"],"title":"Scope"},"mode":{"type":"string","enum":["around_me","top_n","search","around_rank"],"title":"Mode"},"context":{"anyOf":[{"$ref":"#/components/schemas/RankingWindowSeasonContext"},{"type":"null"}]},"scope_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scope Id","description":"Identifier for the scope when scope=club (club primary key)."},"my_player_id":{"type":"integer","title":"My Player Id"},"my_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"My Rank"},"total_count":{"type":"integer","title":"Total Count"},"scope_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Scope Count","description":"Number of players in the selected scope (e.g. friends with a skill row, club members with a season entry); null when not applicable (e.g. global full-board window)."},"my_scope_position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"My Scope Position","description":"1-based index of the viewer within the selected scope list; null if not in that list or not used for the request."},"items":{"items":{"$ref":"#/components/schemas/RankingWindowItem"},"type":"array","title":"Items"},"meta":{"$ref":"#/components/schemas/RankingWindowMeta"}},"type":"object","required":["source","scope","mode","my_player_id","total_count","meta"],"title":"RankingWindowResponse"},"RankingWindowSeasonBlock":{"properties":{"points":{"type":"integer","title":"Points"},"wins":{"type":"integer","title":"Wins"},"losses":{"type":"integer","title":"Losses"},"matches_played":{"type":"integer","title":"Matches Played"},"legs_won":{"type":"integer","title":"Legs Won"},"legs_lost":{"type":"integer","title":"Legs Lost"},"three_dart_average":{"type":"number","title":"Three Dart Average"},"checkout_percentage":{"type":"number","title":"Checkout Percentage"}},"type":"object","required":["points","wins","losses","matches_played","legs_won","legs_lost","three_dart_average","checkout_percentage"],"title":"RankingWindowSeasonBlock"},"RankingWindowSeasonContext":{"properties":{"season_id":{"type":"integer","title":"Season Id","description":"League season primary key."},"year":{"type":"integer","title":"Year"},"month":{"type":"integer","title":"Month"},"season_label":{"type":"string","title":"Season Label"},"display_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Label","description":"User-facing monthly display label such as 'Season 26-6'."},"board_id":{"type":"integer","title":"Board Id"}},"type":"object","required":["season_id","year","month","season_label","board_id"],"title":"RankingWindowSeasonContext"},"RankingWindowSkillBlock":{"properties":{"rating_score":{"type":"integer","title":"Rating Score"},"skill_tier":{"type":"string","title":"Skill Tier"}},"type":"object","required":["rating_score","skill_tier"],"title":"RankingWindowSkillBlock"},"ReadinessCheckRead":{"properties":{"status":{"type":"string","title":"Status","description":"'ready' wenn alle Pflicht-Subsysteme erreichbar sind, sonst 'unavailable'.","examples":["ready","unavailable"]},"db":{"type":"string","title":"Db","description":"Datenbankstatus: 'ok' oder kurze Fehlermeldung.","examples":["ok","connection error"]},"redis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redis","description":"Redis-Status wenn RATE_LIMIT_BACKEND=redis: 'ok', 'degraded' (fail-open) oder 'connection error' (fail-closed → HTTP 503). None wenn RATE_LIMIT_BACKEND=memory.","examples":["ok","degraded","connection error",null]},"service":{"type":"string","title":"Service","description":"Technischer Name des API-Dienstes.","default":"dart-backend","examples":["dart-backend"]},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"UTC-Zeitpunkt der Readiness-Antwort.","examples":["2026-04-18T06:20:00"]}},"type":"object","required":["status","db","timestamp"],"title":"ReadinessCheckRead","description":"R9/R18b: Tiefgehender Readiness-Check inkl. DB und optionalem Redis.\n\nWird von Container-Orchestratoren (Docker healthcheck, Kubernetes readiness\nprobe) und dem Prometheus-Exporter genutzt, um festzustellen, ob der\nProzess Requests verarbeiten kann.\n\n`redis` ist nur gesetzt wenn RATE_LIMIT_BACKEND=redis konfiguriert ist.\nWenn Redis down und fail-closed: status='unavailable', HTTP 503.\nWenn Redis down und fail-open: redis='degraded', HTTP 200."},"RematchCreate":{"properties":{"mode_name":{"type":"string","enum":["301","501","701","1001"],"title":"Mode Name","default":"501"},"starting_score":{"type":"integer","enum":[301,501,701,1001],"title":"Starting Score","default":501},"best_of_legs":{"type":"integer","enum":[1,3,5],"title":"Best Of Legs","default":3},"start_rule":{"$ref":"#/components/schemas/StartRule","default":"straight_in"},"finish_rule":{"$ref":"#/components/schemas/FinishRule","default":"double_out"},"scoring_variant":{"$ref":"#/components/schemas/ScoringVariant","default":"x01"},"context":{"anyOf":[{"$ref":"#/components/schemas/GameContext"},{"type":"null"}]},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","title":"RematchCreate","example":{"best_of_legs":3,"finish_rule":"double_out","mode_name":"501","scoring_variant":"x01","start_rule":"straight_in","starting_score":501}},"RetryFailedRequestIn":{"properties":{"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","default":50},"client_game_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Game Id"}},"type":"object","title":"RetryFailedRequestIn"},"Scoring100PlusFinalScoreEntry":{"properties":{"slot":{"type":"integer","title":"Slot"},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"successful_turns":{"type":"integer","title":"Successful Turns"},"total_points":{"type":"integer","title":"Total Points"}},"type":"object","required":["slot","display_name","successful_turns","total_points"],"title":"Scoring100PlusFinalScoreEntry"},"Scoring100PlusSessionConfigCreate":{"properties":{"success_threshold":{"type":"integer","title":"Success Threshold"},"throws_per_turn":{"type":"integer","title":"Throws Per Turn"},"total_turns":{"type":"integer","title":"Total Turns"}},"type":"object","required":["success_threshold","throws_per_turn","total_turns"],"title":"Scoring100PlusSessionConfigCreate"},"Scoring100PlusSessionParticipantCreate":{"properties":{"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"slot":{"type":"integer","title":"Slot"},"is_bot":{"type":"boolean","title":"Is Bot","default":false},"bot_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Version"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["display_name","slot"],"title":"Scoring100PlusSessionParticipantCreate"},"Scoring100PlusTrainingSessionCreate":{"properties":{"name":{"type":"string","title":"Name","default":"100+ Scoring Training"},"created_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Player Id"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"participants":{"items":{"$ref":"#/components/schemas/Scoring100PlusSessionParticipantCreate"},"type":"array","maxItems":4,"minItems":1,"title":"Participants"},"config":{"$ref":"#/components/schemas/Scoring100PlusSessionConfigCreate"},"finish_reason":{"type":"string","title":"Finish Reason"},"final_scores":{"items":{"$ref":"#/components/schemas/Scoring100PlusFinalScoreEntry"},"type":"array","title":"Final Scores"},"winner_player_ids":{"items":{"type":"integer"},"type":"array","title":"Winner Player Ids"},"winner_slots":{"items":{"type":"integer"},"type":"array","title":"Winner Slots"},"turns_summary":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Turns Summary"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["participants","config","finish_reason"],"title":"Scoring100PlusTrainingSessionCreate"},"ScoringVariant":{"type":"string","enum":["x01","cricket","around_the_clock","practice"],"title":"ScoringVariant"},"SeasonListItem":{"properties":{"league_season_id":{"type":"integer","title":"League Season Id"},"label":{"type":"string","title":"Label"},"display_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Label","description":"User-facing monthly display label such as 'Season 26-6'."},"year":{"type":"integer","title":"Year"},"month":{"type":"integer","title":"Month"},"is_current":{"type":"boolean","title":"Is Current"},"starts_on":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts On"},"ends_on":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends On"}},"type":"object","required":["league_season_id","label","year","month","is_current"],"title":"SeasonListItem"},"SeasonListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SeasonListItem"},"type":"array","title":"Items"}},"type":"object","title":"SeasonListResponse"},"SessionFinishRequest":{"properties":{"winner_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Player Id"},"winner_session_participant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Session Participant Id"}},"type":"object","title":"SessionFinishRequest","example":{"winner_player_id":1,"winner_session_participant_id":2}},"SessionListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/GameSessionRead"},"type":"array","title":"Items"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["meta"],"title":"SessionListResponse"},"SessionParticipantCreate":{"properties":{"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"slot":{"type":"integer","title":"Slot"},"team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Name"},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id"},"is_home":{"type":"boolean","title":"Is Home","default":false},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["slot"],"title":"SessionParticipantCreate","example":{"is_home":true,"player_id":1,"slot":1}},"SessionParticipantRead":{"properties":{"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"slot":{"type":"integer","title":"Slot"},"team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Name"},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id"},"is_home":{"type":"boolean","title":"Is Home","default":false},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"id":{"type":"integer","title":"Id"},"session_id":{"type":"integer","title":"Session Id"},"final_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Final Rank"}},"type":"object","required":["slot","id","session_id"],"title":"SessionParticipantRead","example":{"is_home":true,"player_id":1,"slot":1}},"SessionState":{"type":"string","enum":["scheduled","active","finished","cancelled"],"title":"SessionState"},"SessionSyncRead":{"properties":{"session_id":{"type":"integer","title":"Session Id"},"revision":{"type":"integer","title":"Revision"},"changed":{"type":"boolean","title":"Changed"},"session":{"anyOf":[{"$ref":"#/components/schemas/GameSessionRead"},{"type":"null"}]}},"type":"object","required":["session_id","revision","changed"],"title":"SessionSyncRead"},"SessionUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"state":{"anyOf":[{"$ref":"#/components/schemas/SessionState"},{"type":"null"}]},"scheduled_for":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled For"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"winner_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Player Id"},"winner_session_participant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Session Participant Id"},"match_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Format"},"extra_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra Data"}},"type":"object","title":"SessionUpdate"},"SetPlayerPreferredClubBody":{"properties":{"club_id":{"type":"integer","title":"Club Id"}},"type":"object","required":["club_id"],"title":"SetPlayerPreferredClubBody"},"ShanghaiFinalScoreEntry":{"properties":{"slot":{"type":"integer","title":"Slot"},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"score":{"type":"integer","title":"Score"}},"type":"object","required":["slot","display_name","score"],"title":"ShanghaiFinalScoreEntry"},"ShanghaiSessionConfigCreate":{"properties":{"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset"},"target_start":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Target Start"},"target_end":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Target End"},"targets":{"items":{"type":"integer"},"type":"array","title":"Targets"},"throws_per_round":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Throws Per Round"},"rule_mode":{"anyOf":[{"type":"string","enum":["off","instantWin","bonusOnly"]},{"type":"null"}],"title":"Rule Mode"}},"type":"object","title":"ShanghaiSessionConfigCreate"},"ShanghaiSessionParticipantCreate":{"properties":{"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"slot":{"type":"integer","title":"Slot"},"is_bot":{"type":"boolean","title":"Is Bot","default":false},"bot_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Version"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["display_name","slot"],"title":"ShanghaiSessionParticipantCreate"},"ShanghaiTrainingSessionCreate":{"properties":{"name":{"type":"string","title":"Name","default":"Shanghai Training"},"created_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Player Id"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"participants":{"items":{"$ref":"#/components/schemas/ShanghaiSessionParticipantCreate"},"type":"array","maxItems":4,"minItems":1,"title":"Participants"},"config":{"anyOf":[{"$ref":"#/components/schemas/ShanghaiSessionConfigCreate"},{"type":"null"}]},"finish_reason":{"type":"string","title":"Finish Reason"},"final_scores":{"items":{"$ref":"#/components/schemas/ShanghaiFinalScoreEntry"},"type":"array","title":"Final Scores"},"winning_player_ids":{"items":{"type":"integer"},"type":"array","title":"Winning Player Ids"},"winning_slots":{"items":{"type":"integer"},"type":"array","title":"Winning Slots"},"rounds_total":{"type":"integer","title":"Rounds Total","default":7},"throws_per_round":{"type":"integer","title":"Throws Per Round","default":3},"rounds_summary":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Rounds Summary"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["participants","finish_reason"],"title":"ShanghaiTrainingSessionCreate","example":{"config":{"preset":"classic7","rule_mode":"instantWin","target_end":7,"target_start":1,"targets":[1,2,3,4,5,6,7],"throws_per_round":3},"extra_data":{"source":"ios_shanghai_mvp"},"final_scores":[{"display_name":"maxcheckout","player_id":7,"score":64,"slot":1},{"display_name":"Guest Bob","score":60,"slot":2}],"finish_reason":"highest_score","name":"Shanghai Local Session","participants":[{"display_name":"maxcheckout","player_id":7,"slot":1},{"display_name":"Guest Bob","slot":2}],"rounds_summary":[],"rounds_total":7,"throws_per_round":3,"winning_player_ids":[7],"winning_slots":[1]}},"SocialIdentityRead":{"properties":{"id":{"type":"integer","title":"Id"},"provider":{"type":"string","title":"Provider"},"email_at_link_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email At Link Time"},"display_name_at_link_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name At Link Time"},"linked_at":{"type":"string","format":"date-time","title":"Linked At"},"can_unlink":{"type":"boolean","title":"Can Unlink"}},"type":"object","required":["id","provider","linked_at","can_unlink"],"title":"SocialIdentityRead","description":"A social provider identity linked to a player account."},"SocialLinkRequest":{"properties":{"id_token":{"type":"string","minLength":20,"title":"Id Token","description":"Provider-issued identity token (JWT)"},"nonce":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nonce","description":"Nonce generated by iOS client for replay protection"}},"type":"object","required":["id_token"],"title":"SocialLinkRequest","description":"Request to link a social provider to the current player account.","example":{"id_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6IkVYQU1QTEUifQ.example.payload","nonce":"random-nonce-abc123"}},"SocialLinkResponse":{"properties":{"id":{"type":"integer","title":"Id"},"provider":{"type":"string","title":"Provider"},"linked_at":{"type":"string","format":"date-time","title":"Linked At"}},"type":"object","required":["id","provider","linked_at"],"title":"SocialLinkResponse","description":"Response after successfully linking a social provider."},"SocialUnlinkResponse":{"properties":{"message":{"type":"string","title":"Message"},"provider":{"type":"string","title":"Provider"}},"type":"object","required":["message","provider"],"title":"SocialUnlinkResponse","description":"Response after unlinking a social provider."},"SpectatorGrantCreate":{"properties":{"ttl_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl Seconds"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"}},"type":"object","title":"SpectatorGrantCreate"},"SpectatorGrantIssueRead":{"properties":{"grant_id":{"type":"integer","title":"Grant Id"},"token":{"type":"string","title":"Token"},"session_id":{"type":"integer","title":"Session Id"},"scope":{"type":"string","title":"Scope"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"}},"type":"object","required":["grant_id","token","session_id","scope","expires_at"],"title":"SpectatorGrantIssueRead"},"SpectatorGrantRead":{"properties":{"grant_id":{"type":"integer","title":"Grant Id"},"session_id":{"type":"integer","title":"Session Id"},"scope":{"type":"string","title":"Scope"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"}},"type":"object","required":["grant_id","session_id","scope","expires_at"],"title":"SpectatorGrantRead"},"StartRule":{"type":"string","enum":["straight_in","double_in","master_in"],"title":"StartRule"},"StatsWindowEntryRead":{"properties":{"window":{"type":"string","enum":["7d","30d","90d","365d"],"title":"Window"},"average":{"type":"number","title":"Average"},"checkout_percentage":{"type":"number","title":"Checkout Percentage"},"high_score":{"type":"integer","title":"High Score"},"one_eighties":{"type":"integer","title":"One Eighties","default":0},"wins":{"type":"integer","title":"Wins","default":0},"legs_won":{"type":"integer","title":"Legs Won","default":0}},"type":"object","required":["window","average","checkout_percentage","high_score"],"title":"StatsWindowEntryRead"},"ThrowBed":{"type":"string","enum":["single","double","triple","single_bull","double_bull","miss"],"title":"ThrowBed"},"ThrowMultiplier":{"type":"string","enum":["single","double","triple"],"title":"ThrowMultiplier"},"TournamentBracketRead":{"properties":{"tournament_id":{"type":"integer","title":"Tournament Id"},"rounds":{"items":{"$ref":"#/components/schemas/TournamentRoundRead"},"type":"array","title":"Rounds"}},"type":"object","required":["tournament_id"],"title":"TournamentBracketRead"},"TournamentBracketSlotRead":{"properties":{"slot_number":{"type":"integer","title":"Slot Number"},"participant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Participant Id"},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"}},"type":"object","required":["slot_number","display_name"],"title":"TournamentBracketSlotRead"},"TournamentCreate":{"properties":{"name":{"type":"string","title":"Name"},"format":{"$ref":"#/components/schemas/TournamentFormat","default":"single_elimination"},"status":{"$ref":"#/components/schemas/TournamentStatus","default":"draft"},"mode_name":{"type":"string","enum":["301","501","701","1001"],"title":"Mode Name","default":"501"},"start_rule":{"$ref":"#/components/schemas/StartRule","default":"straight_in"},"finish_rule":{"$ref":"#/components/schemas/FinishRule","default":"double_out"},"best_of_legs":{"type":"integer","enum":[1,3,5],"title":"Best Of Legs","default":1},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Name"},"club_alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Alias"},"competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Competition Id"},"season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season Id"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"max_participants":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Participants"},"display_club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Display Club Id"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["name"],"title":"TournamentCreate"},"TournamentDetailRead":{"properties":{"name":{"type":"string","title":"Name"},"format":{"anyOf":[{"$ref":"#/components/schemas/TournamentFormat"},{"type":"null"}]},"status":{"$ref":"#/components/schemas/TournamentStatus","default":"draft"},"mode_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode Name"},"start_rule":{"anyOf":[{"$ref":"#/components/schemas/StartRule"},{"type":"null"}]},"finish_rule":{"anyOf":[{"$ref":"#/components/schemas/FinishRule"},{"type":"null"}]},"best_of_legs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Best Of Legs"},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Name"},"club_alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Alias"},"competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Competition Id"},"season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season Id"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"max_participants":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Participants"},"display_club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Display Club Id"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"id":{"type":"integer","title":"Id"},"club_season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Season Id"},"club_competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Competition Id"},"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id"},"participant_type":{"type":"string","title":"Participant Type","default":"player"},"join_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Join Code"},"join_code_active":{"type":"boolean","title":"Join Code Active","default":false},"join_code_created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Join Code Created At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"current_round":{"type":"integer","title":"Current Round"},"winner_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Player Id"},"created_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Player Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"display_club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Club Name"},"participants_count":{"type":"integer","title":"Participants Count","default":0},"tournament":{"anyOf":[{"$ref":"#/components/schemas/TournamentRead"},{"type":"null"}]},"participants":{"items":{"$ref":"#/components/schemas/TournamentParticipantRead"},"type":"array","title":"Participants"},"current_status":{"anyOf":[{"$ref":"#/components/schemas/TournamentStatus"},{"type":"null"}]},"bracket_summary":{"anyOf":[{"$ref":"#/components/schemas/TournamentBracketRead"},{"type":"null"}]},"standings_summary":{"anyOf":[{"$ref":"#/components/schemas/TournamentStandingsRead"},{"type":"null"}]},"standings_preview":{"items":{"$ref":"#/components/schemas/TournamentStandingEntryRead"},"type":"array","title":"Standings Preview"},"bracket_preview":{"items":{"$ref":"#/components/schemas/TournamentRoundRead"},"type":"array","title":"Bracket Preview"}},"type":"object","required":["name","id","current_round","created_at","updated_at"],"title":"TournamentDetailRead"},"TournamentFormat":{"type":"string","enum":["single_elimination","double_elimination","round_robin"],"title":"TournamentFormat"},"TournamentJoinByCodeRequest":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"TournamentJoinByCodeRequest"},"TournamentJoinCodeRead":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["is_active"],"title":"TournamentJoinCodeRead"},"TournamentListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TournamentRead"},"type":"array","title":"Items"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["meta"],"title":"TournamentListResponse"},"TournamentManualResultRequest":{"properties":{"winner_participant_id":{"type":"integer","title":"Winner Participant Id"},"score_label":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Score Label"}},"type":"object","required":["winner_participant_id"],"title":"TournamentManualResultRequest"},"TournamentMatchJoinRequest":{"properties":{"hot_seat":{"type":"boolean","title":"Hot Seat","default":false}},"type":"object","title":"TournamentMatchJoinRequest","description":"Request payload for the join endpoint.\n\nRegular participants call without ``hot_seat`` (default ``False``) to claim\ntheir own slot. Tournament managers may set ``hot_seat=True`` to claim both\nslots atomically — used when a single device drives both seats (e.g. guest\nmatches without separate App-User accounts)."},"TournamentMatchRead":{"properties":{"id":{"type":"integer","title":"Id"},"tournament_id":{"type":"integer","title":"Tournament Id"},"round_number":{"type":"integer","title":"Round Number"},"bracket_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bracket Label"},"match_number":{"type":"integer","title":"Match Number"},"participant_one_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Participant One Id"},"participant_two_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Participant Two Id"},"winner_participant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Participant Id"},"session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Session Id"},"status":{"$ref":"#/components/schemas/TournamentMatchStatus"},"scheduled_for":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled For"},"player_a_joined_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Player A Joined At"},"player_b_joined_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Player B Joined At"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"slots":{"items":{"$ref":"#/components/schemas/TournamentBracketSlotRead"},"type":"array","title":"Slots"},"score_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Score Label"},"result_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result Source"},"participant_one_legs_won":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Participant One Legs Won"},"participant_two_legs_won":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Participant Two Legs Won"}},"type":"object","required":["id","tournament_id","round_number","match_number","status","extra_data"],"title":"TournamentMatchRead"},"TournamentMatchSessionLinkRequest":{"properties":{"session_id":{"type":"integer","title":"Session Id"}},"type":"object","required":["session_id"],"title":"TournamentMatchSessionLinkRequest"},"TournamentMatchStatus":{"type":"string","enum":["scheduled","active","finished","cancelled"],"title":"TournamentMatchStatus"},"TournamentParticipantCreate":{"properties":{"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","title":"TournamentParticipantCreate"},"TournamentParticipantRead":{"properties":{"id":{"type":"integer","title":"Id"},"tournament_id":{"type":"integer","title":"Tournament Id"},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"status":{"$ref":"#/components/schemas/TournamentParticipantStatus"},"wins":{"type":"integer","title":"Wins"},"losses":{"type":"integer","title":"Losses"},"legs_won":{"type":"integer","title":"Legs Won"},"legs_lost":{"type":"integer","title":"Legs Lost"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","tournament_id","status","wins","losses","legs_won","legs_lost","extra_data","created_at","updated_at"],"title":"TournamentParticipantRead"},"TournamentParticipantStatus":{"type":"string","enum":["registered","active","eliminated","withdrawn"],"title":"TournamentParticipantStatus"},"TournamentParticipantUpdate":{"properties":{"display_name":{"type":"string","maxLength":120,"minLength":1,"title":"Display Name"}},"type":"object","required":["display_name"],"title":"TournamentParticipantUpdate"},"TournamentRead":{"properties":{"name":{"type":"string","title":"Name"},"format":{"$ref":"#/components/schemas/TournamentFormat","default":"single_elimination"},"status":{"$ref":"#/components/schemas/TournamentStatus","default":"draft"},"mode_name":{"type":"string","enum":["301","501","701","1001"],"title":"Mode Name","default":"501"},"start_rule":{"anyOf":[{"$ref":"#/components/schemas/StartRule"},{"type":"null"}]},"finish_rule":{"anyOf":[{"$ref":"#/components/schemas/FinishRule"},{"type":"null"}]},"best_of_legs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Best Of Legs"},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Name"},"club_alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Alias"},"competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Competition Id"},"season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season Id"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"max_participants":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Participants"},"display_club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Display Club Id"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"id":{"type":"integer","title":"Id"},"club_season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Season Id"},"club_competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Competition Id"},"event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Event Id"},"participant_type":{"type":"string","title":"Participant Type","default":"player"},"join_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Join Code"},"join_code_active":{"type":"boolean","title":"Join Code Active","default":false},"join_code_created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Join Code Created At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"current_round":{"type":"integer","title":"Current Round"},"winner_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Winner Player Id"},"created_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Player Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"display_club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Club Name"},"participants_count":{"type":"integer","title":"Participants Count","default":0}},"type":"object","required":["name","id","current_round","created_at","updated_at"],"title":"TournamentRead"},"TournamentRoundRead":{"properties":{"round_number":{"type":"integer","title":"Round Number"},"matches":{"items":{"$ref":"#/components/schemas/TournamentMatchRead"},"type":"array","title":"Matches"}},"type":"object","required":["round_number"],"title":"TournamentRoundRead"},"TournamentStandingEntryRead":{"properties":{"participant_id":{"type":"integer","title":"Participant Id"},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"display_name":{"type":"string","title":"Display Name"},"position":{"type":"integer","title":"Position"},"wins":{"type":"integer","title":"Wins"},"losses":{"type":"integer","title":"Losses"},"legs_won":{"type":"integer","title":"Legs Won"},"legs_lost":{"type":"integer","title":"Legs Lost"},"points":{"type":"integer","title":"Points"},"leg_difference":{"type":"integer","title":"Leg Difference"}},"type":"object","required":["participant_id","display_name","position","wins","losses","legs_won","legs_lost","points","leg_difference"],"title":"TournamentStandingEntryRead"},"TournamentStandingsRead":{"properties":{"tournament_id":{"type":"integer","title":"Tournament Id"},"standings":{"items":{"$ref":"#/components/schemas/TournamentStandingEntryRead"},"type":"array","title":"Standings"}},"type":"object","required":["tournament_id"],"title":"TournamentStandingsRead"},"TournamentStatus":{"type":"string","enum":["draft","registration_open","active","finished","cancelled"],"title":"TournamentStatus"},"TournamentUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"format":{"anyOf":[{"$ref":"#/components/schemas/TournamentFormat"},{"type":"null"}]},"status":{"anyOf":[{"$ref":"#/components/schemas/TournamentStatus"},{"type":"null"}]},"mode_name":{"anyOf":[{"type":"string","enum":["301","501","701","1001"]},{"type":"null"}],"title":"Mode Name"},"start_rule":{"anyOf":[{"$ref":"#/components/schemas/StartRule"},{"type":"null"}]},"finish_rule":{"anyOf":[{"$ref":"#/components/schemas/FinishRule"},{"type":"null"}]},"best_of_legs":{"anyOf":[{"type":"integer","enum":[1,3,5]},{"type":"null"}],"title":"Best Of Legs"},"club_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Club Id"},"club_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Name"},"club_alias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Club Alias"},"competition_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Competition Id"},"season_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season Id"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"max_participants":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Participants"},"extra_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra Data"}},"type":"object","title":"TournamentUpdate"},"TrainingDrillListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TrainingDrillRead"},"type":"array","title":"Items"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["meta"],"title":"TrainingDrillListResponse"},"TrainingDrillRead":{"properties":{"key":{"type":"string","title":"Key"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"recommended_mode":{"type":"string","title":"Recommended Mode"},"icon_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Key"},"accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Color"},"focus_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Focus Area"},"difficulty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Difficulty"},"recommended_start_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recommended Start Score"},"recommended_finish_rule":{"anyOf":[{"$ref":"#/components/schemas/FinishRule"},{"type":"null"}]}},"type":"object","required":["key","title","description","recommended_mode"],"title":"TrainingDrillRead"},"TrainingSessionCreate":{"properties":{"drill_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drill Key"},"name":{"type":"string","title":"Name"},"starting_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Starting Score"},"recommended_finish_rule":{"anyOf":[{"$ref":"#/components/schemas/FinishRule"},{"type":"null"}]},"created_by_player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By Player Id"},"participants":{"items":{"$ref":"#/components/schemas/SessionParticipantCreate"},"type":"array","title":"Participants"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["name"],"title":"TrainingSessionCreate","example":{"created_by_player_id":7,"drill_key":"checkout_61_80","extra_data":{"source":"ios_training_hub"},"name":"Checkout Training","participants":[{"display_name":"maxcheckout","player_id":7,"slot":1},{"display_name":"Gastspieler","slot":2}],"recommended_finish_rule":"double_out","starting_score":80}},"TrainingSessionListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/GameSessionRead"},"type":"array","title":"Items"},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["meta"],"title":"TrainingSessionListResponse"},"UnblockPlayerResponse":{"properties":{"status":{"type":"string","title":"Status","default":"deleted"}},"type":"object","title":"UnblockPlayerResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VisitCreate":{"properties":{"session_participant_id":{"type":"integer","title":"Session Participant Id"},"throws":{"items":{"$ref":"#/components/schemas/DartInput"},"type":"array","maxItems":3,"minItems":1,"title":"Throws"},"visit_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Visit Number"},"expected_leg_revision":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Leg Revision"},"recorded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Recorded At"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["session_participant_id","throws"],"title":"VisitCreate","example":{"session_participant_id":1,"throws":[{"bed":"triple","multiplier":"triple","segment":20},{"bed":"triple","multiplier":"triple","segment":20},{"bed":"triple","multiplier":"triple","segment":20}]}},"VisitRead":{"properties":{"id":{"type":"integer","title":"Id"},"leg_id":{"type":"integer","title":"Leg Id"},"session_participant_id":{"type":"integer","title":"Session Participant Id"},"player_id":{"type":"integer","title":"Player Id"},"visit_number":{"type":"integer","title":"Visit Number"},"recorded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Recorded At"},"remaining_before":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining Before"},"subtotal":{"type":"integer","title":"Subtotal"},"score_applied":{"type":"integer","title":"Score Applied"},"scored_points":{"type":"integer","title":"Scored Points"},"remaining_after":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining After"},"bust":{"type":"boolean","title":"Bust"},"checkout":{"type":"boolean","title":"Checkout"},"is_checkout_attempt":{"type":"boolean","title":"Is Checkout Attempt"},"darts_used_in_visit":{"type":"integer","title":"Darts Used In Visit"},"valid_turn":{"type":"boolean","title":"Valid Turn"},"revision":{"type":"integer","title":"Revision","default":1},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"},"darts":{"items":{"$ref":"#/components/schemas/DartThrowRead"},"type":"array","title":"Darts"}},"type":"object","required":["id","leg_id","session_participant_id","player_id","visit_number","remaining_before","subtotal","score_applied","scored_points","remaining_after","bust","checkout","is_checkout_attempt","darts_used_in_visit","valid_turn","created_at","updated_at","extra_data"],"title":"VisitRead"},"VisitUpdate":{"properties":{"throws":{"items":{"$ref":"#/components/schemas/DartInput"},"type":"array","maxItems":3,"minItems":1,"title":"Throws"},"recorded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Recorded At"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"type":"object","required":["throws"],"title":"VisitUpdate"}},"securitySchemes":{"BearerAuth":{"type":"http","description":"Bearer-Zugangstoken aus Login, Refresh oder OAuth-Login.","scheme":"bearer"}}}}