{"openapi":"3.1.0","info":{"title":"Notoq API","description":"API für Discord Bot Statistiken und Management","version":"1.0.0"},"paths":{"/":{"get":{"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health Check","description":"Überprüft ob API und DB laufen","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cache/stats":{"get":{"summary":"Cache Stats","description":"Cache-Statistiken (nur für Admins)","operationId":"cache_stats_cache_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/login":{"get":{"tags":["🔐 Authentication"],"summary":"Login","description":"Starts the Discord OAuth2 login flow.\n\n`redirect` is an optional own-site path (must start with \"/\"). Public pages like\nthe application page use it so the user lands back where they started instead of\non the dashboard - the session itself is the normal, site-wide one.\n\nRate Limited: 10 requests/minute (Security)","operationId":"login_auth_login_get","parameters":[{"name":"redirect","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Frontend path to return to after login, e.g. /apply/123","title":"Redirect"},"description":"Frontend path to return to after login, e.g. /apply/123"},{"name":"prompt","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only \"consent\" is honoured: forces the Discord authorize screen so the user can pick another account","title":"Prompt"},"description":"Only \"consent\" is honoured: forces the Discord authorize screen so the user can pick another account"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login-url":{"get":{"tags":["🔐 Authentication"],"summary":"Get Login Url","description":"Returns the Discord authorization URL (without redirect).\n\nRate Limited: 10 requests/minute (Security)","operationId":"get_login_url_auth_login_url_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code (en-US, de, es, prt, fr, pl, tr, ru, it, nl)","default":"en-US","title":"Lang"},"description":"Language code (en-US, de, es, prt, fr, pl, tr, ru, it, nl)"},{"name":"redirect","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Frontend path to return to after login","title":"Redirect"},"description":"Frontend path to return to after login"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/callback":{"get":{"tags":["🔐 Authentication"],"summary":"Callback","description":"Discord Callback - Premium Experience Version","operationId":"callback_auth_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Authorization code from Discord","title":"Code"},"description":"Authorization code from Discord"},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"OAuth error (e.g. access_denied)","title":"Error"},"description":"OAuth error (e.g. access_denied)"},{"name":"guild_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Guild ID from bot invite (if any)","title":"Guild Id"},"description":"Guild ID from bot invite (if any)"},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"OAuth state param, may contain referral info (ref_<userId>)","title":"State"},"description":"OAuth state param, may contain referral info (ref_<userId>)"},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Language code (en-US, de, es, prt, fr, pl, tr, ru, it, nl)","default":"en-US","title":"Lang"},"description":"Language code (en-US, de, es, prt, fr, pl, tr, ru, it, nl)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"tags":["🔐 Authentication"],"summary":"Get Current User Info","description":"Returns information about the currently logged-in user.\n\nOPTIMIZED: Shows only servers where user CURRENTLY has admin access\nRate Limited: 60 requests/minute","operationId":"get_current_user_info_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/refresh":{"post":{"tags":["🔐 Authentication"],"summary":"Refresh Token","description":"Token Refresh - Erstellt einen neuen JWT Token.\n\nAkzeptiert auch abgelaufene Tokens (bis zu 30 Tage alt).\nDas Frontend sollte diesen Endpoint aufrufen bevor/nachdem der Token abläuft,\num den User eingeloggt zu halten.\n\nRate Limited: 60 requests/minute","operationId":"refresh_token_auth_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/login-auto":{"get":{"tags":["🔐 Authentication"],"summary":"Login Auto","description":"Auto-Login für wiederkehrende User.\n\nWenn der User den Bot bereits autorisiert hat, wird er direkt\neingeloggt ohne nochmal auf den \"Authorize\" Button klicken zu müssen.\nNutzt Discord OAuth2 prompt=none.\n\nFalls der User den Bot noch nicht autorisiert hat, wird er\nzum normalen Login weitergeleitet.\n\nRate Limited: 10 requests/minute","operationId":"login_auto_auth_login_auto_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/login-auto-url":{"get":{"tags":["🔐 Authentication"],"summary":"Get Login Auto Url","description":"Gibt die Auto-Login URL zurück (mit prompt=none).\nFür Mobile/API Clients die den User direkt einloggen wollen,\nohne dass er nochmal den Authorize-Button klicken muss.\n\nRate Limited: 10 requests/minute","operationId":"get_login_auto_url_auth_login_auto_url_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language code (en-US, de, es, prt, fr, pl, tr, ru, it, nl)","default":"en-US","title":"Lang"},"description":"Language code (en-US, de, es, prt, fr, pl, tr, ru, it, nl)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"post":{"tags":["🔐 Authentication"],"summary":"Logout","description":"Logout endpoint (Frontend deletes token from localStorage).","operationId":"logout_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/community-ai/{server_id}/config":{"get":{"tags":["🤖 Community AI"],"summary":"Get Community Ai Config","description":"Serverweite Community-KI-Konfig + Channels + verfügbare Modelle + Verbrauch.","operationId":"get_community_ai_config_api_v1_community_ai__server_id__config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/community-ai/{server_id}/settings":{"put":{"tags":["🤖 Community AI"],"summary":"Update Community Ai Settings","description":"Aktualisiert die serverweiten Community-KI-Einstellungen (partiell).","operationId":"update_community_ai_settings_api_v1_community_ai__server_id__settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunitySettingsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/community-ai/{server_id}/channels":{"post":{"tags":["🤖 Community AI"],"summary":"Upsert Community Ai Channel","description":"Legt einen KI-Channel (Charakter / Always-on-Helfer) an oder aktualisiert ihn.","operationId":"upsert_community_ai_channel_api_v1_community_ai__server_id__channels_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunityChannelBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/community-ai/{server_id}/channels/{channel_id}":{"delete":{"tags":["🤖 Community AI"],"summary":"Delete Community Ai Channel","description":"Entfernt einen KI-Channel.","operationId":"delete_community_ai_channel_api_v1_community_ai__server_id__channels__channel_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Channel ID","title":"Channel Id"},"description":"Discord Channel ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/characters":{"get":{"tags":["🎭 Character Marketplace"],"summary":"List Characters","description":"Marktplatz-Liste. Für jeden eingeloggten User sichtbar (Discovery).","operationId":"list_characters_api_v1_characters_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"trending|popular|new|top","default":"trending","title":"Sort"},"description":"trending|popular|new|top"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"scope","in":"query","required":false,"schema":{"type":"string","description":"public|official|mine|favorites","default":"public","title":"Scope"},"description":"public|official|mine|favorites"},{"name":"collection","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"staff|legends (nur scope=official)","title":"Collection"},"description":"staff|legends (nur scope=official)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":30,"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🎭 Character Marketplace"],"summary":"Create Character","operationId":"create_character_api_v1_characters_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Dashboard-Kontext fürs Gating","title":"Server Id"},"description":"Dashboard-Kontext fürs Gating"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/characters/recommended":{"get":{"tags":["🎭 Character Marketplace"],"summary":"Recommended Characters","description":"Empfehlungen: beliebte öffentliche Charaktere (leichtgewichtig, popularitätsbasiert).","operationId":"recommended_characters_api_v1_characters_recommended_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":8,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/characters/test-chat":{"post":{"tags":["🎭 Character Marketplace"],"summary":"Test Chat Character","description":"Probe-Unterhaltung mit einem (ggf. ungespeicherten) Charakter-Entwurf.\n\nNichts wird persistiert. Nutzt die Provider-Kette des Dashboard-Servers, daher\nAI-Abo + gültiger Key erforderlich (wie das echte Deployment). Der Charakter\nkommt komplett im Request; so lässt sich vor dem Speichern testen.","operationId":"test_chat_character_api_v1_characters_test_chat_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"query","required":true,"schema":{"type":"string","description":"Dashboard-Server (für Zugriff + Provider-Key)","title":"Server Id"},"description":"Dashboard-Server (für Zugriff + Provider-Key)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestChatBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/characters/{slug}":{"get":{"tags":["🎭 Character Marketplace"],"summary":"Get Character","operationId":"get_character_api_v1_characters__slug__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/characters/{character_id}":{"put":{"tags":["🎭 Character Marketplace"],"summary":"Update Character","operationId":"update_character_api_v1_characters__character_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"integer","title":"Character Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharacterBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎭 Character Marketplace"],"summary":"Delete Character","operationId":"delete_character_api_v1_characters__character_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"integer","title":"Character Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/characters/{character_id}/publish":{"post":{"tags":["🎭 Character Marketplace"],"summary":"Publish Character","operationId":"publish_character_api_v1_characters__character_id__publish_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"integer","title":"Character Id"}},{"name":"server_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/characters/{character_id}/unpublish":{"post":{"tags":["🎭 Character Marketplace"],"summary":"Unpublish Character","operationId":"unpublish_character_api_v1_characters__character_id__unpublish_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"integer","title":"Character Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/characters/{character_id}/favorite":{"post":{"tags":["🎭 Character Marketplace"],"summary":"Favorite Character","operationId":"favorite_character_api_v1_characters__character_id__favorite_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"integer","title":"Character Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎭 Character Marketplace"],"summary":"Unfavorite Character","operationId":"unfavorite_character_api_v1_characters__character_id__favorite_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"integer","title":"Character Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/characters/{character_id}/report":{"post":{"tags":["🎭 Character Marketplace"],"summary":"Report Character","operationId":"report_character_api_v1_characters__character_id__report_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"integer","title":"Character Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/characters/{character_id}/remix":{"post":{"tags":["🎭 Character Marketplace"],"summary":"Remix Character","description":"Forkt einen öffentlichen/offiziellen Charakter in eine eigene, private Kopie.","operationId":"remix_character_api_v1_characters__character_id__remix_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"integer","title":"Character Id"}},{"name":"server_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/characters/assets":{"post":{"tags":["🎭 Character Marketplace"],"summary":"Upload Character Asset","operationId":"upload_character_asset_api_v1_characters_assets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/characters/assets/{asset_id}":{"get":{"tags":["🎭 Character Marketplace"],"summary":"Get Character Asset","operationId":"get_character_asset_api_v1_characters_assets__asset_id__get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"integer","title":"Asset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/characters/moderation/queue":{"get":{"tags":["🎭 Character Marketplace"],"summary":"Moderation Queue","operationId":"moderation_queue_api_v1_characters_moderation_queue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/characters/{character_id}/moderate":{"post":{"tags":["🎭 Character Marketplace"],"summary":"Moderate Character","operationId":"moderate_character_api_v1_characters__character_id__moderate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"character_id","in":"path","required":true,"schema":{"type":"integer","title":"Character Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/config":{"get":{"tags":["💬 Support Chat"],"summary":"Support Config","description":"Lightweight config for the widget/page (per logged-in user).","operationId":"support_config_api_v1_support_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/support/me/notifications":{"get":{"tags":["💬 Support Chat"],"summary":"Get Notify Prefs","operationId":"get_notify_prefs_api_v1_support_me_notifications_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["💬 Support Chat"],"summary":"Set Notify Prefs","description":"Nur die uebergebenen Felder aendern.\n\n`get_or_create` und nicht `create`: wer nie etwas umgestellt hat, hat\nkeine Zeile, und die erste Aenderung legt sie an.","operationId":"set_notify_prefs_api_v1_support_me_notifications_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotifyPrefsBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/support/typing":{"post":{"tags":["💬 Support Chat"],"summary":"Typing","description":"Jemand tippt gerade. OHNE DATENBANKSCHREIBEN.\n\nEin Tipp-Punkt ist die fluechtigste Information im ganzen System. Eine\nZeile dafuer waere ein Schreibvorgang je drei Sekunden je tippendem\nNutzer - bei fuenfzig gleichzeitigen Gespraechen also rund tausend\nSchreibvorgaenge in der Minute fuer etwas, das nach acht Sekunden\nwertlos ist.\n\nDer Zustand lebt in `utils/support_strom.py` mit Verfallszeit und wird\nueber den Strom verteilt. Bricht der Browser weg, verfaellt er von\nselbst: ein ewiger Tipp-Punkt ist schlimmer als keiner.","operationId":"typing_api_v1_support_typing_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TypingBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/support/agent/typing":{"post":{"tags":["💬 Support Chat"],"summary":"Agent Typing","description":"Dasselbe in die andere Richtung: das Team tippt.","operationId":"agent_typing_api_v1_support_agent_typing_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TypingBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/support/agent/conversations/{conv_id}/read":{"post":{"tags":["💬 Support Chat"],"summary":"Agent Mark Read","description":"Der Lesestand des Teams.\n\nEs gab ihn bisher nur als NEBENWIRKUNG von `agent_get_conversation`, und\nder laeuft auch dann, wenn der Desk im Hintergrund pollt und niemand\nhinsieht. Mit dem Strom aus Phase 2 faellt das Polling weg, also braucht\nder Lesestand einen eigenen Weg - genau wie auf der Nutzerseite.","operationId":"agent_mark_read_api_v1_support_agent_conversations__conv_id__read_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/agent/presence":{"get":{"tags":["💬 Support Chat"],"summary":"Agent Presence","description":"Wer vom Team gerade einen offenen Strom hat.\n\nNUR FUER DIE ANZEIGE \"wer ist im Dienst\". Fuer die DM-Entscheidung in\nPhase 11 ist diese Quelle falsch: sie kennt nur DIESEN Prozess. Das\nsteht auch im Kopf von `utils/support_strom.py`.","operationId":"agent_presence_api_v1_support_agent_presence_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/support/hilfe/rueckmeldung":{"post":{"tags":["💬 Support Chat"],"summary":"Hilfe Rueckmeldung","description":"Zaehlt, ob ein Selbsthilfe-Vorschlag geholfen hat.\n\nZWEI ZAHLEN JE KATALOGEINTRAG, kein Protokoll. Die Frage ist \"taugt\nEintrag X etwas\", nicht \"wer hat wann geklickt\". Ein Protokoll koennte\nmehr, kostet aber einen Schreibvorgang je Klick und muss aufgeraeumt\nwerden.\n\nDas ist die einzige ehrliche Zahl dafuer, ob die Selbsthilfe etwas\nbringt. Ohne sie waere der Katalog eine Behauptung.","operationId":"hilfe_rueckmeldung_api_v1_support_hilfe_rueckmeldung_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HilfeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/support/me/conversations":{"get":{"tags":["💬 Support Chat"],"summary":"My Conversations","operationId":"my_conversations_api_v1_support_me_conversations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["💬 Support Chat"],"summary":"Create Conversation","operationId":"create_conversation_api_v1_support_me_conversations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewConversationBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/support/me/conversations/{conv_id}":{"get":{"tags":["💬 Support Chat"],"summary":"Get My Conversation","description":"Fetch a conversation. With `after=<message id>` only newer messages are\nreturned (`partial: true`) — this turns the 4s poll from a full-transcript\ndownload into a near-empty response.","operationId":"get_my_conversation_api_v1_support_me_conversations__conv_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"After"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/me/conversations/{conv_id}/messages":{"post":{"tags":["💬 Support Chat"],"summary":"Send My Message","operationId":"send_my_message_api_v1_support_me_conversations__conv_id__messages_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/me/conversations/{conv_id}/read":{"post":{"tags":["💬 Support Chat"],"summary":"Mark Read","operationId":"mark_read_api_v1_support_me_conversations__conv_id__read_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/me/conversations/{conv_id}/close":{"post":{"tags":["💬 Support Chat"],"summary":"Close My Conversation","operationId":"close_my_conversation_api_v1_support_me_conversations__conv_id__close_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/me/conversations/{conv_id}/reopen":{"post":{"tags":["💬 Support Chat"],"summary":"Reopen My Conversation","operationId":"reopen_my_conversation_api_v1_support_me_conversations__conv_id__reopen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/me/conversations/{conv_id}/rate":{"post":{"tags":["💬 Support Chat"],"summary":"Rate Conversation","operationId":"rate_conversation_api_v1_support_me_conversations__conv_id__rate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/upload":{"post":{"tags":["💬 Support Chat"],"summary":"Upload Attachment","description":"Nimmt eine Datei an, legt sie in R2 ab und gibt eine ADRESSE zurueck.\n\nKeine `data:`-Zeichenkette mehr. Was hier zurueckkommt, ist die schlanke\nForm plus eine Adresse mit Karte, damit der Composer sofort eine Vorschau\nzeigen kann, obwohl die Nachricht noch gar nicht existiert.\n\nIst R2 nicht eingerichtet, bleibt alles wie vorher (base64 im Feld `data`\nder Zeile UND in der Antwort). Hausregel: eine halb gefuellte .env legt\nnichts lahm.","operationId":"upload_attachment_api_v1_support_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_attachment_api_v1_support_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/support/me/stream":{"get":{"tags":["💬 Support Chat"],"summary":"My Stream","description":"Der Strom des Nutzers. Schluessel ist seine ID.\n\nNUTZERWEIT, nicht je Unterhaltung. Wer im Dashboard sitzt und einen\nServer einrichtet, soll die Antwort auf sein Ticket mitbekommen, ohne den\nChat offen zu haben. Ab Phase 11 ist dieser offene Strom zugleich das\nAnwesenheitssignal.","operationId":"my_stream_api_v1_support_me_stream_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/support/agent/stream":{"get":{"tags":["💬 Support Chat"],"summary":"Agent Stream","description":"Der Strom des Teams. Ein Schluessel fuer alle Agenten.\n\nNicht je Agent: der Desk zeigt die Warteschlange, und die ist fuer alle\ndieselbe. Ein Schluessel je Agent haette dieselben Ereignisse N-mal\nverteilt.","operationId":"agent_stream_api_v1_support_agent_stream_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/support/attachments/{sha256}":{"get":{"tags":["💬 Support Chat"],"summary":"Support Attachment","description":"Die Bytes eines Anhangs. Zwei Wege hinein, einer hinaus.\n\nERST DIE KARTE, DANN DER BEARER. Ein <img>-Tag kann keinen\nAuthorization-Header senden, deshalb gibt es die Karte ueberhaupt. Wer\neinen Bearer hat, kommt auch ohne Karte durch - das ist der Weg fuer\nHerunterladen und fuer den Desk.\n\n404 STATT 403, wenn etwas nicht erlaubt ist. Sonst laesst sich ueber die\nStatuscodes auslesen, welche Anhaenge es gibt, und der Hashraum wird zum\nVerzeichnis.","operationId":"support_attachment_api_v1_support_attachments__sha256__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sha256","in":"path","required":true,"schema":{"type":"string","title":"Sha256"}},{"name":"t","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Kurzlebige Karte","title":"T"},"description":"Kurzlebige Karte"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/agent/conversations":{"get":{"tags":["💬 Support Chat"],"summary":"Agent Conversations","description":"The agent inbox feed. `scope` picks a queue, `status` narrows it further,\n`sort` orders it, and `search` fuzzy-matches user, supporter, subject and the\nmessage contents. The archive is `scope=archived` (closed) + date/assignee.","operationId":"agent_conversations_api_v1_support_agent_conversations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"query","required":false,"schema":{"type":"string","default":"open","title":"Scope"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"recent","title":"Sort"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated status filter (overrides scope defaults)","title":"Status"},"description":"Comma-separated status filter (overrides scope defaults)"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO date; only conversations closed on/after this (archive)","title":"Since"},"description":"ISO date; only conversations closed on/after this (archive)"},{"name":"assignee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by supporter (assigned agent user id)","title":"Assignee"},"description":"Filter by supporter (assigned agent user id)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":300,"minimum":1,"default":120,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/agent/stats":{"get":{"tags":["💬 Support Chat"],"summary":"Agent Stats","operationId":"agent_stats_api_v1_support_agent_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/support/agent/supporters":{"get":{"tags":["💬 Support Chat"],"summary":"Agent Supporters","description":"Distinct supporters who have handled at least one conversation — powers the\narchive's 'filter by supporter' control.","operationId":"agent_supporters_api_v1_support_agent_supporters_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/support/agent/conversations/{conv_id}":{"get":{"tags":["💬 Support Chat"],"summary":"Agent Get Conversation","description":"Fetch a conversation for the inbox. With `after=<message id>` only newer\nmessages are returned (`partial: true`) so the 4s thread poll stays tiny.","operationId":"agent_get_conversation_api_v1_support_agent_conversations__conv_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en-US","title":"Lang"}},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"After"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/agent/conversations/{conv_id}/insights":{"get":{"tags":["💬 Support Chat"],"summary":"Agent Conversation Insights","description":"The 'smart layer' for a conversation, computed in one call and cached until\na new message arrives:\n\n- entities: servers/users mentioned in the chat (by ID or name), resolved and\n  pre-filtered to what can actually be right (server names only match servers\n  the customer is a member of), with candidates when ambiguous.\n- bot_status: where Notoq stands on the affected server (role position,\n  permissions, warnings) — the same payload the AI receives as context.\n- related: the customer's previous tickets + how many tickets exist for the\n  same server.\n- detected_language: the language the customer is writing in right now.","operationId":"agent_conversation_insights_api_v1_support_agent_conversations__conv_id__insights_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/agent/servers/{server_id}/bot-status":{"get":{"tags":["💬 Support Chat"],"summary":"Agent Bot Status","description":"Standalone bot-status check (used by the server modal and the refresh\nbutton on the status card).","operationId":"agent_bot_status_api_v1_support_agent_servers__server_id__bot_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"fresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Fresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/agent/conversations/{conv_id}/claim":{"post":{"tags":["💬 Support Chat"],"summary":"Agent Claim","operationId":"agent_claim_api_v1_support_agent_conversations__conv_id__claim_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/agent/conversations/{conv_id}/reply":{"post":{"tags":["💬 Support Chat"],"summary":"Agent Reply","description":"Die Antwort eines MENSCHEN. Der Ablauf selbst liegt in\n`support_dienst.antwort_senden` - hier steht nur, was diesen Aufrufer\nausmacht: er bringt Anhaenge mit, er uebernimmt das Ticket, und er nimmt\ndie KI aus dem Gespraech.\n\nDASS EIN MENSCH DIE KI VERDRAENGT, IST DER KERN DER UEBERGABE. `ai_active`\nauf False und `ai_handed_off` auf True heisst fuer den Autopiloten: Finger\nweg, hier arbeitet jemand. Er sieht dieses Ticket danach nicht mehr in\nseiner Warteschlange, ohne dass irgendwo ein zweites Kennzeichen gepflegt\nwerden muss.","operationId":"agent_reply_api_v1_support_agent_conversations__conv_id__reply_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/agent/conversations/{conv_id}/status":{"post":{"tags":["💬 Support Chat"],"summary":"Agent Set Status","operationId":"agent_set_status_api_v1_support_agent_conversations__conv_id__status_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/agent/conversations/{conv_id}/snooze":{"post":{"tags":["💬 Support Chat"],"summary":"Agent Snooze","description":"Zurueckstellen, und mit `minutes=null` wieder zurueckholen.\n\nBeim Zurueckkommen entsteht KEINE Systemzeile: die schreibt der erste\nAbruf, der das Ticket wieder in der Warteschlange sieht. Eine Zeile beim\nZurueckstellen waere ehrlicher, aber sie stuende im Verlauf DES NUTZERS,\nund der hat mit der Wiedervorlage des Teams nichts zu tun.","operationId":"agent_snooze_api_v1_support_agent_conversations__conv_id__snooze_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnoozeBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/agent/conversations/bulk":{"post":{"tags":["💬 Support Chat"],"summary":"Agent Bulk","description":"Sammelaktion ueber mehrere Tickets: schliessen, zuweisen, Kategorie.\n\nDie Rueckfrage steht in der Oberflaeche (`UniversalConfirmDialog` mit\neiner Zahl darin). Hier steht die Grenze: hoechstens fuenfzig auf einmal.\nWer mehr auswaehlt, hat sich vertan, und ein Massenschliessen ueber\ndreihundert Tickets ist von Hand nicht rueckgaengig zu machen.","operationId":"agent_bulk_api_v1_support_agent_conversations_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/support/agent/views":{"get":{"tags":["💬 Support Chat"],"summary":"List Views","operationId":"list_views_api_v1_support_agent_views_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["💬 Support Chat"],"summary":"Create View","operationId":"create_view_api_v1_support_agent_views_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/support/agent/views/{view_id}":{"delete":{"tags":["💬 Support Chat"],"summary":"Delete View","operationId":"delete_view_api_v1_support_agent_views__view_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"view_id","in":"path","required":true,"schema":{"type":"integer","title":"View Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/agent/conversations/{conv_id}/summary":{"post":{"tags":["💬 Support Chat"],"summary":"Agent Generate Summary","operationId":"agent_generate_summary_api_v1_support_agent_conversations__conv_id__summary_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/agent/canned":{"get":{"tags":["💬 Support Chat"],"summary":"List Canned","operationId":"list_canned_api_v1_support_agent_canned_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["💬 Support Chat"],"summary":"Create Canned","operationId":"create_canned_api_v1_support_agent_canned_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CannedBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/support/agent/canned/{canned_id}":{"patch":{"tags":["💬 Support Chat"],"summary":"Update Canned","operationId":"update_canned_api_v1_support_agent_canned__canned_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"canned_id","in":"path","required":true,"schema":{"type":"integer","title":"Canned Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CannedBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["💬 Support Chat"],"summary":"Delete Canned","operationId":"delete_canned_api_v1_support_agent_canned__canned_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"canned_id","in":"path","required":true,"schema":{"type":"integer","title":"Canned Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/agent/canned/{canned_id}/localize":{"post":{"tags":["💬 Support Chat"],"summary":"Localize Canned","description":"Uebersetzt einen Baustein und fuellt seine Platzhalter.\n\n─── Warum ein fehlender Platzhalter das Einfuegen VERHINDERT ───────────\n\n`{name}`, `{server}`, `{agent}` und `{plan}` werden aus der Unterhaltung\ngefuellt. Fehlt einer, kommt der Text NICHT mit einer Luecke zurueck,\nsondern mit `blocked: true` und der Liste der fehlenden Namen.\n\nEine Antwort, die \"Hallo ,\" beginnt, ist schlimmer als gar keine: sie\nsagt dem Nutzer, dass hier eine Maschine ohne Aufsicht laeuft, und das\nist genau der Eindruck, den ein Support nicht hinterlassen darf.\n\nZUERST UEBERSETZEN, DANN FUELLEN. Umgekehrt liefe der Servername durch\ndie maschinelle Uebersetzung, und aus \"Gaming Lounge\" wuerde auf\nDeutsch \"Spielesalon\".","operationId":"localize_canned_api_v1_support_agent_canned__canned_id__localize_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"canned_id","in":"path","required":true,"schema":{"type":"integer","title":"Canned Id"}},{"name":"target_lang","in":"query","required":true,"schema":{"type":"string","title":"Target Lang"}},{"name":"conversation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/support/settings":{"get":{"tags":["💬 Support Chat"],"summary":"Get Support Settings","operationId":"get_support_settings_api_v1_support_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["💬 Support Chat"],"summary":"Update Support Settings","operationId":"update_support_settings_api_v1_support_settings_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/support/ai/models":{"get":{"tags":["💬 Support Chat"],"summary":"Ai Models","description":"Provider catalog + chat-capable models, only for providers whose platform key\nis configured — so the owner only sees models Notoq can actually run.","operationId":"ai_models_api_v1_support_ai_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/register":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Register","operationId":"register_accounts_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/register/start":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Register Start","operationId":"register_start_accounts_register_start_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/register/complete":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Register Complete","operationId":"register_complete_accounts_register_complete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterCompleteBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/password/forgot":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Password Forgot","description":"Start a password reset. Always returns a token (no account enumeration);\nthe code is only emailed when the address actually has a credential.","operationId":"password_forgot_accounts_password_forgot_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/password/reset":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Password Reset","operationId":"password_reset_accounts_password_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/login":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Login","operationId":"login_accounts_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/refresh":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Refresh","description":"Tauscht ein gültiges Refresh-Token gegen ein neues Token-Paar (Rotation).\n\nStatt das benutzte Token sofort hart zu widerrufen, wird seine Restlaufzeit auf\nein kurzes Kulanzfenster (``jwt_refresh_grace_seconds``) gekürzt. Dadurch übersteht\nein paralleler Refresh ODER ein Wiederholungsversuch nach einer verlorenen Antwort\n(dasselbe Token nochmal) das Fenster und erhält einfach ein neues Paar – statt\nfälschlich als „Reuse/Diebstahl\" gewertet zu werden und ALLE Sitzungen des Kontos\n(auch auf ANDEREN Geräten) abzumelden. Genau dieser Kaskaden-Widerruf war die\nUrsache der zufälligen, geräteübergreifenden Logouts. Nach dem Kulanzfenster gilt\ndas alte Token schlicht als abgelaufen – ohne andere Sitzungen mitzureißen.","operationId":"refresh_accounts_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/logout":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Logout","operationId":"logout_accounts_logout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/sessions":{"get":{"tags":["🪪 Notoq Accounts"],"summary":"List Sessions","operationId":"list_sessions_accounts_sessions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/sessions/{session_id}":{"delete":{"tags":["🪪 Notoq Accounts"],"summary":"Revoke Session","description":"Revoke a device entry — every token row whose signature matches (all of its\nrotated + legacy rows). Falls back to the old session_id / row: ids for safety.","operationId":"revoke_session_accounts_sessions__session_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/sessions/revoke-others":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Revoke Other Sessions","description":"Sign out of every device except the caller's own session.","operationId":"revoke_other_sessions_accounts_sessions_revoke_others_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/handoff/create":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Handoff Create","description":"Mint a one-time handoff code for the signed-in account.","operationId":"handoff_create_accounts_handoff_create_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/handoff/redeem":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Handoff Redeem","description":"Exchange a handoff code (minted on the other device) for a fresh session.\nSingle-use: the code must be the dedicated 'handoff' kind, unrevoked and unexpired,\nand is burned before the new session is issued so a race can't redeem it twice.","operationId":"handoff_redeem_accounts_handoff_redeem_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HandoffRedeemBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/upgrade-legacy":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Upgrade Legacy","description":"Silently upgrade a still-valid legacy /api/auth dashboard token to a unified\nNotoq accounts session, WITHOUT a re-login. The frontend calls this once when it\nfinds an old token in localStorage, then swaps in the returned tokens. The Discord\nidentity in the legacy token is trusted because this API signed it. Idempotent:\npassing an already-accounts token simply re-issues a session for the same account.","operationId":"upgrade_legacy_accounts_upgrade_legacy_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeLegacyBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/verify-email":{"get":{"tags":["🪪 Notoq Accounts"],"summary":"Verify Email","operationId":"verify_email_accounts_verify_email_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/set-password":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Set Password","description":"Add (or change) native email/password login for the signed-in account —\ne.g. a Discord-first user who now wants email login too, so both methods land\nin the same Notoq account. Mirrors register()'s validation.","operationId":"set_password_accounts_set_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPasswordBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/password/change":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Password Change","operationId":"password_change_accounts_password_change_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/email/change/start":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Email Change Start","operationId":"email_change_start_accounts_email_change_start_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailChangeStartBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/email/change/confirm":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Email Change Confirm","operationId":"email_change_confirm_accounts_email_change_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailChangeConfirmBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/account/delete":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Account Delete","description":"Delete the account and everything attached (identities, credential, tokens,\n2FA cascade). Requires the password when one is set.","operationId":"account_delete_accounts_account_delete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/unlink/{provider}":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Unlink","description":"Remove a linked login method, but never orphan the account — at least one\nother method must remain.","operationId":"unlink_accounts_unlink__provider__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/me":{"get":{"tags":["🪪 Notoq Accounts"],"summary":"Me","operationId":"me_accounts_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/jwks.json":{"get":{"tags":["🪪 Notoq Accounts"],"summary":"Jwks","description":"Öffentlicher Schlüssel im JWKS-Format. Solange kein RSA-Schlüsselpaar\nkonfiguriert ist, liefert dies eine leere Schlüsselliste (HS256 bleibt aktiv).","operationId":"jwks_accounts_jwks_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/accounts/discord/login":{"get":{"tags":["🪪 Notoq Accounts"],"summary":"Discord Login","description":"Start a Discord login. The desktop client opens this URL in the browser and\ncatches the callback on its loopback listener\n(`?mode=desktop&port=<p>&challenge=<S256>`, see \"Desktop-Anmeldung\" above). A\nbrowser SPA (NotoqWebsite) instead passes `?redirect=<its-origin-url>`; that\nreturn URL is sealed into a short-lived signed `state` so the callback can hand\nthe session back to the site (vs. dumping JSON on the API origin).","operationId":"discord_login_accounts_discord_login_get","parameters":[{"name":"port","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Port"}},{"name":"mode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"}},{"name":"redirect","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect"}},{"name":"challenge","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Challenge"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/link/discord":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Link Discord","description":"Start linking Discord to the *currently signed-in* Notoq account. The target\naccount is carried in a short-lived signed state token. The desktop passes\n`?port=<p>&challenge=<S256>` so the callback hands the (re-issued) session back\nover the loopback listener as a one-time code (redeemed at /desktop/redeem, like\nthe desktop login); a browser SPA passes `?redirect=<its-url>` so the callback\nreturns to the site after linking.","operationId":"link_discord_accounts_link_discord_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"port","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Port"}},{"name":"redirect","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect"}},{"name":"challenge","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Challenge"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/discord/callback":{"get":{"tags":["🪪 Notoq Accounts"],"summary":"Discord Callback","operationId":"discord_callback_accounts_discord_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"login","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/desktop/redeem":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Desktop Redeem","description":"Gibt die Sitzung einer Desktop-Anmeldung gegen Einmalcode und\nPKCE-Verifier heraus (siehe \"Desktop-Anmeldung\" oben).\n\nDer Code ist beim ERSTEN Versuch verbraucht, egal wie er ausgeht. Sonst\nliesse sich zu einem mitgelesenen Code der Verifier durchprobieren - bei\neinem schwach gewaehlten Verifier ist das keine Theorie. Scheitert der\nVersuch, wird auch die Sitzung dahinter widerrufen: sie hat dann keinen\nAbnehmer mehr und stuende sonst 30 Tage lang in der Geraeteliste.","operationId":"desktop_redeem_accounts_desktop_redeem_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesktopRedeemBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/2fa/setup":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Twofa Setup","operationId":"twofa_setup_accounts_2fa_setup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/2fa/enable":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Twofa Enable","operationId":"twofa_enable_accounts_2fa_enable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/2fa/disable":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Twofa Disable","description":"Turn 2FA off — requires a valid current code so a hijacked session can't\nsilently remove the second factor.","operationId":"twofa_disable_accounts_2fa_disable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/admin/roles":{"get":{"tags":["🪪 Notoq Accounts"],"summary":"List Role Holders","description":"Every account that has a role above the default `user` — i.e. all\npartner/team/admin holders, plus the (computed) owner. This is the standing\noverview the Admin Hub shows without a search.","operationId":"list_role_holders_accounts_admin_roles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/admin/users":{"get":{"tags":["🪪 Notoq Accounts"],"summary":"Search Users","description":"Find accounts by email / display name (`q`) or fetch a specific set (`ids`,\ncomma-separated account ids). Results are capped at SEARCH_LIMIT.","operationId":"search_users_accounts_admin_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ids"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/admin/users/{account_id}/role":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Set Role","operationId":"set_role_accounts_admin_users__account_id__role_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/admin/metrics":{"get":{"tags":["🪪 Notoq Accounts"],"summary":"Admin Metrics","description":"Aggregierte Staff-KPIs aus der Identitaets-DB. 60s In-Process-Cache.","operationId":"admin_metrics_accounts_admin_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/admin/partner-limit":{"get":{"tags":["🪪 Notoq Accounts"],"summary":"Get Partner Limit","description":"Das Monatskontingent eines Partnerkontos (Vorgabewert, wenn nie gesetzt).","operationId":"get_partner_limit_accounts_admin_partner_limit_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"query","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🪪 Notoq Accounts"],"summary":"Set Partner Limit","description":"Das Monatskontingent setzen. Die Obergrenze ist Absicht: \"unbegrenzt\"\nsoll eine Rolle sein (owner/admin), kein Zahlendreher in diesem Feld.","operationId":"set_partner_limit_accounts_admin_partner_limit_put","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerLimitBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/admin/account/{account_id}":{"get":{"tags":["🪪 Notoq Accounts"],"summary":"Account Detail","description":"Alles, was die Identitaetsschicht ueber ein Konto weiss.","operationId":"account_detail_accounts_admin_account__account_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/admin/bot-team":{"get":{"tags":["🪪 Notoq Accounts"],"summary":"List Team","description":"Every current Bot-Team member, enriched with the Discord username/avatar\nwhen the bot has seen that user before.","operationId":"list_team_accounts_admin_bot_team_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["🪪 Notoq Accounts"],"summary":"Add Member","operationId":"add_member_accounts_admin_bot_team_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMemberBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/admin/bot-team/{discord_id}":{"patch":{"tags":["🪪 Notoq Accounts"],"summary":"Set Member Role","operationId":"set_member_role_accounts_admin_bot_team__discord_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"discord_id","in":"path","required":true,"schema":{"type":"string","title":"Discord Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🪪 Notoq Accounts"],"summary":"Remove Member","operationId":"remove_member_accounts_admin_bot_team__discord_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"discord_id","in":"path","required":true,"schema":{"type":"string","title":"Discord Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/partner/overview":{"get":{"tags":["🪪 Notoq Accounts"],"summary":"Overview","description":"Kontingent des Monats plus die eigenen Codes mit ihrem Einloesestand.","operationId":"overview_accounts_partner_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/partner/discounts":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Create Discount","description":"Einen Rabattcode erzeugen. Kontingent und Prozentgrenze werden VOR dem\nPaddle-Aufruf geprueft - ein abgelehnter Code soll gar nicht erst dort\nentstehen.","operationId":"create_discount_accounts_partner_discounts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDiscountBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts/partner/discounts/{discount_id}/archive":{"post":{"tags":["🪪 Notoq Accounts"],"summary":"Archive Discount","description":"Einen eigenen Code stilllegen. Fremde Codes sind nicht auffindbar (404\nstatt 403 - wer sie nicht besitzt, soll auch nicht erfahren, dass es sie\ngibt).","operationId":"archive_discount_accounts_partner_discounts__discount_id__archive_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"discount_id","in":"path","required":true,"schema":{"type":"integer","title":"Discount Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/hub":{"get":{"tags":["🪪 Notoq Accounts"],"summary":"Hub","description":"Die Rolle dieses Kontos und - fuer Partner - der Kontingentstand.\n\nDie Rolle wird frisch aus der Datenbank abgeleitet und NICHT aus dem Token\ngelesen: eine gerade entzogene Partnerrolle soll beim naechsten Aufruf weg\nsein und nicht erst, wenn das Token in einer Stunde ablaeuft.","operationId":"hub_accounts_hub_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/servers/{server_id}":{"get":{"tags":["🖥️ Servers"],"summary":"Get Server Details","description":"Gibt Details (Name, Icon) für einen spezifischen Server zurück.\nWird vom Frontend für den Header benötigt.\n\n─── Warum hier KEINE Anmeldung verlangt wird ──────────────────────────\n\nWeil die oeffentliche Bestenliste ihn braucht: LeaderboardSystem.jsx:132\nholt sich hier den Servernamen fuer die Kopfzeile, und zwar ohne Token -\ndie Seite ist fuer jeden da. Eine Anmeldepflicht wuerde dort den Namen\nverschwinden lassen.\n\nWas er herausgibt, steht ohnehin auf der oeffentlichen Serverliste: Name,\nBild, Mitgliederzahl. Die Ratenbremse kam 2026-09 dazu und ist der Punkt,\nder wirklich fehlte - ohne sie liess sich der ganze Bestand Kennung fuer\nKennung abklappern, und zwar so schnell, wie die Datenbank antwortet.","operationId":"get_server_details_api_v1_servers__server_id__get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerMetaResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers":{"get":{"tags":["🖥️ Servers"],"summary":"Get All Servers","description":"Gibt eine Liste aller Server zurück, auf denen der User Zugriff hat.\nZugriff hat er, wenn:\n1. Er als Admin in ServerMemberAccess steht.\n2. ODER er eine Rolle besitzt, die explizit Dashboard-Zugriff hat (ServerDashboardAccessRole).\n3. ODER er eine Rolle besitzt, die in ServerSetting als Team-Rolle definiert ist.","operationId":"get_all_servers_api_v1_servers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/api__schemas__server__ServerStats"},"type":"array","title":"Response Get All Servers Api V1 Servers Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/servers/{server_id}/channels":{"get":{"tags":["🖥️ Servers"],"summary":"Get Server Channels","description":"Gibt alle Kanäle UND Threads eines Servers zurück – aktive wie archivierte.\n\nArchivierte Forum-Posts sind bewusst enthalten: Discord archiviert Posts\nnach Inaktivität automatisch, und ohne sie fehlen ältere Posts in jedem\nDashboard-Picker (Giveaways, Automationen, ...).","operationId":"get_server_channels_api_v1_servers__server_id__channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Server Channels Api V1 Servers  Server Id  Channels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/roles":{"get":{"tags":["🖥️ Servers"],"summary":"Get Server Roles","description":"Gibt alle Rollen eines Servers zurück.\n\nVERWENDET DISCORD API statt Datenbank.\nRate Limited: 80 requests/minute\nCached: 30 seconds (Rollen ändern sich selten)","operationId":"get_server_roles_api_v1_servers__server_id__roles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Server Roles Api V1 Servers  Server Id  Roles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/emojis":{"get":{"tags":["🖥️ Servers"],"summary":"Get Server Emojis","description":"Gibt alle Emojis eines Servers zurück.\n\nEnthält sowohl animierte als auch statische Emojis mit vollständigen Details\nfür die Frontend-Darstellung.\n\nRate Limited: 80 requests/minute\nCached: 10 minutes (Emojis ändern sich selten)","operationId":"get_server_emojis_api_v1_servers__server_id__emojis_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Server Emojis Api V1 Servers  Server Id  Emojis Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/emojis/{emoji_id}":{"get":{"tags":["🖥️ Servers"],"summary":"Get Server Emoji Detail","description":"Gibt detaillierte Informationen zu einem spezifischen Emoji zurück.\n\nNützlich für Detailansichten oder wenn nur ein einzelnes Emoji\nbenötigt wird.\n\nRate Limited: 80 requests/minute\nCached: 10 minutes","operationId":"get_server_emoji_detail_api_v1_servers__server_id__emojis__emoji_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"emoji_id","in":"path","required":true,"schema":{"type":"string","description":"Emoji ID","title":"Emoji Id"},"description":"Emoji ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Server Emoji Detail Api V1 Servers  Server Id  Emojis  Emoji Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/dashboard-roles":{"get":{"tags":["🖥️ Servers"],"summary":"Get Dashboard Access Roles","description":"Gibt alle Rollen zurück, die Dashboard-Zugriff haben.\nJeder mit Dashboard-Zugriff kann diese Liste sehen.","operationId":"get_dashboard_access_roles_api_v1_servers__server_id__dashboard_roles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Dashboard Access Roles Api V1 Servers  Server Id  Dashboard Roles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🖥️ Servers"],"summary":"Add Dashboard Access Role","description":"🔒 NUR OWNER: Fügt eine Rolle hinzu, die Dashboard-Zugriff erhält.","operationId":"add_dashboard_access_role_api_v1_servers__server_id__dashboard_roles_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddDashboardRoleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Dashboard Access Role Api V1 Servers  Server Id  Dashboard Roles Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/dashboard-roles/{role_id}":{"delete":{"tags":["🖥️ Servers"],"summary":"Remove Dashboard Access Role","description":"🔒 NUR OWNER: Entfernt Dashboard-Zugriff von einer Rolle.","operationId":"remove_dashboard_access_role_api_v1_servers__server_id__dashboard_roles__role_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"role_id","in":"path","required":true,"schema":{"type":"string","description":"Role ID to remove","title":"Role Id"},"description":"Role ID to remove"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Dashboard Access Role Api V1 Servers  Server Id  Dashboard Roles  Role Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/access-info":{"get":{"tags":["🖥️ Servers"],"summary":"Get My Access Info","description":"Gibt zurück welche Art von Zugriff der User hat.\nVerwendet validate_team_access, damit auch Teammitglieder (ohne Admin) diesen Endpoint aufrufen dürfen.\nPrüft zusätzlich Stats-Zugriff über validate_stats_access.","operationId":"get_my_access_info_api_v1_servers__server_id__access_info_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get My Access Info Api V1 Servers  Server Id  Access Info Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/public/partners":{"get":{"tags":["🖥️ Servers"],"summary":"Get Public Partner Servers","description":"Öffentlicher Endpunkt für die Landingpage.\nGibt Details zu spezifischen Servern zurück.\nAufrufbar via: /api/servers/public/partners?ids=123,456","operationId":"get_public_partner_servers_api_v1_servers_public_partners_get","parameters":[{"name":"ids","in":"query","required":true,"schema":{"type":"string","description":"Comma separated list of Server IDs (e.g. '123456,789012')","title":"Ids"},"description":"Comma separated list of Server IDs (e.g. '123456,789012')"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicServerDetails"},"title":"Response Get Public Partner Servers Api V1 Servers Public Partners Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/check":{"get":{"tags":["🖥️ Servers"],"summary":"Check Bot Team Permissions","description":"Prüft, ob der aktuelle User Mitglied des Bot-Teams ist.\nGibt die Rolle (admin, moderator, support) zurück.","operationId":"check_bot_team_permissions_api_v1_bot_team_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Check Bot Team Permissions Api V1 Bot Team Check Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/bot-team/search/servers":{"get":{"tags":["🖥️ Servers"],"summary":"Search Servers Admin","description":"ADMIN: Sucht Server anhand von Name, Server-ID oder Owner-ID.\nExakte ID-Matches werden priorisiert.","operationId":"search_servers_admin_api_v1_bot_team_search_servers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Servername, Server-ID oder Owner-ID (min 2 Zeichen)","title":"Query"},"description":"Servername, Server-ID oder Owner-ID (min 2 Zeichen)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"description":"Maximale Anzahl Ergebnisse","default":20,"title":"Limit"},"description":"Maximale Anzahl Ergebnisse"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Servers Admin Api V1 Bot Team Search Servers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/search/users":{"get":{"tags":["🖥️ Servers"],"summary":"Search Users Admin","description":"ADMIN: Sucht User anhand von Username oder ID.\nExakte ID-Matches werden priorisiert.","operationId":"search_users_admin_api_v1_bot_team_search_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Username oder ID (min 2 Zeichen)","title":"Query"},"description":"Username oder ID (min 2 Zeichen)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"description":"Maximale Anzahl Ergebnisse","default":20,"title":"Limit"},"description":"Maximale Anzahl Ergebnisse"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Users Admin Api V1 Bot Team Search Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/servers/banned":{"get":{"tags":["🖥️ Servers"],"summary":"Get Banned Servers Admin","description":"ADMIN: Listet gesperrte (gebannte) Server auf.\nErmöglicht Suche innerhalb der gebannten Server.","operationId":"get_banned_servers_admin_api_v1_bot_team_servers_banned_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"query","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"description":"Optionaler Suchbegriff in der Bann-Liste","title":"Query"},"description":"Optionaler Suchbegriff in der Bann-Liste"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"description":"Maximale Anzahl","default":30,"title":"Limit"},"description":"Maximale Anzahl"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Banned Servers Admin Api V1 Bot Team Servers Banned Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/users/banned":{"get":{"tags":["🖥️ Servers"],"summary":"Get Banned Users Admin","description":"ADMIN: Listet gesperrte (gebannte) User auf.\nErmöglicht Suche innerhalb der gebannten User.","operationId":"get_banned_users_admin_api_v1_bot_team_users_banned_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"query","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2},{"type":"null"}],"description":"Optionaler Suchbegriff in der Bann-Liste","title":"Query"},"description":"Optionaler Suchbegriff in der Bann-Liste"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"description":"Maximale Anzahl","default":30,"title":"Limit"},"description":"Maximale Anzahl"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Banned Users Admin Api V1 Bot Team Users Banned Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/servers/{server_id}/mod-info":{"get":{"tags":["🖥️ Servers"],"summary":"Get Server Mod Info","description":"ADMIN: Liefert detaillierte Informationen über einen Server für Moderationszwecke.","operationId":"get_server_mod_info_api_v1_bot_team_servers__server_id__mod_info_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Server Mod Info Api V1 Bot Team Servers  Server Id  Mod Info Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/users/{user_id}/mod-info":{"get":{"tags":["🖥️ Servers"],"summary":"Get User Mod Info","description":"ADMIN: Liefert detaillierte Informationen über einen User für Moderationszwecke.\nEnthält eine vollständige Liste der gemeinsamen Server mit Icon, Invite-Link und Member-Count.","operationId":"get_user_mod_info_api_v1_bot_team_users__user_id__mod_info_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get User Mod Info Api V1 Bot Team Users  User Id  Mod Info Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/servers/{server_id}/ban":{"post":{"tags":["🖥️ Servers"],"summary":"Ban Server Admin","description":"ADMIN/OWNER: Sperrt einen Server für die Bot-Nutzung.\nNur Mitglieder mit der Rolle 'admin' oder 'owner' können Server bannen.","operationId":"ban_server_admin_api_v1_bot_team_servers__server_id__ban_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ban Server Admin Api V1 Bot Team Servers  Server Id  Ban Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/users/{user_id}/ban":{"post":{"tags":["🖥️ Servers"],"summary":"Ban User Admin","description":"ADMIN/OWNER: Sperrt einen User global für die Bot-Nutzung.\nNur Mitglieder mit der Rolle 'admin' oder 'owner' können User bannen.","operationId":"ban_user_admin_api_v1_bot_team_users__user_id__ban_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ban User Admin Api V1 Bot Team Users  User Id  Ban Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/servers/{server_id}/unban":{"post":{"tags":["🖥️ Servers"],"summary":"Unban Server Admin","description":"ADMIN/OWNER: Entsperrt einen Server.\nNur Mitglieder mit der Rolle 'admin' oder 'owner' können Server entbannen.","operationId":"unban_server_admin_api_v1_bot_team_servers__server_id__unban_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Unban Server Admin Api V1 Bot Team Servers  Server Id  Unban Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/users/{user_id}/unban":{"post":{"tags":["🖥️ Servers"],"summary":"Unban User Admin","description":"ADMIN/OWNER: Entsperrt einen User global.\nNur Mitglieder mit der Rolle 'admin' oder 'owner' können User entbannen.","operationId":"unban_user_admin_api_v1_bot_team_users__user_id__unban_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Unban User Admin Api V1 Bot Team Users  User Id  Unban Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/reviews/recent":{"get":{"tags":["🖥️ Servers"],"summary":"Get Recent Reviews","description":"Gibt die neuesten Reviews netzwerkweit zurück für das Bot-Team.","operationId":"get_recent_reviews_api_v1_bot_team_reviews_recent_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/bot-team/modlog/recent":{"get":{"tags":["🖥️ Servers"],"summary":"Get Recent Modlog","description":"Gibt die neuesten Moderationsaktionen global zurück.","operationId":"get_recent_modlog_api_v1_bot_team_modlog_recent_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/bot-team/stats/votes":{"get":{"tags":["🖥️ Servers"],"summary":"Get Bot Votes Stats","description":"Detaillierte Vote-Statistiken - Sichtbar für das gesamte Bot-Team.","operationId":"get_bot_votes_stats_api_v1_bot_team_stats_votes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/bot-team/stats/global":{"get":{"tags":["🖥️ Servers"],"summary":"Get Global Bot Stats","description":"Globale Bot-Statistiken - nur für Admin und Owner sichtbar.\n\nVERALTET. Neue Ansichten nehmen die vier Endpunkte in\n`api/routers/bot_team_stats.py`; dieser hier holt alles auf einmal und\nist damit so langsam wie sein langsamstes Teilstueck.\n\nEr bleibt, weil `components/TeamDashboard.jsx` ihn heute aufruft und ein\nstiller Formwechsel eine Seite zerlegt, die niemand ansieht, bevor sie\nkaputt ist. Gerechnet wird nichts mehr hier: die Antwort entsteht aus\ndenselben Bausteinen wie die neuen Endpunkte, damit die alte und die neue\nZahl gar nicht auseinanderlaufen KOENNEN.\n\n─── Was sich gegenueber der alten Antwort aendert ─────────────────────\n\nDie FORM ist dieselbe - jeder Schluessel, jedes Feld. Drei Dinge im\nInhalt sind anders, und alle drei sind gewollt:\n\n1. Die Zeitreihen haben jetzt LUECKENLOSE Faecher. Ein Tag ohne einen\n   einzigen neuen Server hatte vorher gar keinen Punkt; jetzt hat er\n   einen mit 0. Fuer ein Balkendiagramm ist das der Unterschied zwischen\n   einer ehrlichen und einer gestauchten Zeitachse.\n2. `cumulative_servers` und `cumulative_users` kommen im Monatsraster\n   (120 Faecher) statt als Stichprobe aus Tagespunkten. `date` traegt\n   dort jetzt \"2026-09\" statt \"2026-09-14\" - dieselbe Kurve, aber die\n   Punkte liegen auf Monatsenden statt auf willkuerlichen Tagen.\n3. `active_trend` zaehlt Wochen ab SONNTAG (`%U`, wie jede andere\n   Wochenreihe im Projekt) statt ab Montag (`WEEKDAY()`), und `date`\n   traegt \"2026-W36\" statt eines Datums.\n\n4. `top_commands` zaehlt die letzten 30 TAGE statt der ganzen Geschichte\n   des Bots, und traegt neben `count` ein Feld `fehler`. Beides ist\n   Absicht: eine Rangliste ueber alles ist ein Archiv, in dem ein Befehl\n   von vor zwei Jahren ueber einem steht, den heute alle benutzen - und\n   die alte Zaehlung warf die Fehlschlaege weg, obwohl ein Befehl, der zu\n   einem Drittel scheitert, kaputt ist und nicht beliebt.\n\nEine Sache ist KEINE Aenderung, sondern eine Voraussetzung: die\nZeitreihen lesen `plattform_tageswerte` und `befehl_tageswerte` aus\nMigration 115. Ist das SQL nicht gelaufen, bleiben die Diagramme leer -\ndie Kennzahlen, Verteilungen und Server-Ranglisten stehen weiter, und die\nEinzelendpunkte sagen es in `quelle_fehlt` bzw. `quellen_fehlen` an.","operationId":"get_global_bot_stats_api_v1_bot_team_stats_global_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/bot-team/users/{user_id}/full-info":{"get":{"tags":["🖥️ Servers"],"summary":"Get User Full Info","description":"Erweiterte User-Informationen für das Team-Dashboard.","operationId":"get_user_full_info_api_v1_bot_team_users__user_id__full_info_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/users/{user_id}/billing":{"get":{"tags":["🖥️ Servers"],"summary":"Get User Billing","description":"Live Paddle-Abrechnungsdaten (best-effort) für die Abos eines Users.\nTransaktionen sind per Price-ID dem jeweiligen Produkt zugeordnet.","operationId":"get_user_billing_api_v1_bot_team_users__user_id__billing_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/users/{user_id}/billing/history":{"get":{"tags":["🖥️ Servers"],"summary":"Get User Billing History","description":"Vollständige Abrechnungs- & Abo-Historie eines Users (Owner/Admin).\nEnthält alle Transaktionen (nach Produkt kategorisiert), Refunds/Adjustments,\nSummen pro Kategorie und eine zusammengeführte Timeline.","operationId":"get_user_billing_history_api_v1_bot_team_users__user_id__billing_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/servers/{server_id}/full-info":{"get":{"tags":["🖥️ Servers"],"summary":"Get Server Full Info","description":"Erweiterte Server-Informationen für das Team-Dashboard.","operationId":"get_server_full_info_api_v1_bot_team_servers__server_id__full_info_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/notes/user/{user_id}":{"post":{"tags":["🖥️ Servers"],"summary":"Create User Note","description":"Notiz zu einem User erstellen.","operationId":"create_user_note_api_v1_bot_team_notes_user__user_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/notes/server/{server_id}":{"post":{"tags":["🖥️ Servers"],"summary":"Create Server Note","description":"Notiz zu einem Server erstellen.","operationId":"create_server_note_api_v1_bot_team_notes_server__server_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/notes/user/{note_id}":{"delete":{"tags":["🖥️ Servers"],"summary":"Delete User Note","description":"User-Notiz löschen (nur eigene oder als Admin/Owner).","operationId":"delete_user_note_api_v1_bot_team_notes_user__note_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/notes/server/{note_id}":{"delete":{"tags":["🖥️ Servers"],"summary":"Delete Server Note","description":"Server-Notiz löschen (nur eigene oder als Admin/Owner).","operationId":"delete_server_note_api_v1_bot_team_notes_server__note_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/users/{user_id}/grant-subscription":{"post":{"tags":["🖥️ Servers"],"summary":"Grant User Subscription","description":"Subscription an User vergeben - Owner oder Admin.","operationId":"grant_user_subscription_api_v1_bot_team_users__user_id__grant_subscription_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantSubscriptionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/users/{user_id}/revoke-subscription":{"post":{"tags":["🖥️ Servers"],"summary":"Revoke User Subscription","description":"Subscription von User entziehen - Owner oder Admin.","operationId":"revoke_user_subscription_api_v1_bot_team_users__user_id__revoke_subscription_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/users/{user_id}/subscription/set-trial":{"post":{"tags":["🖥️ Servers"],"summary":"Set User Trial","description":"Setzt has_used_trial: False = Trial freischalten (Reset), True = Trial blocken.","operationId":"set_user_trial_api_v1_bot_team_users__user_id__subscription_set_trial_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetTrialRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/users/{user_id}/subscription/set-active-server":{"post":{"tags":["🖥️ Servers"],"summary":"Set Active Subscription Server","description":"Setzt/ändert den aktiven Premium- bzw. AI-Server FÜR den User.","operationId":"set_active_subscription_server_api_v1_bot_team_users__user_id__subscription_set_active_server_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetActiveServerRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/users/{user_id}/ai-config":{"post":{"tags":["🖥️ Servers"],"summary":"Update User Ai Config","description":"Aktualisiert das AI-Zeichen-/Anfragen-Limit des Users (UserCustomGeminiConfig).","operationId":"update_user_ai_config_api_v1_bot_team_users__user_id__ai_config_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/users/{user_id}/profile":{"patch":{"tags":["🖥️ Servers"],"summary":"Update User Profile","description":"Bearbeitet User-Stammdaten (Sprache, Reward-Preference).","operationId":"update_user_profile_api_v1_bot_team_users__user_id__profile_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/users/{user_id}/birthday":{"patch":{"tags":["🖥️ Servers"],"summary":"Update User Birthday","description":"Korrigiert die Geburtstags-Einträge des Users (über alle Server).","operationId":"update_user_birthday_api_v1_bot_team_users__user_id__birthday_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BirthdayUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🖥️ Servers"],"summary":"Delete User Birthday","description":"Löscht alle Geburtstags-Einträge des Users.","operationId":"delete_user_birthday_api_v1_bot_team_users__user_id__birthday_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/referrals/{referral_id}/validate":{"post":{"tags":["🖥️ Servers"],"summary":"Validate Referral Admin","description":"Validiert ein Referral manuell.","operationId":"validate_referral_admin_api_v1_bot_team_referrals__referral_id__validate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"referral_id","in":"path","required":true,"schema":{"type":"integer","title":"Referral Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/referrals/{referral_id}/reject":{"post":{"tags":["🖥️ Servers"],"summary":"Reject Referral Admin","description":"Entwertet/widerruft ein Referral.","operationId":"reject_referral_admin_api_v1_bot_team_referrals__referral_id__reject_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"referral_id","in":"path","required":true,"schema":{"type":"integer","title":"Referral Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralReasonRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/referrals/{referral_id}/grant-reward":{"post":{"tags":["🖥️ Servers"],"summary":"Grant Referral Reward Admin","description":"Vergibt manuell eine Referral-Belohnung an den Referrer dieses Referrals.","operationId":"grant_referral_reward_admin_api_v1_bot_team_referrals__referral_id__grant_reward_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"referral_id","in":"path","required":true,"schema":{"type":"integer","title":"Referral Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantReferralRewardRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/users/{user_id}/reset-referral-abuse":{"post":{"tags":["🖥️ Servers"],"summary":"Reset Referral Abuse Admin","description":"Löscht die Referral-Abuse-Logs des Users (Zähler zurücksetzen).","operationId":"reset_referral_abuse_admin_api_v1_bot_team_users__user_id__reset_referral_abuse_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/servers/{server_id}/grant-subscription":{"post":{"tags":["🖥️ Servers"],"summary":"Grant Server Subscription","description":"Subscription an Server vergeben - Owner oder Admin.","operationId":"grant_server_subscription_api_v1_bot_team_servers__server_id__grant_subscription_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantSubscriptionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/servers/{server_id}/revoke-subscription":{"post":{"tags":["🖥️ Servers"],"summary":"Revoke Server Subscription","description":"Subscription von Server entziehen - Owner oder Admin.","operationId":"revoke_server_subscription_api_v1_bot_team_servers__server_id__revoke_subscription_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats-access-roles":{"get":{"tags":["🖥️ Servers"],"summary":"Get Stats Access Roles","description":"Listet alle Stats-Access-Rollen eines Servers auf.\nNur Server Owner kann diese sehen.","operationId":"get_stats_access_roles_api_v1_servers__server_id__stats_access_roles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Server ID","title":"Server Id"},"description":"Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StatsAccessRoleResponse"},"title":"Response Get Stats Access Roles Api V1 Servers  Server Id  Stats Access Roles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🖥️ Servers"],"summary":"Add Stats Access Role","description":"Fügt eine neue Stats-Access-Rolle hinzu.\nNur Server Owner darf dies tun.","operationId":"add_stats_access_role_api_v1_servers__server_id__stats_access_roles_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Server ID","title":"Server Id"},"description":"Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddStatsRoleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsAccessRoleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats-access-roles/{role_id}":{"delete":{"tags":["🖥️ Servers"],"summary":"Remove Stats Access Role","description":"Entfernt eine Stats-Access-Rolle (deaktiviert sie).\nNur Server Owner darf dies tun.","operationId":"remove_stats_access_role_api_v1_servers__server_id__stats_access_roles__role_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Server ID","title":"Server Id"},"description":"Server ID"},{"name":"role_id","in":"path","required":true,"schema":{"type":"string","description":"Role ID to remove","title":"Role Id"},"description":"Role ID to remove"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/discovery":{"post":{"tags":["🖥️ Servers"],"summary":"Set Discovery Source","description":"Speichert, wie der Server den Bot gefunden hat.\nKann pro Server nur einmal gesetzt werden.\n\nZwei Wege fuehren hierher, und sie sind unterschiedlich viel wert:\n\n  GEMESSEN - der Nutzer kam ueber einen Einladungslink mit src-Kennung\n  (`/invite/src_topgg-moderation`). Dann steht `detail` drin und die\n  Angabe ist eine Beobachtung.\n\n  GEFRAGT - die Onboarding-Umfrage am Ende des Flows. Dann ist `detail`\n  leer und die Angabe ist eine Erinnerung.\n\nWer zuerst kommt, gewinnt - und das ist der gemessene Weg, weil er direkt\nbei der Einladung laeuft und die Umfrage erst Minuten spaeter kommt.\nGestellt wird sie danach ohnehin nicht mehr: das Overlay prueft\n`discovery_source` aus dem Bootstrap UND eine Merkzelle, die der gemessene\nWeg setzt - beide Abrufe starten gleichzeitig, und ohne die Zelle gewinnt\ngelegentlich der groessere. Wuerde die Frage doch gestellt, ueberschriebe\nihre Antwort nichts.","operationId":"set_discovery_source_api_v1_servers__server_id__discovery_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Discovery Source Api V1 Servers  Server Id  Discovery Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/users":{"get":{"tags":["👤 Users"],"summary":"Get Server Users","description":"Gibt eine paginierte Liste aller User eines Servers zurück.\n\nHYBRID APPROACH:\n- Holt Member-Liste von Discord API (gedeckelt auf MAX_MEMBER_FETCH)\n- Holt Stats (messages, voice, level) aus Datenbank, in Stapeln\n\nDie Deckelung steht in `pagination.truncated`. Ist sie True, ist\n`total_items` eine UNTERGRENZE und nicht die Mitgliederzahl des Servers -\nein Aufrufer, der daraus \"so viele Mitglieder hat der Server\" macht, irrt\nsich auf grossen Servern.","operationId":"get_server_users_api_v1_servers__server_id__users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Seite (startet bei 1)","default":1,"title":"Page"},"description":"Seite (startet bei 1)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Einträge pro Seite","default":50,"title":"Limit"},"description":"Einträge pro Seite"},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","description":"Sortierung: messages, voice, level, joined","default":"messages","title":"Sort By"},"description":"Sortierung: messages, voice, level, joined"},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"Reihenfolge: asc oder desc","default":"desc","title":"Order"},"description":"Reihenfolge: asc oder desc"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Suche nach Username","title":"Search"},"description":"Suche nach Username"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/users/{user_id}":{"get":{"tags":["👤 Users"],"summary":"Get User Details","description":"Gibt detaillierte Statistiken für einen spezifischen User zurück.\nOPTIMIERT: Batch-loading von Channels.","operationId":"get_user_details_api_v1_servers__server_id__users__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/leaderboard":{"get":{"tags":["👤 Users"],"summary":"Get Leaderboard","description":"Liefert ein Leaderboard pro Kategorie mit stabiler Sortierung.\nBEREITS OPTIMIERT: Nutzt DB-Aggregationen.","operationId":"get_leaderboard_api_v1_servers__server_id__leaderboard_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"category","in":"query","required":false,"schema":{"enum":["messages","voice","level"],"type":"string","description":"Kategorie: messages, voice, level","default":"messages","title":"Category"},"description":"Kategorie: messages, voice, level"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Anzahl Einträge","default":10,"title":"Limit"},"description":"Anzahl Einträge"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaderboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/messages":{"get":{"tags":["📊 Analytics"],"summary":"Get Message Analytics","operationId":"get_message_analytics_api_v1_servers__server_id__analytics_messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["hourly","two_days","daily","weekly","monthly","yearly","all"],"type":"string","description":"Timeframe","default":"daily","title":"Timeframe"},"description":"Timeframe"},{"name":"group_by","in":"query","required":false,"schema":{"enum":["hour","day","week","month","year"],"type":"string","description":"Group by","default":"day","title":"Group By"},"description":"Group by"},{"name":"channel_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by channel","title":"Channel Id"},"description":"Filter by channel"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeSeriesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/voice":{"get":{"tags":["📊 Analytics"],"summary":"Get Voice Analytics","operationId":"get_voice_analytics_api_v1_servers__server_id__analytics_voice_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["hourly","two_days","daily","weekly","monthly","yearly","all"],"type":"string","description":"Timeframe","default":"daily","title":"Timeframe"},"description":"Timeframe"},{"name":"group_by","in":"query","required":false,"schema":{"enum":["hour","day","week","month","year"],"type":"string","description":"Group by","default":"day","title":"Group By"},"description":"Group by"},{"name":"metric","in":"query","required":false,"schema":{"enum":["minutes","sessions","unique_users"],"type":"string","description":"Metric","default":"minutes","title":"Metric"},"description":"Metric"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeSeriesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/members":{"get":{"tags":["📊 Analytics"],"summary":"Get Member Growth","operationId":"get_member_growth_api_v1_servers__server_id__analytics_members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["hourly","two_days","daily","weekly","monthly","yearly","all"],"type":"string","description":"Timeframe","default":"monthly","title":"Timeframe"},"description":"Timeframe"},{"name":"group_by","in":"query","required":false,"schema":{"enum":["hour","day","week","month","year"],"type":"string","description":"Group by","default":"day","title":"Group By"},"description":"Group by"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberGrowthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/heatmap":{"get":{"tags":["📊 Analytics"],"summary":"Get Activity Heatmap","operationId":"get_activity_heatmap_api_v1_servers__server_id__analytics_heatmap_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"metric","in":"query","required":false,"schema":{"enum":["messages","voice"],"type":"string","description":"Metric","default":"messages","title":"Metric"},"description":"Metric"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":7,"description":"Number of days (7-90)","default":30,"title":"Days"},"description":"Number of days (7-90)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityHeatmapResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/channels":{"get":{"tags":["📊 Analytics"],"summary":"Get Channel Activity","operationId":"get_channel_activity_api_v1_servers__server_id__analytics_channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["daily","weekly","monthly","all"],"type":"string","description":"Timeframe","default":"monthly","title":"Timeframe"},"description":"Timeframe"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Number of top channels","default":10,"title":"Limit"},"description":"Number of top channels"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelActivityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/overview":{"get":{"tags":["📊 Analytics"],"summary":"Get Server Overview","operationId":"get_server_overview_api_v1_servers__server_id__analytics_overview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerOverviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/online-activity":{"get":{"tags":["📊 Analytics"],"summary":"Get Online Activity","operationId":"get_online_activity_api_v1_servers__server_id__analytics_online_activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["hourly","two_days","daily","weekly","monthly","yearly","all"],"type":"string","description":"Timeframe","default":"weekly","title":"Timeframe"},"description":"Timeframe"},{"name":"group_by","in":"query","required":false,"schema":{"enum":["hour","day","week","month","year"],"type":"string","description":"Group by","default":"hour","title":"Group By"},"description":"Group by"},{"name":"metric","in":"query","required":false,"schema":{"enum":["online","idle","dnd","offline"],"type":"string","description":"Status metric","default":"online","title":"Metric"},"description":"Status metric"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeSeriesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/moderation":{"get":{"tags":["📊 Analytics"],"summary":"Get Moderation Stats","operationId":"get_moderation_stats_api_v1_servers__server_id__analytics_moderation_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["hourly","two_days","daily","weekly","monthly","yearly","all"],"type":"string","description":"Timeframe","default":"monthly","title":"Timeframe"},"description":"Timeframe"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/user-activities":{"get":{"tags":["📊 Analytics"],"summary":"Get User Activity Stats","operationId":"get_user_activity_stats_api_v1_servers__server_id__analytics_user_activities_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["daily","weekly","monthly"],"type":"string","description":"Timeframe","default":"weekly","title":"Timeframe"},"description":"Timeframe"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/economy":{"get":{"tags":["📊 Analytics"],"summary":"Get Economy Stats","operationId":"get_economy_stats_api_v1_servers__server_id__analytics_economy_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/tickets":{"get":{"tags":["📊 Analytics"],"summary":"Get Ticket Stats","operationId":"get_ticket_stats_api_v1_servers__server_id__analytics_tickets_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["hourly","two_days","daily","weekly","monthly","yearly","all"],"type":"string","description":"Timeframe","default":"monthly","title":"Timeframe"},"description":"Timeframe"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/reviews":{"get":{"tags":["📊 Analytics"],"summary":"Get Review Stats","operationId":"get_review_stats_api_v1_servers__server_id__analytics_reviews_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["hourly","two_days","daily","weekly","monthly","yearly","all"],"type":"string","description":"Timeframe","default":"monthly","title":"Timeframe"},"description":"Timeframe"},{"name":"include_texts","in":"query","required":false,"schema":{"type":"boolean","description":"Include review texts?","default":false,"title":"Include Texts"},"description":"Include review texts?"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Max number of texts","default":10,"title":"Limit"},"description":"Max number of texts"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/invites":{"get":{"tags":["📊 Analytics"],"summary":"Get Invite Stats","operationId":"get_invite_stats_api_v1_servers__server_id__analytics_invites_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["hourly","two_days","daily","weekly","monthly","yearly","all"],"type":"string","description":"Timeframe","default":"monthly","title":"Timeframe"},"description":"Timeframe"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/reactions":{"get":{"tags":["📊 Analytics"],"summary":"Get Reaction Stats","operationId":"get_reaction_stats_api_v1_servers__server_id__analytics_reactions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["daily","weekly","monthly"],"type":"string","description":"Timeframe","default":"monthly","title":"Timeframe"},"description":"Timeframe"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Top X emojis","default":15,"title":"Limit"},"description":"Top X emojis"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/commands":{"get":{"tags":["📊 Analytics"],"summary":"Get Command Stats","operationId":"get_command_stats_api_v1_servers__server_id__analytics_commands_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["daily","weekly","monthly"],"type":"string","description":"Timeframe","default":"monthly","title":"Timeframe"},"description":"Timeframe"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/starboard":{"get":{"tags":["📊 Analytics"],"summary":"Get Starboard Stats","operationId":"get_starboard_stats_api_v1_servers__server_id__analytics_starboard_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["daily","weekly","monthly","all"],"type":"string","description":"Timeframe","default":"monthly","title":"Timeframe"},"description":"Timeframe"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/reviews/latest":{"get":{"tags":["📊 Analytics"],"summary":"Get Latest Reviews","operationId":"get_latest_reviews_api_v1_servers__server_id__analytics_reviews_latest_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of reviews","default":20,"title":"Limit"},"description":"Number of reviews"},{"name":"rating_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Filter by rating","title":"Rating Filter"},"description":"Filter by rating"},{"name":"review_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["purchase","general"],"type":"string"},{"type":"null"}],"description":"Filter by type","title":"Review Type"},"description":"Filter by type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stats/global":{"get":{"tags":["📊 Analytics"],"summary":"Get Global Stats","description":"Öffentlicher Endpoint für globale Bot-Statistiken.\nOPTIMIERUNG: Parallele Count-Queries\n\nDer Endpunkt hatte WEDER Rate-Limit NOCH Cache und ist ohne Anmeldung\nerreichbar. Jeder Aufruf loeste drei COUNT(*) aus, darunter eines ueber\n`users` mit 1,03 Mio. Zeilen - fuer InnoDB ein voller Indexdurchlauf.\nWer die Adresse kennt, konnte damit beliebig Last erzeugen.\n\nEine halbe Stunde alt sind diese drei Uebersichtszahlen unbedenklich:\nsie stehen auf der oeffentlichen Startseite und bewegen sich in dieser\nZeit im Promillebereich (632 neue Server in sieben Tagen). Das\nRate-Limit ist bewusst hoch gewaehlt (dieselbe Groessenordnung wie beim\nNachbarn /stats/active-servers mit 200/minute) - es soll den Missbrauch\nabschneiden, nicht die Startseite.","operationId":"get_global_stats_api_v1_stats_global_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/stats/network":{"get":{"tags":["📊 Analytics"],"summary":"Get Network Status","description":"Öffentlicher Endpoint für die Status-Seite der Website.\n\nLiefert in einem Aufruf:\n  • global   – globale Bot-Statistiken (Server, User, Members, Commands,\n               Nachrichten, Voice-Zeit, Votes, Reviews, Giveaways, Tickets,\n               Embeds, Bewerbungen, Blueprints, Geburtstage) samt der\n               Zeitfenster-Werte (24 h / 7 d) und der 30-Tage-Kurve\n  • network  – Live Cluster-/Shard-Status (vom Launcher-IPC, optional)\n  • services – Zustand der einzelnen Bausteine (Gateway, API, DB, Cache)\n               samt Latenzverlauf der letzten 24 Stunden\n  • uptime   – gemessene Verfügbarkeit (24 h / 7 d) aus der Zeitreihe\n  • traffic  – Befehle je Stunde gegen den Normalwert derselben Uhrzeit\n  • team     – offizielle Bot-Team-Mitglieder (Avatar, Rolle, User-ID)\n\nPerformance: der teure messages-Voll-Scan (Reaktionen) läuft NIE im\nRequest-Pfad (Stale-While-Revalidate, Hintergrund-Refresh). Alle übrigen\nWerte sind günstig und werden prozess-/userübergreifend (Redis) gecacht.","operationId":"get_network_status_api_v1_stats_network_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/public/servers/{server_id}/reviews":{"get":{"tags":["📊 Analytics"],"summary":"Get Public Server Reviews","description":"Öffentlicher Endpoint für Server-Reviews (kein Auth erforderlich).\nOPTIMIERT: values() statt all()","operationId":"get_public_server_reviews_api_v1_public_servers__server_id__reviews_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"description":"Number of reviews","default":3,"title":"Limit"},"description":"Number of reviews"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/voice-channels":{"get":{"tags":["📊 Analytics"],"summary":"Get Voice Channel Activity","operationId":"get_voice_channel_activity_api_v1_servers__server_id__analytics_voice_channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["daily","weekly","monthly","all"],"type":"string","description":"Timeframe","default":"monthly","title":"Timeframe"},"description":"Timeframe"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Number of top channels","default":10,"title":"Limit"},"description":"Number of top channels"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/analytics/voice-peak-times":{"get":{"tags":["📊 Analytics"],"summary":"Get Voice Peak Times","operationId":"get_voice_peak_times_api_v1_servers__server_id__analytics_voice_peak_times_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":7,"description":"Number of days","default":30,"title":"Days"},"description":"Number of days"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stats/active-servers":{"get":{"tags":["📊 Analytics"],"summary":"Get Active Servers","description":"Öffentlicher Endpoint für aktive Server (Landingpage-Carousel).\n\nOPTIMIERT (war der Flaschenhals): Früher wurde hier ein GROUP BY über die\nKOMPLETTE ServerMember-Tabelle (potenziell Millionen Zeilen) gemacht, nur\num die größten Server zu finden. Stattdessen lesen wir jetzt direkt aus dem\ndenormalisierten, INDIZIERTEN Feld `Server.member_count`. Das ist ein\neinfacher Index-Scan auf der kleinen `servers`-Tabelle -> nahezu instant.","operationId":"get_active_servers_api_v1_stats_active_servers_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Max number of servers","default":20,"title":"Limit"},"description":"Max number of servers"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"description":"Activity timeframe in days","default":7,"title":"Days"},"description":"Activity timeframe in days"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/invite":{"get":{"tags":["📊 Analytics"],"summary":"Get Public Invite","description":"Öffentlicher Endpoint: gibt den Invite-Link des Servers zurück.\nOPTIMIERT: Nur benötigte Felder laden!","operationId":"get_public_invite_api_v1_public_servers__server_id__invite_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/stats/kennzahlen":{"get":{"tags":["📊 Bot-Team-Statistik","📊 Bot-Team-Statistik"],"summary":"Kennzahlen","description":"Die Zahlen oben auf der Seite. Drei Abfragen, keine Gruppierung.\n\nDer Endpunkt, auf den die Ansicht zuerst wartet - und der einzige, ohne\nden sie nichts zeigen kann. Alles andere darf spaeter kommen oder ganz\nausfallen.","operationId":"kennzahlen_api_v1_bot_team_stats_kennzahlen_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Kennzahlen Api V1 Bot Team Stats Kennzahlen Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/bot-team/stats/verlauf":{"get":{"tags":["📊 Bot-Team-Statistik","📊 Bot-Team-Statistik"],"summary":"Verlauf","description":"Eine Zeitreihe, in einer Aufloesung - Stunde bis Jahr.\n\n─── Warum EINE Reihe je Anfrage ───────────────────────────────────────\n\nWeil die Seite acht Diagramme hat und sie damit acht Anfragen parallel\nstellt, die einzeln ankommen. Vorher steckten alle acht in einer Antwort:\ndie Seite sah nichts, bis das langsamste fertig war, und ein Ausfall\nkostete alle acht.\n\n─── `aufloesung=hour` faellt hier auf den Tag zurueck ─────────────────\n\nDie Plattformzahlen sind TAGESWERTE - eine Stunde gibt es dort nicht.\nAngefragt wird sie trotzdem nicht mit einem 400 beantwortet, sondern mit\nder Tagesreihe; welche Aufloesung wirklich geliefert wurde, steht in der\nAntwort. Die Reihe `abwanderung` liest `servers.joined_at` direkt und\nkann die Stunde deshalb wirklich.\n\nWarum kein 400: der Aufrufer ist das eigene Team-Dashboard mit einem\nRegler ueber alle fuenf Stufen. Ein Fehler tauschte dort eine Karte gegen\neine rote Flaeche, obwohl die Frage beantwortbar ist - nur eine Stufe\ngroeber.","operationId":"verlauf_api_v1_bot_team_stats_verlauf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"reihe","in":"query","required":false,"schema":{"type":"string","description":"server | nutzer | votes | premium | supreme | ai | referral | nachrichten | mitglieder_zu | mitglieder_ab | moderation | abwanderung","default":"server","title":"Reihe"},"description":"server | nutzer | votes | premium | supreme | ai | referral | nachrichten | mitglieder_zu | mitglieder_ab | moderation | abwanderung"},{"name":"aufloesung","in":"query","required":false,"schema":{"type":"string","description":"hour | day | week | month | year","default":"day","title":"Aufloesung"},"description":"hour | day | week | month | year"},{"name":"punkte","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":2,"description":"Wie viele Faecher zurueck, das laufende mitgezaehlt","default":30,"title":"Punkte"},"description":"Wie viele Faecher zurueck, das laufende mitgezaehlt"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Verlauf Api V1 Bot Team Stats Verlauf Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/stats/verlaeufe":{"get":{"tags":["📊 Bot-Team-Statistik","📊 Bot-Team-Statistik"],"summary":"Verlaeufe","description":"MEHRERE Zeitreihen in EINER Antwort.\n\n─── Warum es das neben `/verlauf` gibt ────────────────────────────────\n\n`/verlauf` liefert bewusst eine Reihe je Anfrage: acht Diagramme kommen\ndann einzeln an, und ein Ausfall kostet eine Karte statt der Seite. Das\nist richtig fuer acht GROSSE Diagramme.\n\nDie Uebersicht der Statistikseite zeigt aber ELF Kleinserien nebeneinander,\ndie zusammen EINE Karte sind - und elf gleichzeitige Anfragen sind dort\nnicht Ausfallsicherheit, sondern eine Warteschlange. Der Browser laesst je\nVerbindung nur eine Handvoll gleichzeitig zu; die Kennzahlen oben, auf die\njemand tatsaechlich wartet, standen dahinter und liefen in die Zeitgrenze.\nGenau so wurde aus der Kennzahlenkarte ein Feld voller Striche.\n\nDie Ausfallsicherheit bleibt trotzdem: jede Reihe wird EINZELN gelesen und\ntraegt ihr eigenes `quelle_fehlt`. Eine Reihe, deren Quelltabelle fehlt,\nkommt leer zurueck - die zehn daneben nicht.\n\nUnbekannte Namen werden UEBERSPRUNGEN und nicht mit einem 400 quittiert:\neine Oberflaeche, die eine Reihe kennt, die dieser Server noch nicht hat,\nsoll die zehn anderen trotzdem bekommen. Was uebersprungen wurde, steht in\n`unbekannt`.","operationId":"verlaeufe_api_v1_bot_team_stats_verlaeufe_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"reihen","in":"query","required":true,"schema":{"type":"string","description":"Kommaliste, z.B. server,nutzer,premium","title":"Reihen"},"description":"Kommaliste, z.B. server,nutzer,premium"},{"name":"aufloesung","in":"query","required":false,"schema":{"type":"string","description":"hour | day | week | month | year","default":"day","title":"Aufloesung"},"description":"hour | day | week | month | year"},{"name":"punkte","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":2,"default":30,"title":"Punkte"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Verlaeufe Api V1 Bot Team Stats Verlaeufe Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/stats/verteilungen":{"get":{"tags":["📊 Bot-Team-Statistik","📊 Bot-Team-Statistik"],"summary":"Verteilungen","description":"Sprachen, Servergroessen und Herkunft - eine Karte, ein Endpunkt.","operationId":"verteilungen_api_v1_bot_team_stats_verteilungen_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Verteilungen Api V1 Bot Team Stats Verteilungen Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/bot-team/stats/listen":{"get":{"tags":["📊 Bot-Team-Statistik","📊 Bot-Team-Statistik"],"summary":"Listen","description":"Ranglisten und die letzten Baenne.","operationId":"listen_api_v1_bot_team_stats_listen_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tage","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Zeitraum der Befehlsrangliste in Tagen","default":30,"title":"Tage"},"description":"Zeitraum der Befehlsrangliste in Tagen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Listen Api V1 Bot Team Stats Listen Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/stats/funktionen":{"get":{"tags":["📊 Bot-Team-Statistik","📊 Bot-Team-Statistik"],"summary":"Funktionen","description":"Was eingerichtet ist, und wer sich die Seite dazu angesehen hat.\n\nDie Einrichtungszahlen sind GESAMTSTAENDE ohne Zeitbezug - eine Funktion\nist eingerichtet oder nicht. Nur die Aufrufe daneben haengen an `tage`.\nDas steht in der Antwort und muss in der Oberflaeche dabeistehen, sonst\nliest jemand beide Zahlen als denselben Zeitraum.","operationId":"funktionen_api_v1_bot_team_stats_funktionen_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tage","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Zeitraum der Seitenaufrufe in Tagen","default":30,"title":"Tage"},"description":"Zeitraum der Seitenaufrufe in Tagen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Funktionen Api V1 Bot Team Stats Funktionen Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/dashboard":{"get":{"tags":["📦 Batch Operations"],"summary":"Get Dashboard Data","description":"BATCH-ENDPOINT: Alle wichtigen Dashboard-Daten in einem Request.\nOPTIMIERT: Parallele Queries, Batch-Loading und DB-Aggregationen.","operationId":"get_dashboard_data_api_v1_servers__server_id__dashboard_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/comparison/timeframe":{"get":{"tags":["🔄 Comparisons"],"summary":"Compare Timeframes","description":"Vergleicht eine Metrik zwischen zwei Zeiträumen.","operationId":"compare_timeframes_api_v1_servers__server_id__comparison_timeframe_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"metric","in":"query","required":true,"schema":{"enum":["messages","voice","members"],"type":"string","description":"Metrik","title":"Metric"},"description":"Metrik"},{"name":"current_period","in":"query","required":false,"schema":{"enum":["last_7_days","last_30_days","last_90_days"],"type":"string","description":"Aktueller Zeitraum","default":"last_7_days","title":"Current Period"},"description":"Aktueller Zeitraum"},{"name":"compare_period","in":"query","required":false,"schema":{"enum":["previous_period","same_period_last_month","same_period_last_year"],"type":"string","description":"Vergleichs-Zeitraum","default":"previous_period","title":"Compare Period"},"description":"Vergleichs-Zeitraum"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/comparison/servers":{"get":{"tags":["🔄 Comparisons"],"summary":"Compare Servers","description":"Vergleicht mehrere Server miteinander.\nKORRIGIERT: Permissions-Check und Sortierung.","operationId":"compare_servers_api_v1_comparison_servers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_ids","in":"query","required":true,"schema":{"type":"string","description":"Komma-separierte Server-IDs (max 5)","title":"Server Ids"},"description":"Komma-separierte Server-IDs (max 5)"},{"name":"metric","in":"query","required":false,"schema":{"enum":["messages","voice","members","channels"],"type":"string","description":"Metrik","default":"messages","title":"Metric"},"description":"Metrik"},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["last_7_days","last_30_days","all_time"],"type":"string","description":"Zeitraum","default":"last_30_days","title":"Timeframe"},"description":"Zeitraum"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/control-center":{"get":{"tags":["⚙️ Control Center"],"summary":"Get Control Center","description":"🎯 CONTROL CENTER (High Performance v3.0)\n\nOptimierungen:\n- Phase 1: ALLE DB-Counts + Snapshot in einem einzigen asyncio.gather (~20 parallele Queries)\n- Phase 2: Analytische Funktionen erhalten vorberechnete Counts → 0 eigene DB-Queries\n- ~19 redundante Queries eliminiert gegenüber v2.0\n- .only() für minimalen Speicherverbrauch\n- SMDC Pre-Aggregation für Message-Counts","operationId":"get_control_center_api_v1_servers__server_id__control_center_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ControlCenterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/control-center/health-history":{"get":{"tags":["⚙️ Control Center"],"summary":"Get Health History","description":"📈 30-Tage Server-Health-History für den Pulse-Chart.\n\nAblauf:\n1. Tabelle sicherstellen (einmalig pro Prozess, <1 ms danach)\n2. Bestehende Snapshots lesen (max. 90 Rows → ultra-schnell)\n3a. Keine Daten (erster Aufruf überhaupt) → synchron berechnen, dann lesen\n3b. Daten vorhanden → sofort zurückgeben + fire-and-forget Refresh\n    (Throttle: max 1 Refresh/Stunde/Server via _health_last_refresh)\n\nDas Frontend fetcht diesen Endpoint lazy → Haupt-Dashboard ist bereits sichtbar.","operationId":"get_health_history_api_v1_servers__server_id__control_center_health_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":7,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/control-center/alerts":{"get":{"tags":["⚙️ Control Center"],"summary":"Get Active Alerts","description":"🚨 Active Alerts","operationId":"get_active_alerts_api_v1_servers__server_id__control_center_alerts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AlertResponse"},"title":"Response Get Active Alerts Api V1 Servers  Server Id  Control Center Alerts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/control-center/alerts/{alert_id}/resolve":{"post":{"tags":["⚙️ Control Center"],"summary":"Resolve Alert","description":"✅ Mark an alert as resolved","operationId":"resolve_alert_api_v1_servers__server_id__control_center_alerts__alert_id__resolve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","description":"Alert ID","title":"Alert Id"},"description":"Alert ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/control-center/recommendations":{"get":{"tags":["⚙️ Control Center"],"summary":"Get Recommendations","description":"💡 Smart Recommendations - Actionable tips to configure and understand the bot","operationId":"get_recommendations_api_v1_servers__server_id__control_center_recommendations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/control-center/upcoming":{"get":{"tags":["⚙️ Control Center"],"summary":"Get Upcoming Agenda","description":"🗓️ Upcoming agenda — a forward-looking list of time-sensitive things\ncoming up on this server: the next giveaways ending, scheduled\nauto-messages, the next bump reminder and today's/upcoming birthdays.\n\nLightweight + lazy-loaded by the Manage dashboard (independent of the\nheavy /control-center payload). Returns structured data only — every\nuser-facing label and the relative time are localized on the frontend.","operationId":"get_upcoming_agenda_api_v1_servers__server_id__control_center_upcoming_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/control-center/live-stats":{"get":{"tags":["⚙️ Control Center"],"summary":"Get Live Stats","description":"📊 Live Statistics (Ultra-Lightweight for Polling)\nRaw SQL für minimale Latenz bei 60/min Polling.","operationId":"get_live_stats_api_v1_servers__server_id__control_center_live_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/control-center/feed-detail":{"get":{"tags":["⚙️ Control Center"],"summary":"Get Feed Detail","description":"📋 Feed Detail — Lazy-loaded detail info for a single feed item.\nCalled when a user clicks on a feed card in the dashboard.","operationId":"get_feed_detail_api_v1_servers__server_id__control_center_feed_detail_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"type","in":"query","required":true,"schema":{"type":"string","description":"Feed item type (e.g. moderation, warning, ticket, review, giveaway, giveaway_started)","title":"Type"},"description":"Feed item type (e.g. moderation, warning, ticket, review, giveaway, giveaway_started)"},{"name":"id","in":"query","required":true,"schema":{"type":"string","description":"Feed item ID","title":"Id"},"description":"Feed item ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/control-center/notifications":{"get":{"tags":["⚙️ Control Center"],"summary":"Get Notifications","description":"🔔 Setup & Configuration Notifications\n\nGibt kontextbezogene Hinweise zurück, die dem Server-Admin helfen,\nden Bot korrekt einzurichten – z.B. fehlende Berechtigungen,\nzu niedrige Bot-Rollen-Position oder vergessene Konfigurationsschritte.\nEs werden nur Benachrichtigungen zurückgegeben, die tatsächlich relevant sind.","operationId":"get_notifications_api_v1_servers__server_id__control_center_notifications_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/global-news":{"get":{"tags":["⚙️ Control Center"],"summary":"Get Global News","description":"📰 Globale News abrufen (paginiert, für alle Server-Dashboards).\nNormale User sehen nur veröffentlichte, nicht abgelaufene News.\nBot-Team Admins/Owners können (mit include_unpublished) auch Entwürfe sehen.\nPagination via limit/offset für das Infinite-Scroll im News-Tab.","operationId":"get_global_news_api_v1_global_news_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"include_unpublished","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Unpublished"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"News pro Seite (Infinite Scroll)","default":8,"title":"Limit"},"description":"News pro Seite (Infinite Scroll)"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Offset für die Pagination","default":0,"title":"Offset"},"description":"Offset für die Pagination"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerNewsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["⚙️ Control Center"],"summary":"Create Global News","description":"📰 Neue globale News erstellen (nur Bot-Team Admin/Owner).","operationId":"create_global_news_api_v1_global_news_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerNewsCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/global-news/{news_id}":{"put":{"tags":["⚙️ Control Center"],"summary":"Update Global News","description":"📰 Globale News bearbeiten (nur Bot-Team Admin/Owner).","operationId":"update_global_news_api_v1_global_news__news_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"news_id","in":"path","required":true,"schema":{"type":"integer","description":"News ID","title":"News Id"},"description":"News ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerNewsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["⚙️ Control Center"],"summary":"Delete Global News","description":"📰 Globale News löschen (nur Bot-Team Admin/Owner).","operationId":"delete_global_news_api_v1_global_news__news_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"news_id","in":"path","required":true,"schema":{"type":"integer","description":"News ID","title":"News Id"},"description":"News ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/global-news/channels":{"get":{"tags":["⚙️ Control Center"],"summary":"Get News Channels","description":"📰 Kanäle des News-Servers für den optionalen Discord-Crosspost-Picker.\nNur Bot-Team Admin/Owner. Liefert Text-/Ankündigungskanäle gruppiert nach Typ\n(kompatibel zum Channel-Picker im Frontend).","operationId":"get_news_channels_api_v1_global_news_channels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerNewsChannelsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/changelog":{"get":{"tags":["⚙️ Control Center"],"summary":"Get Changelog","description":"📝 Die letzten veroeffentlichten Changelog-Eintraege.\n\nFuer jeden angemeldeten Nutzer lesbar, wie die globalen News auch. Der\nInhalt ist ohnehin oeffentlich - er steht als Karte im Changelog-Kanal.\n\n`entries` ist die strukturierte Liste der Aenderungen\n([{kind, text, detail, area, refs}]) und bleibt es auch: die Oberflaeche\nsetzt die Art als Marke vor jede Zeile, und aus einem fertigen Absatz\nmuesste sie sie erst wieder herausloesen.","operationId":"get_changelog_api_v1_changelog_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":25,"minimum":1,"description":"Wie viele Eintraege","default":5,"title":"Limit"},"description":"Wie viele Eintraege"},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"enum":["bot","website","api","mixed"],"type":"string"},{"type":"null"}],"description":"Nur Aenderungen aus dieser Quelle; ohne Angabe alle","title":"Source"},"description":"Nur Aenderungen aus dieser Quelle; ohne Angabe alle"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/control-center/ai-report":{"get":{"tags":["⚙️ Control Center"],"summary":"Get Ai Health Report","description":"🤖 AI Health/Development Report — täglicher AI-generierter Bericht.\n\n- AI-Server: Generiert einmal pro Tag einen Report und cached ihn.\n- Nicht-AI-Server: Gibt is_ai=false zurück.","operationId":"get_ai_health_report_api_v1_servers__server_id__control_center_ai_report_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/control-center/impact":{"get":{"tags":["⚙️ Control Center"],"summary":"Get Impact Ledger","description":"Was der Bot in diesem Zeitraum erledigt hat, gezaehlt.","operationId":"get_impact_ledger_api_v1_servers__server_id__control_center_impact_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":14,"title":"Days"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-Zeitpunkt des letzten Besuchs","title":"Since"},"description":"ISO-Zeitpunkt des letzten Besuchs"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/control-center/people":{"get":{"tags":["⚙️ Control Center"],"summary":"Get People","description":"Traeger, Neuzugaenge und Verstummte des Servers.","operationId":"get_people_api_v1_servers__server_id__control_center_people_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":7,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PeopleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/control-center/journey-report":{"get":{"tags":["⚙️ Control Center"],"summary":"Get Journey Report","description":"Der sichtbare Rueckblick dieses Servers - hoechstens einer.\n\nHoechstens einer, weil zwei nebeneinander den Leser vor eine Entscheidung\nstellen, die er nicht treffen kann: er kennt die Rechnung hinter keinem\nvon beiden. Der Schreibweg setzt den vorigen deshalb auf\n`is_published = 0`, statt ihn zu loeschen - hier kommt also immer der\nneueste veroeffentlichte.","operationId":"get_journey_report_api_v1_servers__server_id__control_center_journey_report_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/control-center/journey-report/{report_id}/viewed":{"post":{"tags":["⚙️ Control Center"],"summary":"Mark Journey Report Viewed","description":"Zaehlt, dass der Bericht wirklich GELESEN wurde.\n\nBewusst ein eigener Weg und nicht ein Seiteneffekt des GET: die Karte\nrendert bei jedem Aufbau des Dashboards mit. Wer dort zaehlt, misst\nDashboard-Besuche und nennt sie Lesungen - und beantwortet damit genau die\nFrage nicht, wegen der der Zaehler existiert (ob der Aufwand je beim\nBetreiber ankommt).\n\nDer Aufrufer ist das Modal, also der Moment des Aufklappens.\n\nEin unbekannter oder fremder Bericht ist hier kein Fehler, sondern ein\nstilles `counted: false`: ein Zaehler darf keine Oberflaeche zum Absturz\nbringen, und die ID kommt ohnehin aus dem GET daneben.","operationId":"mark_journey_report_viewed_api_v1_servers__server_id__control_center_journey_report__report_id__viewed_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","description":"ID des Rueckblicks","title":"Report Id"},"description":"ID des Rueckblicks"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/branding/colors":{"get":{"tags":["🎨 Branding"],"summary":"Get Colors","description":"Returns the current design colors for a server. (Optimized)\nRate Limited: 80 requests/minute\nNO CACHING - Live data for dashboard","operationId":"get_colors_api_v1_servers__server_id__branding_colors_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🎨 Branding"],"summary":"Update Colors","description":"Updates the design colors for a server.","operationId":"update_colors_api_v1_servers__server_id__branding_colors_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColorUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎨 Branding"],"summary":"Reset Colors","description":"Resets the design colors to default values.","operationId":"reset_colors_api_v1_servers__server_id__branding_colors_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/branding/background":{"get":{"tags":["🎨 Branding"],"summary":"Get Background","description":"Returns information about the server background image. (Optimized)","operationId":"get_background_api_v1_servers__server_id__branding_background_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🎨 Branding"],"summary":"Upload Background","description":"Uploads a server background image.","operationId":"upload_background_api_v1_servers__server_id__branding_background_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_background_api_v1_servers__server_id__branding_background_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎨 Branding"],"summary":"Delete Background","description":"Removes the server background image.","operationId":"delete_background_api_v1_servers__server_id__branding_background_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/branding/background/image":{"get":{"tags":["🎨 Branding"],"summary":"Get Background Image","description":"Returns the server background image. (Optimized)","operationId":"get_background_image_api_v1_servers__server_id__branding_background_image_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/status":{"get":{"tags":["👋 Welcome"],"summary":"Get Welcome Status","description":"Returns the status of the welcome system.\nRate Limited: 80 requests/minute\nNO CACHING - Live data for dashboard","operationId":"get_welcome_status_api_v1_servers__server_id__welcome_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["👋 Welcome"],"summary":"Update Welcome Status","description":"Updates the status of the welcome system.\nRate Limited: 80 requests/minute","operationId":"update_welcome_status_api_v1_servers__server_id__welcome_status_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WelcomeStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/channels":{"get":{"tags":["👋 Welcome"],"summary":"Get Welcome Channels","description":"Returns the configured channels.\nRate Limited: 80 requests/minute\nNO CACHING - Live data for dashboard","operationId":"get_welcome_channels_api_v1_servers__server_id__welcome_channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["👋 Welcome"],"summary":"Update Welcome Channels","description":"Updates the configured channels.\nRate Limited: 80 requests/minute","operationId":"update_welcome_channels_api_v1_servers__server_id__welcome_channels_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WelcomeChannelsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/channels/{channel_type}":{"delete":{"tags":["👋 Welcome"],"summary":"Remove Welcome Channel","description":"Removes a channel configuration.\nRate Limited: 80 requests/minute","operationId":"remove_welcome_channel_api_v1_servers__server_id__welcome_channels__channel_type__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"channel_type","in":"path","required":true,"schema":{"enum":["welcome","goodbye","goodbye_log"],"type":"string","description":"Channel type","title":"Channel Type"},"description":"Channel type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/messages":{"get":{"tags":["👋 Welcome"],"summary":"Get Welcome Messages","operationId":"get_welcome_messages_api_v1_servers__server_id__welcome_messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["👋 Welcome"],"summary":"Update Welcome Messages","operationId":"update_welcome_messages_api_v1_servers__server_id__welcome_messages_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WelcomeMessagesUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/messages/{message_type}":{"delete":{"tags":["👋 Welcome"],"summary":"Remove Welcome Message","description":"Removes a custom message text.\nRate Limited: 80 requests/minute","operationId":"remove_welcome_message_api_v1_servers__server_id__welcome_messages__message_type__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"message_type","in":"path","required":true,"schema":{"enum":["welcome_message","welcome_content","goodbye_message","goodbye_log"],"type":"string","description":"Message type","title":"Message Type"},"description":"Message type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/card/background":{"get":{"tags":["👋 Welcome"],"summary":"Get Card Background","description":"Returns information about the welcome card background image.\nRate Limited: 80 requests/minute\nNO CACHING - Live data for dashboard","operationId":"get_card_background_api_v1_servers__server_id__welcome_card_background_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["👋 Welcome"],"summary":"Upload Card Background","description":"Uploads a background image for the welcome card.\nRate Limited: 10 requests/minute","operationId":"upload_card_background_api_v1_servers__server_id__welcome_card_background_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_card_background_api_v1_servers__server_id__welcome_card_background_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["👋 Welcome"],"summary":"Delete Card Background","description":"Removes the welcome card background image.\nRate Limited: 80 requests/minute","operationId":"delete_card_background_api_v1_servers__server_id__welcome_card_background_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/card/background/image":{"get":{"tags":["👋 Welcome"],"summary":"Get Card Background Image","description":"Returns the welcome card background image.\nPublicly accessible - no authentication required.\nRate Limited: 80 requests/minute","operationId":"get_card_background_image_api_v1_servers__server_id__welcome_card_background_image_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/card/preview":{"get":{"tags":["👋 Welcome"],"summary":"Get Welcome Card Preview","description":"Rendert die ECHTE Willkommenskarte und gibt sie als PNG zurueck.\n\nWofuer das da ist: im Container-Editor steht die generierte Karte als\n``dyn://welcome_card`` in der Galerie, und die Vorschau zeigte dafuer bisher\nnur einen Platzhalter. Ein Kartengenerator, der auf einen Fehler laeuft, war\nim Dashboard damit unsichtbar — man sah ihn erst daran, dass im Kanal nichts\nankam.\n\nGerendert wird im Bot (ueber ``request_welcome_card_preview``), nicht hier:\nnur dort laeuft derselbe Code wie beim Beitritt. Eine zweite Fassung in der\nAPI waere eine zweite Wahrheit, und eine Vorschau, die etwas anderes zeigt\nals das, was ankommt, verdeckt genau den Fehler, den sie zeigen soll.\n\nAntwortet kein Cluster oder scheitert der Generator, ist das KEIN leeres\nBild, sondern ein Fehler mit Grund — das Dashboard zeigt ihn an.\n\nRate Limited: 80 requests/minute","operationId":"get_welcome_card_preview_api_v1_servers__server_id__welcome_card_preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/joinroles":{"get":{"tags":["👋 Welcome"],"summary":"Get Join Roles","description":"Returns all configured join roles.\nRate Limited: 80 requests/minute\nNO CACHING - Live data for dashboard","operationId":"get_join_roles_api_v1_servers__server_id__welcome_joinroles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["👋 Welcome"],"summary":"Add Join Role","description":"Adds a new join role.\nRate Limited: 80 requests/minute","operationId":"add_join_role_api_v1_servers__server_id__welcome_joinroles_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JoinRoleAdd"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/joinroles/{role_id}":{"delete":{"tags":["👋 Welcome"],"summary":"Remove Join Role","description":"Removes a join role.\nRate Limited: 80 requests/minute","operationId":"remove_join_role_api_v1_servers__server_id__welcome_joinroles__role_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"role_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Role ID","title":"Role Id"},"description":"Discord Role ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/banner":{"get":{"tags":["👋 Welcome"],"summary":"Get Welcome Banner","description":"Returns the welcome banner as Base64.","operationId":"get_welcome_banner_api_v1_servers__server_id__welcome_banner_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["👋 Welcome"],"summary":"Upload Welcome Banner","description":"Uploads a welcome banner as Base64 and saves it to the DB.","operationId":"upload_welcome_banner_api_v1_servers__server_id__welcome_banner_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WelcomeBannerBase64Update"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["👋 Welcome"],"summary":"Delete Welcome Banner","description":"Removes the welcome banner from the database.","operationId":"delete_welcome_banner_api_v1_servers__server_id__welcome_banner_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/banner/image":{"get":{"tags":["👋 Welcome"],"summary":"Get Welcome Banner Image","description":"Returns the welcome banner (public).","operationId":"get_welcome_banner_image_api_v1_servers__server_id__welcome_banner_image_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/premium/customization":{"get":{"tags":["👋 Welcome"],"summary":"Get Welcome Premium Customization","description":"Returns the premium welcome settings (Base64 image, Blur, Darken).","operationId":"get_welcome_premium_customization_api_v1_servers__server_id__welcome_premium_customization_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["👋 Welcome"],"summary":"Update Welcome Premium Settings","description":"Updates blur and darken for the welcome image.","operationId":"update_welcome_premium_settings_api_v1_servers__server_id__welcome_premium_customization_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WelcomePremiumUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/premium/background":{"put":{"tags":["👋 Welcome"],"summary":"Update Welcome Premium Background","description":"Uploads a Base64 welcome image.","operationId":"update_welcome_premium_background_api_v1_servers__server_id__welcome_premium_background_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WelcomeBackgroundBase64Update"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["👋 Welcome"],"summary":"Delete Welcome Premium Background","description":"Deletes the Base64 welcome image.","operationId":"delete_welcome_premium_background_api_v1_servers__server_id__welcome_premium_background_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/ghostping":{"get":{"tags":["👋 Welcome"],"summary":"Get Ghost Ping Channels","description":"Gibt alle konfigurierten Ghost-Ping-Kanäle zurück (max 7).\nBeim Beitritt eines Users wird in diesen Kanälen ein Ping gesendet und direkt gelöscht.","operationId":"get_ghost_ping_channels_api_v1_servers__server_id__welcome_ghostping_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["👋 Welcome"],"summary":"Add Ghost Ping Channel","description":"Fügt einen neuen Ghost-Ping-Kanal hinzu. Maximal 7 Kanäle pro Server.","operationId":"add_ghost_ping_channel_api_v1_servers__server_id__welcome_ghostping_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GhostPingChannelAdd"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/ghostping/{channel_id}":{"delete":{"tags":["👋 Welcome"],"summary":"Remove Ghost Ping Channel","description":"Entfernt einen Ghost-Ping-Kanal.","operationId":"remove_ghost_ping_channel_api_v1_servers__server_id__welcome_ghostping__channel_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Channel ID","title":"Channel Id"},"description":"Discord Channel ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/dm":{"get":{"tags":["👋 Welcome"],"summary":"Get Welcome Dm Config","description":"Gibt die aktuelle DM-Konfiguration für neue Mitglieder zurück.\nDie DM kann als Plaintext oder als vollständig anpassbares EmbedTemplate gesendet werden.","operationId":"get_welcome_dm_config_api_v1_servers__server_id__welcome_dm_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["👋 Welcome"],"summary":"Update Welcome Dm Config","description":"Aktualisiert die DM-Konfiguration für neue Mitglieder.\n\n- **welcome_dm_enabled**: DM aktivieren/deaktivieren\n- **welcome_dm_mode**: `text` für Plaintext, `embed` für EmbedTemplate\n- **welcome_dm_text**: Nachrichtentext bei Modus `text` (Platzhalter: {user_mention}, {server_name}, ...)\n- **welcome_dm_embed_template_id**: ID eines EmbedTemplates (erstellt via /embeds API) bei Modus `embed`","operationId":"update_welcome_dm_config_api_v1_servers__server_id__welcome_dm_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WelcomeDMConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["👋 Welcome"],"summary":"Reset Welcome Dm Config","description":"Setzt die DM-Konfiguration zurück (deaktiviert DM und löscht alle Einstellungen).","operationId":"reset_welcome_dm_config_api_v1_servers__server_id__welcome_dm_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/embed-template":{"get":{"tags":["👋 Welcome"],"summary":"Get Welcome Embed Config","description":"Gibt die aktuelle Welcome-Embed-Template-Konfiguration zurück.\n\nWenn `welcome_embed_template_id` gesetzt ist und `welcome_display_mode` = `embed`,\nwird das verknüpfte EmbedTemplate für die Willkommensnachricht verwendet.\nDas EmbedTemplate kann über die /embeds API vollständig konfiguriert werden\n(Titel, Beschreibung, Author, Footer, Bilder, Buttons, Select-Menüs usw.).\n\nThumbnail-Typen:\n- `user_avatar`: Avatar des beitretenden Users\n- `server_icon`: Server-Icon\n- `custom`: Bild aus dem EmbedTemplate\n- `none`: Kein Thumbnail\n\nImage-Typen:\n- `welcome_card`: Generierte Willkommenskarte (PIL/Pillow)\n- `custom`: Bild aus dem EmbedTemplate\n- `none`: Kein Image","operationId":"get_welcome_embed_config_api_v1_servers__server_id__welcome_embed_template_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["👋 Welcome"],"summary":"Update Welcome Embed Config","description":"Verknüpft ein EmbedTemplate mit der Willkommensnachricht und konfiguriert Thumbnail/Image.\n\nDas EmbedTemplate (erstellt über die /embeds API) wird beim Beitritt eines Users\nals Willkommensnachricht gesendet. Platzhalter wie `{user_mention}`, `{server_name}` etc.\nwerden automatisch in Titel, Beschreibung, Author und Footer ersetzt.\n\n**Thumbnail-Typen:**\n- `user_avatar` → Avatar des beitretenden Users\n- `server_icon` → Server-Icon\n- `custom` → Thumbnail aus dem EmbedTemplate\n- `none` → Kein Thumbnail\n\n**Image-Typen:**\n- `welcome_card` → Generierte Willkommenskarte (kombiniert mit Embed)\n- `custom` → Image aus dem EmbedTemplate\n- `none` → Kein Image\n\n**Hinweis zu Buttons:** Buttons und Select-Menüs aus dem EmbedTemplate werden\nmit der Nachricht gesendet, sind aber nach einem Bot-Neustart nicht mehr aktiv.","operationId":"update_welcome_embed_config_api_v1_servers__server_id__welcome_embed_template_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WelcomeEmbedConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["👋 Welcome"],"summary":"Remove Welcome Embed Config","description":"Entfernt das verknüpfte Welcome-EmbedTemplate (fällt auf klassisches Embed zurück).","operationId":"remove_welcome_embed_config_api_v1_servers__server_id__welcome_embed_template_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/ai":{"get":{"tags":["👋 Welcome"],"summary":"Get Welcome Ai Config","description":"Gibt die AI-Willkommensnachrichten-Konfiguration zurück.\n\nWenn `welcome_ai_enabled` aktiviert ist, generiert der Bot personalisierte\nWillkommensnachrichten basierend auf:\n- Server-Thema und aktuelle Events\n- Tageszeit\n- Ob der User schon mal auf dem Server war\n- Bekannte Infos über den User aus der Datenbank\n- User-Bio/Status/Aktivitäten\n\n**Voraussetzungen:**\n- Server muss ein aktives AI-Abo haben\n- AI-Provider muss konfiguriert sein\n- AI-Nutzungslimits dürfen nicht überschritten sein\n\nFunktioniert mit allen Display-Modi (card, embed, text).","operationId":"get_welcome_ai_config_api_v1_servers__server_id__welcome_ai_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["👋 Welcome"],"summary":"Update Welcome Ai Config","description":"Aktiviert oder deaktiviert AI-generierte Willkommensnachrichten.\n\n**Voraussetzungen zum Aktivieren:**\n- Server muss ein aktives AI-Abo haben\n- AI-Provider muss konfiguriert sein\n\nBei Aktivierung werden Willkommensnachrichten automatisch durch die AI\npersonalisiert. Die Nachricht basiert auf Server-Kontext, User-Infos\nund Tageszeit. Das normale Template wird als Fallback verwendet,\nfalls die AI-Generierung fehlschlägt.","operationId":"update_welcome_ai_config_api_v1_servers__server_id__welcome_ai_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WelcomeAIConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/dashboard":{"get":{"tags":["👋 Welcome"],"summary":"Get Welcome Dashboard","description":"Returns all welcome settings aggregated in one response to prevent N+1 queries.","operationId":"get_welcome_dashboard_api_v1_servers__server_id__welcome_dashboard_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/containers":{"get":{"tags":["👋 Welcome"],"summary":"Get Welcome Containers","description":"Liefert die gespeicherten Welcome- und DM-Container (Components V2).","operationId":"get_welcome_containers_api_v1_servers__server_id__welcome_containers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/message-container":{"put":{"tags":["👋 Welcome"],"summary":"Update Welcome Message Container","description":"Speichert den Container der Willkommensnachricht (Modus 'container').","operationId":"update_welcome_message_container_api_v1_servers__server_id__welcome_message_container_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerJsonBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/welcome/dm-container":{"put":{"tags":["👋 Welcome"],"summary":"Update Welcome Dm Container","description":"Speichert den Container der Willkommens-DM (DM-Modus 'container').","operationId":"update_welcome_dm_container_api_v1_servers__server_id__welcome_dm_container_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerJsonBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__welcome__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/logs/types":{"get":{"tags":["⚙️ Logs"],"summary":"Get Log Types","description":"Returns all available log types.\nRate Limited: 80 requests/minute","operationId":"get_log_types_api_v1_servers__server_id__logs_types_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__logs__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/logs/config":{"get":{"tags":["⚙️ Logs"],"summary":"Get Log Configs","description":"Returns all log configurations for a server.\nRate Limited: 80 requests/minute\nNO CACHING - Live data for dashboard","operationId":"get_log_configs_api_v1_servers__server_id__logs_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__logs__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["⚙️ Logs"],"summary":"Create Log Config","description":"Creates or updates a log configuration.\nRate Limited: 80 requests/minute","operationId":"create_log_config_api_v1_servers__server_id__logs_config_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogConfigCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__logs__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["⚙️ Logs"],"summary":"Delete All Log Configs","description":"Deletes ALL log configurations for a server.\nRate Limited: 80 requests/minute","operationId":"delete_all_log_configs_api_v1_servers__server_id__logs_config_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__logs__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/logs/config/{log_type}":{"get":{"tags":["⚙️ Logs"],"summary":"Get Log Config","description":"Returns the configuration for a specific log type.\nRate Limited: 80 requests/minute\nNO CACHING - Live data for dashboard","operationId":"get_log_config_api_v1_servers__server_id__logs_config__log_type__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"log_type","in":"path","required":true,"schema":{"type":"string","description":"Log type","title":"Log Type"},"description":"Log type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__logs__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["⚙️ Logs"],"summary":"Update Log Config","description":"Updates an existing log configuration.\nRate Limited: 80 requests/minute","operationId":"update_log_config_api_v1_servers__server_id__logs_config__log_type__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"log_type","in":"path","required":true,"schema":{"type":"string","description":"Log type","title":"Log Type"},"description":"Log type"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__logs__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["⚙️ Logs"],"summary":"Delete Log Config","description":"Deletes a log configuration.\nRate Limited: 80 requests/minute","operationId":"delete_log_config_api_v1_servers__server_id__logs_config__log_type__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"log_type","in":"path","required":true,"schema":{"type":"string","description":"Log type","title":"Log Type"},"description":"Log type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__logs__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/logs/config/{log_type}/toggle":{"put":{"tags":["⚙️ Logs"],"summary":"Toggle Log Config","description":"Toggles a log type on/off.\nRate Limited: 80 requests/minute","operationId":"toggle_log_config_api_v1_servers__server_id__logs_config__log_type__toggle_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"log_type","in":"path","required":true,"schema":{"type":"string","description":"Log type","title":"Log Type"},"description":"Log type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__logs__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/logs/entries":{"get":{"tags":["⚙️ Logs"],"summary":"Get Log Entries","description":"Query log entries with smart filtering and search.\n\nSupports filtering by log_type, user IDs, channel, date range, and full-text search.\nUser/role IDs are automatically resolved to names in the response.\n\nRate Limited: 80 requests/minute","operationId":"get_log_entries_api_v1_servers__server_id__logs_entries_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"log_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by log type (e.g. 'message_logs', 'ban_logs')","title":"Log Type"},"description":"Filter by log type (e.g. 'message_logs', 'ban_logs')"},{"name":"target_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by target user ID","title":"Target User Id"},"description":"Filter by target user ID"},{"name":"executor_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by executor user ID","title":"Executor User Id"},"description":"Filter by executor user ID"},{"name":"channel_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by channel ID where log was posted","title":"Channel Id"},"description":"Filter by channel ID where log was posted"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search in action text, usernames, content, role names","title":"Search"},"description":"Search in action text, usernames, content, role names"},{"name":"action_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by action_type (e.g. 'delete', 'ban', 'edit')","title":"Action Type"},"description":"Filter by action_type (e.g. 'delete', 'ban', 'edit')"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date (ISO format, e.g. 2025-01-01)","title":"Date From"},"description":"Start date (ISO format, e.g. 2025-01-01)"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date (ISO format, e.g. 2025-12-31)","title":"Date To"},"description":"End date (ISO format, e.g. 2025-12-31)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Results per page (max 200)","default":50,"title":"Per Page"},"description":"Results per page (max 200)"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort order: 'asc' or 'desc'","default":"desc","title":"Sort"},"description":"Sort order: 'asc' or 'desc'"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__logs__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/logs/entries/{entry_id}":{"get":{"tags":["⚙️ Logs"],"summary":"Get Log Entry Detail","description":"Returns detailed information for a specific log entry.\nRate Limited: 80 requests/minute","operationId":"get_log_entry_detail_api_v1_servers__server_id__logs_entries__entry_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","description":"Log entry ID","title":"Entry Id"},"description":"Log entry ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__logs__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/logs/stats":{"get":{"tags":["⚙️ Logs"],"summary":"Get Log Stats","description":"Returns log statistics for a server (counts per type, top users, timeline).\nRate Limited: 60 requests/minute","operationId":"get_log_stats_api_v1_servers__server_id__logs_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Number of days to look back (max 365)","default":30,"title":"Days"},"description":"Number of days to look back (max 365)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__logs__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/logs/user/{user_id}":{"get":{"tags":["⚙️ Logs"],"summary":"Get User Logs","description":"Returns all log entries involving a specific user (as target OR executor).\nRate Limited: 80 requests/minute","operationId":"get_user_logs_api_v1_servers__server_id__logs_user__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"log_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by log type","title":"Log Type"},"description":"Filter by log type"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Results per page","default":50,"title":"Per Page"},"description":"Results per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__logs__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/logs/ignored":{"get":{"tags":["⚙️ Logs"],"summary":"Get Ignored Channels","description":"Returns all ignored channels","operationId":"get_ignored_channels_api_v1_servers__server_id__logs_ignored_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__logs__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["⚙️ Logs"],"summary":"Add Ignored Channel","description":"Adds a channel to the ignore list","operationId":"add_ignored_channel_api_v1_servers__server_id__logs_ignored_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogIgnoredChannelCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__logs__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/logs/ignored/{entry_id}":{"delete":{"tags":["⚙️ Logs"],"summary":"Remove Ignored Channel","description":"Removes a channel from the ignore list","operationId":"remove_ignored_channel_api_v1_servers__server_id__logs_ignored__entry_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","description":"Entry ID","title":"Entry Id"},"description":"Entry ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__logs__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/scheduled-events":{"get":{"tags":["📅 Discord-Events"],"summary":"List Events","description":"Die Events dieses Servers, so wie der Bot sie zuletzt gesehen hat.","operationId":"list_events_api_v1_servers__server_id__scheduled_events_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"scope","in":"query","required":false,"schema":{"type":"string","description":"all | upcoming | past","default":"all","title":"Scope"},"description":"all | upcoming | past"},{"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/scheduled-events/activity":{"get":{"tags":["📅 Discord-Events"],"summary":"Event Activity","description":"Der Strom der Signale: wer wann zu- oder abgesagt hat.\n\nDas ist die eigentliche Antwort auf die Frage, um die es hier geht. Jede\nZeile traegt ihre Herkunft mit; ohne die saehe ein Nachtrag aus wie eine\nBeobachtung.","operationId":"event_activity_api_v1_servers__server_id__scheduled_events_activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"event_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nur dieses Event","title":"Event Id"},"description":"Nur dieses Event"},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nur diese Person","title":"User Id"},"description":"Nur diese Person"},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"interested | withdrawn","title":"Action"},"description":"interested | withdrawn"},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"gateway | sync","title":"Source"},"description":"gateway | sync"},{"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/scheduled-events/stats":{"get":{"tags":["📅 Discord-Events"],"summary":"Event Stats","description":"Die Zahlen ueber allem: wie viele Events, wie viel Zu- und Absage, und wer\nam zuverlaessigsten kommt.\n\nDie Treuequote ist bewusst nur fuer Leute mit mindestens zwei Signalen\nausgewiesen. Eine Quote aus einem einzigen Klick ist 100 Prozent oder 0 und\nsagt nichts; sie stuende trotzdem ganz oben in der Liste.","operationId":"event_stats_api_v1_servers__server_id__scheduled_events_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/scheduled-events/config":{"get":{"tags":["📅 Discord-Events"],"summary":"Get Config","description":"Die Einstellungen, notfalls die Standardwerte.","operationId":"get_config_api_v1_servers__server_id__scheduled_events_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["📅 Discord-Events"],"summary":"Update Config","description":"Einstellungen aendern. Nur was gesetzt ist, wird angefasst.","operationId":"update_config_api_v1_servers__server_id__scheduled_events_config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__scheduled_events__ConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/scheduled-events/sync":{"post":{"tags":["📅 Discord-Events"],"summary":"Sync All","description":"Alle Events dieses Servers mit Discord abgleichen.\n\nNachgetragene Zeilen tragen `source='sync'` und den Zeitpunkt des\nAbgleichs. Der Klickzeitpunkt laesst sich nicht rekonstruieren; Discord\nkennt ihn selbst nicht.","operationId":"sync_all_api_v1_servers__server_id__scheduled_events_sync_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/scheduled-events/{event_id}/people":{"get":{"tags":["📅 Discord-Events"],"summary":"Event People","description":"Wer fuer dieses Event interessiert ist, und wer wieder abgesprungen ist.\n\nBeide Listen aus derselben Tabelle: `withdrawn` sind die Zeilen, die einmal\nein Ja hatten und jetzt keins mehr haben. Wer nie zugesagt hat, steht in\nkeiner von beiden.","operationId":"event_people_api_v1_servers__server_id__scheduled_events__event_id__people_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"event_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Scheduled-Event-ID","title":"Event Id"},"description":"Discord Scheduled-Event-ID"},{"name":"state","in":"query","required":false,"schema":{"type":"string","description":"interested | withdrawn | all","default":"interested","title":"State"},"description":"interested | withdrawn | all"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/scheduled-events/{event_id}/export":{"get":{"tags":["📅 Discord-Events"],"summary":"Export Event","description":"Die Teilnehmerliste als CSV.\n\nDer Grund, warum es das gibt: eine Gaesteliste wird ausgedruckt, in eine\nTabelle gezogen oder an jemanden geschickt, der kein Dashboard hat. Die\nSpalte `source` faehrt mit, damit auch dort erkennbar bleibt, welche Zeile\nbeobachtet und welche nachgetragen ist.","operationId":"export_event_api_v1_servers__server_id__scheduled_events__event_id__export_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"event_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Scheduled-Event-ID","title":"Event Id"},"description":"Discord Scheduled-Event-ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/scheduled-events/{event_id}/sync":{"post":{"tags":["📅 Discord-Events"],"summary":"Sync One","description":"Ein einzelnes Event mit Discord abgleichen.","operationId":"sync_one_api_v1_servers__server_id__scheduled_events__event_id__sync_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"event_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Scheduled-Event-ID","title":"Event Id"},"description":"Discord Scheduled-Event-ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/scheduled-events/{event_id}/impact":{"get":{"tags":["📅 Discord-Events"],"summary":"Event Impact","description":"Was dieses Event bewirkt hat: Zahlen, Teilnahme, Nachhall.\n\n─── Warum das hier steht und nicht in event_impact.py ──────────────────\n\nWeil es eine Unterseite EINES Events ist und der Pfad das sagen soll.\nDie Rechnung selbst liegt in `utils/event_wirkung.py`, wo auch das\nMCP-Werkzeug sie holt - eine Rechnung an zwei Stellen waere zwei\nRechnungen, und die zweite faellt erst auf, wenn jemand die Zahlen\nnebeneinanderlegt.\n\n─── Der Zugriff ist STATS, nicht SERVER ────────────────────────────────\n\nAnders als die Nachbarrouten dieser Datei. Hier stehen Zahlen ueber den\nganzen Server - wie viel geschrieben und gesprochen wurde, wer kam und\nwer ging. Das ist die Auskunft, fuer die es die Statistik-Rollen gibt,\nund nicht dieselbe Frage wie \"wer hat auf Interessiert gedrueckt\".\n\n─── Warum `weeks` einstellbar ist ──────────────────────────────────────\n\nBei einer woechentlichen Reihe sind vier Wochen Vergleich schnell alle\nbelastet und aussortiert (siehe `utils/event_wirkung._belastete_wochen`).\nWer dann nichts als \"zu wenige Vergleichsfenster\" liest, soll den\nRueckblick verlaengern koennen, statt vor einer leeren Seite zu stehen.","operationId":"event_impact_api_v1_servers__server_id__scheduled_events__event_id__impact_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"event_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Scheduled-Event-ID","title":"Event Id"},"description":"Discord Scheduled-Event-ID"},{"name":"weeks","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":2,"description":"Wie viele Wochen Vergleich","default":6,"title":"Weeks"},"description":"Wie viele Wochen Vergleich"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/scheduled-events/{event_id}":{"get":{"tags":["📅 Discord-Events"],"summary":"Event Detail","description":"Ein Event mit seinen Zahlen und den letzten Bewegungen.","operationId":"event_detail_api_v1_servers__server_id__scheduled_events__event_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"event_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Scheduled-Event-ID","title":"Event Id"},"description":"Discord Scheduled-Event-ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/activity-markers/categories":{"get":{"tags":["📈 Event-Wirkung"],"summary":"Marker Kategorien","description":"Die Kategorien mit ihrer Richtung.\n\nVom Server und nicht aus einer Liste in der Oberflaeche: die Richtung\nentscheidet, wie ein Marker eingefaerbt wird und wie die Rechnung ihn\nliest. Zwei Listen liefen auseinander, und zwar unauffaellig - ein\nAusfall, den die Oberflaeche fuer positiv haelt, sieht aus wie ein\nmisslungener Filmabend.\n\nDiese Route steht ABSICHTLICH vor `/{marker_id}` - siehe der Kopf dieser\nDatei.","operationId":"marker_kategorien_api_v1_servers__server_id__activity_markers_categories_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/activity-markers":{"get":{"tags":["📈 Event-Wirkung"],"summary":"Marker Auflisten","description":"Die Zeitraeume dieses Servers, juengster zuerst.","operationId":"marker_auflisten_api_v1_servers__server_id__activity_markers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Nur ab hier","title":"From"},"description":"Nur ab hier"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Nur bis hier","title":"To"},"description":"Nur bis hier"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nur diese Kategorie","title":"Category"},"description":"Nur diese Kategorie"},{"name":"direction","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"positiv | neutral | negativ","title":"Direction"},"description":"positiv | neutral | negativ"},{"name":"linked_event_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nur zu diesem Event","title":"Linked Event Id"},"description":"Nur zu diesem Event"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["📈 Event-Wirkung"],"summary":"Marker Anlegen","description":"Traegt einen Zeitraum ein.\n\nRueckwirkend ist ausdruecklich erlaubt und der halbe Zweck: `messages`\nist ein vollstaendiges Archiv, also liefert ein nachgetragener Marker\nsofort eine echte Auswertung. Deshalb kommt die Wirkung gleich mit\nzurueck - der Nutzer soll nicht raten muessen, ob sich das Eintragen\ngelohnt hat.","operationId":"marker_anlegen_api_v1_servers__server_id__activity_markers_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkerCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/activity-markers/{marker_id}":{"put":{"tags":["📈 Event-Wirkung"],"summary":"Marker Aendern","description":"Aendert einen Zeitraum.","operationId":"marker_aendern_api_v1_servers__server_id__activity_markers__marker_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"marker_id","in":"path","required":true,"schema":{"type":"integer","description":"ID des Markers","title":"Marker Id"},"description":"ID des Markers"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkerUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📈 Event-Wirkung"],"summary":"Marker Loeschen","description":"Loescht einen Zeitraum.\n\nWas dabei NICHT verloren geht, sind die Messwerte: die stehen in\n`messages` und `voice_activity_sessions` und werden von dieser Tabelle\nnur befragt. Weg ist nur die Behauptung, dass in diesem Zeitraum etwas\nBestimmtes stattfand - und die ist in zehn Sekunden neu getippt.","operationId":"marker_loeschen_api_v1_servers__server_id__activity_markers__marker_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"marker_id","in":"path","required":true,"schema":{"type":"integer","description":"ID des Markers","title":"Marker Id"},"description":"ID des Markers"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/activity-markers/{marker_id}/impact":{"get":{"tags":["📈 Event-Wirkung"],"summary":"Marker Wirkung","description":"Was in diesem Zeitraum passiert ist, gegen das Uebliche gehalten.","operationId":"marker_wirkung_api_v1_servers__server_id__activity_markers__marker_id__impact_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"marker_id","in":"path","required":true,"schema":{"type":"integer","description":"ID des Markers","title":"Marker Id"},"description":"ID des Markers"},{"name":"weeks","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":2,"description":"Wie viele Wochen Vergleich","default":6,"title":"Weeks"},"description":"Wie viele Wochen Vergleich"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/event-impact/compare":{"get":{"tags":["📈 Event-Wirkung"],"summary":"Wirkung Vergleich","description":"Was bringt mehr - der Filmabend oder das Turnier?\n\nEvents und Marker in EINER Rangliste. Die Frage macht an der Grenze\nzwischen Discord-Event und Handeintrag nicht halt, und eine Ansicht, die\ndas trotzdem tut, beantwortet sie nur halb.","operationId":"wirkung_vergleich_api_v1_servers__server_id__event_impact_compare_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"description":"Wie weit zurueck","default":90,"title":"Days"},"description":"Wie weit zurueck"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":2,"description":"Wie viele Ereignisse hoechstens","default":12,"title":"Limit"},"description":"Wie viele Ereignisse hoechstens"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/event-impact/best-times":{"get":{"tags":["📈 Event-Wirkung"],"summary":"Beste Zeiten","description":"Wann das naechste Event liegen sollte.\n\nAlles in UTC. Die Umrechnung passiert im Browser, der die Zone des\nLesers kennt - eine Server-Zeitzone gibt es im Modell nicht, und eine\nhier geratene waere fuer die Haelfte der Betrachter falsch.","operationId":"beste_zeiten_api_v1_servers__server_id__event_impact_best_times_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":180,"minimum":14,"description":"Rueckblick in Tagen","default":56,"title":"Days"},"description":"Rueckblick in Tagen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/event-impact/timeline":{"get":{"tags":["📈 Event-Wirkung"],"summary":"Zeitstrahl","description":"Events und Marker nebeneinander auf einer Zeitachse.\n\nOHNE Wirkungsrechnung - die kostet je Eintrag eine Handvoll Abfragen und\nwaere fuer eine Uebersicht, die jemand ueberfliegt, das Vielfache des\nNutzens. Wer eine Zahl will, oeffnet den Eintrag.","operationId":"zeitstrahl_api_v1_servers__server_id__event_impact_timeline_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"description":"Rueckblick in Tagen","default":90,"title":"Days"},"description":"Rueckblick in Tagen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/event-impact/insights":{"get":{"tags":["📈 Event-Wirkung"],"summary":"Befunde","description":"Die geschriebenen Befunde dieses Servers.\n\nSie entstehen NICHT hier, sondern ueber das MCP-Werkzeug\n`notoq_event_insight_write` - der Betreiber laesst sie fuer einzelne\nServer schreiben. Diese Route liefert nur aus, was schon dasteht, und\neine leere Liste ist der Normalfall: die Karte erscheint dann gar nicht,\nstatt als leeres Gehaeuse dazustehen.\n\nKEIN Zwischenspeicher. Die Liste ist eine Handvoll Zeilen ueber einen\nIndex, und ein frisch geschriebener Befund soll beim naechsten Laden da\nsein - nicht in zehn Minuten.","operationId":"befunde_api_v1_servers__server_id__event_impact_insights_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"subject_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["event","marker","server"],"type":"string"},{"type":"null"}],"title":"Subject Type"}},{"name":"subject_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Subject Ref"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/birthdays/settings":{"get":{"tags":["🎁 Birthdays"],"summary":"Get Birthday Settings","description":"Returns birthday settings for a server.\nRate Limited: 80 requests/minute\nNO CACHING - Live data for dashboard","operationId":"get_birthday_settings_api_v1_servers__server_id__birthdays_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__birthdays__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🎁 Birthdays"],"summary":"Update Birthday Settings","description":"Updates birthday settings.\nRate Limited: 80 requests/minute","operationId":"update_birthday_settings_api_v1_servers__server_id__birthdays_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BirthdaySettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__birthdays__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/birthdays/stats":{"get":{"tags":["🎁 Birthdays"],"summary":"Get Birthday Stats","description":"Returns detailed birthday statistics: member-aware counts, who has their\nbirthday today (incl. announcement status), the upcoming week and the\nfull monthly distribution — everything the dashboard drill-downs need.\nRate Limited: 80 requests/minute","operationId":"get_birthday_stats_api_v1_servers__server_id__birthdays_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__birthdays__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/birthdays/announce":{"post":{"tags":["🎁 Birthdays"],"summary":"Announce Birthdays Now","description":"Manually triggers today's birthday announcement(s) — e.g. when the bot\nmissed the scheduled time. Optionally limited to a single user; `force`\nre-sends even if the birthday was already celebrated today.\nRate Limited: 10 requests/minute","operationId":"announce_birthdays_now_api_v1_servers__server_id__birthdays_announce_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnounceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__birthdays__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/birthdays":{"get":{"tags":["🎁 Birthdays"],"summary":"Get Birthdays","description":"Returns all birthdays for a server.\nRate Limited: 80 requests/minute\nNO CACHING - Live data for dashboard","operationId":"get_birthdays_api_v1_servers__server_id__birthdays_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"filter_type","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Filter Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__birthdays__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🎁 Birthdays"],"summary":"Create Birthday","description":"Creates or updates a birthday.\nRate Limited: 80 requests/minute","operationId":"create_birthday_api_v1_servers__server_id__birthdays_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BirthdayCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__birthdays__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/birthdays/{user_id}":{"get":{"tags":["🎁 Birthdays"],"summary":"Get Birthday","description":"Returns a single birthday.\nRate Limited: 80 requests/minute","operationId":"get_birthday_api_v1_servers__server_id__birthdays__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__birthdays__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎁 Birthdays"],"summary":"Delete Birthday","description":"Deletes a birthday.\nRate Limited: 80 requests/minute","operationId":"delete_birthday_api_v1_servers__server_id__birthdays__user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__birthdays__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/birthdays/{user_id}/privacy":{"put":{"tags":["🎁 Birthdays"],"summary":"Update Birthday Privacy","description":"Updates privacy settings of a birthday.\nRate Limited: 80 requests/minute","operationId":"update_birthday_privacy_api_v1_servers__server_id__birthdays__user_id__privacy_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"is_public","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public"}},{"name":"show_age","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Age"}},{"name":"dm_notification","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dm Notification"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__birthdays__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/birthdays/banner":{"post":{"tags":["🎁 Birthdays"],"summary":"Upload Birthday Banner","description":"Uploads a birthday banner.\nRate Limited: 10 requests/minute","operationId":"upload_birthday_banner_api_v1_servers__server_id__birthdays_banner_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_birthday_banner_api_v1_servers__server_id__birthdays_banner_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__birthdays__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎁 Birthdays"],"summary":"Delete Birthday Banner","description":"Removes the birthday banner.\nRate Limited: 80 requests/minute","operationId":"delete_birthday_banner_api_v1_servers__server_id__birthdays_banner_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__birthdays__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/birthdays/banner/image":{"head":{"tags":["🎁 Birthdays"],"summary":"Get Birthday Banner Image","description":"Returns the birthday banner (public).","operationId":"get_birthday_banner_image_api_v1_servers__server_id__birthdays_banner_image_head","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["🎁 Birthdays"],"summary":"Get Birthday Banner Image","description":"Returns the birthday banner (public).","operationId":"get_birthday_banner_image_api_v1_servers__server_id__birthdays_banner_image_head","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/birthdays/permanent-list":{"post":{"tags":["🎁 Birthdays"],"summary":"Send Permanent Birthday List","description":"Sends the permanent birthday list to a channel.\nRate Limited: 80 requests/minute","operationId":"send_permanent_birthday_list_api_v1_servers__server_id__birthdays_permanent_list_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermanentListRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__birthdays__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎁 Birthdays"],"summary":"Delete Permanent Birthday List","description":"Deletes the permanent birthday list.\nRate Limited: 80 requests/minute","operationId":"delete_permanent_birthday_list_api_v1_servers__server_id__birthdays_permanent_list_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__birthdays__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/birthdays/permanent-list/status":{"get":{"tags":["🎁 Birthdays"],"summary":"Get Permanent List Status","description":"Returns the status of the permanent list.\nRate Limited: 80 requests/minute","operationId":"get_permanent_list_status_api_v1_servers__server_id__birthdays_permanent_list_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__birthdays__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/birthdays/timezones":{"get":{"tags":["🎁 Birthdays"],"summary":"Get Available Timezones","description":"Returns all available timezones.\nRate Limited: 80 requests/minute","operationId":"get_available_timezones_api_v1_birthdays_timezones_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__birthdays__ApiResponse"}}}}}}},"/api/v1/servers/{server_id}/level/settings":{"get":{"tags":["🪄 Levels"],"summary":"Get Level Settings","operationId":"get_level_settings_api_v1_servers__server_id__level_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🪄 Levels"],"summary":"Update Level Settings","operationId":"update_level_settings_api_v1_servers__server_id__level_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LevelSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/settings/channel":{"delete":{"tags":["🪄 Levels"],"summary":"Remove Levelup Channel","operationId":"remove_levelup_channel_api_v1_servers__server_id__level_settings_channel_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/settings/no_xp_role":{"delete":{"tags":["🪄 Levels"],"summary":"Remove No Xp Role","operationId":"remove_no_xp_role_api_v1_servers__server_id__level_settings_no_xp_role_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/excluded-channels":{"get":{"tags":["🪄 Levels"],"summary":"Get Excluded Channels","description":"Lists all excluded channels for a server.","operationId":"get_excluded_channels_api_v1_servers__server_id__level_excluded_channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🪄 Levels"],"summary":"Add Excluded Channel","description":"Adds a new excluded channel.","operationId":"add_excluded_channel_api_v1_servers__server_id__level_excluded_channels_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExcludedChannelCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🪄 Levels"],"summary":"Remove All Excluded Channels","description":"Removes all excluded channels from a server.","operationId":"remove_all_excluded_channels_api_v1_servers__server_id__level_excluded_channels_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/excluded-channels/{channel_id}":{"delete":{"tags":["🪄 Levels"],"summary":"Remove Excluded Channel","description":"Removes a channel from the exclusion list.","operationId":"remove_excluded_channel_api_v1_servers__server_id__level_excluded_channels__channel_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Channel ID","title":"Channel Id"},"description":"Discord Channel ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/roles":{"get":{"tags":["🪄 Levels"],"summary":"Get Level Roles","description":"Lists all configured level roles for a server.","operationId":"get_level_roles_api_v1_servers__server_id__level_roles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🪄 Levels"],"summary":"Add Level Role","description":"Adds a new level role for a server.","operationId":"add_level_role_api_v1_servers__server_id__level_roles_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LevelRoleRewardCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🪄 Levels"],"summary":"Delete All Level Roles","description":"Removes all configured level roles from a server.","operationId":"delete_all_level_roles_api_v1_servers__server_id__level_roles_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/roles/{role_id}":{"delete":{"tags":["🪄 Levels"],"summary":"Delete Level Role","description":"Removes a configured level role.","operationId":"delete_level_role_api_v1_servers__server_id__level_roles__role_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"role_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Role ID","title":"Role Id"},"description":"Discord Role ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/notification-settings":{"get":{"tags":["🪄 Levels"],"summary":"Get Levelup Notification Settings","description":"Gets level-up notification settings","operationId":"get_levelup_notification_settings_api_v1_servers__server_id__level_notification_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🪄 Levels"],"summary":"Update Levelup Notification Settings","description":"Updates level-up notification settings","operationId":"update_levelup_notification_settings_api_v1_servers__server_id__level_notification_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LevelUpNotificationSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/kurve":{"get":{"tags":["🪄 Levels"],"summary":"Get Level Kurve","description":"Die eingestellte Stufenleiter - und ob gerade umgerechnet wird.\n\n`umrechnung` ist nicht Beiwerk: solange sie laeuft, stehen auf dem Server\nProfile auf zwei verschiedenen Leitern. Das Dashboard muss es sagen\nkoennen, und der Aufrufer braucht `ab_id`, um fortzusetzen.","operationId":"get_level_kurve_api_v1_servers__server_id__level_kurve_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🪄 Levels"],"summary":"Set Level Kurve","description":"Die Stufenleiter wechseln und alle Profile neu einordnen.\n\n─── Warum die Einstellung ZUERST geschrieben wird ──────────────────────\n\nWeil sie der einzige Ort ist, an dem der Bot nachsieht, welche Kurve\ngilt. Bricht die Umrechnung in der Mitte ab, gibt es zwei moegliche\nZwischenzustaende:\n    * Einstellung neu, ein Teil der Profile noch alt. Die noch nicht\n      umgerechneten tragen einen Schwellenwert der alten Leiter; beim\n      naechsten Aufstieg rechnet `_calculate_next_level_xp` mit der neuen\n      und setzt ihn richtig. Der Fehler heilt sich selbst.\n    * Einstellung alt, ein Teil der Profile schon neu. Die bereits\n      umgerechneten werden ab sofort an der ALTEN Leiter gemessen - und\n      das ist genau der Sprung, den dieser Endpunkt verhindern soll.\nDer erste Zustand ist der harmlosere, also wird in dieser Reihenfolge\ngeschrieben.\n\n─── Warum das Protokoll nur EINMAL entsteht ────────────────────────────\n\nWeil es EIN Vorgang ist. Das Buch haelt fest, was ein Mensch entschieden\nhat; die Fortsetzungen sind die Ausfuehrung derselben Entscheidung. Eine\nZeile je Charge waeren auf dem groessten Server einunddreissig Zeilen fuer\neinen Klick.","operationId":"set_level_kurve_api_v1_servers__server_id__level_kurve_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KurveWechsel"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/kurve/vorschau":{"get":{"tags":["🪄 Levels"],"summary":"Get Kurve Vorschau","description":"Was eine Kurve bedeutet - in Zahlen, die ein Mensch vergleichen kann.\n\nOhne `kurve` die eingestellte. Die Punkte sind die Linie fuers Diagramm,\ndie Marken die vier Zahlen daneben; beide relativ zur Standardkurve, weil\neine absolute XP-Zahl nichts sagt, solange man nicht weiss, wie viel XP\neine Nachricht bringt.","operationId":"get_kurve_vorschau_api_v1_servers__server_id__level_kurve_vorschau_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"kurve","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kurve"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/kurve/wechsel/vorschau":{"get":{"tags":["🪄 Levels"],"summary":"Get Kurve Wechsel Vorschau","description":"Wen der Wechsel wohin verschiebt - vor dem Klick.\n\n─── Warum es diese Vorschau geben MUSS ─────────────────────────────────\n\nWeil ein Kurvenwechsel jede Stufe des Servers veraendert und sich nicht\nzurueckdrehen laesst: `level_eingriffe.NICHT_UMKEHRBAR` fuehrt\n`ART_KURVE_WECHSEL` ausdruecklich auf, weil die Umrechnung in beide\nRichtungen rundet. Ein Zurueckwechseln ist ein zweiter Vorgang mit\neigenem Verlust.\n\nDie Beispiele kommen aus der Spitze der Rangliste - dort ist die\nVerschiebung am groessten, und dort sitzen die Leute, die sich melden.","operationId":"get_kurve_wechsel_vorschau_api_v1_servers__server_id__level_kurve_wechsel_vorschau_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"ziel","in":"query","required":false,"schema":{"type":"string","title":"Ziel"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/kurve/fortsetzen":{"post":{"tags":["🪄 Levels"],"summary":"Kurve Fortsetzen","description":"Die abgeschnittene Umrechnung weiterfuehren.\n\nDie alte Kurve und der Stand kommen aus den Einstellungen, nicht aus dem\nAnfragekoerper - siehe `KURVE_WECHSEL_VON_SCHLUESSEL`. Der Aufrufer darf\n`ab_id` mitgeben; ist er kleiner als der gespeicherte Stand, gewinnt der\ngespeicherte. Sonst waere ein zurueckgesetzter Wert eine zweite\nUmrechnung derselben Profile - und die rechnete von der NEUEN Kurve auf\ndie neue, also von einem Stand, den es nie gab.","operationId":"kurve_fortsetzen_api_v1_servers__server_id__level_kurve_fortsetzen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KurveFortsetzung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/simulator":{"post":{"tags":["🪄 Levels"],"summary":"Level Simulator","description":"Wann erreicht jemand mit diesem Verhalten welche Stufe?\n\nDie einzige Frage, die jemand beim Einstellen der XP-Werte wirklich hat -\nund bis hierher konnte sie niemand beantworten. Man stellt\n`xp_per_message_base` auf 7 statt 5 und erfaehrt daraus nichts, weil die\nKurve quadratisch ist.\n\nWas fehlt, kommt aus den Einstellungen DIESES Servers. Der Simulator\nbeantwortet damit \"wie lange dauert Stufe 50 bei uns\" und nicht \"bei\nirgendwelchen Werten\".","operationId":"level_simulator_api_v1_servers__server_id__level_simulator_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Simulation"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/fairness":{"get":{"tags":["🪄 Levels"],"summary":"Get Level Fairness","description":"Die acht Fairness-Werte.\n\nDie Vorgaben kommen aus `level_fairness.VORGABEN` und werden hier NICHT\nwiederholt: `_get_settings` bestimmt den Zieltyp aus dem Vorgabewert, und\neine zweite Liste hier waere die Stelle, an der ein geaenderter Standard\nnicht ankommt.","operationId":"get_level_fairness_api_v1_servers__server_id__level_fairness_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🪄 Levels"],"summary":"Set Level Fairness","description":"Die Fairness-Werte setzen.\n\nWahrheitswerte gehen als \"true\"/\"false\" in die Datenbank - dieselbe\nSchreibweise wie bei den Voice-Schaltern weiter oben, weil `setting_bool`\nbeim Lesen die Kleinschreibung erwartet und der Bestand alle drei\nSchreibweisen enthaelt.","operationId":"set_level_fairness_api_v1_servers__server_id__level_fairness_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FairnessEinstellungen"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/fairness/verdacht":{"get":{"tags":["🪄 Levels"],"summary":"Get Level Fairness Verdacht","description":"Wer auffaellig viel XP je Nachricht hat - und sonst nichts.\n\n─── Warum es diesen Endpunkt geben MUSS ────────────────────────────────\n\n`level_fairness.verdacht_pruefen` war gebaut und getestet und von\nnirgendwo erreichbar. Die Fairness-Regeln beantworten \"was zaehlt nicht\",\ndiese Liste beantwortet \"bei wem hat es trotzdem nicht funktioniert\" -\nund ohne sie kann ein Serverbetreiber die Regeln nur ins Blaue schaerfen.\n\n─── Was diese Liste NICHT ist ──────────────────────────────────────────\n\nKein Urteil. Die Kennzahl hat Gruende, die kein Farmen sind: Sprachzeit,\nXP aus der Wirtschaft, eine Bonusrolle, ein Doppel-XP-Wochenende.\nDeshalb gibt es hier auch keine Handlung - wer eingreifen will, tut das\nim Mitglieder-Reiter, wo der Eingriff ins Protokoll wandert.","operationId":"get_level_fairness_verdacht_api_v1_servers__server_id__level_fairness_verdacht_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/verfall":{"get":{"tags":["🪄 Levels"],"summary":"Get Level Verfall","description":"Die vier Verfalls-Werte.","operationId":"get_level_verfall_api_v1_servers__server_id__level_verfall_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🪄 Levels"],"summary":"Set Level Verfall","description":"Die Verfalls-Werte setzen.\n\n─── Warum das Einschalten hier NICHTS abzieht ──────────────────────────\n\nWeil `verfall_gerechnet_bis` auf jedem Profil auf NULL steht, und\n`level_verfall.berechnen` gibt fuer NULL ausdruecklich `None` zurueck:\nder erste Lauf setzt nur den Startpunkt. Ein Server, der Verfall\neinschaltet, faengt an dem Tag an zu zaehlen und verliert seine\nVorgeschichte - das ist die richtige Richtung des Irrtums, und die\nAlternative waere ein Massenloeschvorgang beim Umlegen eines Schalters.","operationId":"set_level_verfall_api_v1_servers__server_id__level_verfall_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerfallEinstellungen"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/verfall/vorschau":{"get":{"tags":["🪄 Levels"],"summary":"Get Verfall Vorschau","description":"Was der Verfall fuer ein Beispielprofil bedeutet.\n\n─── Warum das Dashboard das zeigen MUSS ────────────────────────────────\n\n\"5 Prozent pro Woche\" klingt harmlos. Dass davon nach einem halben Jahr\nnoch ein Viertel uebrig ist, steht nirgends - und ein Serverbetreiber,\nder es erst an den Beschwerden merkt, hat seinen Mitgliedern etwas\nweggenommen, das er nicht wegnehmen wollte.\n\nGerechnet wird mit den GESPEICHERTEN Werten. Wer den Regler bewegt,\nspeichert erst und sieht dann - das ist eine Umdrehung mehr, dafuer zeigt\ndie Vorschau nie etwas anderes als das, was tatsaechlich gilt.","operationId":"get_verfall_vorschau_api_v1_servers__server_id__level_verfall_vorschau_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"beispiel_level","in":"query","required":false,"schema":{"type":"integer","default":40,"title":"Beispiel Level"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/oeffentlich":{"get":{"tags":["🪄 Levels"],"summary":"Get Leaderboard Oeffentlich","description":"Ob die Bestenliste dieses Servers ohne Anmeldung sichtbar ist.","operationId":"get_leaderboard_oeffentlich_api_v1_servers__server_id__level_oeffentlich_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🪄 Levels"],"summary":"Set Leaderboard Oeffentlich","description":"Die oeffentliche Bestenliste ein- oder ausschalten.\n\nAusgewertet wird der Schalter in `api/routers/leaderboards.py` - dort\nsteht auch, warum seine Vorgabe TRUE ist und warum ein abgeschalteter\nServer mit 404 antwortet und nicht mit 403.\n\n─── Warum der Bot benachrichtigt wird, obwohl ihn das nichts angeht ────\n\nDer Bot liest den Schalter nicht. Der gecachte Endpunkt in\n`leaderboards.py` prueft ihn dagegen VOR dem Cache, bei jeder Anfrage -\neine Abschaltung wirkt also sofort. Das Ereignis geht trotzdem raus, weil\ndieser Endpunkt in `server_settings` schreibt und der Level-Cog seine\nKopie dieser Tabelle je Server haelt: ein Schluessel, der dort mit altem\nWert liegen bleibt, ist der Anfang einer Fehlersuche, die nirgendwo\nhinfuehrt.","operationId":"set_leaderboard_oeffentlich_api_v1_servers__server_id__level_oeffentlich_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OeffentlichEinstellung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/settings":{"get":{"tags":["🪙 Economy"],"summary":"Einstellungen Lesen","description":"Die Grundeinstellungen der Wirtschaft.\n\nLiefert auch die Vorgabewerte mit: das Dashboard soll zeigen koennen,\nwas der Ausgangszustand war, ohne ihn fest einzubauen.","operationId":"einstellungen_lesen_api_v1_servers__server_id__economy_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🪙 Economy"],"summary":"Einstellungen Schreiben","description":"Die Regler schreiben - was bis heute nichts konnte.","operationId":"einstellungen_schreiben_api_v1_servers__server_id__economy_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WirtschaftEinstellungen"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/balance":{"get":{"tags":["🪙 Economy"],"summary":"Regelwerk Lesen","description":"Das geltende Regelwerk samt aller abgeleiteten Betraege.","operationId":"regelwerk_lesen_api_v1_servers__server_id__economy_balance_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🪙 Economy"],"summary":"Regelwerk Schreiben","description":"Stellschrauben des Regelwerks feinjustieren.\n\nLegt die Zeile beim ersten Speichern selbst an - seit Nachtlauf 3 gibt\nes nichts mehr, worauf man vorher umstellen muesste. Angelegt wird mit\nden Werten des STANDARDS (`balance.standard_werte`), nicht mit der\nTabellenvorgabe: sonst schaltete das Drehen am Tagesziel nebenbei\nVermoegensabgabe und Ueberweisungsgebuehr ein, die der Server bis dahin\nnicht hatte. Eine zurueckgestellte Zeile (`balance_version = 1`) wird\ndabei wieder zur eigenen Einstellung - ebenfalls mit den Abgaben des\nStandards, denn die waren der Grund fuers Zurueckstellen.","operationId":"regelwerk_schreiben_api_v1_servers__server_id__economy_balance_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceEinstellungen"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/balance/vorschau":{"post":{"tags":["🪙 Economy"],"summary":"Regelwerk Vorschau","description":"Was WAEREN die Betraege, wenn man das so speichert?\n\nOhne diese Vorschau muesste ein Admin die Wirtschaft eines laufenden\nServers umstellen, um zu sehen, was die Umstellung bewirkt. Genau das\nsoll niemand tun muessen - eine Wirtschaft ist nichts, woran man\nausprobiert.\n\nSpeichert ausdruecklich nichts.","operationId":"regelwerk_vorschau_api_v1_servers__server_id__economy_balance_vorschau_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceEinstellungen"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/balance/umstellen":{"post":{"tags":["🪙 Economy"],"summary":"Regelwerk Umstellen","description":"Auf das abgeleitete Regelwerk umstellen - oder zurueck.\n\nWas sie NICHT tut: Kontostaende anfassen. Sie aendert die Regeln fuer das,\nwas ab jetzt passiert. Wer bestehende Bestaende zuruecksetzen will,\nnimmt den Konten-Reset - ausdruecklich und getrennt.\n\n─── Warum hier NICHT mehr `require_owner` steht ────────────────────────\n\nHier stand \"Nur der Besitzer - eine Umstellung aendert, wie sich der\nServer fuer JEDEN Spieler anfuehlt\". Das Argument stimmt, nur hat es\nnichts verhindert: `PUT /economy/balance` daneben stellt dieselben zwanzig\nWerte einzeln, und das durfte jede Dashboard-Rolle schon immer. Wer die\nWirtschaft umbauen wollte, konnte es - er musste nur den umstaendlichen\nWeg nehmen.\n\nDie Schranke hat also nicht den Eingriff gesperrt, sondern den GEFUEHRTEN\nWeg dorthin: den einen Knopf, der alle zwanzig Werte in ein Verhaeltnis\nsetzt, das jemand gerechnet hat. Sie stand genau vor der sicheren\nVariante und liess die unsichere offen.\n\nGemeldet als Support-Ticket 42: ein Admin eines Premium-Servers kam an\nseine Wirtschaft nicht heran und bekam ein nacktes \"HTTP 403\".\n\nWas scharf bleibt und warum: der Konten-Reset und die Saisons. Die\nloeschen den Spielfortschritt anderer Leute, und dafuer gibt es keinen\nzweiten Weg, der ohnehin offen stuende. Regeln aendern darf, wer das\nDashboard bedienen darf; Besitz loeschen nur der Besitzer.","operationId":"regelwerk_umstellen_api_v1_servers__server_id__economy_balance_umstellen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegelwerkUmstellung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/vorlagen":{"get":{"tags":["🪙 Economy"],"summary":"Vorlagen Lesen","description":"Die Vorlagen zur Auswahl - mit dem, was sie bewirken.\n\nAusdruecklich mit den ABGELEITETEN Betraegen, nicht nur den\nStellschrauben: derselbe Gedanke wie bei der Regelwerk-Vorschau. Wer\n\"Casino\" waehlt, soll vorher sehen, dass `/work` dort 875 Coins bringt\nund die Vermoegensabgabe aus ist - sonst waehlt er ein Wort und hofft.","operationId":"vorlagen_lesen_api_v1_servers__server_id__economy_vorlagen_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🪙 Economy"],"summary":"Vorlage Anwenden Endpunkt","description":"Eine Vorlage anwenden - das hebt den Server auf Fassung 2.\n\nWas sie NICHT tut: Kontostaende, Geschaefte, Serien, Gems, Tokens oder\nPrestige anfassen. Sie schreibt Regeln, nicht Besitz. Wer gestern vier\nMilliarden Coins hatte, hat sie heute auch - sie sind nur anders viel\nwert.\n\nZugriff wie bei `/balance/umstellen`, und die Begruendung steht dort\nausgeschrieben: eine Vorlage kann nichts, was `PUT /economy/balance` fuer\ndieselbe Rolle nicht auch koennte - sie tut es nur in einem Zug und mit\nWerten, die zueinander passen.","operationId":"vorlage_anwenden_endpunkt_api_v1_servers__server_id__economy_vorlagen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VorlageAnwenden"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/saison-pass":{"get":{"tags":["🪙 Economy"],"summary":"Saison Pass Lesen","description":"Die Titelstufen und was der Server daraus gemacht hat.\n\nOhne Premium-Pruefung: Lesen ist nie gesperrt. Ein Dashboard, das die\nStufen nicht anzeigen darf, kann auch nicht erklaeren, was Premium hier\nueberhaupt aendert.","operationId":"saison_pass_lesen_api_v1_servers__server_id__economy_saison_pass_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🪙 Economy"],"summary":"Saison Pass Titel Setzen","description":"Einen eigenen Titeltext setzen - oder leeren.\n\nSETZEN braucht Premium. LEEREN nie: wer sein Abo kuendigt, muss seine\nEinstellung wieder entfernen koennen, sonst haengt sie fuer immer fest.","operationId":"saison_pass_titel_setzen_api_v1_servers__server_id__economy_saison_pass_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaisonTitelText"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/health":{"get":{"tags":["🪙 Economy"],"summary":"Gesundheit","description":"Der Zustand dieser Wirtschaft in Zahlen.\n\nDas ist der Bericht, der auf Plattformebene die Schieflage sichtbar\ngemacht hat - hier je Server, damit ein Admin sie an seinem eigenen\nServer sehen kann, bevor sie zum Problem wird.\n\nDie drei Fragen, die er beantwortet:\n  1. Waechst die Geldmenge schneller, als sie schrumpft? (Inflation)\n  2. Welche Quelle erschafft das Geld? (Faucet-Rangliste)\n  3. Wem gehoert es? (Konzentration)\n  4. Wie viel davon waren wir selbst? (Eingriffe)\n\nDie vierte kam mit dem Dashboard dazu. Ohne sie liest ein Admin die\neigene Ausschuettung als Inflation und senkt danach die Ertraege fuer\nalle - die Begruendung steht in `economy/eingriff_wirkung.py`.","operationId":"gesundheit_api_v1_servers__server_id__economy_health_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"tage","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Tage"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/accounts":{"get":{"tags":["🪙 Economy"],"summary":"Konten Lesen","description":"Die Konten des Servers.\n\n`nur_aktive` steht bewusst auf True: plattformweit haben 230.393 von\n231.692 Profilen nie einen Wirtschaftsbefehl benutzt. Eine Liste, die\nmit diesen Karteileichen beginnt, ist unbrauchbar.","operationId":"konten_lesen_api_v1_servers__server_id__economy_accounts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"sortierung","in":"query","required":false,"schema":{"type":"string","default":"vermoegen","title":"Sortierung"}},{"name":"seite","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Seite"}},{"name":"pro_seite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Pro Seite"}},{"name":"nur_aktive","in":"query","required":false,"schema":{"type":"boolean","description":"Profile ohne jedes Spiel ausblenden","default":true,"title":"Nur Aktive"},"description":"Profile ohne jedes Spiel ausblenden"},{"name":"suche","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Suche"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/accounts/{user_id}/adjust":{"post":{"tags":["🪙 Economy"],"summary":"Konto Anpassen","description":"Ein Konto anpassen - der Ersatz fuer `/admincoins`.\n\nDrei Unterschiede zum Discord-Befehl, und alle drei sind der Grund,\nwarum der Befehl 2.799-mal in 30 Tagen laeuft:\n\n  * Kein Deckel bei einer Million je Vorgang.\n  * \"setzen\" gibt es ueberhaupt erst hier - bisher musste man den\n    Bestand ablesen und die Differenz selbst rechnen.\n  * Ein Grund wird mitgeschrieben. Kontostaende sind das, worueber sich\n    Spieler beschweren, und \"warum habe ich weniger\" muss in drei Wochen\n    noch beantwortbar sein.","operationId":"konto_anpassen_api_v1_servers__server_id__economy_accounts__user_id__adjust_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KontoAnpassung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/accounts/reset":{"post":{"tags":["🪙 Economy"],"summary":"Konten Zuruecksetzen","description":"Konten zuruecksetzen - der scharfe Eingriff.\n\nNur der Besitzer, und mit Wortlaut-Bestaetigung: das hier loescht den\nSpielfortschritt anderer Leute. Prestige bleibt auf Wunsch stehen, weil\ndas der uebliche Fall beim Saisonwechsel ist - was jemand ueber Monate\naufgebaut hat, soll nicht am Kontostand haengen.","operationId":"konten_zuruecksetzen_api_v1_servers__server_id__economy_accounts_reset_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MassenReset"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/transactions":{"get":{"tags":["🪙 Economy"],"summary":"Transaktionen","description":"Das Pruefbuch: wer hat wann wie viel bekommen oder verloren.\n\nFuer die Frage, die im Support am haeufigsten kommt und bisher nicht\nbeantwortbar war: \"Warum habe ich weniger Coins als gestern?\"","operationId":"transaktionen_api_v1_servers__server_id__economy_transactions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"art","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Art"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"User Id"}},{"name":"tage","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Tage"}},{"name":"seite","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Seite"}},{"name":"pro_seite","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Pro Seite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/seasons":{"get":{"tags":["🪙 Economy"],"summary":"Saisons Lesen","description":"Die laufende Saison und die Endstaende der vergangenen.","operationId":"saisons_lesen_api_v1_servers__server_id__economy_seasons_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🪙 Economy"],"summary":"Saison Starten Endpunkt","description":"Eine Saison beginnen.\n\nNur der Besitzer: eine Saison mit Reset beendet den Fortschritt aller\nSpieler zu einem festen Zeitpunkt. Das ist keine Einstellung, die eine\nDashboard-Rolle nebenbei treffen sollte.\n\nSetzt beim Start NICHTS zurueck - das passiert erst am Ende. Wer sofort\nzuruecksetzen will, nimmt den Konten-Reset.","operationId":"saison_starten_endpunkt_api_v1_servers__server_id__economy_seasons_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaisonStart"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/seasons/beenden":{"post":{"tags":["🪙 Economy"],"summary":"Saison Beenden Endpunkt","description":"Die laufende Saison sofort abschliessen.\n\nDerselbe Ablauf wie beim regulaeren Ende: Rangliste einfrieren,\nzuruecksetzen (falls eingestellt), naechste starten (falls eingestellt).","operationId":"saison_beenden_endpunkt_api_v1_servers__server_id__economy_seasons_beenden_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaisonBeenden"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/seasons/laufend":{"patch":{"tags":["🪙 Economy"],"summary":"Saison Aendern Endpunkt","description":"Die laufende Saison anpassen: Dauer, Reset am Ende, Fortsetzung.\n\nNur der Besitzer, wie Start und Ende: jeder der drei Werte entscheidet,\nob und wann alle Konten des Servers zurueckgesetzt werden.\n\n`laeuft_weiter=false` ist der Aus-Schalter des Saison-Systems: die\nlaufende Saison endet zu ihrem Termin (oder ueber das Beenden), und\ndanach beginnt keine neue, bis jemand eine startet. Ohne diesen Weg\nwar eine einmal gestartete Saison mit Fortsetzung nicht abschaltbar.","operationId":"saison_aendern_endpunkt_api_v1_servers__server_id__economy_seasons_laufend_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__SaisonAenderung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/catalog/{art}":{"get":{"tags":["🪙 Economy"],"summary":"Katalog Lesen","description":"Alle Eintraege eines Katalogs.","operationId":"katalog_lesen_api_v1_servers__server_id__economy_catalog__art__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"art","in":"path","required":true,"schema":{"type":"string","description":"fishing | mining | properties","title":"Art"},"description":"fishing | mining | properties"},{"name":"nur_aktive","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Nur Aktive"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🪙 Economy"],"summary":"Katalog Anlegen","description":"Einen neuen Eintrag anlegen.","operationId":"katalog_anlegen_api_v1_servers__server_id__economy_catalog__art__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"art","in":"path","required":true,"schema":{"type":"string","description":"fishing | mining | properties","title":"Art"},"description":"fishing | mining | properties"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Eingabe"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/catalog/{art}/{eintrag_id}":{"put":{"tags":["🪙 Economy"],"summary":"Katalog Aendern","description":"Einen Eintrag aendern.","operationId":"katalog_aendern_api_v1_servers__server_id__economy_catalog__art___eintrag_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"art","in":"path","required":true,"schema":{"type":"string","description":"fishing | mining | properties","title":"Art"},"description":"fishing | mining | properties"},{"name":"eintrag_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Eintrag Id"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Eingabe"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🪙 Economy"],"summary":"Katalog Loeschen","description":"Einen Eintrag entfernen.\n\nBei Immobilien wird NICHT geloescht, sondern abgeschaltet: an einer\nImmobilie haengen `user_properties` mit echten Kaeufen, und ein CASCADE\nwuerde Spielern etwas wegnehmen, wofuer sie bezahlt haben.\n\nDer LETZTE Eintrag eines Katalogs wird ebenfalls nur abgeschaltet. Der\nBot saet die Vorgaben in jede Liste, die gar keine Zeile hat\n(`ensure_default_content`, einmal je Server und Neustart). Eine\nleergeloeschte Liste saehe fuer ihn aus wie eine nie angelegte - wer\nalle Angelplaetze entfernt, um das Angeln abzustellen, haette sie nach\ndem naechsten Deploy wieder. Die abgeschaltete Zeile haelt fest, dass\nhier jemand entschieden hat.","operationId":"katalog_loeschen_api_v1_servers__server_id__economy_catalog__art___eintrag_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"art","in":"path","required":true,"schema":{"type":"string","description":"fishing | mining | properties","title":"Art"},"description":"fishing | mining | properties"},{"name":"eintrag_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Eintrag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/shop":{"get":{"tags":["🪙 Economy"],"summary":"Shop Lesen","description":"Die Shop-Eintraege des Servers samt Artikeldaten.","operationId":"shop_lesen_api_v1_servers__server_id__economy_shop_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🪙 Economy"],"summary":"Shop Anlegen","description":"Einen Artikel in den Shop stellen.\n\nLegt Artikel und Shop-Eintrag zusammen an - getrennt waeren es zwei\nAufrufe, zwischen denen ein Artikel ohne Shop-Eintrag entstehen kann,\nden danach niemand mehr findet.","operationId":"shop_anlegen_api_v1_servers__server_id__economy_shop_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopEintragEingabe"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/shop/{eintrag_id}":{"put":{"tags":["🪙 Economy"],"summary":"Shop Aendern","description":"Preis, Bestand oder Artikeldaten aendern.","operationId":"shop_aendern_api_v1_servers__server_id__economy_shop__eintrag_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"eintrag_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Eintrag Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopEintragEingabe"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🪙 Economy"],"summary":"Shop Entfernen","description":"Einen Artikel aus dem Shop nehmen.\n\nNur der Shop-Eintrag verschwindet, der Artikel bleibt: an ihm haengen\n`user_inventory`-Zeilen. Ein geloeschter Artikel wuerde per CASCADE die\nInventare aller Kaeufer leeren - Gegenstaende, die Spieler bezahlt haben.","operationId":"shop_entfernen_api_v1_servers__server_id__economy_shop__eintrag_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"eintrag_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Eintrag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/business-types":{"get":{"tags":["🪙 Economy"],"summary":"Geschaeftsarten","description":"Die Geschaeftsarten - nur lesbar, samt ihrer Ertragskurve.\n\nSie stehen als Konstante im Bot-Code (`EconomySystem.business_types`) und\nnicht in der Datenbank; hier sind sie deshalb Anzeige, nicht Eingabe.\n\nMitgeliefert wird die Kurve, weil sie die Ursache der gemessenen\nHyperinflation IST und man sie sehen koennen muss: das Einkommen waechst\nmit `basis * multiplikator ** (stufe - 1)`, bei `tech_startup` also von\n800 Coins am Tag auf 13.421.772.800 bei Stufe 25. Genau dieser Wert ist\nder hoechste gemessene Einzelbetrag einer Einkommensbuchung auf der\nProduktivdatenbank - die Kurve ist keine Theorie.","operationId":"geschaeftsarten_api_v1_servers__server_id__economy_business_types_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/stocks":{"get":{"tags":["🪙 Economy"],"summary":"Aktien Katalog","description":"Die sieben handelbaren Papiere - nur lesbar.\n\nSie stehen als Konstante im Bot-Code und nicht in der Datenbank; hier\nsind sie deshalb Anzeige, nicht Eingabe.\n\nEs gibt sie als Endpunkt, weil das Dashboard eine Aktienposition vergeben\nkann und die Auswahl dafuer aus DER Quelle kommen muss, gegen die auch\nder Bot prueft. Ein Freitextfeld ergaebe eine Position, die\n`update_stock_prices` nie wieder anfasst: sie stuende auf ewig auf ihrem\nEinstandswert, liesse sich verkaufen und waere nirgends erklaerbar.\n\nDer `base_price` ist NICHT der Tageskurs - der schwankt alle fuenf\nMinuten und lebt nur im Zwischenspeicher des Cogs. Er ist die\nBezugsgroesse, um die der Kurs schwankt, und genau der Wert, mit dem eine\nvergebene Position angelegt wird.","operationId":"aktien_katalog_api_v1_servers__server_id__economy_stocks_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/quests":{"get":{"tags":["🪙 Economy"],"summary":"Aufgaben Lesen","description":"Die Tagesaufgaben des Servers, samt Belohnung in Coins.\n\nDer Faktor allein sagt nichts - \"0,2\" beantwortet nicht, was jemand\nbekommt. Deshalb wird der Betrag aus dem Tagesziel des Servers\nmitgerechnet.","operationId":"aufgaben_lesen_api_v1_servers__server_id__economy_quests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/quests/vorgaben":{"post":{"tags":["🪙 Economy"],"summary":"Aufgaben Vorgaben","description":"Die Vorgabe-Aufgaben anlegen, falls sie fehlen.\n\nDer Weg fuer Bestandsserver: sie haben noch keine Aufgaben, weil die\nbeim Serverbeitritt entstehen und dieser laengst vorbei ist. Legt nichts\ndoppelt an - vorhandene Aufgaben behalten ihre Aenderungen.","operationId":"aufgaben_vorgaben_api_v1_servers__server_id__economy_quests_vorgaben_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/quests/{aufgabe_id}":{"put":{"tags":["🪙 Economy"],"summary":"Aufgabe Aendern","description":"Eine Aufgabe anpassen.","operationId":"aufgabe_aendern_api_v1_servers__server_id__economy_quests__aufgabe_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"aufgabe_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Aufgabe Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AufgabeEingabe"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/markt/angebote":{"get":{"tags":["🪙 Economy"],"summary":"Angebote Lesen","description":"Die Angebote eines Servers.\n\nRaeumt vorher die abgelaufenen weg (siehe Modulkopf) - das Dashboard soll\nkeine Angebote zeigen, die im Discord laengst nicht mehr kaufbar sind.\n\nNur lesend. Ein Admin, der ein einzelnes Angebot loeschen koennte, haette\neinen Weg, einem Spieler seine hinterlegte Ware ersatzlos wegzunehmen;\nwer den ganzen Markt nicht will, schaltet ihn ab - dabei geht jedes\noffene Angebot an seinen Verkaeufer zurueck.","operationId":"angebote_lesen_api_v1_servers__server_id__economy_markt_angebote_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"zustand","in":"query","required":false,"schema":{"type":"string","description":"offen | verkauft | zurueckgezogen | abgelaufen","default":"offen","title":"Zustand"},"description":"offen | verkauft | zurueckgezogen | abgelaufen"},{"name":"seite","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Seite"}},{"name":"pro_seite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Pro Seite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/markt/statistik":{"get":{"tags":["🪙 Economy"],"summary":"Statistik Lesen","description":"Was der Markt bewegt hat - und was er dem Kreislauf entzogen hat.\n\nDie zweite Zahl ist die wichtigere. Gemessen entstehen 1,84 Billionen\nCoins im Monat bei praktisch keinem Abfluss; die Marktgebuehr ist neben\nder Ueberweisungsgebuehr und der Vermoegensabgabe eine der wenigen\nStellen, an denen Geld den Kreislauf ueberhaupt verlaesst. Sie wird\ndeshalb getrennt ausgewiesen und nicht im Umsatz versteckt.\n\nMitgeliefert wird der Zustand des Marktes: ob er ueberhaupt laufen KANN\n(Fassung 2) und ob er eingeschaltet ist. Ohne das koennte das Dashboard\neinen leeren Markt nicht von einem abgeschalteten unterscheiden - und\ndie haeufigste Ursache fuer \"leer\" ist auf Bestandsservern die Fassung.","operationId":"statistik_lesen_api_v1_servers__server_id__economy_markt_statistik_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/markt/schalter":{"put":{"tags":["🪙 Economy"],"summary":"Markt Schalten Endpunkt","description":"Den Markt ein- oder ausschalten.\n\n─── Was beim Abschalten passiert ──────────────────────────────────────\n\nJedes offene Angebot wird aufgeloest und die hinterlegte Ware geht an\nihren Verkaeufer zurueck. Sie liegen zu lassen waere die kuerzere Zeile\nund die schlechtere Entscheidung: die Gegenstaende gehoeren Spielern, die\nnichts falsch gemacht haben, und ein abgeschalteter Markt zeigt keine\nListe mehr, aus der sie ihre Angebotsnummer ablesen koennten.\n\nWeil das ein Eingriff in laufende Vorgaenge ist, verlangt das Abschalten\neine Wortlaut-Bestaetigung. Das EINschalten nicht - es nimmt niemandem\netwas weg.\n\nKeine Zeile in `economy_markt_einstellungen` heisst \"an\". Das ist kein\nWiderspruch zum Opt-in: die Zustimmung ist das abgeleitete Regelwerk, und\nohne das laeuft der Markt gar nicht erst.","operationId":"markt_schalten_endpunkt_api_v1_servers__server_id__economy_markt_schalter_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarktSchalter"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/spieler/{user_id}":{"get":{"tags":["🪙 Economy"],"summary":"Akte Lesen","description":"Alles zu einem Spieler.\n\nEIN Endpunkt statt neun. Neun Abfragen aus der Oberflaeche heraus waeren\nneun Rundreisen fuer einen Bildschirm, der als Ganzes gelesen wird - und\nacht davon kaemen bei den allermeisten Spielern leer zurueck.\n\nDie Abschnitte kommen auch dann mit, wenn sie leer sind. Ein Abschnitt,\nder bei fehlendem Inhalt verschwindet, nimmt den Weg mit, etwas\nanzulegen - und genau der fehlt heute ueberall.","operationId":"akte_lesen_api_v1_servers__server_id__economy_spieler__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/eingriffe":{"get":{"tags":["🪙 Economy"],"summary":"Eingriffe Lesen","description":"Wer hat was an wem geaendert.\n\nOhne `ziel_user_id` das Buch des ganzen Servers, mit ihm der Abschnitt\neiner Akte. Ein eigener Endpunkt je Fall waere zweimal dieselbe Abfrage\nmit einem Filter Unterschied.","operationId":"eingriffe_lesen_api_v1_servers__server_id__economy_eingriffe_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"ziel_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Ziel User Id"}},{"name":"art","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Art"}},{"name":"seite","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Seite"}},{"name":"pro_seite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Pro Seite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/eingriffe/{eingriff_id}/rueckgaengig":{"post":{"tags":["🪙 Economy"],"summary":"Eingriff Zuruecknehmen","description":"Den letzten Griff daneben zurueckdrehen.\n\n─── Warum es das braucht ────────────────────────────────────────────────\n\nGemessen kommen auf 173 Nutzer 3.085 Anpassungen in 30 Tagen - achtzehn\nje Person. Bei dieser Zahl ist der Vertipper der Normalfall, nicht die\nAusnahme. Und \"setzen\" auf einen falschen Wert ist ohne Vorher-Wert\nueberhaupt nicht mehr herstellbar.\n\n─── Die wichtigste Entscheidung: Differenz, nicht Schnappschuss ─────────\n\nZurueckgeschrieben wird NIE der absolute Vorher-Wert. Der Bot bucht\ngleichzeitig auf dasselbe Konto: zwischen dem Eingriff und seiner\nRuecknahme koennen `/work`, `/daily`, der stuendliche Einkommenstakt und\nein Spielerhandel gelaufen sein. Ein absoluter Schnappschuss wuerde all\ndas mit loeschen - und zwar unsichtbar, weil die Zahl danach genauso\nplausibel aussieht wie vorher.\n\nStattdessen die Gegenbuchung: `-(nachher - vorher)`. Wer nach einem\nVertipper von +5.000.000 noch 500 Coins erarbeitet hat, behaelt die 500.\n\n─── Warum das Rueckgaengig selbst ein Eingriff ist ──────────────────────\n\nEs wird nichts geloescht. Die urspruengliche Zeile behaelt ihren Inhalt\nund bekommt `rueckgaengig_am`; daneben entsteht eine neue Zeile, die auf\nsie zeigt. Ein Protokoll, in dem etwas verschwinden kann, beweist nichts.","operationId":"eingriff_zuruecknehmen_api_v1_servers__server_id__economy_eingriffe__eingriff_id__rueckgaengig_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"eingriff_id","in":"path","required":true,"schema":{"type":"integer","description":"ID des Eingriffs","title":"Eingriff Id"},"description":"ID des Eingriffs"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EingriffRuecknahme"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/spieler/{user_id}/geschaefte":{"post":{"tags":["🪙 Economy"],"summary":"Geschaeft Vergeben","description":"Ein Geschaeft vergeben.\n\nArt und Stufe kommen aus `EconomySystem.BUSINESS_TYPES`; Ertrag und\nAusbaukosten werden daraus gerechnet. Ein Freitextfeld waere hier der\neine Fehler, der unsichtbar bleibt: `/business collect` ueberspringt\neinen unbekannten Typ stillschweigend, das geschenkte Geschaeft zahlte\nnie etwas aus, und niemand saehe warum.","operationId":"geschaeft_vergeben_api_v1_servers__server_id__economy_spieler__user_id__geschaefte_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeschaeftVergabe"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/geschaefte/{geschaeft_id}":{"patch":{"tags":["🪙 Economy"],"summary":"Geschaeft Aendern Endpunkt","description":"Stufe oder Betriebszustand aendern.\n\nBei einer Stufenaenderung rechnet der Schreibweg `daily_income` und\n`upgrade_cost` neu - genau wie `/business upgrade`. `total_earned` und\n`last_collected` bleiben unberuehrt: die schreibt der Bot fort, und sie\naus einem Schnappschuss zurueckzuschreiben ist der Fehler, der zuletzt\nin `/property collect` steckte.","operationId":"geschaeft_aendern_endpunkt_api_v1_servers__server_id__economy_geschaefte__geschaeft_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"geschaeft_id","in":"path","required":true,"schema":{"type":"integer","description":"ID des Geschaefts","title":"Geschaeft Id"},"description":"ID des Geschaefts"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeschaeftAenderung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🪙 Economy"],"summary":"Geschaeft Entziehen Endpunkt","description":"Ein Geschaeft entziehen - geloescht, nicht stillgelegt.\n\nDie Begruendung fuer Loeschen statt `is_active=False` steht bei\n`economy/besitz.py: geschaeft_entziehen`: es gibt im ganzen Bot keinen\nWeg, ein stillgelegtes Geschaeft wieder einzuschalten, ein Entzug ueber\ndiesen Schalter hinterliesse also dauerhaft eine tote rote Zeile.\n\nHat das Geschaeft Teilhaber, braucht es die zweite Hand: mit dem\nGeschaeft verschwinden ihre Anteile, und ihre Einlage bekommen sie nicht\nzurueck - eine Erstattung erschuefe Coins aus dem Nichts. Ihre\nProzentsaetze und Einlagen stehen deshalb im `vorher` des Protokolls.","operationId":"geschaeft_entziehen_endpunkt_api_v1_servers__server_id__economy_geschaefte__geschaeft_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"geschaeft_id","in":"path","required":true,"schema":{"type":"integer","description":"ID des Geschaefts","title":"Geschaeft Id"},"description":"ID des Geschaefts"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeschaeftEntzug"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/spieler/{user_id}/wartezeiten":{"post":{"tags":["🪙 Economy"],"summary":"Wartezeiten Zuruecksetzen Endpunkt","description":"Ausgewaehlte Wartezeiten aufheben.","operationId":"wartezeiten_zuruecksetzen_endpunkt_api_v1_servers__server_id__economy_spieler__user_id__wartezeiten_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WartezeitZuruecksetzung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/spieler/{user_id}/serien":{"post":{"tags":["🪙 Economy"],"summary":"Serien Setzen Endpunkt","description":"Daily- und Arbeitsserie setzen.\n\nDer zweite Grund, aus dem sich jemand meldet: eine abgerissene Serie -\nund der Grund dafuer ist meistens ein Ausfall auf unserer Seite.","operationId":"serien_setzen_endpunkt_api_v1_servers__server_id__economy_spieler__user_id__serien_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SerienSetzung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/spieler/{user_id}/beruf":{"put":{"tags":["🪙 Economy"],"summary":"Beruf Setzen Endpunkt","description":"Einen Beruf zuweisen oder entziehen.\n\nBeim WECHSEL fallen die Arbeitsgaenge auf null - genau wie im Spiel. Sie\nstehen zu lassen hiesse, den Aufstieg im neuen Beruf zu verschenken, und\ndessen Ertragszuschlag ist echtes Geld.","operationId":"beruf_setzen_endpunkt_api_v1_servers__server_id__economy_spieler__user_id__beruf_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BerufSetzung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/wirkungen/{wirkung_id}":{"delete":{"tags":["🪙 Economy"],"summary":"Wirkung Beenden Endpunkt","description":"Eine laufende Wirkung widerrufen.\n\nNur beenden, nicht vergeben. Eine Wirkung hat Stapelgruppe, Laufzeitart,\nAufladungen und eine Obergrenze der GRUPPE; eine falsch geformte ist\nschlimmer als keine, weil `EffectEngine.resolve` sie mitrechnet. Wer eine\ngeben will, hat dafuer den Shop.\n\nDie Zeile bleibt stehen und bekommt `status=\"revoked\"` - sie ist das\nPruefbuch des Wirkungssystems.","operationId":"wirkung_beenden_endpunkt_api_v1_servers__server_id__economy_wirkungen__wirkung_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"wirkung_id","in":"path","required":true,"schema":{"type":"integer","description":"ID der Wirkung","title":"Wirkung Id"},"description":"ID der Wirkung"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WirkungBeendigung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/spieler/{user_id}/aktien":{"post":{"tags":["🪙 Economy"],"summary":"Aktie Vergeben","description":"Anteile gutschreiben - in die eine Zeile je Symbol.","operationId":"aktie_vergeben_api_v1_servers__server_id__economy_spieler__user_id__aktien_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AktieVergabe"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/aktien/{position_id}":{"delete":{"tags":["🪙 Economy"],"summary":"Aktie Entziehen Endpunkt","description":"Eine ganze Aktienposition entziehen.","operationId":"aktie_entziehen_endpunkt_api_v1_servers__server_id__economy_aktien__position_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"position_id","in":"path","required":true,"schema":{"type":"integer","description":"ID der Position","title":"Position Id"},"description":"ID der Position"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BesitzEntzug"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/spieler/{user_id}/immobilien":{"post":{"tags":["🪙 Economy"],"summary":"Immobilie Vergeben","description":"Eine Immobilie aus dem Katalog dieses Servers uebereignen.","operationId":"immobilie_vergeben_api_v1_servers__server_id__economy_spieler__user_id__immobilien_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImmobilieVergabe"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/immobilien/{besitz_id}":{"delete":{"tags":["🪙 Economy"],"summary":"Immobilie Entziehen Endpunkt","operationId":"immobilie_entziehen_endpunkt_api_v1_servers__server_id__economy_immobilien__besitz_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"besitz_id","in":"path","required":true,"schema":{"type":"integer","description":"ID der Besitzzeile","title":"Besitz Id"},"description":"ID der Besitzzeile"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BesitzEntzug"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/spieler/{user_id}/inventar":{"post":{"tags":["🪙 Economy"],"summary":"Gegenstand Vergeben","description":"Gegenstaende ins Inventar legen.","operationId":"gegenstand_vergeben_api_v1_servers__server_id__economy_spieler__user_id__inventar_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GegenstandVergabe"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/inventar/{eintrag_id}":{"delete":{"tags":["🪙 Economy"],"summary":"Gegenstand Entziehen Endpunkt","description":"Gegenstaende herausnehmen - ganz oder teilweise.\n\nWas in einem Marktangebot LIEGT, ist hier nicht dabei: es wurde beim\nEinstellen aus dem Inventar genommen. Die Akte zeigt offene Angebote\ndaneben, damit das nicht wie ein Fehler aussieht.","operationId":"gegenstand_entziehen_endpunkt_api_v1_servers__server_id__economy_inventar__eintrag_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"eintrag_id","in":"path","required":true,"schema":{"type":"integer","description":"ID der Inventarzeile","title":"Eintrag Id"},"description":"ID der Inventarzeile"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BesitzEntzug"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/sammelaktion/vorschau":{"post":{"tags":["🪙 Economy"],"summary":"Sammelaktion Vorschau","description":"Wen es traefe, wie viel es waere - und was das fuer die Geldmenge heisst.\n\nAendert nichts. Der Anteil an der vorhandenen Geldmenge ist der Kern:\neine Gesamtsumme allein ist eine Zahl, ein Anteil ist eine Aussage.\n500.000 Coins sind auf einem Server mit 50 Millionen nichts und auf einem\nmit 300.000 eine Verdopplung.","operationId":"sammelaktion_vorschau_api_v1_servers__server_id__economy_sammelaktion_vorschau_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__Sammelaktion"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/economy/sammelaktion":{"post":{"tags":["🪙 Economy"],"summary":"Sammelaktion Ausfuehren","description":"Ausschuetten oder einziehen.\n\n─── Was hier NICHT passiert ────────────────────────────────────────────\n\nEs entsteht kein Profil. Wer nie einen Wirtschaftsbefehl benutzt hat,\nbekommt auch aus einer Sammelaktion nichts - Bestandsserver aendern sich\nnicht, und keine Zeile entsteht von selbst.\n\n─── Wo die eigentliche Buchung steht ───────────────────────────────────\n\nIn `economy/sammelaktion.py: ausschuetten` - samt der Begruendung, warum\nes ein UPDATE und keine Schleife ueber 500 Konten ist und warum das\nAbziehen ZWEI Anweisungen in genau dieser Reihenfolge braucht. Dort ist\nsie ohne HTTP-Testclient pruefbar, und genau die Reihenfolge ist das\nEinzige, was hier wirklich schiefgehen kann.\n\nWer weniger hatte als abgezogen wird, landet auf null. Die Summe im\nProtokoll ist deshalb die BEABSICHTIGTE und nicht die tatsaechliche - und\ndie Antwort sagt das.","operationId":"sammelaktion_ausfuehren_api_v1_servers__server_id__economy_sammelaktion_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__Sammelaktion"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/import/analyze":{"post":{"tags":["🪄 Levels"],"summary":"Analyze Import","operationId":"analyze_import_api_v1_servers__server_id__level_import_analyze_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_analyze_import_api_v1_servers__server_id__level_import_analyze_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/import/commit":{"post":{"tags":["🪄 Levels"],"summary":"Commit Import","operationId":"commit_import_api_v1_servers__server_id__level_import_commit_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommitRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/migration/status":{"get":{"tags":["🧳 Umzug"],"summary":"Migration Status","operationId":"migration_status_api_v1_servers__server_id__migration_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/migration/moderation/preview":{"post":{"tags":["🧳 Umzug"],"summary":"Moderation Preview","operationId":"moderation_preview_api_v1_servers__server_id__migration_moderation_preview_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerationScan"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/migration/moderation/import":{"post":{"tags":["🧳 Umzug"],"summary":"Moderation Import","operationId":"moderation_import_api_v1_servers__server_id__migration_moderation_import_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerationImport"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/migration/role-menu/read":{"post":{"tags":["🧳 Umzug"],"summary":"Role Menu Read","operationId":"role_menu_read_api_v1_servers__server_id__migration_role_menu_read_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleMenuRead"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/migration/role-menu/create":{"post":{"tags":["🧳 Umzug"],"summary":"Role Menu Create","operationId":"role_menu_create_api_v1_servers__server_id__migration_role_menu_create_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleMenuCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/multiplikatoren":{"get":{"tags":["🪄 Levels"],"summary":"Multiplikatoren Liste","description":"Alle Faktoren des Servers, mit ihrem Zustand.\n\nSortiert wie die Kette wirkt (global, Kategorie, Kanal, Rolle) und\ninnerhalb dessen nach Anlagezeit. Das ist dieselbe Reihenfolge, in der\n`berechnen` die Aufschluesselung liefert - eine Liste, die anders\nsortiert ist als die Erklaerung daneben, laesst beide falsch aussehen.","operationId":"multiplikatoren_liste_api_v1_servers__server_id__level_multiplikatoren_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_multiplikatoren__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🪄 Levels"],"summary":"Multiplikator Anlegen","description":"Einen Faktor anlegen - Dauerregel oder Ereignis.","operationId":"multiplikator_anlegen_api_v1_servers__server_id__level_multiplikatoren_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FaktorAnlage"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_multiplikatoren__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/multiplikatoren/{multiplikator_id}":{"patch":{"tags":["🪄 Levels"],"summary":"Multiplikator Aendern","description":"Einen bestehenden Faktor aendern.\n\nGeprueft wird der ZUSTAND NACH der Aenderung und nicht das, was\nhereinkommt: wer nur den Bereich von `channel` auf `global` dreht, laesst\neine Ziel-ID stehen, die dort nicht stehen darf. Eine Pruefung, die nur\ndie mitgeschickten Felder ansieht, laesst genau das durch.","operationId":"multiplikator_aendern_api_v1_servers__server_id__level_multiplikatoren__multiplikator_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"multiplikator_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Multiplikator Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FaktorAenderung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_multiplikatoren__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🪄 Levels"],"summary":"Multiplikator Loeschen","description":"Einen Faktor entfernen.\n\nOhne Papierkorb und ohne Protokollzeile: ein Faktor ist eine Regel fuer\ndie Zukunft, kein Eingriff in einen Bestand. Wer ihn loescht, nimmt\nniemandem etwas weg - er hoert nur auf, mehr zu geben.","operationId":"multiplikator_loeschen_api_v1_servers__server_id__level_multiplikatoren__multiplikator_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"multiplikator_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Multiplikator Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_multiplikatoren__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/multiplikatoren/kette":{"post":{"tags":["🪄 Levels"],"summary":"Multiplikator Kette","description":"Was aus Basis-XP wird, wenn dieser Fall eintritt - Glied fuer Glied.\n\n─── Warum die Ausschluesse mitgeladen werden ───────────────────────────\n\nWeil sie Teil derselben Kette sind (`economy/level_multiplikator.py`:\n\"Ein ausgeschlossener Kanal IST ein Faktor von null\"). Eine Vorschau, die\n\"2,4x\" sagt, waehrend der Kanal in der Ausschlussliste steht, ist keine\nVorschau, sondern die schlimmste Art von Fehlinformation: eine, die genau\ndort falsch ist, wo jemand nachgesehen hat.\n\n─── Warum `erzwingen=True` beim Laden ──────────────────────────────────\n\n`laden` haelt einen Prozess-Cache mit 300 Sekunden Haltbarkeit. Der ist\nim BOT richtig - dort laeuft er bei jeder Nachricht. Im API-Prozess ist\ner nur ein Weg, jemandem eine Vorschau auf Faktoren zu zeigen, die er\ngerade eben geaendert hat. Die Vorschau muss frisch sein, also wird sie\nfrisch geladen.","operationId":"multiplikator_kette_api_v1_servers__server_id__level_multiplikatoren_kette_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KettenAnfrage"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_multiplikatoren__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/belohnungen":{"get":{"tags":["🪄 Levels"],"summary":"Belohnungen Liste","description":"Alle Belohnungen des Servers, nach Stufe sortiert.\n\nDie aktive/gesperrte Menge wird ueber die ERSTELL-Reihenfolge bestimmt\n(id aufsteigend) und nicht ueber die Anzeigereihenfolge - wortgleich wie\nbei den Level-Rollen in `level_settings.py`, damit API und Bot dieselben\nZeilen sperren. Eine andere Sortierung hier hiesse: das Dashboard zeigt\nZeile 11 als aktiv, der Bot ueberspringt sie.","operationId":"belohnungen_liste_api_v1_servers__server_id__level_belohnungen_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_belohnungen__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🪄 Levels"],"summary":"Belohnung Anlegen","description":"Eine Belohnung anlegen.","operationId":"belohnung_anlegen_api_v1_servers__server_id__level_belohnungen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BelohnungAnlage"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_belohnungen__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🪄 Levels"],"summary":"Belohnungen Alle Loeschen","description":"Alle Belohnungen eines Servers entfernen.\n\nEngeres Limit als die Einzelloeschung (`CONFIG_UPDATE` statt\n`SETTINGS_UPDATE`), weil hinter EINEM Aufruf die ganze\nBelohnungskonfiguration steht - und nicht, weil er teurer waere.","operationId":"belohnungen_alle_loeschen_api_v1_servers__server_id__level_belohnungen_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_belohnungen__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/belohnungen/{belohnung_id}":{"patch":{"tags":["🪄 Levels"],"summary":"Belohnung Aendern","description":"Eine Belohnung aendern.\n\nGeprueft wird wie beim Multiplikator der ZUSTAND NACH der Aenderung:\nwer nur die Art von `economy.coins` auf `role.add` dreht, hinterlaesst\neinen gespeicherten `betrag` ohne Rolle - eine Belohnung, die nie wirkt.\nEine Pruefung ueber die mitgeschickten Felder allein liesse das durch.","operationId":"belohnung_aendern_api_v1_servers__server_id__level_belohnungen__belohnung_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"belohnung_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Belohnung Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BelohnungAenderung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_belohnungen__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🪄 Levels"],"summary":"Belohnung Loeschen","description":"Eine Belohnung entfernen.\n\nWas sie bereits vergeben hat, bleibt: die Rolle steht am Mitglied, die\nCoins sind gebucht, der Titel gehoert ihm (`LevelTitel`: \"ein verdienter\nTitel gehoert dem Spieler, nicht der aktuellen Konfiguration\"). Geloescht\nwird die REGEL fuer die Zukunft.","operationId":"belohnung_loeschen_api_v1_servers__server_id__level_belohnungen__belohnung_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"belohnung_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Belohnung Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_belohnungen__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/belohnungen/{belohnung_id}/rueckwirkend/vorschau":{"post":{"tags":["🪄 Levels"],"summary":"Rueckwirkend Vorschau","description":"Wie viele Mitglieder haetten die Stufe schon - vor dem Klick.\n\nAendert nichts. Sie ist der eigentliche Schutz: eine Belohnung mit\n`message.dm` auf Stufe 5 trifft auf einem gewachsenen Server tausende\nMenschen, und dass davon KEINE Nachricht rausgeht (`live=False`), muss\nman wissen, bevor man drueckt - nicht danach.","operationId":"rueckwirkend_vorschau_api_v1_servers__server_id__level_belohnungen__belohnung_id__rueckwirkend_vorschau_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"belohnung_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Belohnung Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_belohnungen__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/belohnungen/{belohnung_id}/rueckwirkend":{"post":{"tags":["🪄 Levels"],"summary":"Rueckwirkend Anwenden","description":"Eine bestehende Belohnung auf alle anwenden, die die Stufe schon haben.\n\n─── Was hier passiert und was beim Bot ─────────────────────────────────\n\nHier: Empfaenger suchen, Obergrenze durchsetzen, Liste in Redis legen,\nProtokollzeile schreiben, Ereignis senden. Beim Bot: die Liste abarbeiten\nueber `level_vergabe.vergeben(..., live=False)`, gedrosselt, mit den\nlebenden Discord-Objekten, die es dafuer braucht.\n\n─── Warum `live=False` nicht verhandelbar ist ──────────────────────────\n\n`level_belohnung._darf_erzaehlen` haengt genau daran. Mit `live=True`\ngingen bei 4.000 Betroffenen 4.000 Direktnachrichten raus - Discord\nwuerde den Bot dafuer zurecht bremsen, und die Empfaenger bekaemen eine\nGlueckwunschnachricht zu einer Stufe, die sie vor einem Jahr erreicht\nhaben. Die Rollen und Coins wirken trotzdem: sie sind das, was die Person\nhaette bekommen sollen. Die Nachricht ist die Feier des Augenblicks, und\nder ist vorbei.\n\n─── Warum das Protokoll VOR dem Ereignis geschrieben wird ──────────────\n\nWeil die Wirkung sonst eintreten kann, ohne dass sie im Buch steht. Der\numgekehrte Fall - Zeile im Buch, Ereignis nicht angekommen - ist der\nharmlosere: er ist als Zeile ohne Wirkung sichtbar, waehrend eine Wirkung\nohne Zeile genau der Zustand ist, den `economy/level_eingriffe.py`\nbeenden soll.","operationId":"rueckwirkend_anwenden_api_v1_servers__server_id__level_belohnungen__belohnung_id__rueckwirkend_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"belohnung_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Belohnung Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rueckwirkend"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_belohnungen__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/saisons":{"get":{"tags":["🪄 Levels"],"summary":"Saisons Liste","description":"Alle Saisons des Servers, die laufende zuerst herausgestellt.\n\nEin Server ohne Zeile bekommt eine leere Liste und keine erfundene\n\"Saison 1\". `economy/level_saison.py` ist dabei ausdruecklich: ohne eine\nZeile passiert nichts, kein Standardwert, keine Migration, die\nBestandsserver in eine Saison steckt.","operationId":"saisons_liste_api_v1_servers__server_id__level_saisons_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_saison__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🪄 Levels"],"summary":"Saison Anlegen","description":"Eine Saison planen.\n\nSie startet NICHT sofort. Entweder erreicht der Bot ihren Beginn\n(`saison_loop`, stuendlich) oder jemand drueckt `/starten`. Beides\nbenutzt dieselbe Sperre, also passiert es genau einmal.\n\n─── Woher Beginn und Ende kommen, wenn nur eine Dauer geschickt wird ───\n\n`beginnt_am` = jetzt, `endet_am` = jetzt + `dauer_tage`. Der Beginn ist\ndamit erreicht, und der stuendliche Bot-Lauf setzt die Saison zur\nnaechsten vollen Stunde in Gang, falls niemand vorher `/starten` drueckt.\nEin Beginn in der Zukunft waere ein Termin, den die Oberflaeche nie\nabgefragt hat - und ein Beginn, der NIE erreicht wird, waere eine Saison\nohne Anfang. Begonnen wird also jetzt, spaetestens in einer Stunde.","operationId":"saison_anlegen_api_v1_servers__server_id__level_saisons_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaisonAnlage"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_saison__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/saisons/vorschau":{"get":{"tags":["🪄 Levels"],"summary":"Saison Vorschau","description":"Was ein Saisonende bedeutet - vor dem Klick.\n\nWie bei der Sammelaktion ist die Vorschau nicht Beiwerk, sondern der\neigentliche Vorgang: wer nicht gesehen hat, wie viele Profile betroffen\nsind und wohin die Spitze faellt, soll nicht ausfuehren koennen. Die\nBeispiele kommen aus der SPITZE der Rangliste, weil dort der groesste\nabsolute Verlust steht.\n\n`reset_anteil` kommt als Abfrageparameter und nicht aus der Saison: die\nVorschau wird beim EINSTELLEN des Reglers gebraucht, also bevor\nirgendeine Zeile den Wert traegt.","operationId":"saison_vorschau_api_v1_servers__server_id__level_saisons_vorschau_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"reset_anteil","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":0,"default":0,"title":"Reset Anteil"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_saison__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/saisons/rangliste":{"get":{"tags":["🪄 Levels"],"summary":"Saison Rangliste","description":"Die Rangliste der LAUFENDEN Saison.\n\nNach `saison_xp` und nicht nach der Stufe - sonst stuende jemand, der mit\nStufe 70 in die Saison ging und nichts getan hat, ueber jemandem, der bei\n1 anfing und die ganze Saison aktiv war. Genau dagegen gibt es Saisons.\n\nNamen und Avatare kommen aus `User` und werden in EINER Abfrage geholt.\nEine Abfrage je Platz waeren hundert.\n\n─── Warum `pro_seite` wirklich gelesen wird ────────────────────────────\n\nWeil das Dashboard zehn Zeilen anfordert und darunter \"die besten 10\"\nschreibt. Wuerde der Endpunkt den Wert ignorieren und hundert Zeilen\nliefern, stuende die Zahl in der Ueberschrift und eine andere in der\nListe - ein Fehler, den niemand meldet, weil beide Zahlen plausibel\naussehen.\n\n─── Warum `saison_id` kein Filter ist, sondern eine Absicherung ────────\n\nLive gibt es nur EINE Rangliste: `saison_xp` zaehlt fuer die laufende\nSaison, und der Reset am Saisonende leert die Spalte. Zeigt der Aufruf\nauf eine andere Saison, waere jede Antwort falsch - die Zahlen gehoerten\neiner fremden. Dann also eine leere Liste statt fremder Zahlen unter\nfremdem Namen. Die Platzierung einer beendeten Saison steht im Archiv\n(`/saisons/archiv/{saison_id}`).","operationId":"saison_rangliste_api_v1_servers__server_id__level_saisons_rangliste_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"saison_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Saison Id"}},{"name":"pro_seite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":100,"title":"Pro Seite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_saison__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/saisons/archiv/{saison_id}":{"get":{"tags":["🪄 Levels"],"summary":"Saison Archiv","description":"Die festgehaltene Endplatzierung einer beendeten Saison.\n\nSie ist nicht nachrechenbar: die Rangliste ergab sich aus `saison_xp`,\nund der Reset hat die Spalte geleert. Was hier steht, ist alles, was es\nvon der Saison noch gibt - deshalb wird es archiviert und nicht abgefragt.","operationId":"saison_archiv_api_v1_servers__server_id__level_saisons_archiv__saison_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"saison_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Saison Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_saison__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/saisons/{saison_id}":{"patch":{"tags":["🪄 Levels"],"summary":"Saison Aendern","description":"Eine Saison aendern.\n\n─── Was sich noch aendern laesst und was nicht ─────────────────────────\n\nEine GEPLANTE Saison ist vollstaendig aenderbar; sie hat noch nichts\nbewirkt. Bei einer LAUFENDEN bleibt der Reset-Anteil stehen: ihn zu\naendern hiesse, die Bedingungen zu veraendern, unter denen die Leute\nmitgemacht haben. Der BEGINN einer laufenden Saison laesst sich hier gar\nnicht mehr ansprechen - er liegt in der Vergangenheit, und `dauer_tage`\nverschiebt nur das Ende. Das ist keine Luege ueber eine zaehlende\nRangliste, sondern eine Verlaengerung oder Verkuerzung, die als solche\nsichtbar ist (der Countdown springt).\n\nEine beendete oder abgebrochene Saison ist Geschichte und wird gar nicht\nmehr angefasst.","operationId":"saison_aendern_api_v1_servers__server_id__level_saisons__saison_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"saison_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Saison Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_saison__SaisonAenderung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_saison__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🪄 Levels"],"summary":"Saison Loeschen","description":"Eine GEPLANTE Saison loeschen.\n\nNur geplante. Eine Saison, die lief, hat Spuren hinterlassen -\nAnkuendigungen, Erwartungen, bei einer beendeten ausserdem ein Archiv\nmit Platzierungen. Fuer sie gibt es `/abbrechen`: die Zeile bleibt und\nsagt, was passiert ist. Das ist die ausdrueckliche Begruendung des\nZustands `abgebrochen` in `models.LevelSaison`.","operationId":"saison_loeschen_api_v1_servers__server_id__level_saisons__saison_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"saison_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Saison Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_saison__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/saisons/{saison_id}/starten":{"post":{"tags":["🪄 Levels"],"summary":"Saison Starten","description":"Eine geplante Saison sofort in Gang setzen.\n\n─── Warum `saison_xp` dabei geleert wird ───────────────────────────────\n\nWeil die Spalte auch ohne Saison mitgefuehrt wird - `level_vergabe`\naddiert sie im heissesten Pfad der Plattform, und eine Fallunterscheidung\ndort waere teurer als die Addition. Beim Start steht dort also der seit\ndem Neuentwurf aufgelaufene Wert, und der gehoert nicht in die erste\nSaison. EIN Massen-UPDATE, kein Schreibzugriff je Profil.\n\n─── Warum ein bedingtes UPDATE und kein `save()` ───────────────────────\n\nWeil der Bot dasselbe tut, sobald `beginnt_am` erreicht ist. Wer den\nUebergang gewinnt, leert `saison_xp`; wer ihn verliert, findet nichts\nmehr zu tun. Mit `save()` wuerden beide starten, und der zweite leerte\neine Saison-Rangliste, die bereits zaehlte.","operationId":"saison_starten_api_v1_servers__server_id__level_saisons__saison_id__starten_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"saison_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Saison Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_saison__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/saisons/{saison_id}/beenden":{"post":{"tags":["🪄 Levels"],"summary":"Saison Beenden","description":"Endabrechnung: archivieren, belohnen lassen, zuruecksetzen.\n\nDer gefaehrlichste Vorgang des Levelsystems. Er setzt hunderte Profile\nzurueck, er ist nicht umkehrbar (`level_eingriffe.NICHT_UMKEHRBAR`\nfuehrt `ART_SAISON_ENDE` ausdruecklich auf), und er darf genau einmal\nlaufen.\n\n─── Die drei Schutzmassnahmen ──────────────────────────────────────────\n\n1. Eine getippte Bestaetigung. Kein Doppelklick erzeugt sie. Im\n   Dashboard ist es der NAME der Saison (`UniversalConfirmDialog`), hier\n   der Satz `bestaetigung`, falls einer mitkommt - siehe `Bestaetigung`,\n   dort steht, warum er nicht mehr Pflicht ist.\n2. Das bedingte UPDATE als Sperre. Der stuendliche Bot-Lauf und dieser\n   Endpunkt greifen dieselbe Zeile an; nur einer gewinnt.\n3. Archivieren VOR dem Reset. Die Platzierung ergibt sich aus\n   `saison_xp`, und der Reset leert genau diese Spalte.\n\n─── Was in der Antwort steht ───────────────────────────────────────────\n\n`offen` und `letzte_id`. Bei mehr als 10.000 Profilen ist der Reset nach\ndiesem Aufruf noch nicht fertig; der Aufrufer ruft `/beenden/fortsetzen`,\nbis `offen` falsch ist. Die Saison ist zu diesem Zeitpunkt bereits\nbeendet und archiviert - offen ist nur noch das Zuruecksetzen.","operationId":"saison_beenden_api_v1_servers__server_id__level_saisons__saison_id__beenden_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"saison_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Saison Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_saison__Bestaetigung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_saison__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/saisons/{saison_id}/beenden/fortsetzen":{"post":{"tags":["🪄 Levels"],"summary":"Saison Reset Fortsetzen","description":"Den abgeschnittenen Reset weiterfuehren.\n\n─── Warum kein Protokolleintrag je Fortsetzung ─────────────────────────\n\nWeil es derselbe Vorgang ist. Das Buch haelt fest, was ein MENSCH\nentschieden hat, und die Entscheidung fiel beim Beenden. Eine Zeile je\nCharge waeren auf dem groessten Server einunddreissig Zeilen fuer einen\nKlick - und die eigentliche Aussage ginge darin unter.\n\n─── Warum `ab_id` vom Aufrufer kommt ───────────────────────────────────\n\nWeil `reset_ausfuehren` genau dort weitermacht, wo der letzte Durchgang\naufhoerte, und Fertiges nicht erneut anfasst. Ohne den Stand liefe die\nFortsetzung wieder bei null los und zoege denselben Anteil ein zweites\nMal ab - bei 50 Prozent stuende danach ein Viertel statt der Haelfte.\nDer Wert steht in der Antwort des vorigen Aufrufs.","operationId":"saison_reset_fortsetzen_api_v1_servers__server_id__level_saisons__saison_id__beenden_fortsetzen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"saison_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Saison Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fortsetzung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_saison__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/saisons/{saison_id}/abbrechen":{"post":{"tags":["🪄 Levels"],"summary":"Saison Abbrechen","description":"Eine Saison zurueckziehen - ohne Abrechnung, ohne Reset.\n\nDer Unterschied zum Beenden ist der ganze Zweck: NICHTS wird\nzurueckgesetzt, NICHTS wird belohnt, NICHTS wird archiviert. Die Zeile\nbleibt stehen und sagt, dass es diese Saison gab und wie sie ausging.\n\n─── Warum die Bestaetigung nur bei einer LAUFENDEN noetig ist ──────────\n\nWeil eine geplante Saison noch nichts bewirkt hat - sie zurueckzuziehen\nist dasselbe wie sie zu loeschen. Eine laufende dagegen zaehlt bereits\neine Rangliste, auf die sich Leute eingelassen haben; sie ohne Abrechnung\nzu beenden ist ein Wortbruch, und der soll getippt werden muessen.","operationId":"saison_abbrechen_api_v1_servers__server_id__level_saisons__saison_id__abbrechen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"saison_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Saison Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_saison__Bestaetigung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_saison__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/karte":{"get":{"tags":["🪄 Levels"],"summary":"Karte Lesen","description":"Der gespeicherte Entwurf - oder die Vorgaben, wenn es keinen gibt.\n\n─── Warum hier KEINE Premium-Pruefung steht ────────────────────────────\n\nWeil Lesen nichts kostet und weil ein Server, dessen Premium abgelaufen\nist, sehen koennen muss, was er eingestellt hat. Eine Einstellung, die\nman nicht mehr sehen kann, kann man auch nicht mehr entfernen.\n\n─── Warum der gespeicherte Entwurf beim LESEN geprueft wird ────────────\n\nWeil er aus einer aelteren Fassung dieses Schemas stammen kann, oder von\nHand geaendert wurde. `_entwurf_pruefen` wirft dabei allerdings einen\n400er, und das waere hier die falsche Antwort - also wird er still\nbereinigt und der Rest gemeldet. Die Karte muss auch dann entstehen,\nwenn in der Spalte Unsinn steht (`models.LevelKartenDesign`).","operationId":"karte_lesen_api_v1_servers__server_id__level_karte_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_karte__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🪄 Levels"],"summary":"Karte Setzen","description":"Den Entwurf setzen - oder mit einem leeren Verzeichnis leeren.\n\n─── Die Premium-Kopplung, wortgleich nach `achievements.py` ────────────\n\nSETZEN braucht Premium. LEEREN nicht - `entwurf: {}` geht immer durch.\nDer Grund steht dort und gilt hier genauso: sonst koennte ein Server nach\nPremium-Ablauf sein eigenes Werk nie wieder entfernen. Er saehe eine\nKarte, die er nicht mehr aendern und nicht mehr loswerden kann, und das\nist schlimmer, als sie nie gehabt zu haben.","operationId":"karte_setzen_api_v1_servers__server_id__level_karte_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KartenEntwurf"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_karte__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🪄 Levels"],"summary":"Karte Leeren","description":"Den Entwurf entfernen. OHNE Premium-Pruefung - siehe PUT.\n\nLoescht die Zeile ganz, statt sie mit einem leeren Entwurf stehen zu\nlassen: \"kein Entwurf\" und \"ein Entwurf, der nichts sagt\" sind dasselbe,\nund von zwei Darstellungen desselben Zustands ist eine zu viel.","operationId":"karte_leeren_api_v1_servers__server_id__level_karte_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_karte__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/mitglieder":{"get":{"tags":["🪄 Levels"],"summary":"Mitglieder Liste","description":"Die Mitgliederliste mit Filtern - die Grundlage jeder Massenaktion.\n\n─── Warum die Filter hier und nicht erst bei der Sammelaktion ──────────\n\nWeil man sehen muss, wen man trifft, BEVOR man etwas tut. Die\nSammelaktion nimmt dieselben Filter entgegen und trifft damit genau die\nMenge, die hier steht - wer die Liste gefiltert hat, hat die Vorschau\nschon gesehen.\n\n─── Warum die Filter `stufe_*` heissen und nicht `level_*` ─────────────\n\nWeil sie in der Oberflaeche \"Stufe von / bis\" heissen und der Reiter sie\ngenau so schickt. Ein Parameter, den niemand so nennt, wie er\nausgeschrieben wird, ist ein Parameter, der stillschweigend ignoriert\nwird - FastAPI verwirft unbekannte Abfrageteile ohne Fehler, und die\nListe stand dann ungefiltert da, obwohl der Filter gesetzt war.\n\nDasselbe gilt fuer die Sortierung. Die vier Werte sind die vier\nAuswahleintraege der Oberflaeche (`xp`, `stufe`, `aktiv`, `name`); die\nalten Namen (`rang`, `xp_gesamt`, `aktivitaet`) hat nie jemand\ngeschickt, und `xp` haette als unbekannter Wert einen 422 ergeben - also\neinen Reiter, der gar nichts zeigt.\n\n─── Warum die Namenssuche ueber Discord und nicht ueber die Datenbank ──\n\n`users.username` ist der GLOBALE Discord-Name und veraltet: er wird nur\nbeim ersten Kontakt geschrieben. Der Servername (Nickname) steht dort gar\nnicht. Eine Suche darueber faende genau die Leute nicht, die sich\numbenannt haben.\n\nDeshalb: die Mitgliederliste des Servers kommt aus `guild_live`\n(Discord, mit Cache), und die Suche laeuft darauf. Ist sie nicht\nverfuegbar, faellt die Suche auf die Discord-ID zurueck - das ist wenig,\naber es ist richtig, und der Aufrufer erfaehrt es (`namen_verfuegbar`).","operationId":"mitglieder_liste_api_v1_servers__server_id__level_mitglieder_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"suche","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Discord-ID oder Namensteil","title":"Suche"},"description":"Discord-ID oder Namensteil"},{"name":"stufe_von","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Stufe Von"}},{"name":"stufe_bis","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Stufe Bis"}},{"name":"inaktiv_tage","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":3650,"minimum":1},{"type":"null"}],"title":"Inaktiv Tage"}},{"name":"nur_eingefroren","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Nur Eingefroren"}},{"name":"sortierung","in":"query","required":false,"schema":{"enum":["xp","stufe","aktiv","name"],"type":"string","default":"xp","title":"Sortierung"}},{"name":"seite","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Seite"}},{"name":"pro_seite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Pro Seite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/mitglieder/{user_id}":{"get":{"tags":["🪄 Levels"],"summary":"Mitglied Akte","description":"Alles zu EINEM Mitglied - inklusive dessen, was Admins ihm angetan haben.\n\n─── Warum der Verlauf mit in die Akte gehoert ──────────────────────────\n\nWeil die erste Frage bei jeder Beschwerde \"warum habe ich weniger als\ngestern\" lautet, und die Antwort in aller Regel drei Zeilen darueber\nsteht. Ihn in einem eigenen Reiter zu verstecken hiesse, dass ihn\nniemand ansieht, bevor er raet.\n\n─── Warum eine Verlaufszeile `beschreibung` und `akteur` traegt ────────\n\nWeil die Schublade genau zwei Zeilen je Eintrag zeigt: WAS passiert ist\nund WER es getan hat. Beides steht so in keiner Spalte - das eine ist\nein uebersetzter Satz aus Art und Werten (`_beschreibung`), das andere\nein Name, den nur Discord kennt. Die rohen Felder (`art`, `vorher`,\n`nachher`) stehen daneben, weil sie den Satz belegen.","operationId":"mitglied_akte_api_v1_servers__server_id__level_mitglieder__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["🪄 Levels"],"summary":"Mitglied Aendern","description":"Stufe und XP eines Mitglieds setzen, addieren oder abziehen.\n\n─── Warum ueber die GESAMT-XP gerechnet wird ───────────────────────────\n\nWeil eine Stufe kein Wert ist, den man setzt, sondern das Ergebnis einer\nRechnung. Wer nur `level = 30` schreibt, hinterlaesst ein Profil mit\neinem Schwellenwert, der nicht zu 30 gehoert - und beim naechsten XP\nspringt es irgendwohin.\n\nDer Weg ist deshalb immer derselbe:\n\n    1. aktuelle Gesamt-XP ermitteln\n    2. die Aenderung darauf anwenden\n    3. ueber `_neu_einordnen` wieder Stufe, Rest und Schwelle machen\n\nDas gilt fuer alle vier Faelle - setzen, addieren, abziehen, beides\nzugleich - und deshalb gibt es nur diesen einen Weg.\n\n─── Warum `gesamt_xp_verdient` nur STEIGT ──────────────────────────────\n\nEs ist die Lebensleistung, nicht der Kontostand. Ein Admin, der XP\nhinzufuegt, erhoeht sie mit (die Person hat sie ja bekommen); ein Admin,\nder abzieht, senkt sie NICHT. Sonst waere die All-Time-Rangliste nach\njedem Eingriff ein Stueck falscher, und niemand koennte hinterher sagen,\nwer wirklich am meisten gesammelt hat.\n\nDie Ausnahme, die keine ist: das Zuruecksetzen auf Stufe 1 setzt sie\nebenfalls nicht zurueck. Ein zurueckgesetztes Profil hat die XP\ntrotzdem einmal verdient.","operationId":"mitglied_aendern_api_v1_servers__server_id__level_mitglieder__user_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MitgliedAenderung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/mitglieder/{user_id}/einfrieren":{"post":{"tags":["🪄 Levels"],"summary":"Mitglied Einfrieren","description":"XP-Sperre fuer EINE Person - ohne dass es jemand sieht.\n\n─── Warum das die bessere Sperre ist als die No-XP-Rolle ───────────────\n\nDie No-XP-Rolle ist im Discord sichtbar. Wer jemanden wegen XP-Farmens\naus der Wertung nimmt, haengt ihm damit ein Schild um - das ist eine\noeffentliche Strafe fuer eine Verwaltungsentscheidung, und sie trifft\nausserdem alle Traeger der Rolle gleich.\n\nEingefroren heisst: sammelt nichts mehr, BEHAELT aber alles. Der\nUnterschied zum Zuruecksetzen ist der ganze Zweck - ein Irrtum kostet\nhier nichts, und das Auftauen stellt den Zustand vollstaendig her.","operationId":"mitglied_einfrieren_api_v1_servers__server_id__level_mitglieder__user_id__einfrieren_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Einfrieren"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/mitglieder/{user_id}/zuruecksetzen":{"post":{"tags":["🪄 Levels"],"summary":"Mitglied Zuruecksetzen","description":"Auf Stufe 1 zurueck.\n\n`gesamt_xp_verdient` bleibt stehen - siehe `mitglied_aendern`. Ein\nzurueckgesetztes Profil hat seine XP trotzdem einmal verdient, und die\nAll-Time-Rangliste soll das wissen.\n\nUmkehrbar: `vorher` traegt den vollstaendigen Stand, und der Rueckbau\nschreibt ihn zurueck. Dass dabei zwischenzeitlich gesammelte XP verloren\ngehen, sagt die Antwort des Rueckbaus ausdruecklich.","operationId":"mitglied_zuruecksetzen_api_v1_servers__server_id__level_mitglieder__user_id__zuruecksetzen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Zuruecksetzen"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/protokoll":{"get":{"tags":["🪄 Levels"],"summary":"Protokoll Lesen","description":"Wer hat wem wann welches Level gegeben.\n\n─── Warum der Art-Filter gegen die Konstantenliste geprueft wird ───────\n\nWeil ein durchgereichter Filter aus der Oberflaeche sonst alles\ndurchliesse, was jemand in die Adresszeile schreibt. `ALLE_ARTEN` ist\ndie vollstaendige Liste; was dort nicht steht, gibt es nicht, und ein\n404 waere hier eine schlechtere Antwort als eine leere Liste - der\nFilter ist eine Anzeigeoption, kein Objekt.\n\n─── Warum die beiden Personenfilter `ziel` und `bearbeiter` heissen ────\n\nWeil der Reiter zwei SUCHFELDER hat und keine zwei Kennungsfelder: dort\nsteht \"Betroffene Person …\", und wer das liest, tippt einen Namen. Ein\nParameter `ziel_user_id` verlangte dagegen eine achtzehnstellige Zahl -\nund weil FastAPI unbekannte Abfrageteile still verwirft, tat der Filter\nschlicht nichts.\n\nGesucht wird deshalb wie in der Mitgliederliste: eine Zahl ist eine\nKennung, ein Wort ist ein Name (`_such_einschraenkung`).\n\n─── Warum eine Zeile `ziel` und `bearbeiter` als OBJEKT traegt ─────────\n\nWeil jede Zeile ein Gesicht, einen Namen und die Kennung zeigt. Drei\nflache Felder je Person waeren sechs Felder fuer zwei Menschen, und die\nZeile muesste sie im Browser wieder zu zwei Personen zusammensetzen -\nalso dieselbe Zuordnung noch einmal, an der Stelle, an der sie am\nleichtesten falsch wird.","operationId":"protokoll_lesen_api_v1_servers__server_id__level_protokoll_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"art","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Art"}},{"name":"ziel","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Discord-ID oder Namensteil","title":"Ziel"},"description":"Discord-ID oder Namensteil"},{"name":"bearbeiter","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Discord-ID oder Namensteil","title":"Bearbeiter"},"description":"Discord-ID oder Namensteil"},{"name":"seite","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Seite"}},{"name":"pro_seite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Pro Seite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/protokoll/{eingriff_id}/rueckgaengig":{"post":{"tags":["🪄 Levels"],"summary":"Eingriff Zuruecknehmen","description":"Den letzten Griff daneben zurueckdrehen.\n\n─── Warum das Rueckgaengig selbst ein Eingriff ist ─────────────────────\n\nEs wird nichts geloescht. Die urspruengliche Zeile behaelt ihren Inhalt\nund bekommt `rueckgaengig_am`; daneben entsteht eine neue Zeile, die auf\nsie zeigt. Ein Protokoll, in dem etwas verschwinden kann, beweist nichts.\n\n─── Warum der Eingriff ZUERST beansprucht wird ─────────────────────────\n\nDie Pruefung unten liest eine Kopie, die ausserhalb jeder Transaktion\ngeholt wurde. Wuerde `rueckgaengig_am` erst nach der Buchung gesetzt,\nkaemen zwei gleichzeitige Ruecknahmen desselben Eingriffs BEIDE daran\nvorbei - und buchten beide. Bei einer Differenz-Ruecknahme hiesse das:\nzweimal abgezogen.\n\nDer bedingte Statuswechsel ist dieselbe Absicherung, die das\nWirtschafts-Pruefbuch verwendet (`api/routers/economy_spieler.py`): die\nBedingung steht IM UPDATE, es gewinnt genau einer.","operationId":"eingriff_zuruecknehmen_api_v1_servers__server_id__level_protokoll__eingriff_id__rueckgaengig_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"eingriff_id","in":"path","required":true,"schema":{"type":"integer","title":"Eingriff Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ruecknahme"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/sammelaktion/vorschau":{"post":{"tags":["🪄 Levels"],"summary":"Sammelaktion Vorschau","description":"Wen es traefe und was es bewirkt - ohne etwas zu tun.\n\n─── Warum die Wirkung mitgerechnet wird und nicht nur die Anzahl ───────\n\nWeil \"412 Mitglieder betroffen\" nichts darueber sagt, was mit ihnen\npassiert. Bei `xp_nehmen` ist die eigentliche Frage, wie viele dabei eine\nStufe VERLIEREN und wie viele auf Stufe 1 landen - und die beantwortet\nkeine Anzahl.\n\n`wirkung_vorab` rechnet das durch, ohne zu schreiben. Es kostet eine\nzweite Abfrage; die ist an dieser Stelle richtig angelegt.","operationId":"sammelaktion_vorschau_api_v1_servers__server_id__level_sammelaktion_vorschau_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__Sammelaktion"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/sammelaktion":{"post":{"tags":["🪄 Levels"],"summary":"Sammelaktion Ausfuehren","description":"Ausfuehren - mit Bestaetigung.\n\n─── Warum die Empfaenger hier ERNEUT ermittelt werden ──────────────────\n\nWeil zwischen Vorschau und Klick Zeit vergangen ist. Die Menge wird aus\ndenselben Filtern neu gebildet; sie kann sich verschoben haben, aber\nnicht unbemerkt - die Antwort nennt die tatsaechliche Zahl, und das\nDashboard zeigt sie neben der Zahl aus der Vorschau.\n\nDie Alternative waere, die IDs aus der Vorschau mitzuschicken. Dann\nstuende aber im Protokoll eine Menge, die zum Zeitpunkt der Ausfuehrung\nvielleicht gar nicht mehr die gefilterte ist - und ein Mitglied, das\nzwischenzeitlich eingefroren wurde, waere trotzdem dabei.","operationId":"sammelaktion_ausfuehren_api_v1_servers__server_id__level_sammelaktion_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__Sammelaktion"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/export":{"get":{"tags":["🪄 Levels"],"summary":"Export Csv","description":"Alle Level-Profile als CSV.\n\n─── Warum das ueberhaupt existiert ─────────────────────────────────────\n\nEs gibt seit Langem einen IMPORT von anderen Bots\n(`api/routers/level_import.py`) und keinen Export. Das ist eine\nEinbahnstrasse, und sie sagt einem Serverbetreiber etwas ueber das\nVerhaeltnis: hereinkommen ist leicht, herauskommen nicht vorgesehen.\n\nDer Export dreht das um. Er ist zugleich das ehrlichste\nVertrauensargument, das dieses System machen kann - \"deine Daten\ngehoeren dir\" ist ein Satz, den ein Knopf beweist und eine\nDatenschutzerklaerung nicht.\n\n─── Warum als Stream und nicht als JSON-Antwort ────────────────────────\n\nWeil ein Server mit 60.000 Profilen sonst einen Antwortkoerper von\nmehreren Megabyte am Stueck aufbaut - im Speicher der API, fuer einen\nKlick. Der Stream schreibt in Bloecken und haelt nie mehr als einen im\nSpeicher.\n\n─── Warum keine Namen im Export ────────────────────────────────────────\n\nDiscord-Namen aendern sich, und die Kopie in `users.username` ist der\nglobale Name vom Zeitpunkt des ersten Kontakts. Ein Export mit veralteten\nNamen sieht vollstaendiger aus, als er ist, und jemand baut darauf eine\nZuordnung, die nicht stimmt. Die Discord-ID ist der Schluessel, der\nstimmt - wer Namen braucht, holt sie sich zur Ausgabezeit dazu.","operationId":"export_csv_api_v1_servers__server_id__level_export_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/karteileichen":{"post":{"tags":["🪄 Levels"],"summary":"Karteileichen","description":"Profile von Mitgliedern entfernen, die den Server verlassen haben.\n\n─── Warum diese Profile ueberhaupt bleiben ─────────────────────────────\n\nWeil ein Austritt nicht endgueltig ist. Wer zurueckkommt, soll seine\nStufe wiederfinden - das ist die haeufigere Geschichte als der\nendgueltige Abschied, und ein System, das beim Austritt loescht, bestraft\ndie Rueckkehr.\n\nDer Preis dafuer sind Zeilen, die sich ansammeln. Auf einem drei Jahre\nalten Server koennen das zehntausende sein, und sie verzerren jede\nStatistik ueber \"wie viele Mitglieder haben ein Profil\".\n\n─── Warum es NICHT automatisch passiert ────────────────────────────────\n\nWeil die Entscheidung dem Server gehoert und nicht dem Zeitablauf. Ein\nautomatischer Aufraeum-Lauf loeschte irgendwann den Fortschritt von\njemandem, der nach zwei Jahren zurueckkommt - ohne dass jemals jemand\nentschieden haette, dass das richtig ist.\n\n─── Warum die Mitgliederliste vollstaendig sein MUSS ───────────────────\n\nDas ist die gefaehrlichste Stelle des Endpunkts. `guild_members` gibt\nausdruecklich zurueck, OB die Liste vollstaendig ist - bei einem\nFehlschlag liefert es `([], False)`.\n\nWer daraus \"niemand ist mehr auf dem Server\" liest, loescht JEDES Profil\ndes Servers. Deshalb bricht dieser Endpunkt bei einer unvollstaendigen\nListe ab, statt zu raten. Ein Aufraeumen, das ausfaellt, kostet nichts;\neines, das zu viel loescht, ist nicht rueckholbar.","operationId":"karteileichen_api_v1_servers__server_id__level_karteileichen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Aufraeumen"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/rollen-sync/pruefen":{"post":{"tags":["🪄 Levels"],"summary":"Rollen Sync Pruefen","description":"Nachsehen, was fehlt und was zu viel ist - ohne eine Aenderung.\n\nAntwortet mit der Auftragskennung und sonst nichts. Der Befund kommt\nasynchron und wird unter\n`GET /servers/{server_id}/level/rollen-sync/{auftrag_id}` abgeholt.\n\nDie Vorschau ist hier nicht Beiwerk, sondern der eigentliche Vorgang: sie\nsagt, wie gross die Welle wird, bevor jemand sie ausloest. Sie aendert\nnichts - `level_sync.pruefen` hat keinen einzigen schreibenden Aufruf,\nund das steht dort ausdruecklich begruendet.","operationId":"rollen_sync_pruefen_api_v1_servers__server_id__level_rollen_sync_pruefen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RollenSyncAuftrag"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/rollen-sync/{auftrag_id}":{"get":{"tags":["🪄 Levels"],"summary":"Rollen Sync Ergebnis","description":"Den Befund eines Auftrags holen - so oft, bis er da ist.\n\n─── Warum es hier keinen 404 gibt ──────────────────────────────────────\n\nWeil das Dashboard einen 404 als \"kaputt\" liest und nicht als \"noch\nnicht\". Ein Auftrag, der laeuft, hat kein Ergebnis - das ist kein Fehler,\nsondern der Normalfall der ersten Sekunden. Deshalb immer 200, und der\nZustand steht im Koerper.\n\n─── Die fuenf Lagen und was die Anzeige daraus macht ───────────────────\n\nDer Bot legt seinen Zustand auf Deutsch ab, die Fortschrittskarte kennt\nvier englische - `_sync_anzeige` uebersetzt (Begruendung dort):\n\n    laeuft            → running    Weiter nachfragen, bis\n                                   `frist_sekunden` um sind.\n    fertig            → completed  Der Befund steht in `befund`, bei\n                                   einer Reparatur daneben `geaendert`,\n                                   `gegeben`, `entzogen`.\n    fehler            → failed     Ein Cluster war zustaendig und ist\n                                   gescheitert; `fehler` sagt womit.\n    nicht_zugestellt  → failed     Kein Cluster hat den Auftrag gehoert.\n    unbekannt         → failed     Kennung falsch, oder das Ergebnis ist\n                                   abgelaufen.\n\nWarum `unbekannt` als Fehler und nicht als \"laeuft noch\": der Auftrag\nwird VOR dem Absenden angelegt, also gibt es zu einer gueltigen Kennung\nimmer einen Eintrag. Ist keiner da, kommt auch keiner mehr - und ein\nNachfragen alle drei Sekunden bis zum Schliessen des Reiters waere die\nAntwort auf eine Frage, die schon entschieden ist.\n\nDie einzige Ausnahme ist 503: ohne Redis gibt es keinen Ort, an dem ein\nErgebnis liegen koennte, und \"abgelaufen\" waere dafuer die falsche\nAuskunft.\n\n─── Warum eine fremde Kennung nichts findet ────────────────────────────\n\nDer Schluessel wird aus der Server-ID im Pfad gebaut, und die hat\n`validate_server_access` geprueft. Eine Kennung von einem anderen Server\ntrifft damit ins Leere, statt dessen Mitgliederliste auszuliefern.","operationId":"rollen_sync_ergebnis_api_v1_servers__server_id__level_rollen_sync__auftrag_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"auftrag_id","in":"path","required":true,"schema":{"type":"string","maxLength":64,"title":"Auftrag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/rollen-sync/reparieren":{"post":{"tags":["🪄 Levels"],"summary":"Rollen Sync Reparieren","description":"Die Abweichungen anwenden - mit Bestaetigung.\n\n─── Warum eine Bestaetigung, obwohl der Lauf harmlos ist ───────────────\n\nHarmlos ist er in der Sache: er stellt her, was die Belohnungsregeln des\nServers ohnehin sagen, und er laesst sich beliebig wiederholen. SICHTBAR\nist er trotzdem - bis zu 250 Rollenaenderungen sind auf einem Server eine\nWelle, die jeder mitbekommt, und wer die Vorschau nicht gelesen hat, hat\nwomoeglich eine falsche Belohnungsregel und merkt es erst danach.\n\n─── Warum dasselbe Wort wie bei der Sammelaktion ───────────────────────\n\nWeil es dieselbe Seite, derselbe Nutzer und dieselbe Sorte Riegel ist.\nEin zweites Bestaetigungswort waere eine zweite Sache zum Nachschlagen,\nund `level_sammelaktion.bestaetigt` prueft es an der einen Stelle, an der\nes schon geprueft wird.\n\n─── Warum hier kein Befund uebergeben wird ─────────────────────────────\n\nWeil `reparieren` selbst neu prueft - zwischen Anzeige und Klick steigt\njemand auf, tritt jemand aus, aendert jemand eine Belohnung. Die\nBegruendung steht ausfuehrlich in `economy/level_sync.py`.","operationId":"rollen_sync_reparieren_api_v1_servers__server_id__level_rollen_sync_reparieren_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RollenSyncReparatur"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/mitglieder/{user_id}/rollen-sync":{"post":{"tags":["🪄 Levels"],"summary":"Mitglied Rollen Sync","description":"Die Stufenrollen EINER Person richtigstellen.\n\n─── Warum das einen eigenen Endpunkt bekommt ───────────────────────────\n\nWeil es der haeufigere Fall ist und der billige. Der Anlass ist fast\nimmer eine Beschwerde (\"ich bin Stufe 30 und habe die Rolle nicht\"), und\ndie Antwort darauf darf nicht sein, einen Lauf ueber 25.000 Profile\nanzustossen und drei Minuten zu warten. Eine Person heisst: eine\nRegelabfrage, ein Profil, eine Handvoll Rollenaenderungen.\n\nDer Weg ist trotzdem derselbe - Auftrag an den Bot, Ergebnis aus Redis,\nabgeholt ueber denselben Leseendpunkt. Ein zweiter Weg fuer denselben\nVorgang waere die Stelle, an der eine der beiden Seiten irgendwann etwas\nanderes fuer richtig haelt.\n\n─── Warum ein fehlendes Profil hier ein 404 ist ────────────────────────\n\nWeil eine Person ohne Level-Profil auch kein Soll hat: `pruefen` geht von\nder Profiltabelle aus und saehe sie gar nicht erst an. Das sofort zu\nsagen ist ehrlicher als ein Auftrag, dessen Ergebnis nach fuenf Sekunden\n\"nichts zu tun\" lautet.","operationId":"mitglied_rollen_sync_api_v1_servers__server_id__level_mitglieder__user_id__rollen_sync_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MitgliedRollenSync"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/level/rangliste":{"get":{"tags":["🪄 Levels"],"summary":"Rangliste","description":"Die Rangliste im Level-Dashboard.\n\n─── Warum eine eigene und nicht die aus `leaderboards.py` ──────────────\n\nJene beantwortet \"wer ist auf diesem Server am aktivsten\" ueber sieben\nMetriken (Nachrichten, Sprachzeit, Reaktionen, Einladungen, ...) und ist\nzugleich der OEFFENTLICHE Endpunkt - sie laeuft ohne Anmeldung und ist\nlange gecacht.\n\nDiese hier beantwortet eine engere Frage, und zwar genau die, die man\nhat, waehrend man daneben jemandem XP gibt: wo steht wer JETZT. Sie ist\ndeshalb nicht gecacht - eine Rangliste, die den Eingriff von vor zehn\nSekunden noch nicht zeigt, waere an dieser Stelle irrefuehrend.\n\n─── Der Unterschied zwischen den beiden Bereichen ──────────────────────\n\n`saison`  ordnet nach Stufe und Rest - der Stand, den `/level` zeigt und\n          den ein Mitglied als \"seinen\" versteht.\n`gesamt`  ordnet nach `gesamt_xp_verdient` - der Lebensleistung. Sie\n          ueberlebt Verfall und Saison-Reset; die aktuelle Stufe nicht.\n\nNach einem Saison-Reset laufen die beiden auseinander, und genau dann\nwird der Umschalter wichtig: die eine Liste sagt, wer gerade vorn ist,\ndie andere, wer es sich ueber die Jahre erarbeitet hat.\n\n─── Warum eingefrorene Profile fehlen ──────────────────────────────────\n\nWer aus der Wertung genommen wurde, gehoert nicht in die Wertung. Das\nist die halbe Begruendung dafuer, dass es das Einfrieren gibt.\n\n─── Warum eine Zeile hier `user_id` und `level` heisst ─────────────────\n\nWeil der Reiter \"Rangliste\" genau diese beiden Namen liest, waehrend die\nMitgliederliste `nutzer_id` und `stufe` liest. Das ist die Uneinigkeit\nder Oberflaeche und nicht die dieser Datei - und sie aufzuloesen heisst,\neinen der beiden Reiter zu aendern. Bis dahin gilt: der LESER bestimmt\nden Namen, denn ein Feld, das niemand liest, ist kein Vertrag.","operationId":"rangliste_api_v1_servers__server_id__level_rangliste_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"bereich","in":"query","required":false,"schema":{"enum":["saison","gesamt"],"type":"string","default":"saison","title":"Bereich"}},{"name":"suche","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Suche"}},{"name":"seite","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Seite"}},{"name":"pro_seite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Pro Seite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__level_mitglieder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/achievements/meta":{"get":{"tags":["🏆 Achievements"],"summary":"Get Meta","description":"Statische Metadaten für den Dashboard-Builder: Metriken, Kategorien, Seltenheiten.","operationId":"get_meta_api_v1_servers__server_id__achievements_meta_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/achievements/limits":{"get":{"tags":["🏆 Achievements"],"summary":"Get Limits","description":"Frei-vs-Premium-Nutzung für Custom-Achievements.","operationId":"get_limits_api_v1_servers__server_id__achievements_limits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/achievements":{"get":{"tags":["🏆 Achievements"],"summary":"List Achievements","operationId":"list_achievements_api_v1_servers__server_id__achievements_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"rarity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rarity"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"custom | builtin","title":"Kind"},"description":"custom | builtin"},{"name":"enabled","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"default":60,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🏆 Achievements"],"summary":"Create Achievement","operationId":"create_achievement_api_v1_servers__server_id__achievements_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AchievementCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/achievements/settings":{"get":{"tags":["🏆 Achievements"],"summary":"Get Settings","operationId":"get_settings_api_v1_servers__server_id__achievements_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["🏆 Achievements"],"summary":"Update Settings","operationId":"update_settings_api_v1_servers__server_id__achievements_settings_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/achievements/season":{"get":{"tags":["🏆 Achievements"],"summary":"Get Season Settings","operationId":"get_season_settings_api_v1_servers__server_id__achievements_season_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["🏆 Achievements"],"summary":"Update Season Settings","operationId":"update_season_settings_api_v1_servers__server_id__achievements_season_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeasonSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/achievements/leaderboard":{"get":{"tags":["🏆 Achievements"],"summary":"Leaderboard","description":"Bestenliste des Servers.\n\n``scope`` fehlte hier, obwohl ``_leaderboard_data`` es laengst kann und die\noeffentliche Route es nutzt: die Admin-Ansicht zeigte also ausschliesslich\ndie All-time-Liste - genau die, von der der Kommentar dort sagt, dass sie\nauf Dauer dem gehoert, der zuerst da war. Wer im Dashboard die Saison\neinrichtet, konnte ihren Stand nirgends sehen.","operationId":"leaderboard_api_v1_servers__server_id__achievements_leaderboard_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"by","in":"query","required":false,"schema":{"type":"string","default":"points","title":"By"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"scope","in":"query","required":false,"schema":{"type":"string","description":"alltime | season","default":"alltime","title":"Scope"},"description":"alltime | season"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/achievements/{ident}":{"get":{"tags":["🏆 Achievements"],"summary":"Get One","operationId":"get_one_api_v1_servers__server_id__achievements__ident__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"ident","in":"path","required":true,"schema":{"type":"string","title":"Ident"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["🏆 Achievements"],"summary":"Update Achievement","operationId":"update_achievement_api_v1_servers__server_id__achievements__ident__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"ident","in":"path","required":true,"schema":{"type":"string","title":"Ident"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AchievementUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🏆 Achievements"],"summary":"Delete Achievement","operationId":"delete_achievement_api_v1_servers__server_id__achievements__ident__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"ident","in":"path","required":true,"schema":{"type":"string","title":"Ident"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/achievements/{ident}/toggle":{"post":{"tags":["🏆 Achievements"],"summary":"Toggle Achievement","operationId":"toggle_achievement_api_v1_servers__server_id__achievements__ident__toggle_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"ident","in":"path","required":true,"schema":{"type":"string","title":"Ident"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToggleBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/achievements/{ident}/icon":{"put":{"tags":["🏆 Achievements"],"summary":"Upload Icon","operationId":"upload_icon_api_v1_servers__server_id__achievements__ident__icon_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"ident","in":"path","required":true,"schema":{"type":"string","title":"Ident"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IconBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🏆 Achievements"],"summary":"Delete Icon","operationId":"delete_icon_api_v1_servers__server_id__achievements__ident__icon_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"ident","in":"path","required":true,"schema":{"type":"string","title":"Ident"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/achievements/config/points-roles":{"get":{"tags":["🏆 Achievements"],"summary":"Get Points Roles","operationId":"get_points_roles_api_v1_servers__server_id__achievements_config_points_roles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🏆 Achievements"],"summary":"Set Points Roles","operationId":"set_points_roles_api_v1_servers__server_id__achievements_config_points_roles_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PointsRolesBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/achievements/{ident}/grant":{"post":{"tags":["🏆 Achievements"],"summary":"Grant Achievement","operationId":"grant_achievement_api_v1_servers__server_id__achievements__ident__grant_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"ident","in":"path","required":true,"schema":{"type":"string","title":"Ident"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/achievements/{ident}/revoke":{"post":{"tags":["🏆 Achievements"],"summary":"Revoke Achievement","operationId":"revoke_achievement_api_v1_servers__server_id__achievements__ident__revoke_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"ident","in":"path","required":true,"schema":{"type":"string","title":"Ident"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/achievements/members/{user_id}/reset":{"post":{"tags":["🏆 Achievements"],"summary":"Reset Member","operationId":"reset_member_api_v1_servers__server_id__achievements_members__user_id__reset_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/achievements/members/{user_id}":{"get":{"tags":["🏆 Achievements"],"summary":"Member Progress","operationId":"member_progress_api_v1_servers__server_id__achievements_members__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/achievements/recount":{"post":{"tags":["🏆 Achievements"],"summary":"Recount","operationId":"recount_api_v1_servers__server_id__achievements_recount_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nur dieses Mitglied (leer = ganzer Server)","title":"User Id"},"description":"Nur dieses Mitglied (leer = ganzer Server)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/achievements/me/profile":{"patch":{"tags":["🏆 Achievements"],"summary":"Update My Profile","description":"Ein Mitglied bearbeitet sein EIGENES Achievement-Profil (Showcase/Titel/Bio …).\nKein Admin nötig — ersetzt das frühere /achievements feature-Command.","operationId":"update_my_profile_api_v1_servers__server_id__achievements_me_profile_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/achievements/overview":{"get":{"tags":["🏆 Achievements"],"summary":"Public Overview","description":"Alles, was der Server-Hub oberhalb der Bestenliste braucht — in einem Aufruf.","operationId":"public_overview_api_v1_public_servers__server_id__achievements_overview_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/achievements":{"get":{"tags":["🏆 Achievements"],"summary":"Public List","operationId":"public_list_api_v1_public_servers__server_id__achievements_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/achievements/leaderboard":{"get":{"tags":["🏆 Achievements"],"summary":"Public Leaderboard","operationId":"public_leaderboard_api_v1_public_servers__server_id__achievements_leaderboard_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"by","in":"query","required":false,"schema":{"type":"string","default":"points","title":"By"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"scope","in":"query","required":false,"schema":{"type":"string","default":"season","title":"Scope"}},{"name":"season","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}$"},{"type":"null"}],"title":"Season"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/achievements/seasons":{"get":{"tags":["🏆 Achievements"],"summary":"Public Seasons","description":"Hall of Fame: abgeschlossene Seasons mit Podest.\n\nBewusst nicht gemetert und ohne Kürzung nach Plan — der Sinn dieser Seite ist,\ndass eine Platzierung dauerhaft sichtbar bleibt.","operationId":"public_seasons_api_v1_public_servers__server_id__achievements_seasons_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":12,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/achievements/members/search":{"get":{"tags":["🏆 Achievements"],"summary":"Public Member Search","description":"Mitgliedersuche für den Server-Hub.\n\nSucht in zwei Töpfen: Teilnehmern (haben Punkte, kommen zuerst) und normalen\nServermitgliedern (damit man auch jemanden mit null Badges findet). Eine reine\nZiffernfolge wird zusätzlich als Discord-ID probiert. Auf privat gestellte\nProfile tauchen nicht auf.\n\nBeide Töpfe zeigen nur aktuelle Mitglieder. Der Mitglieder-Topf tat das\nschon immer (er liest ``server_members``); der Teilnehmer-Topf holte\nAusgetretene zurück, die die Bestenliste danebendran nicht mehr führt.","operationId":"public_member_search_api_v1_public_servers__server_id__achievements_members_search_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":100,"default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/achievements/members/{user_id}":{"get":{"tags":["🏆 Achievements"],"summary":"Public Member","operationId":"public_member_api_v1_public_servers__server_id__achievements_members__user_id__get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/achievements/card-background":{"get":{"tags":["🏆 Achievements"],"summary":"Public Card Background","description":"Liefert den hochgeladenen Karten-Hintergrund als echte Bilddatei.\n\nGleiche Begründung wie beim Badge: er liegt als Base64 (bis 5 MB) in\n``ServerAchievementSettings.card_background_base64`` und hätte in der\nSettings-Antwort nichts verloren, die bei jedem Tab-Wechsel geladen wird.\n\nMuss VOR ``{ident}/icon`` stehen? Nein — die Icon-Route braucht zwei\nSegmente, diese eines, sie können sich nicht überdecken. Die Reihenfolge\nist trotzdem bewusst gewählt, damit ein später ergänztes\n``achievements/{ident}`` diese Route nicht schluckt.\n\nÖffentlich wie das Badge auch: das Bild steckt ohnehin in jeder\nFreischalt-Ankündigung, die der Bot in den Kanal schreibt.","operationId":"public_card_background_api_v1_public_servers__server_id__achievements_card_background_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/achievements/{ident}/icon":{"get":{"tags":["🏆 Achievements"],"summary":"Public Icon","description":"Liefert das hochgeladene Badge-Bild als echte Bilddatei.\n\nEs liegt als Base64 in ``ServerAchievement.icon_base64`` und wäre in einer\nListen-Antwort mit 350 Einträgen viel zu schwer — hier kommt es einzeln und\nmit langem Cache-Header, weil das Bild sich praktisch nie ändert.","operationId":"public_icon_api_v1_public_servers__server_id__achievements__ident__icon_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"ident","in":"path","required":true,"schema":{"type":"string","title":"Ident"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/users/{user_id}/achievements":{"get":{"tags":["🏆 Achievements"],"summary":"Public Global Profile","description":"Serverübergreifendes Profil.\n\nAggregiert nur Server, die öffentliche Profile erlauben UND auf denen das\nMitglied sein Profil nicht privat gestellt hat. Die Server-Menge kommt aus\n``member_achievements`` (Index ``user_id``/``unlocked``), nicht aus einem\nScan über die Stats-Tabelle.","operationId":"public_global_profile_api_v1_public_users__user_id__achievements_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__achievements__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/clans/settings":{"get":{"tags":["🏰 Clans"],"summary":"Einstellungen Lesen","description":"Die Clan-Regeln dieses Servers.\n\nKeine Zeile heisst \"alles an\" (models.ClanServerSettings) - die Zeile\nentsteht hier beim ersten Lesen, damit das Dashboard immer dieselbe\nForm bekommt und der Bot dieselbe Zeile liest.","operationId":"einstellungen_lesen_api_v1_servers__server_id__clans_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🏰 Clans"],"summary":"Einstellungen Speichern","description":"Die Clan-Regeln aendern - nur die Felder, die mitkommen.\n\nDie beiden Premium-Schalter (`nick_sync`, `auto_channels`) lassen sich\nohne Server-Premium nicht EINschalten; Ausschalten geht immer. Die\nAntwort auf den Versuch hat die Form von `plan_utils.require_plan`\n(`plan_required`), weil das Frontend daran den Upsell-Hinweis erkennt.\n\nNach dem Speichern: Cache des Dienstes leeren (dieser Prozess) und\n`clans_settings_updated` an den Bot (alle Cluster). Ein Speichern ohne\nAenderung tut beides nicht - es gibt nichts zu melden.","operationId":"einstellungen_speichern_api_v1_servers__server_id__clans_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClanServerEinstellungen"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/clans":{"get":{"tags":["🏰 Clans"],"summary":"Clans Auf Server","description":"Die Clans auf diesem Server, nach der Saison-XP, die HIER entstand\n(Spec 3.3: ein fairer lokaler Wettbewerb, kein Ranking fremder Riesen).\nMit Sperre, Heimat-Kennzeichen und Anfuehrer fuer das Aktionsmenue.","operationId":"clans_auf_server_api_v1_servers__server_id__clans_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"season","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Saison, z. B. 2026-09","title":"Season"},"description":"Saison, z. B. 2026-09"},{"name":"seite","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Seite"}},{"name":"pro_seite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Pro Seite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/clans/stats":{"get":{"tags":["🏰 Clans"],"summary":"Statistik Lesen","description":"Die Zahlen fuer das Statistikband der Uebersicht.\n\n`members_with_clan` neben `level_active_30d`: erst das Verhaeltnis der\nbeiden sagt dem Admin, ob Clans auf seinem Server angekommen sind -\n\"40 von 300 Aktiven\" ist eine Aussage, \"40\" allein keine.","operationId":"statistik_lesen_api_v1_servers__server_id__clans_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"season","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Saison, z. B. 2026-09","title":"Season"},"description":"Saison, z. B. 2026-09"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/clans/insights":{"get":{"tags":["🏰 Clans"],"summary":"Statistik Verlauf Lesen","description":"Der Reiter \"Statistik\" (Nachtlauf 3, C6, clans/statistik.py): die\nBeteiligung jetzt und ueber 90 Tage, die Clan-XP der letzten zwoelf\nSaisons auf diesem Server, die aktivsten Clans der Woche und die Wirkung\nvon Clan-Brett und Clan-Rollen.\n\nEine eigene Antwort und nicht Teil von `/clans/stats`: das Kopfband laedt\ndie Uebersicht bei jedem Aufruf, diese Seite nur, wer den Reiter oeffnet.","operationId":"statistik_verlauf_lesen_api_v1_servers__server_id__clans_insights_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/clans/{clan_id}/ban":{"post":{"tags":["🏰 Clans"],"summary":"Clan Sperren","description":"`/clanadmin ban` aus dem Dashboard - mit dem Wort `sperren`.","operationId":"clan_sperren_api_v1_servers__server_id__clans__clan_id__ban_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id","title":"Clan Id"},"description":"Clan-Id"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__clans__Bestaetigung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/clans/{clan_id}/unban":{"post":{"tags":["🏰 Clans"],"summary":"Clan Entsperren","description":"Die Sperre aufheben - ohne Wort: das nimmt niemandem etwas weg.","operationId":"clan_entsperren_api_v1_servers__server_id__clans__clan_id__unban_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id","title":"Clan Id"},"description":"Clan-Id"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/clan":{"get":{"tags":["🏰 Clans"],"summary":"Mein Clan","description":"Der eigene Clan: Wappen, Level, Liga, die eigene Rolle und die\neigenen Beitraege (Saison und gesamt), der heutige Tagesdeckel und die\noffenen Einladungen. Ohne Clan: `clan: null` - und trotzdem die\nEinladungen, denn genau dann sind sie das, was der Nutzer sucht.","operationId":"mein_clan_api_v1_users_me_clan_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/clan/leave":{"post":{"tags":["🏰 Clans"],"summary":"Clan Verlassen","description":"`/clan leave`. Der Anfuehrer kann nicht gehen (er uebergibt oder\nloest auf); danach gilt die 24-h-Sperre - beides sagt der Dienst.","operationId":"clan_verlassen_api_v1_users_me_clan_leave_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/clan/titel":{"put":{"tags":["🏰 Clans"],"summary":"Titel Waehlen","description":"Den eigenen Titel waehlen (Nachtlauf 3, C1) - oder mit `null` keinen.\n\nNur fuer sich selbst: ein Titel ist eine Auszeichnung, die man verdient\nund dann zeigt oder nicht; einen fremden setzt niemand. Welche es gibt\nund ob er verdient ist, sagt `clans.titel` (400 mit Satz, sonst).","operationId":"titel_waehlen_api_v1_users_me_clan_titel_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TitelWahl"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/clan/invitations/{clan_id}/accept":{"post":{"tags":["🏰 Clans"],"summary":"Einladung Annehmen","description":"`/clan accept tag` von der Website aus.","operationId":"einladung_annehmen_api_v1_users_me_clan_invitations__clan_id__accept_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id","title":"Clan Id"},"description":"Clan-Id"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EinladungsAntwort"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/clan/invitations/{clan_id}/decline":{"post":{"tags":["🏰 Clans"],"summary":"Einladung Ablehnen","description":"`/clan decline tag` von der Website aus.","operationId":"einladung_ablehnen_api_v1_users_me_clan_invitations__clan_id__decline_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id","title":"Clan Id"},"description":"Clan-Id"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EinladungsAntwort"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/clan/chests":{"get":{"tags":["🏰 Clans"],"summary":"Meine Kisten","description":"Die eigenen ungeoeffneten Kisten (Vertrag 6) - und wo man sie oeffnen\nkann.\n\nBis zur Spielwelt stand hier \"Oeffnen gibt es hier nicht\", weil die\nWebsite keinen aktuellen Server hat. Jetzt nennt die Antwort die Server,\nauf denen das Oeffnen gelingt, samt der Beute je Stufe dort\n(`servers[].beute`) und dem Vorschlag (`standard_server_id`) - Begruendung\nder Wahl und des Vorschlags in clans/kisten.py. Geoeffnet wird mit\n`POST /users/me/clan/chests/{id}/open`.\n\nDie Kiste ueberlebt die Aufloesung ihres Clans (`clan_id` ohne\nFremdschluessel), `clan_tag` kann deshalb `null` sein.","operationId":"meine_kisten_api_v1_users_me_clan_chests_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/clan/chests/{chest_id}/open":{"post":{"tags":["🏰 Clans"],"summary":"Kiste Oeffnen Web","description":"Eine Kiste von der Website aus oeffnen - derselbe Dienst wie der Knopf\nunter `/clan chest` (`raids.kiste_oeffnen`), auf dem gewaehlten Server\noder dem Vorschlag (clans/kisten.py).\n\nDoppelt oeffnen geht nicht: der Dienst nimmt die Kiste mit einem\nbedingten UPDATE (`opened_at IS NULL`), der zweite Klick trifft keine\nZeile mehr und bekommt eine Absage - die Oberflaeche laedt danach still\nneu. Die Antwort traegt die Beute (Coins, Artikel) und Server samt\nWaehrung fuer die Enthuellung.","operationId":"kiste_oeffnen_web_api_v1_users_me_clan_chests__chest_id__open_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"chest_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"Id der Kiste","title":"Chest Id"},"description":"Id der Kiste"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KisteOeffnen"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/clan/wallet":{"get":{"tags":["🏰 Clans"],"summary":"Wallet Lesen","description":"Das eigene Portemonnaie: die Konten auf den Servern, auf denen der\nNutzer wirtschaftet, der eigene Anteil am Clan und die Zahl der Kisten.\n\nCoins, Gems und Tokens stehen je Server mit dessen Waehrung - es gibt\nkeine Summe darueber, aus demselben Grund wie in der Schatzkammer: fuenf\nKonten in fuenf Waehrungen zu addieren ergaebe eine erfundene Zahl.\nHoechstens `kisten.SERVER_MAX` Server, juengste zuerst (clans/kisten.py,\n`eigene_konten`).","operationId":"wallet_lesen_api_v1_users_me_clan_wallet_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/clan/pass":{"get":{"tags":["🏰 Clans"],"summary":"Pass Lesen","description":"Der eigene Saisonpfad der laufenden Saison: Stufe, beide Spuren, was\nangelegt ist, was der Nutzer aus allen Saisons besitzt und was ohne\nSupreme ruht (clans/clan_pass.py, `stand`). Auch ohne Clan lesbar - der\nFortschritt gehoert dem Nutzer, nur waechst er ohne Clan nicht.","operationId":"pass_lesen_api_v1_users_me_clan_pass_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/clan/pass/schmuck":{"put":{"tags":["🏰 Clans"],"summary":"Pass Schmuck","description":"Eine Zier oder einen Stein anlegen - oder mit `key: null` ablegen.\nNur Eigenes, und aus der Supreme-Spur nur mit Supreme (400 mit Satz\nsonst). Danach sehen die Mitgliederlisten den neuen Schmuck:\n`publish_clan_updated` wie beim Titel.","operationId":"pass_schmuck_api_v1_users_me_clan_pass_schmuck_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PassSchmuck"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/clan/pass/gesehen":{"post":{"tags":["🏰 Clans"],"summary":"Pass Gesehen","description":"Bis zu welcher Stufe der Nutzer seine Belohnungen gesehen hat - das\n\"Neu\" an den Stufen verschwindet. Nur vorwaerts.","operationId":"pass_gesehen_api_v1_users_me_clan_pass_gesehen_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PassGesehen"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/clans/{clan_id}":{"get":{"tags":["🏰 Clans"],"summary":"Clan Lesen","description":"Ein beliebiger Clan in der Langform, plus die Rolle des Aufrufers\ndarin (`viewer`) - daran entscheidet die Oberflaeche, welche Knoepfe\nsie zeigt. Die oeffentliche Form ohne Anmeldung steht in clans_public.","operationId":"clan_lesen_api_v1_clans__clan_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["🏰 Clans"],"summary":"Clan Einstellen","description":"`/clan settings` von der Website aus. Offiziere duerfen nur die\nBeschreibung, alles andere der Anfuehrer - und die Palette, den\nWappenkatalog, die Laengen prueft der Dienst (Spec 2.1).","operationId":"clan_einstellen_api_v1_clans__clan_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClanEinstellungen"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/members":{"get":{"tags":["🏰 Clans"],"summary":"Mitglieder Lesen","description":"Die Mitgliederliste mit Beitraegen (gesamt und Saison), Rang zuerst,\ndarin nach Beitrag - dieselbe Ordnung wie `/clan members`. Dazu Suche,\nRang-Filter, Sortierungen und \"inaktiv\" (`_mitglieder_liste`); fuer ein\nMitglied dieses Clans traegt jede Zeile, was es mit ihr tun darf\n(`aktionen`, aus der Rechte-Matrix) - die Oberflaeche baut daraus ihr\nMenue, ohne die Regeln zu kennen.\n\nDie Nutzer-Ids sehen nur Mitglieder DIESES Clans. Die oeffentliche Seite\nversteckt sie ausdruecklich, damit niemand sie abgrast\n(`api/routers/clans_public.py`, Modulkopf) - ein Discord-Login ist keine\nBerechtigung, sondern nur eine Anmeldung, und hebelt das sonst aus\n(Review M6). Namen und Beitraege bleiben fuer alle sichtbar: sie stehen\nohnehin auf der oeffentlichen Clan-Seite.","operationId":"mitglieder_lesen_api_v1_clans__clan_id__members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"seite","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Seite"}},{"name":"pro_seite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Pro Seite"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Namenssuche (nur Mitglieder)","title":"Q"},"description":"Namenssuche (nur Mitglieder)"},{"name":"rang","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":12},{"type":"null"}],"description":"Nur dieser Rang","title":"Rang"},"description":"Nur dieser Rang"},{"name":"sortierung","in":"query","required":false,"schema":{"type":"string","maxLength":12,"description":"rang|saison|gesamt|beitritt|aktiv|inaktiv","default":"rang","title":"Sortierung"},"description":"rang|saison|gesamt|beitritt|aktiv|inaktiv"},{"name":"inaktiv","in":"query","required":false,"schema":{"type":"boolean","description":"Nur seit 7 Tagen stille Mitglieder","default":false,"title":"Inaktiv"},"description":"Nur seit 7 Tagen stille Mitglieder"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/members/{user_id}/kick":{"post":{"tags":["🏰 Clans"],"summary":"Mitglied Entfernen","description":"`/clan kick @user` - Anfuehrer jeden, Offiziere nur Rekruten und Mitglieder.","operationId":"mitglied_entfernen_api_v1_clans__clan_id__members__user_id__kick_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/members/{user_id}/promote":{"post":{"tags":["🏰 Clans"],"summary":"Mitglied Befoerdern","description":"`/clan promote @user` - eine Stufe hoeher, Offizier nur mit freiem Platz.","operationId":"mitglied_befoerdern_api_v1_clans__clan_id__members__user_id__promote_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/members/{user_id}/demote":{"post":{"tags":["🏰 Clans"],"summary":"Mitglied Degradieren","description":"`/clan demote @user` - eine Stufe tiefer, bis Mitglied.","operationId":"mitglied_degradieren_api_v1_clans__clan_id__members__user_id__demote_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/members/{user_id}/transfer":{"post":{"tags":["🏰 Clans"],"summary":"Fuehrung Uebergeben","description":"`/clan transfer @user` - nur der Anfuehrer, nur mit dem Tag als Wort.","operationId":"fuehrung_uebergeben_api_v1_clans__clan_id__members__user_id__transfer_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__clans__Bestaetigung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/applications":{"get":{"tags":["🏰 Clans"],"summary":"Bewerbungen Lesen","description":"Die offenen Bewerbungen - fuer die, die sie entscheiden duerfen\n(Rechte-Matrix `applications`, Vorgabe: Offiziere und Anfuehrer). Wer\ndas Recht nicht hat, sieht auch die Liste nicht: Bewerbungstexte sind an\nden Clan gerichtet, nicht an jedes Mitglied.","operationId":"bewerbungen_lesen_api_v1_clans__clan_id__applications_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/applications/{user_id}/decide":{"post":{"tags":["🏰 Clans"],"summary":"Bewerbung Entscheiden","description":"Eine Bewerbung annehmen oder ablehnen. Annehmen ist ein Beitritt mit\nallen Pruefungen (Deckel, Sperren, Server-Regeln) - der Dienst macht sie.","operationId":"bewerbung_entscheiden_api_v1_clans__clan_id__applications__user_id__decide_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID des Bewerbers","title":"User Id"},"description":"Discord User ID des Bewerbers"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entscheidung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/disband":{"post":{"tags":["🏰 Clans"],"summary":"Clan Aufloesen","description":"`/clan disband` - nur der Anfuehrer, nur mit dem Tag als Wort. Der\nClan wird archiviert: Tag frei, Historie bleibt, Mitglieder sind draussen.\nEin fehlendes Wort geht als leeres an den Dienst und kommt als\n`bestaetigung_falsch` zurueck - eine Meldung fuer beide Faelle.","operationId":"clan_aufloesen_api_v1_clans__clan_id__disband_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__clans__Bestaetigung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/quests":{"get":{"tags":["🏰 Clans"],"summary":"Auftraege Lesen","description":"Die Wochenauftraege mit Stufen, Nachschub, Wochen- und Meisterbonus\nund dem Wochen-Ereignis (Clan-Ausbau Oktober 2026).\n\n`anteil` (0..1, bis zur naechsten Stufe) und `rest_sekunden` kommen\nfertig aus `auftraege.stand` - Cog und Website sollen denselben Balken\nund denselben Countdown zeigen. Fehlt die Woche noch (neuer Clan,\nRueckkehr nach einer Pause), zieht `stand` sie nach: wer seine Auftraege\nansieht, sieht welche.","operationId":"auftraege_lesen_api_v1_clans__clan_id__quests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/buildings":{"get":{"tags":["🏰 Clans"],"summary":"Bauwerke Lesen","description":"Alle sieben Bauwerke - auch die, die dieser Clan noch nicht bauen darf.\n\nVollstaendig und in der Reihenfolge des Katalogs (nach Freischalt-Level),\nweil ein Raster, in dem Kacheln erst mit dem Clan-Level erscheinen, dem\nNutzer verschweigt, worauf er hinspielt. Was fehlt, sagt `grund`.","operationId":"bauwerke_lesen_api_v1_clans__clan_id__buildings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/buildings/{key}/upgrade":{"post":{"tags":["🏰 Clans"],"summary":"Bauwerk Ausbauen","description":"`/clan build` von der Website aus: eine Stufe kaufen.\n\nRecht (`settings`), Clan-Level, Endstufe und Kristalle prueft\n`bauwerke.bauen` - inklusive des bedingten UPDATE, das zwei gleichzeitige\nKaeufe auseinanderhaelt. Der Verlierer bekommt `bauwerk.gleichzeitig` und\nkann es sofort erneut versuchen.","operationId":"bauwerk_ausbauen_api_v1_clans__clan_id__buildings__key__upgrade_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"key","in":"path","required":true,"schema":{"type":"string","description":"Schluessel des Bauwerks, z. B. tresor","title":"Key"},"description":"Schluessel des Bauwerks, z. B. tresor"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BauwerkKauf"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/wappen":{"get":{"tags":["🏰 Clans"],"summary":"Wappen Lesen","description":"Die Wappenschmiede: das volle Wappen, die Stufe der Schmiede, der\nKatalog mit Freischaltstatus und was die naechste Stufe bringt\n(clans/wappen.py `stand`). Fuer jedes Mitglied - sehen, was kommt, darf\njeder; aendern nur der Anfuehrer (`darf_aendern`).","operationId":"wappen_lesen_api_v1_clans__clan_id__wappen_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🏰 Clans"],"summary":"Wappen Setzen","description":"Die Wahl der Werkstatt speichern - Emblem, Farbe, Form, Rahmen, Muster,\nMetall, eigene Tinktur, Banner und Zier, geschickt wird, was sich aendert.\nOb ein Teil frei ist, prueft der Dienst gegen die Stufe der Schmiede und\ndas Clan-Level (clans/wappen.py `setzen`); die Antwort hat die Form von\nGET, damit die Werkstatt nicht neu laden muss.","operationId":"wappen_setzen_api_v1_clans__clan_id__wappen_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WappenWahl"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/treasury":{"get":{"tags":["🏰 Clans"],"summary":"Schatzkammer Lesen","description":"Die Schatzkammern des Clans - eine je Server, an dem er praesent ist -\nund das Kassenbuch ueber alle zusammen.\n\nEin Clan kann auf vielen Servern stehen, und jeder hat seine eigene\nWaehrung, sein eigenes Tagesziel und damit seinen eigenen Deckel und\nBoost-Preis. Deshalb eine Liste und keine Zahl.","operationId":"schatzkammer_lesen_api_v1_clans__clan_id__treasury_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/treasury/{server_id}/boost":{"post":{"tags":["🏰 Clans"],"summary":"Schatzkammer Boost","description":"`/clan boost`: 24 Stunden mehr Clan-XP fuer alle auf diesem Server.\n\nKein `validate_server_access` - und das ist hier kein Versehen, sondern\nder Unterschied zu den `/servers/{id}/...`-Pfaden weiter oben: dort\nhandelt ein ADMIN an seinem Server, hier ein Clan-Offizier mit dem Geld\nSEINES Clans. Ein Offizier muss auf dem Server nichts verwalten duerfen;\ner muss Mitglied des Clans sein und das Recht `treasury` haben, und\ngenau das prueft `schatzkammer.boost_kaufen` - zusammen mit\n`clan_server_settings.enabled` und der Server-Sperre des Clans. Aus\ndemselben Grund steht die Server-Id im Pfad und nicht im Body: sie ist\nein Teil der Kammer, nicht eine Eingabe des Nutzers.\n\nDie Antwort ist die Kammer-Zeile aus GET, damit die Karte nach dem Kauf\nnicht neu laden muss.","operationId":"schatzkammer_boost_api_v1_clans__clan_id__treasury__server_id__boost_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoostKauf"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/treasury/{server_id}/pay":{"post":{"tags":["🏰 Clans"],"summary":"Schatzkammer Sold","description":"`/clan pay betrag`: den Sold gleichmaessig an die Aktiven verteilen.\n\nKein `validate_server_access`, aus demselben Grund wie beim Boost. Wer\nEmpfaenger ist (Aktivitaet auf DIESEM Server in sieben Tagen), wie viel\njeder bekommt und dass es nie weniger als zwei sein duerfen, entscheidet\n`schatzkammer.sold_auszahlen`; der Rest, der nicht durch die Zahl der\nEmpfaenger teilbar ist, verlaesst die Kammer gar nicht erst.","operationId":"schatzkammer_sold_api_v1_clans__clan_id__treasury__server_id__pay_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SoldAuszahlung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/raid":{"get":{"tags":["🏰 Clans"],"summary":"Raid Lesen","description":"Der Wochen-Boss: Lebensbalken, eigener Schaden, Top 5.\n\n`raid: null` von Montag bis Freitag - das Fenster ist Samstag 00:00 bis\nSonntag 23:59:59 UTC (`raids.raid_fenster`), und ein besiegter Boss\nbleibt bis Sonntagnacht stehen, damit der Erfolg nicht in dem Moment\nverschwindet, in dem er passiert.\n\n`angriffe_heute`/`angriffe_max` beziehen sich auf den ANGEMELDETEN\nNutzer. Angegriffen wird seit dem Clan-Ausbau (Oktober 2026) auch im Web:\n`POST /clans/{id}/raid/attack` (api/routers/clans_alltag.py) waehlt den\nServer mit dem hoechsten Level, auf dem Clans laufen - der Schaden haengt\nam Level auf dem Server, von dem aus angegriffen wird.","operationId":"raid_lesen_api_v1_clans__clan_id__raid_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/war":{"get":{"tags":["🏰 Clans"],"summary":"Krieg Lesen","description":"Der Krieg dieser Woche: Stand, Gegner, die fuenf Groessten beider\nSeiten und der eigene Angriff.\n\n`war: null` heisst \"diese Woche kein Krieg\" - der Clan war beim Paaren\nam Montag unter Level 3, zu lange still oder es blieb kein Gegner\nuebrig. Das ist kein Fehler, sondern eine Woche ohne Krieg.\n\nAngreifen geht in Discord (`/clan war attack`) und seit dem Clan-Ausbau\nauch im Web (`POST /clans/{id}/war/attack`, api/routers/clans_alltag.py).\nDer Schaden haengt am Level auf dem Server, von dem aus angegriffen wird;\ndas Web waehlt ihn selbst (`angriffs_server`) und nur unter den Servern,\nauf denen der Spieler noch Mitglied ist, Clans an sind und der Clan nicht\ngesperrt ist - also keiner, den er in Discord nicht auch haette nehmen\nkoennen.\n\nDie Namen hinter den Discord-Ids loesen wir NUR fuer die eigene Seite\nauf. Die Gegnerliste bleibt bei Ids: das sind Mitglieder eines fremden\nClans, und die Regel dieser Datei ist, dass man Mitgliederlisten fremder\nClans nicht abgrasen koennen soll (Review M6).","operationId":"krieg_lesen_api_v1_clans__clan_id__war_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tournament":{"get":{"tags":["🏰 Clans"],"summary":"Turnier Lesen","description":"Der Serverkrieg: das laufende Turnier oder das zuletzt beendete.\n\n`tournament: null`, wenn hier noch nie eines lief.\n\n─── Warum hier `validate_server_access` steht ─────────────────────────\n\nHier stand die Begruendung, warum es NICHT noetig sei: \"die Rangliste\nsteht ohnehin jedem offen, der auf dem Server ist\". Der Satz stimmt -\nnur wurde die Voraussetzung darin (\"wer auf dem Server ist\") nirgends\ngeprueft. Ein Discord-Login ist keine Serverzugehoerigkeit, und dieser\nEndpunkt war der einzige `/servers/{id}/...` dieser Datei ohne die\nPruefung.\n\nHerausgefallen ist dabei mehr als eine Rangliste: `gestartet_von` ist\ndie Discord-Id des Menschen, der das Turnier gestartet hat. Server-Ids\nsind ueber die oeffentlichen Bestenlisten frei zu haben, das Limit liegt\nbei 80 Anfragen je Minute - ein Verzeichnis \"Server -> Discord-Id eines\nAdmins\" waere ein Nachmittag Arbeit gewesen. Die oeffentliche Clan-Seite\nlaesst genau diese Id weg (`clans_public.py`).\n\nWer den Stand wirklich ohne Anmeldung zeigen will, braucht dafuer eine\nRoute in `clans_public.py` - und dort ohne `gestartet_von`.","operationId":"turnier_lesen_api_v1_servers__server_id__tournament_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/clan":{"get":{"tags":["🏰 Clans"],"summary":"Clan Eines Nutzers","description":"Die Kurzform fuer Profile: `[TAG]`, Wappen, Level, Liga, Rang.\nMit Anmeldung, aber fuer jeden - der Tag ist ohnehin ueberall sichtbar\n(Spec 2.2).","operationId":"clan_eines_nutzers_api_v1_users__user_id__clan_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/overview":{"get":{"tags":["🏰 Clans"],"summary":"Uebersicht Lesen","description":"\"Heute & diese Woche\": die persoenlichen Aufgaben, der Wochenstand,\ndie naechste Freischaltung - und fuer den Anfuehrer die Start-Checkliste\n(clans/uebersicht.py).","operationId":"uebersicht_lesen_api_v1_clans__clan_id__overview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/checklist/{punkt}/confirm":{"post":{"tags":["🏰 Clans"],"summary":"Checkliste Bestaetigen","description":"\"Passt so\" an einem Punkt der Start-Checkliste - nur der Anfuehrer.","operationId":"checkliste_bestaetigen_api_v1_clans__clan_id__checklist__punkt__confirm_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"punkt","in":"path","required":true,"schema":{"type":"string","maxLength":32,"description":"Punkt der Start-Checkliste","title":"Punkt"},"description":"Punkt der Start-Checkliste"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/checklist/hide":{"post":{"tags":["🏰 Clans"],"summary":"Checkliste Ausblenden","description":"Die Start-Checkliste aus- oder wieder einblenden - nur der Anfuehrer.","operationId":"checkliste_ausblenden_api_v1_clans__clan_id__checklist_hide_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChecklisteSichtbar"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/members/{user_id}":{"get":{"tags":["🏰 Clans"],"summary":"Mitglied Lesen","description":"Ein Mitglied im Detail - fuer Mitglieder desselben Clans.\n\nNeben den Zahlen der Liste: ueber welchen Server es kam, was es an\nKristallen gebracht hat, und sein Rangverlauf (die letzten zehn Eintraege\naus dem Protokoll, 90 Tage). Dazu, was der Betrachter mit ihm tun darf -\ndieselbe Form wie in der Liste.","operationId":"mitglied_lesen_api_v1_clans__clan_id__members__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/members/{user_id}/rank":{"post":{"tags":["🏰 Clans"],"summary":"Rang Setzen","description":"Den Rang direkt setzen (`/clan rank set`). Wer bis wohin darf, sagt\ndie Rechte-Matrix - der Dienst prueft und nennt die Grenze.","operationId":"rang_setzen_api_v1_clans__clan_id__members__user_id__rank_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RangWahl"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/members/{user_id}/auto":{"post":{"tags":["🏰 Clans"],"summary":"Automatik Einschalten","description":"Die automatische Befoerderung fuer ein Mitglied wieder einschalten -\nder von Hand gesetzte Rang gibt seine Sperre ab (models.ClanRankLock).","operationId":"automatik_einschalten_api_v1_clans__clan_id__members__user_id__auto_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/invites":{"get":{"tags":["🏰 Clans"],"summary":"Einladungen Lesen","description":"Die offenen Einladungen des Clans: wen, von wem, seit wann, bis wann,\nob die DM ankam - und fuer jede, ob der Betrachter sie zurueckziehen darf\n(alle mit `invites_manage`, sonst die eigenen). Sichtbar fuer alle, die\neinladen duerfen: wer einlaedt, soll sehen, wer schon eingeladen ist.","operationId":"einladungen_lesen_api_v1_clans__clan_id__invites_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🏰 Clans"],"summary":"Einladung Senden","description":"Jemanden von der Website aus einladen.\n\nNur Menschen, die mit dem Einladenden auf dem genannten Server sind -\ndieselbe Grenze wie `/clan invite @user`, wo Discord nur Mitglieder des\nServers anbietet. Ohne sie waere die Website der Weg, beliebigen Konten\neine Bot-DM zu schicken. Die DM geht ueber die Warteschlange\n(clans/benachrichtigung.py) und traegt den Server, damit ein Annehmen\ndort zaehlt.","operationId":"einladung_senden_api_v1_clans__clan_id__invites_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EinladungNeu"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/invites/{user_id}/revoke":{"post":{"tags":["🏰 Clans"],"summary":"Einladung Zurueckziehen","description":"Eine offene Einladung zurueckziehen - wer `invites_manage` hat, jede;\nwer eingeladen hat, die eigene.","operationId":"einladung_zurueckziehen_api_v1_clans__clan_id__invites__user_id__revoke_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID des Eingeladenen","title":"User Id"},"description":"Discord User ID des Eingeladenen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/invite/servers":{"get":{"tags":["🏰 Clans"],"summary":"Einladungs Server","description":"Die Server, von denen aus der Aufrufer einladen kann: seine\nNotoq-Server, auf denen Clans an sind, dieser Clan nicht gesperrt ist\nund - bei \"nur Heimat-Clans\" - der Clan dort zu Hause ist. Die Heimat\nzuerst, dann die Server mit Mitgliedern des Clans, dann der Rest.","operationId":"einladungs_server_api_v1_clans__clan_id__invite_servers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/invite/search":{"get":{"tags":["🏰 Clans"],"summary":"Personen Suchen","description":"Wen kann ich einladen? Mitglieder eines Servers, auf dem der Aufrufer\nselbst ist - mit dem, was die Auswahl braucht: schon in einem Clan (und\nin welchem), schon von uns eingeladen.\n\nEine Discord-Id wird exakt gesucht; ein Name ab `SUCHE_MIN` Zeichen als\nTeilwort in Name und Server-Nickname. Exakte Treffer zuerst, dann die,\ndie so anfangen, dann der Rest.","operationId":"personen_suchen_api_v1_clans__clan_id__invite_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"server_id","in":"query","required":true,"schema":{"type":"string","description":"Ein Server des Aufrufers","title":"Server Id"},"description":"Ein Server des Aufrufers"},{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"description":"Name, Nickname oder Discord-Id","title":"Q"},"description":"Name, Nickname oder Discord-Id"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/links":{"get":{"tags":["🏰 Clans"],"summary":"Links Lesen","description":"Die gueltigen Beitrittslinks - fuer alle mit dem Recht `links`.","operationId":"links_lesen_api_v1_clans__clan_id__links_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🏰 Clans"],"summary":"Link Erstellen","description":"Einen Beitrittslink erstellen. Laufzeit und Nutzungen nur aus den\nAuswahllisten (clans/links.py).","operationId":"link_erstellen_api_v1_clans__clan_id__links_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkNeu"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/links/{link_id}/revoke":{"post":{"tags":["🏰 Clans"],"summary":"Link Widerrufen","description":"Einen Beitrittslink sofort ungueltig machen.","operationId":"link_widerrufen_api_v1_clans__clan_id__links__link_id__revoke_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"Nummer des Links","title":"Link Id"},"description":"Nummer des Links"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clan-links/{code}/redeem":{"post":{"tags":["🏰 Clans"],"summary":"Link Einloesen","description":"Mit einem Beitrittslink beitreten - von der Website aus.\n\nDer Beitritt zaehlt auf dem Server, den `dienst.web_server` waehlt: ein\ngemeinsamer Server mit Praesenz des Clans, sonst der Heimatserver.","operationId":"link_einloesen_api_v1_clan_links__code__redeem_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","maxLength":80,"description":"Der Code aus dem Link","title":"Code"},"description":"Der Code aus dem Link"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/rights":{"get":{"tags":["🏰 Clans"],"summary":"Rechte Lesen","description":"Wer darf was - fuer jedes Mitglied lesbar (Modulkopf); aendern darf\nnur der Anfuehrer (`darf_aendern`).","operationId":"rechte_lesen_api_v1_clans__clan_id__rights_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🏰 Clans"],"summary":"Rechte Speichern","description":"Die Rechte-Matrix aendern oder auf die Vorgaben zuruecksetzen - nur\nder Anfuehrer. Die Antwort ist die neue Matrix, damit die Seite nicht\nneu laden muss.","operationId":"rechte_speichern_api_v1_clans__clan_id__rights_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RechteAenderung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/log":{"get":{"tags":["🏰 Clans"],"summary":"Protokoll Lesen","description":"Wer hat was wann getan - die letzten 90 Tage des Feeds\n(`clan_activity_log`), juengster zuerst, fuer jedes Mitglied.","operationId":"protokoll_lesen_api_v1_clans__clan_id__log_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"},{"name":"seite","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":1,"title":"Seite"}},{"name":"pro_seite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Pro Seite"}},{"name":"art","in":"query","required":false,"schema":{"type":"string","maxLength":16,"description":"alle|mitglieder|raenge|anfragen|verwaltung|clan","default":"alle","title":"Art"},"description":"alle|mitglieder|raenge|anfragen|verwaltung|clan"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/join":{"post":{"tags":["🏰 Clans"],"summary":"Beitreten","description":"Einem offenen Clan von der Website aus beitreten - oder, bei einem\nClan \"nur auf Einladung\", die offene Einladung annehmen (derselbe\nVorgang wie `/clan join`). Welcher Server zaehlt, waehlt\n`dienst.web_server`.","operationId":"beitreten_api_v1_clans__clan_id__join_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/apply":{"post":{"tags":["🏰 Clans"],"summary":"Bewerben","description":"Sich von der Website aus bewerben - mit einem Satz an die Verwalter.\nDie Verwalter bekommen eine DM (clans/benachrichtigung.py), sofern sie\nsie nicht abgeschaltet haben.","operationId":"bewerben_api_v1_clans__clan_id__apply_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BewerbungNeu"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/clan/found/servers":{"get":{"tags":["🏰 Clans"],"summary":"Gruendungs Server","description":"Die Server, auf denen der Aufrufer einen Clan gruenden kann - und die,\nauf denen er es noch nicht kann, mit dem Grund.\n\nDieselben Regeln wie `dienst.gruenden`: Clans an, Gruendung erlaubt,\nMindestlevel ODER seit `GRUENDUNG_ODER_TAGE` Tagen auf dem Server\n(`dienst._darf_gruenden`). Hier in DREI Abfragen fuer alle Server statt\nzwei je Server - der Dialog listet bis zu 50. Die endgueltige Pruefung\nbleibt beim Gruenden selbst; diese Liste sagt nur vorher, wo es geht.","operationId":"gruendungs_server_api_v1_users_me_clan_found_servers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/clan/found/tag":{"get":{"tags":["🏰 Clans"],"summary":"Gruendungs Tag","description":"Ein freier Tag fuer diesen Namen - der Vorschlag, der im Feld steht,\nsolange der Nutzer keinen eigenen tippt (`start.tag_vorschlag`).","operationId":"gruendungs_tag_api_v1_users_me_clan_found_tag_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/clan/found":{"post":{"tags":["🏰 Clans"],"summary":"Gruenden","description":"Einen Clan von der Website aus gruenden - derselbe Vorgang wie `/clan\ncreate` (`dienst.gruenden`, mit Starterkiste und Einstiegswoche).\n\nOhne Tag schlaegt der Dienst einen vor. Die Beschreibung ist Beiwerk:\nscheitert sie (Laenge, Zeichen), steht der Clan trotzdem, und die\nAntwort sagt es (`beschreibung_fehler`).","operationId":"gruenden_api_v1_users_me_clan_found_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClanGruendung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/clan/applications/{clan_id}/withdraw":{"post":{"tags":["🏰 Clans"],"summary":"Bewerbung Zurueckziehen","description":"Die eigene offene Bewerbung bei einem Clan zurueckziehen.","operationId":"bewerbung_zurueckziehen_api_v1_users_me_clan_applications__clan_id__withdraw_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id","title":"Clan Id"},"description":"Clan-Id"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/clan/notifications":{"get":{"tags":["🏰 Clans"],"summary":"Benachrichtigungen Lesen","operationId":"benachrichtigungen_lesen_api_v1_users_me_clan_notifications_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["🏰 Clans"],"summary":"Benachrichtigungen Speichern","description":"Einzelne Schalter setzen - nur die geschickten (`exclude_unset`).","operationId":"benachrichtigungen_speichern_api_v1_users_me_clan_notifications_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenachrichtigungsEinstellungen"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/clans/{clan_id}/activity":{"get":{"tags":["🏰 Clans"],"summary":"Aktivitaet Lesen","description":"Der Clan ueber Zeit - fuer jedes Mitglied: je Tag der letzten 30, wie\nviele beigetragen haben und wie viel, je Monat die Saison-XP.\n\nFuer die, die entfernen oder Raenge vergeben duerfen, dazu: wer droht\nabzuspringen, und wie die Automatik steht. Und ab 23 Tagen Stille des\nAnfuehrers `anfuehrer` - Offiziere bekommen darin den Knopf zum\nUebernehmen, sobald die 30 Tage um sind. Den Nachfolger sehen nur die,\ndie verwalten, und der Anfuehrer selbst: ein Name, der noch nicht fest\nsteht, gehoert nicht in jede Ansicht.","operationId":"aktivitaet_lesen_api_v1_clans__clan_id__activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/leadership":{"get":{"tags":["🏰 Clans"],"summary":"Fuehrung Lesen","description":"Die Einstellungen der Anfuehrer-Werkzeuge - lesen duerfen die, die\nverwalten, aendern nur der Anfuehrer (`darf_aendern`). Dazu, wer\nStellvertreter werden kann: Offiziere, Veteranen, Mitglieder - Rekruten\nnicht (clans/fuehrung.py `NACHFOLGE_RAENGE`) -, und wie viele Mitglieder\njede Frist heute traefe (`betroffen`).","operationId":"fuehrung_lesen_api_v1_clans__clan_id__leadership_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🏰 Clans"],"summary":"Fuehrung Speichern","description":"Die Anfuehrer-Werkzeuge einstellen - nur der Anfuehrer. Nur die\ngeschickten Felder aendern sich (`exclude_unset`).","operationId":"fuehrung_speichern_api_v1_clans__clan_id__leadership_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FuehrungAenderung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/claim":{"post":{"tags":["🏰 Clans"],"summary":"Fuehrung Uebernehmen","description":"`/clan rank claim` im Web: ein Offizier uebernimmt, wenn der Anfuehrer\nseit 30 Tagen still ist. Die Regeln stehen beim Dienst\n(clans/dienst.py `uebernehmen`) - bis hierher ging das nur in Discord.","operationId":"fuehrung_uebernehmen_api_v1_clans__clan_id__claim_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/clan/buendnis":{"get":{"tags":["🏰 Clans"],"summary":"Buendnis Lesen","description":"Das Buendnis des eigenen Clans - oder, ohne Buendnis, die Einladungen\nan den eigenen Clan und die Regeln (ab Level, wie viele Clans, Bonus).","operationId":"buendnis_lesen_api_v1_users_me_clan_buendnis_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["🏰 Clans"],"summary":"Buendnis Aendern","description":"Name, Emblem und Farbe der Standarte (nur der Gruender-Clan).","operationId":"buendnis_aendern_api_v1_users_me_clan_buendnis_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuendnisAenderung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["🏰 Clans"],"summary":"Buendnis Gruenden","description":"Ein Buendnis gruenden (nur der Anfuehrer, Clan ab Level 5).","operationId":"buendnis_gruenden_api_v1_users_me_clan_buendnis_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuendnisGruendung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/clan/buendnis/einladen":{"post":{"tags":["🏰 Clans"],"summary":"Buendnis Einladen","description":"Einen Clan per Tag einladen. Der Anfuehrer des eingeladenen Clans\nbekommt eine DM mit Annehmen und Ablehnen (clans/benachrichtigung.py).","operationId":"buendnis_einladen_api_v1_users_me_clan_buendnis_einladen_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuendnisEinladung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/clan/buendnis/einladungen/{clan_id}":{"delete":{"tags":["🏰 Clans"],"summary":"Buendnis Einladung Zurueckziehen","operationId":"buendnis_einladung_zurueckziehen_api_v1_users_me_clan_buendnis_einladungen__clan_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"integer","description":"Der eingeladene Clan","title":"Clan Id"},"description":"Der eingeladene Clan"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/clan/buendnis/einladungen/{buendnis_id}/annehmen":{"post":{"tags":["🏰 Clans"],"summary":"Buendnis Einladung Annehmen","operationId":"buendnis_einladung_annehmen_api_v1_users_me_clan_buendnis_einladungen__buendnis_id__annehmen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"buendnis_id","in":"path","required":true,"schema":{"type":"integer","description":"Das einladende Buendnis","title":"Buendnis Id"},"description":"Das einladende Buendnis"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/clan/buendnis/einladungen/{buendnis_id}/ablehnen":{"post":{"tags":["🏰 Clans"],"summary":"Buendnis Einladung Ablehnen","operationId":"buendnis_einladung_ablehnen_api_v1_users_me_clan_buendnis_einladungen__buendnis_id__ablehnen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"buendnis_id","in":"path","required":true,"schema":{"type":"integer","description":"Das einladende Buendnis","title":"Buendnis Id"},"description":"Das einladende Buendnis"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/clan/buendnis/verlassen":{"post":{"tags":["🏰 Clans"],"summary":"Buendnis Verlassen","description":"Das Buendnis verlassen - mit dem Tag des Buendnisses als Bestaetigung.\nBleibt danach nur ein Clan, ist das Buendnis aufgeloest.","operationId":"buendnis_verlassen_api_v1_users_me_clan_buendnis_verlassen_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__clans__Bestaetigung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/clan/today":{"get":{"tags":["🏰 Clans"],"summary":"Heute Lesen","description":"Die drei Tagesauftraege, der Joker und die Tageskiste - und die\nTagesserie dazu (clans/tagesauftraege.py, clans/serie.py). Ohne Clan\nleer (`im_clan: false`): Tagesauftraege gibt es nur im Clan.","operationId":"heute_lesen_api_v1_users_me_clan_today_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/clan/today/{slot}/reroll":{"post":{"tags":["🏰 Clans"],"summary":"Heute Wuerfeln","description":"Einen offenen Tagesauftrag neu wuerfeln - der erste Wurf des Tages ist\nfrei, jeder weitere kostet einen Joker aus dem Rucksack.","operationId":"heute_wuerfeln_api_v1_users_me_clan_today__slot__reroll_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slot","in":"path","required":true,"schema":{"type":"integer","maximum":2,"minimum":0,"description":"Platz des Tagesauftrags","title":"Slot"},"description":"Platz des Tagesauftrags"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/clan/pass/claim":{"post":{"tags":["🏰 Clans"],"summary":"Pass Abholen","description":"Alles Abholbare des Saisonpfads abholen: Kisten in den Rucksack der\nKisten, Kristalle und Clan-XP in den Clan, Boosts, Joker und\nSerienschutz in den Rucksack (clans/clan_pass.py `abholen`). Zweimal\ngeklickt holt jede Stufe genau einmal ab.","operationId":"pass_abholen_api_v1_users_me_clan_pass_claim_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/clan/bag":{"get":{"tags":["🏰 Clans"],"summary":"Rucksack Lesen","description":"Der Rucksack, die Server, auf denen ein Boost wirken kann, und die\nBoosts, die gerade laufen (`laufend`).","operationId":"rucksack_lesen_api_v1_users_me_clan_bag_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/clan/bag/{art}/use":{"post":{"tags":["🏰 Clans"],"summary":"Rucksack Einsetzen","description":"Einen Boost auf einem Server einsetzen - x2 fuer eine Stunde, ueber die\nWirkungs-Maschine der Wirtschaft wie ein Shop-Boost (clans/rucksack.py).","operationId":"rucksack_einsetzen_api_v1_users_me_clan_bag__art__use_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"art","in":"path","required":true,"schema":{"type":"string","pattern":"^(xp_boost|coin_boost)$","title":"Art"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerWahl"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/season-tasks":{"get":{"tags":["🏰 Clans"],"summary":"Saisonaufgaben Lesen","description":"Die zehn Saisonaufgaben mit Stand und Lohn - und die Saisonkrone.\nPrueft vorher, damit ein erreichtes Ziel beim Ansehen schon belohnt ist\n(clans/saisonaufgaben.py).","operationId":"saisonaufgaben_lesen_api_v1_clans__clan_id__season_tasks_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/clan/attack-servers":{"get":{"tags":["🏰 Clans"],"summary":"Angriffs Server Lesen","description":"Von welchen Servern aus Raid- und Kriegsangriffe gehen - fuer die\nZeile \"Du greifst an mit Level 34 von Server X\" im Web.","operationId":"angriffs_server_lesen_api_v1_users_me_clan_attack_servers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/clans/{clan_id}/raid/attack":{"post":{"tags":["🏰 Clans"],"summary":"Raid Angreifen Web","description":"Ein Angriff auf den Wochen-Boss aus dem Web - derselbe Dienst und\nderselbe Tagesriegel wie `/clan raid attack` (clans/raids.py).","operationId":"raid_angreifen_web_api_v1_clans__clan_id__raid_attack_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerWahl"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clans/{clan_id}/war/attack":{"post":{"tags":["🏰 Clans"],"summary":"Krieg Angreifen Web","description":"Ein Angriff im Clan-Krieg aus dem Web - derselbe Dienst und derselbe\nTagesriegel wie `/clan war attack` (clans/kriege.py).","operationId":"krieg_angreifen_web_api_v1_clans__clan_id__war_attack_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"clan_id","in":"path","required":true,"schema":{"type":"string","description":"Clan-Id oder Tag","title":"Clan Id"},"description":"Clan-Id oder Tag"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerWahl"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/clans/leaderboard":{"get":{"tags":["🏰 Clans (oeffentlich)"],"summary":"Public Leaderboard","description":"Die globale Bestenliste der Saison, wahlweise auf eine Liga begrenzt\n(Ligen sind Punktschwellen, der Filter ist ein Bereich - Spec 3.3).\n\nMitgeliefert: das Saisonfenster fuer den Countdown und die Liga-Schwellen\nfuer den Filter, damit die Seite keine Zahl aus clans/regeln.py kopiert.","operationId":"public_leaderboard_api_v1_public_clans_leaderboard_get","parameters":[{"name":"scope","in":"query","required":false,"schema":{"type":"string","description":"global | league","default":"global","title":"Scope"},"description":"global | league"},{"name":"league","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"bronze | silber | gold | platin | diamant | champion","title":"League"},"description":"bronze | silber | gold | platin | diamant | champion"},{"name":"season","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}$"},{"type":"null"}],"title":"Season"}},{"name":"seite","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Seite"}},{"name":"pro_seite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Pro Seite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/clans/finder":{"get":{"tags":["🏰 Clans (oeffentlich)"],"summary":"Public Finder","description":"Der Clan-Finder (Nachtlauf 2): Clans, in die man hineinkommt - offen\noder mit Bewerbung, mindestens ein freier Platz -, wahlweise nur die auf\neinem Server (`server_id`) oder mit einer Sprache (die des\nHeimatservers), sortiert nach Aktivitaet, Alter oder Groesse\n(`clans/finder.py`, dieselbe Suche wie `/clan discover`).\n\nUnbekannte Sortierung oder Sprache sind kein Fehler, sondern die Vorgabe:\nein alter Link mit einem Filter, den es nicht mehr gibt, soll eine Liste\nzeigen und keine Absage.","operationId":"public_finder_api_v1_public_clans_finder_get","parameters":[{"name":"server_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{15,22}$"},{"type":"null"}],"title":"Server Id"}},{"name":"sprache","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Sprache"}},{"name":"sortierung","in":"query","required":false,"schema":{"type":"string","maxLength":10,"default":"aktiv","title":"Sortierung"}},{"name":"seite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":1,"title":"Seite"}},{"name":"pro_seite","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"default":12,"title":"Pro Seite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/clans/sitemap":{"get":{"tags":["🏰 Clans (oeffentlich)"],"summary":"Public Sitemap","description":"Die Clans, die in die Sitemap gehoeren: nicht archiviert, mindestens\ndrei Mitglieder. Schlank wie die Shop-Sitemap - Tag und Zeitstempel,\nmehr braucht sie nicht, und dieselbe Antwortform (`entries`), damit der\nSitemap-Bauer des Frontends beide gleich liest.\n\nDer zuletzt geaenderte zuerst und die Id als zweiter Schluessel: ein\n`LIMIT` ohne feste Ordnung gaebe bei jedem Abruf eine andere Auswahl.","operationId":"public_sitemap_api_v1_public_clans_sitemap_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50000,"minimum":1,"default":50000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/clans/seasons/{season_key}":{"get":{"tags":["🏰 Clans (oeffentlich)"],"summary":"Public Hall Of Fame","description":"Die Hall of Fame einer abgeschlossenen Saison.\n\nQuelle ist seit Phase 2 `clan_season_hall` (ueber `saison.hall_of_fame`)\nund NICHT mehr `clan_seasons` mit einem Join auf `clans`. Der Unterschied\nist der Sinn der Tabelle: sie haelt Tag, Name, Wappen und Farbe so fest,\nwie sie am Saisonende WAREN. Ein Clan, der danach umbenennt, umfaerbt\noder sich aufloest, steht hier weiter so, wie er gewonnen hat - beim Join\nauf `clans` waere die Meisterschaft von 2026-08 im September ploetzlich\nvon einem anders heissenden Clan gewonnen worden, und ein aufgeloester\nhaette gar keinen Tag mehr.\n\nSolange keine Saison abgeschlossen ist (der Saisonabschluss laeuft\nstuendlich, `saison.abschliessen_faellige`), bleibt die Liste leer und\n`finalized` false - die laufende Saison ist keine Hall of Fame, sondern\ndie Bestenliste.","operationId":"public_hall_of_fame_api_v1_public_clans_seasons__season_key__get","parameters":[{"name":"season_key","in":"path","required":true,"schema":{"type":"string","description":"z. B. 2026-08","title":"Season Key"},"description":"z. B. 2026-08"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/clans/regeln":{"get":{"tags":["🏰 Clans (oeffentlich)"],"summary":"Public Regeln","description":"Jede Zahl, die \"So funktioniert's\" und der Level-Fahrplan nennen -\naus clans/regeln.py, damit die Website keine davon abschreibt. Eine\nErklaerung mit einer anderen Zahl als die, nach der der Bot rechnet,\nwaere schlimmer als keine.\n\nAenderungen an den Regeln erreichen die Seite nach spaetestens 30 Minuten\n(Cache) - Regeln aendern sich mit einem Deploy, nicht stuendlich.\n\nSteht VOR `/public/clans/{tag}`: sonst waere \"regeln\" ein Tag, und die\nSeite bekaeme \"Clan nicht gefunden\" (tests/test_route_reihenfolge.py).","operationId":"public_regeln_api_v1_public_clans_regeln_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}}}}},"/api/v1/public/clans/buendnisse":{"get":{"tags":["🏰 Clans (oeffentlich)"],"summary":"Public Buendnisse","description":"Die Rangliste der Buendnisse: die Saison-XP ihrer Clans zusammen.\n\nMitgeliefert: die Regeln (wie viele Clans, Bonus je Verbuendetem, ab\nwelchem Level), damit die Seite sie nicht aus clans/buendnisse.py\nabschreibt.","operationId":"public_buendnisse_api_v1_public_clans_buendnisse_get","parameters":[{"name":"seite","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Seite"}},{"name":"pro_seite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Pro Seite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/clans/buendnisse/{tag}":{"get":{"tags":["🏰 Clans (oeffentlich)"],"summary":"Public Buendnis","description":"Ein Buendnis: Standarte, Clans, Platz, Bonus. Offene Einladungen stehen\nNICHT darin - wen ein Buendnis gefragt hat, geht nur die beiden an.","operationId":"public_buendnis_api_v1_public_clans_buendnisse__tag__get","parameters":[{"name":"tag","in":"path","required":true,"schema":{"type":"string","description":"Tag des Buendnisses","title":"Tag"},"description":"Tag des Buendnisses"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/clans/{tag}":{"get":{"tags":["🏰 Clans (oeffentlich)"],"summary":"Public Profile","description":"Alles fuer /clans/[tag] (Spec 6.2): Wappen, Level und Balken, Liga\nund Rang der Saison, die Vorsaisons, der Anfuehrer, die zehn groessten\nBeitragenden, der Heimatserver - mit Invite nur bei Freigabe.\n\nSeit Phase 2 dazu die Bauwerke (nur Schluessel und Stufe) und, wenn diese\nWoche ein Boss steht, der Raid in groben Zuegen. Beides ist Aushaengeschild\nund kein Innenleben: ein Clan mit Tresor auf Stufe 5 zeigt, dass er lange\nzusammen spielt, und ein laufender Raid ist der Grund, auf \"Beitreten\" zu\ntippen. Was NICHT hier steht, ist die Rechnung dahinter - Kristallbestand,\nPreise, Baubarkeit, eigener Schaden und die Angriffszahlen einzelner\nMitglieder stehen nur mit Anmeldung und nur fuer Mitglieder\n(api/routers/clans.py).","operationId":"public_profile_api_v1_public_clans__tag__get","parameters":[{"name":"tag","in":"path","required":true,"schema":{"type":"string","description":"Clan-Tag","title":"Tag"},"description":"Clan-Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/clans/{tag}/members":{"get":{"tags":["🏰 Clans (oeffentlich)"],"summary":"Public Members","description":"Die Mitgliederliste, 25 je Seite, in der Ordnung von `/clan members`\n(Rang, dann Beitrag). Namen und Bilder fuer alle, Ids nur fuer den\nAnfuehrer und die Top 10 - siehe Modulkopf.","operationId":"public_members_api_v1_public_clans__tag__members_get","parameters":[{"name":"tag","in":"path","required":true,"schema":{"type":"string","description":"Clan-Tag","title":"Tag"},"description":"Clan-Tag"},{"name":"seite","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Seite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/clans/{tag}/chronik":{"get":{"tags":["🏰 Clans (oeffentlich)"],"summary":"Public Chronik","description":"Die Chronik eines Clans, 20 je Seite, neueste zuerst (Nachtlauf 3, C3).\n\nDie Clan-Seite bringt die ersten sechs schon mit (`chronik` im Profil);\n\"Mehr laden\" holt ab hier die echten Seiten - dasselbe Muster wie die\nMitgliederliste. Die Gruendung steht nicht darin: die Seite setzt sie aus\n`created_at` ans Ende, wenn die letzte Seite geladen ist.","operationId":"public_chronik_api_v1_public_clans__tag__chronik_get","parameters":[{"name":"tag","in":"path","required":true,"schema":{"type":"string","description":"Clan-Tag","title":"Tag"},"description":"Clan-Tag"},{"name":"seite","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":1,"title":"Seite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/clans/{tag}/widget":{"get":{"tags":["🏰 Clans (oeffentlich)"],"summary":"Public Widget","description":"Die Karte zum Einbetten (Nachtlauf 3, C3) - Frontend app/clans/[tag]/widget.\n\nGenau das, was die Karte zeigt: Wappen, Tag und Name, Liga und Platz,\nLevel, Mitglieder, Beitrittsregel. Die Clan-Seite waere dafuer ein\nDutzend Abfragen (Bauwerke, Raid, Kriege, Beitragende ...), die Karte\nbraucht vier. Fuenf Minuten Cache: die Karte steht auf fremden Seiten,\njeder ihrer Besucher ruft sie ab, und ob dort 18 oder 19 Mitglieder\nstehen, darf eine Weile nachlaufen.","operationId":"public_widget_api_v1_public_clans__tag__widget_get","parameters":[{"name":"tag","in":"path","required":true,"schema":{"type":"string","description":"Clan-Tag","title":"Tag"},"description":"Clan-Tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/clans":{"get":{"tags":["🏰 Clans (oeffentlich)"],"summary":"Public Server Clans","description":"/clans/server/[serverId]: die Clans auf einem Server nach der\nSaison-XP, die HIER entstand (Spec 3.3). Vom Server gesperrte Clans\nfehlen - der Admin hat entschieden, dass sie hier nicht hingehoeren, und\nseine oeffentliche Seite soll das nicht widerlegen. Ausgeschlossen werden\nsie im Dienst (`bestenliste`, Scope `server`), in der Abfrage selbst:\nnur so stimmen `gesamt`, `seiten` und `rank` - eine Filterung nach der\nSeitenbildung liesse Luecken in den Raengen und kurze Seiten.","operationId":"public_server_clans_api_v1_public_servers__server_id__clans_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"season","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}$"},{"type":"null"}],"title":"Season"}},{"name":"seite","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Seite"}},{"name":"pro_seite","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Pro Seite"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/clans/links/{code}":{"get":{"tags":["🏰 Clans (oeffentlich)"],"summary":"Public Link","description":"Was `/clans/join/<CODE>` zeigt, bevor jemand sich anmeldet: der Clan\nund ob der Link noch gilt.\n\nKurz gecacht (30 s) wie jede Seite hier: ein gerade widerrufener Link\nkann eine halbe Minute lang noch \"gueltig\" heissen - das Einloesen\nprueft trotzdem frisch (clans/links.py) und sagt dann die Wahrheit.\n\nDas Rate-Limit ist enger als bei den Listen - das ist der Endpunkt, an\ndem jemand Codes raten koennte - und liegt HINTER dem Cache: ein\ngeratener Code trifft nie einen Eintrag und zaehlt jedes Mal. Ein\ngeteilter Link dagegen, den eine Gruppe hinter derselben\nMobilfunk-Adresse (CGNAT) oeffnet, zaehlte vor dem Cache jeden Aufruf -\nund der 31. in der Minute bekam 429 fuer eine Antwort, die laengst im\nCache lag.\n\n`404 link_not_found` fuer einen unbekannten Code UND fuer einen Link in\neinen aufgeloesten Clan - von aussen soll nicht unterscheidbar sein, ob\nes den Code je gab.","operationId":"public_link_api_v1_public_clans_links__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","maxLength":80,"description":"Der Code aus dem Link","title":"Code"},"description":"Der Code aus dem Link"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__economy__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints/limits":{"get":{"tags":["🧬 Blueprints"],"summary":"Get Blueprint Limits","description":"Mengenlimit und Verbrauch, damit das Frontend nicht raten muss.\n\nZwei Limits, und sie messen absichtlich Verschiedenes: die ANZAHL deckelt,\nwie viele Vorlagen ein Server halten darf, der SPEICHER, was sie zusammen\nwiegen. Ein Server kann an einem von beiden anstehen, ohne das andere\nauszureizen - eine Erfassung mit 250 Emojis fuellt den Speicher, waehrend\nzwei von drei Plaetzen frei sind.","operationId":"get_blueprint_limits_api_v1_servers__server_id__blueprints_limits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Blueprint Limits Api V1 Servers  Server Id  Blueprints Limits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints":{"get":{"tags":["🧬 Blueprints"],"summary":"List Server Blueprints","description":"Blueprints dieses Servers, mit den Zahlen der aktuellen Version.\n\nDie Zaehler und die Groesse haengen an der VERSION, nicht am Blueprint.\nDas Dashboard hat sie sich deshalb frueher je Karte einzeln geholt - eine\nAnfrage pro Zeile, nur um \"wie gross ist das\" zu beantworten. Jetzt kommen\nsie in zwei zusaetzlichen Abfragen mit, unabhaengig davon, wie viele\nBlueprints der Server hat.\n\nDie Nutzlast bleibt draussen: `stats` traegt Zaehler und Byteangaben, nie\n`payload` oder `data` (siehe Leitplanke 1 im Kopf dieser Datei).","operationId":"list_server_blueprints_api_v1_servers__server_id__blueprints_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Server Blueprints Api V1 Servers  Server Id  Blueprints Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🧬 Blueprints"],"summary":"Create Blueprint","description":"Erfassung starten.\n\nLegt Blueprint und Job an und stoesst den Bot per Redis an. Der Bot fuehrt\ndie eigentliche Erfassung aus und pflegt den Fortschritt in den Job.","operationId":"create_blueprint_api_v1_servers__server_id__blueprints_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBlueprintRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Blueprint Api V1 Servers  Server Id  Blueprints Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints/plan":{"post":{"tags":["🧬 Blueprints"],"summary":"Plan Blueprint","description":"Trockenlauf. Sagt vorher, was ein Anwenden taete, und schreibt nichts.","operationId":"plan_blueprint_api_v1_servers__server_id__blueprints_plan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Plan Blueprint Api V1 Servers  Server Id  Blueprints Plan Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints/apply":{"post":{"tags":["🧬 Blueprints"],"summary":"Apply Blueprint","description":"Anwenden. Verlangt einen frischen, erfolgreichen Trockenlauf.\n\nDie Freigabe wird hier serverseitig geprueft und im Cog ein zweites Mal.\nDer Client darf nicht bestimmen, ob ein Plan gueltig war - sonst genuegte\neine erfundene `plan_job_id`, um die Vorschau zu ueberspringen.","operationId":"apply_blueprint_api_v1_servers__server_id__blueprints_apply_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Apply Blueprint Api V1 Servers  Server Id  Blueprints Apply Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints/undo":{"post":{"tags":["🧬 Blueprints"],"summary":"Undo Blueprint","description":"Den letzten Lauf zuruecknehmen.","operationId":"undo_blueprint_api_v1_servers__server_id__blueprints_undo_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UndoRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Undo Blueprint Api V1 Servers  Server Id  Blueprints Undo Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints/jobs/active":{"get":{"tags":["🧬 Blueprints"],"summary":"Get Active Blueprint Job","description":"Der Lauf, ueber den das Dashboard Bescheid wissen muss.\n\nDamit findet es eine Erfassung oder Anwendung wieder, die es aus den\nAugen verloren hat: nach einem Reiterwechsel, einem Neuladen oder weil\njemand von einem anderen Geraet aus gestartet hat.\n\n── WARUM HIER AUCH EIN GESCHEITERTER LAUF HERAUSGEHT ─────────────────\n\nBis hierher meldete diese Route nur LEBENDE Laeufe, und ein toter wurde\nzu `null`. Das ergab die schlimmste aller Anzeigen: der Streifen war\neinfach weg. Verschwinden ist aber die Bewegung von FERTIG - wer sie\nsieht, schliesst daraus, dass es geklappt hat. Bei einer Sicherung merkt\nman diesen Irrtum erst an dem Tag, an dem man sie braucht.\n\nDeshalb geht ein Lauf, der in der letzten Stunde OHNE ERGEBNIS geendet\nhat, hier ebenfalls hinaus. Das Frontend braucht dafuer nichts Neues:\n`neuerer()` nimmt ihn, `shouldWatch` sieht einen terminalen Status und\npollt nicht, `stripVisible` zeigt den Streifen mit seinem Fehlertext.\n\nDie Stunde ist dieselbe Spanne wie in `utils/insel_live`, und sie ist\ndort begruendet. Kuerzer verpasst man den Fehlschlag beim Kaffeeholen;\nlaenger stuende der rote Streifen noch da, wenn die Sache erledigt ist.\n\n── UND WARUM DIE ROUTE SELBST URTEILT ────────────────────────────────\n\nAufgeschrieben wird ein Fehlschlag vom Aufraeumlauf im Bot. Der sitzt IM\nBot - ist der Bot aus, raeumt niemand auf, und das ist ausgerechnet der\nFall, in dem ein Auftrag nicht angenommen wird. `verendet()` faellt das\nUrteil deshalb hier, ohne zu schreiben: der Datensatz bleibt, wie er\nist, und der Aufraeumlauf holt ihn ein, sobald der Bot wieder da ist.","operationId":"get_active_blueprint_job_api_v1_servers__server_id__blueprints_jobs_active_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Active Blueprint Job Api V1 Servers  Server Id  Blueprints Jobs Active Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints/jobs/{job_id}":{"get":{"tags":["🧬 Blueprints"],"summary":"Get Blueprint Job","description":"Fortschritt eines Vorgangs. Wird vom Dashboard gepollt.\n\nNUR LESEN. Hier stand eine Zeit lang der Rumpf des Abbruchs (beim\nAuslagern nach `utils/blueprint_abbruch.py` in den falschen Handler\ngerutscht, die POST-Route darunter fiel dabei weg): jeder Poll - alle\nanderthalb Sekunden - brach eine laufende Erfassung ab und loeschte sie,\nund Trockenlauf, Anwenden und Ruecknahme bekamen auf jede Abfrage eine\n400, sodass kein Plan je fertig wurde. `test_blueprint_abbruch` haelt\ndie Trennung jetzt fest.","operationId":"get_blueprint_job_api_v1_servers__server_id__blueprints_jobs__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","description":"Job ID","title":"Job Id"},"description":"Job ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Blueprint Job Api V1 Servers  Server Id  Blueprints Jobs  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints/jobs/{job_id}/cancel":{"post":{"tags":["🧬 Blueprints"],"summary":"Cancel Blueprint Job","description":"Eine laufende Erfassung abbrechen und ihre Spuren entfernen.\n\nNur Erfassungen, und nur kooperativ - das Warum steht an\n`utils/blueprint_abbruch.py`.","operationId":"cancel_blueprint_job_api_v1_servers__server_id__blueprints_jobs__job_id__cancel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","description":"Job ID","title":"Job Id"},"description":"Job ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Blueprint Job Api V1 Servers  Server Id  Blueprints Jobs  Job Id  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints/restore-points":{"get":{"tags":["🧬 Blueprints"],"summary":"List Restore Points","description":"Wiederherstellungspunkte. Liefert NIE die Schnappschussdaten selbst.","operationId":"list_restore_points_api_v1_servers__server_id__blueprints_restore_points_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Restore Points Api V1 Servers  Server Id  Blueprints Restore Points Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints/installs":{"get":{"tags":["🧬 Blueprints"],"summary":"List Installs","description":"Was auf diesem Server bereits installiert wurde.\n\n`job_id` UND `sections_applied` gehen mit hinaus, und beides stand schon\nin der Tabelle - nur nie in der Antwort.\n\nDer Lauf-Schluessel ist der einzige Faden zwischen diesem Journal und den\nWiederherstellungspunkten: `blueprint_apply.schreibe_restore_point` und\n`_schreibe_install` tragen dieselbe `job.id` ein. Ohne ihn steht in der\nOberflaeche bei einem Wiederherstellungspunkt nur \"vor zwei Stunden,\n4,2 MB\" - die Frage davor ist aber immer \"zurueck WOVOR eigentlich\", und\ndie konnte niemand beantworten.\n\n`sections_applied` sagt, welche Notoq-Bereiche der Lauf wirklich\ngeschrieben hat. Zwei Anwendungen derselben Vorlage koennen sich darin\nunterscheiden (abgewaehlte Bereiche, fehlende Rechte), und genau das ist\ndie Auskunft, die ein Journal schuldet.\n\n`status` bleibt drin, wird aber bewusst NICHT angezeigt: `_schreibe_install`\nsetzt ihn als Konstante \"completed\", ein gescheiterter Lauf legt gar keine\nZeile an. Eine Spalte, die immer dasselbe sagt, ist keine Information.","operationId":"list_installs_api_v1_servers__server_id__blueprints_installs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Installs Api V1 Servers  Server Id  Blueprints Installs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints/portable":{"get":{"tags":["🧬 Blueprints"],"summary":"List Portable Blueprints","description":"Eigene Blueprints ANDERER Server, hier anwendbar.\n\nDas ist die Tuer, die dem System bisher gefehlt hat. Anwendbar waren sie\nschon immer - `_anwendbarer_blueprint` laesst den Besitzer seinen eigenen\nBlueprint auf jedem Server anwenden, den er administriert. Nur SEHEN\nkonnte man sie nicht: `list_server_blueprints` filtert ueber\n`source_server_id`, und die Bibliothek eines frisch aufgesetzten Servers\nwar deshalb leer, obwohl der Betreiber nebenan eine fertige Vorlage liegen\nhatte.\n\nGenau das macht eine eigene Vorlage erst zu einer Vorlage: einmal auf dem\ngewachsenen Server erfassen, auf dem naechsten anwenden. Ohne diese Liste\nfuehrte der Weg dorthin ueber Export als Datei und Import auf der anderen\nSeite - zweimal mehrere Megabyte durch den Browser, fuer etwas, das schon\nin derselben Datenbank liegt.\n\nKEIN ZUGRIFF AUF FREMDE VORLAGEN: gefiltert wird ueber `owner_user_id`,\nnicht ueber die Server, die der Betrachter administriert. Wer zwei Server\nverwaltet, sieht seine eigenen Vorlagen von beiden - nicht die eines\nKollegen vom Nachbarserver. Fuer die gibt es den Marktplatz, und der hat\neine Pruefung.\n\nKlone bleiben in der Liste, mit ihrem `mode` sichtbar. Sie auszublenden\nwaere eine halbe Bibliothek ohne Erklaerung; die Oberflaeche warnt\nstattdessen, dass darin Mitgliederzustand eines anderen Servers steckt.","operationId":"list_portable_blueprints_api_v1_servers__server_id__blueprints_portable_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Portable Blueprints Api V1 Servers  Server Id  Blueprints Portable Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints/deleted":{"get":{"tags":["🧬 Blueprints"],"summary":"List Deleted Blueprints","description":"Der Papierkorb: geloeschte Blueprints, die noch zurueckkoennen.\n\n`delete_blueprint` loescht weich, und der Wachhund raeumt die Nutzlast\nerst nach `SCHONFRIST_TAGE` weg. Dazwischen liegen drei Tage, in denen\nalles noch da ist - bisher ohne jede Tuer dorthin.\n\nDrei Bedingungen, und alle drei sind noetig; die Regel selbst steht in\n`blueprint_aufraeumen.ist_wiederherstellbar` und ist dort getestet. Hier\nstehen sie als Filter, damit die Auswahl in der Datenbank passiert und\nnicht ueber hundert geladene Zeilen.\n\nNutzlast bleibt draussen, wie in jeder Liste hier: `.values()` mit fester\nFeldliste, Groessen aus den Zaehlern.","operationId":"list_deleted_blueprints_api_v1_servers__server_id__blueprints_deleted_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Deleted Blueprints Api V1 Servers  Server Id  Blueprints Deleted Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints/auto":{"get":{"tags":["🧬 Blueprints"],"summary":"Get Auto Blueprint","description":"Zustand der taeglichen Automatik.\n\nOhne Konfigurationszeile ist die Antwort 'aus' - die Zeile entsteht erst\nbeim ersten Einschalten. Ein Server, der das Feature nie angefasst hat,\nsoll dafuer keine Zeile bekommen.","operationId":"get_auto_blueprint_api_v1_servers__server_id__blueprints_auto_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Auto Blueprint Api V1 Servers  Server Id  Blueprints Auto Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🧬 Blueprints"],"summary":"Set Auto Blueprint","description":"Die Automatik ein- oder ausschalten, ihren Meldekanal setzen oder entfernen.\n\nAUSSCHALTEN GEHT IMMER, auch ohne Premium. Sonst sitzt ein herabgestufter\nServer auf einem Schalter, den er nicht mehr umlegen kann - die Pruefung\nsoll den Zugang zum Feature deckeln, nicht den Ausgang daraus.\n\nEinschalten setzt `next_run_at` auf JETZT. Der erste Stand soll nicht bis\nzum naechsten Tag warten; der stuendliche Lauf im Bot nimmt ihn beim\nnaechsten Durchgang mit.\n\nDas Mengenlimit wird hier bewusst NICHT geprueft: der automatische\nBlueprint zaehlt nicht dagegen (siehe `_gemeterte_ids`). Der Speicher wird\nebenfalls nicht vorab geprueft - wie gross die Erfassung wird, weiss vorher\nniemand, und die harte Grenze zieht der Bot vor dem Schreiben der Version.\nDer Grund landet dann in `last_error` und steht in der Oberflaeche.\n\nDER MELDEKANAL braucht kein Premium: er schaltet nichts frei. Gemeldet\nwird nur nach einem echten Lauf, und der haengt am Schalter. Ein Kanal,\nder nachweislich zu einem anderen Server gehoert, wird abgewiesen; einer,\nden niemand aufloesen kann, geht durch - der Bot sucht ihn beim Senden\nohnehin nur unter den Kanaelen dieses Servers.","operationId":"set_auto_blueprint_api_v1_servers__server_id__blueprints_auto_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoBlueprintRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Auto Blueprint Api V1 Servers  Server Id  Blueprints Auto Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints/{blueprint_id}/restore":{"post":{"tags":["🧬 Blueprints"],"summary":"Restore Blueprint","description":"Einen geloeschten Blueprint zurueckholen.\n\nDAS LIMIT WIRD ERNEUT GEPRUEFT, und das ist keine Formsache. Das Loeschen\ngibt den Platz SOFORT frei, weil `_gemeterte_ids` auf `deleted_at=None`\nfiltert. Ohne diese Pruefung waere die Deckelung trivial zu umgehen:\nloeschen, neu erfassen, das geloeschte zurueckholen - und der Server haelt\neinen Blueprint mehr, als sein Tarif hergibt. Beim Speicher gilt dasselbe,\nnur mit der genauen Zahl: `server_belegung` zaehlt geloeschte nicht mit,\nalso muss das Gewicht dieses Blueprints hier ausdruecklich dazugerechnet\nwerden.\n\n410 statt 404, wenn die Frist vorbei ist. Der Unterschied zwischen \"gab es\nnie\" und \"war zu spaet\" ist genau die Auskunft, die an dieser Stelle\ngebraucht wird.\n\nSICHTBARKEIT BLEIBT, WIE `delete_blueprint` SIE HINTERLASSEN HAT: privat\nund Entwurf. Ein veroeffentlichter Blueprint wuerde sonst still zurueck in\nden Marktplatz rutschen, an der Freigabe vorbei, waehrend der Nutzer nur\n\"wiederherstellen\" gedrueckt hat. Wer wieder veroeffentlichen will, geht\ndurch `publish` und damit durch die Pruefung.","operationId":"restore_blueprint_api_v1_servers__server_id__blueprints__blueprint_id__restore_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","description":"Blueprint ID","title":"Blueprint Id"},"description":"Blueprint ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Restore Blueprint Api V1 Servers  Server Id  Blueprints  Blueprint Id  Restore Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints/{blueprint_id}":{"delete":{"tags":["🧬 Blueprints"],"summary":"Delete Blueprint","description":"Weiches Loeschen, damit Installationen ihre Herkunft behalten.\n\nEINE AUSNAHME: der automatische Blueprint. Bei ihm wird die Automatik\nabgeschaltet und der Eintrag HART geloescht.\n\nWeich waere hier falsch, und zwar aus zwei Richtungen. Der Papierkorb bietet\nWiederherstellung an - einen automatischen Blueprint wiederherzustellen,\nwaehrend der Tageslauf ihn ohnehin taeglich neu schreibt, ergaebe zwei\nWahrheiten. Und liesse man die Automatik an, waere der Eintrag am naechsten\nTag wieder da, was aus Sicht des Nutzers schlicht heisst, dass Loeschen\nnicht funktioniert.","operationId":"delete_blueprint_api_v1_servers__server_id__blueprints__blueprint_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","description":"Blueprint ID","title":"Blueprint Id"},"description":"Blueprint ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Blueprint Api V1 Servers  Server Id  Blueprints  Blueprint Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints/{blueprint_id}/preview":{"get":{"tags":["🧬 Blueprints"],"summary":"Get Apply Preview","description":"Was die Vorlage mitbringt, mit Referenzen zum Abwaehlen.\n\nHinter derselben Pruefung wie `plan` und `apply`, deckt also eigene UND\ninstallierbare Marktplatz-Blueprints ab. Damit hat der Anwenden-Dialog\nzum ersten Mal auch fuer nie veroeffentlichte Vorlagen eine Vorschau; der\noeffentliche Endpunkt liefert dort seit jeher einen 404.\n\nUEBERSETZT MIT DERSELBEN LOCALE, DIE DER PLAN VERWENDEN WIRD. Das ist\nkeine Kosmetik: `build_plan` gleicht Kanaele und Rollen ueber NAMEN ab,\nund eine Auswahlliste in einer anderen Sprache als der Trockenlauf zeigt\nNamen, die dort nicht vorkommen.\n\nDie Grenze der oeffentlichen Vorschau gilt hier weiter: `config_sections`\ntraegt Sektionsnamen und Zeilenzahlen, nie den Inhalt einer Zeile.","operationId":"get_apply_preview_api_v1_servers__server_id__blueprints__blueprint_id__preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","description":"Blueprint ID","title":"Blueprint Id"},"description":"Blueprint ID"},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"en-US | de | es | fr | it | nl | pl | prt | ru | tr","title":"Locale"},"description":"en-US | de | es | fr | it | nl | pl | prt | ru | tr"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Apply Preview Api V1 Servers  Server Id  Blueprints  Blueprint Id  Preview Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/blueprints/{blueprint_id}/assets/{sha256}":{"get":{"tags":["🧬 Blueprints"],"summary":"Get Blueprint Asset","description":"Dasselbe Bild, andere Tuer.\n\nHinter derselben Pruefung wie `plan` und `apply`, und mit derselben Liste\nerlaubter Arten: ein Besitzer bekommt hier nichts, was der Marktplatz\nnicht auch herausgibt. Container-Bilder bleiben damit ueberall drinnen,\nund es gibt keine zweite Regel, die man vergessen kann.\n\nZWEI WEGE HEREIN, und der zweite ist der Grund, warum die Vorschau\nueberhaupt Bilder zeigt: ein <img>-Tag kann keinen Authorization-Header\nsenden. Mit `get_current_user` als harter Abhaengigkeit endete jedes Bild\nim Dashboard bei einem 401, noch bevor dieser Rumpf lief. Deshalb ist die\nAbhaengigkeit optional, und `?t=` traegt eine kurzlebige Karte, die\n`get_apply_preview` ausgestellt hat - also nach genau den Pruefungen, die\nhier sonst laufen.\n\nReihenfolge zaehlt: erst die Karte, dann der Bearer. Eine gueltige Karte\nersetzt `validate_server_access` und `_anwendbarer_blueprint`, weil beide\nschon gelaufen sind, um sie auszustellen.","operationId":"get_blueprint_asset_api_v1_servers__server_id__blueprints__blueprint_id__assets__sha256__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","description":"Blueprint ID","title":"Blueprint Id"},"description":"Blueprint ID"},{"name":"sha256","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{64}$","title":"Sha256"}},{"name":"t","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Kurzlebiges Vorschau-Ticket","title":"T"},"description":"Kurzlebiges Vorschau-Ticket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blueprints/mine":{"get":{"tags":["🧬 Blueprints"],"summary":"List My Blueprints","description":"Alle eigenen Blueprints, serverübergreifend.","operationId":"list_my_blueprints_api_v1_blueprints_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List My Blueprints Api V1 Blueprints Mine Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/blueprints/{blueprint_id}/versions":{"get":{"tags":["🧬 Blueprints"],"summary":"List Versions","description":"Versionsliste mit Statistik, ohne Nutzlast.\n\n`stored` und `export` kommen dazu, weil `payload_bytes` beides nicht ist:\ndort steht die Summe der gepackten Sektionen ohne base64-Aufschlag und\nohne Assets. Die Herleitung steht in utils/blueprint_storage.py.","operationId":"list_versions_api_v1_blueprints__blueprint_id__versions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","description":"Blueprint ID","title":"Blueprint Id"},"description":"Blueprint ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Versions Api V1 Blueprints  Blueprint Id  Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blueprints/{blueprint_id}/versions/{version}/manifest":{"get":{"tags":["🧬 Blueprints"],"summary":"Get Manifest","description":"Was in der Version steckt - Sektionsnamen und Groessen, keine Inhalte.","operationId":"get_manifest_api_v1_blueprints__blueprint_id__versions__version__manifest_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","description":"Blueprint ID","title":"Blueprint Id"},"description":"Blueprint ID"},{"name":"version","in":"path","required":true,"schema":{"type":"integer","description":"Versionsnummer","title":"Version"},"description":"Versionsnummer"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Manifest Api V1 Blueprints  Blueprint Id  Versions  Version  Manifest Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blueprints/{blueprint_id}":{"patch":{"tags":["🧬 Blueprints"],"summary":"Patch Blueprint","description":"Listing-Angaben aendern. Sichtbarkeit laeuft ueber publish/unpublish.","operationId":"patch_blueprint_api_v1_blueprints__blueprint_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","description":"Blueprint ID","title":"Blueprint Id"},"description":"Blueprint ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchBlueprintRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Blueprint Api V1 Blueprints  Blueprint Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blueprints/{blueprint_id}/publish":{"post":{"tags":["🧬 Blueprints"],"summary":"Publish Blueprint","description":"Zur Veroeffentlichung einreichen.\n\n`public` durchlaeuft den Prueflauf und danach die Freigabe durch das Team.\n`unlisted` ueberspringt beides: die Seite ist nur ueber den Direktlink\nerreichbar und taucht in keiner Liste auf.","operationId":"publish_blueprint_api_v1_blueprints__blueprint_id__publish_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","description":"Blueprint ID","title":"Blueprint Id"},"description":"Blueprint ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Publish Blueprint Api V1 Blueprints  Blueprint Id  Publish Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blueprints/{blueprint_id}/unpublish":{"post":{"tags":["🧬 Blueprints"],"summary":"Unpublish Blueprint","description":"Wieder auf privat stellen. Installationen bleiben davon unberuehrt.","operationId":"unpublish_blueprint_api_v1_blueprints__blueprint_id__unpublish_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","description":"Blueprint ID","title":"Blueprint Id"},"description":"Blueprint ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Unpublish Blueprint Api V1 Blueprints  Blueprint Id  Unpublish Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blueprints/{blueprint_id}/rate":{"post":{"tags":["🧬 Blueprints"],"summary":"Rate Blueprint","description":"Bewerten darf nur, wer den Blueprint auch installiert hat.\n\nOhne diese Huerde waere die Bewertung eine reine Meinungsspalte, die sich\nmit Zweitkonten beliebig fuellen laesst.","operationId":"rate_blueprint_api_v1_blueprints__blueprint_id__rate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","description":"Blueprint ID","title":"Blueprint Id"},"description":"Blueprint ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rate Blueprint Api V1 Blueprints  Blueprint Id  Rate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blueprints/{blueprint_id}/report":{"post":{"tags":["🧬 Blueprints"],"summary":"Report Blueprint","description":"Melden kann jeder, auch ohne Installation. Deshalb eng ratenbegrenzt.","operationId":"report_blueprint_api_v1_blueprints__blueprint_id__report_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","description":"Blueprint ID","title":"Blueprint Id"},"description":"Blueprint ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Report Blueprint Api V1 Blueprints  Blueprint Id  Report Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blueprints/import":{"post":{"tags":["🧬 Blueprints"],"summary":"Import Blueprint","description":"Einen exportierten Blueprint wieder einlesen.\n\nWas in der Datei steht, entscheidet NICHT ueber Sichtbarkeit, Freigabe\noder das Merkmal 'offiziell'. Sonst baut sich jemand per Datei ein\nfreigegebenes offizielles Listing.\n\nDer Koerper kommt bewusst NICHT als `body: dict = Body(...)`: die\nGroessengrenze muss vor dem Parsen greifen, sonst liegt die ganze Datei\nschon im Speicher, wenn sie abgewiesen wird. Siehe `_koerper_mit_grenze`.\nDer Zugriff wird trotzdem ZUERST geprueft, damit ein Fremder nicht 250 MB\nhochladen kann, nur um am Ende ein 403 zu bekommen.","operationId":"import_blueprint_api_v1_blueprints_import_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"query","required":true,"schema":{"type":"string","description":"Zielserver für das Listing","title":"Server Id"},"description":"Zielserver für das Listing"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Import Blueprint Api V1 Blueprints Import Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blueprints/{blueprint_id}/export":{"get":{"tags":["🧬 Blueprints"],"summary":"Export Blueprint","description":"Den Blueprint als lesbare JSON-Datei.\n\nDer Klon-Modus haengt an Premium: dort steckt Mitgliederzustand drin, und\nder soll nicht ueber eine Datei aus dem Produkt herauslaufen.","operationId":"export_blueprint_api_v1_blueprints__blueprint_id__export_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","description":"Blueprint ID","title":"Blueprint Id"},"description":"Blueprint ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Export Blueprint Api V1 Blueprints  Blueprint Id  Export Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team/blueprints/queue":{"get":{"tags":["🧬 Blueprints"],"summary":"Team Queue","description":"Offene Freigaben, neueste zuerst.\n\nTraegt alle automatischen Funde mit: wer freigibt, soll nicht blind\nklicken muessen. Laedt nie die Nutzlast; Groessen kommen aus der Version.","operationId":"team_queue_api_v1_team_blueprints_queue_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Team Queue Api V1 Team Blueprints Queue Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team/blueprints/reports":{"get":{"tags":["🧬 Blueprints"],"summary":"Team Reports","operationId":"team_reports_api_v1_team_blueprints_reports_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"open","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Team Reports Api V1 Team Blueprints Reports Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team/blueprints/reports/{report_id}/handle":{"post":{"tags":["🧬 Blueprints"],"summary":"Team Handle Report","operationId":"team_handle_report_api_v1_team_blueprints_reports__report_id__handle_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamNoteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Team Handle Report Api V1 Team Blueprints Reports  Report Id  Handle Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team/blueprints/versions/{version_id}/approve":{"post":{"tags":["🧬 Blueprints"],"summary":"Team Approve","description":"Freigeben. Erst danach ist das Listing oeffentlich sichtbar.","operationId":"team_approve_api_v1_team_blueprints_versions__version_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"integer","title":"Version Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamNoteRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Team Approve Api V1 Team Blueprints Versions  Version Id  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team/blueprints/versions/{version_id}/reject":{"post":{"tags":["🧬 Blueprints"],"summary":"Team Reject","description":"Ablehnen. Die Notiz ist Pflicht: der Besitzer sieht sie und soll\nwissen, was zu aendern ist.","operationId":"team_reject_api_v1_team_blueprints_versions__version_id__reject_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"integer","title":"Version Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamNoteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Team Reject Api V1 Team Blueprints Versions  Version Id  Reject Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team/blueprints/versions/{version_id}/preview":{"get":{"tags":["🧬 Blueprints"],"summary":"Team Version Preview","description":"Eine Version, wie der Marktplatz sie nach der Freigabe zeigen wuerde.\n\nDIE EINGEREICHTE VERSION, NICHT DIE AKTUELLE. Pruefung, Funde und\nFreigabe haengen an `version_id`, der Marktplatz liest dagegen\n`current_version_id`. Meist ist das dieselbe Zeile - aber ein\nautomatischer Blueprint schreibt jeden Tag eine neue Version, auch\nwaehrend eine aeltere in der Warteschlange steht. `is_current` sagt das\nder Oberflaeche, statt die Vorschau still auf eine Version zu legen, ueber\ndie gerade niemand entscheidet.\n\nDieselbe Grenze wie bei den beiden anderen Vorschauen: Sektionsnamen und\nKanalmarken ja, der Inhalt einer Zeile nie. Das Team duerfte mehr sehen,\naber die Frage hier ist, was FREMDE nach der Freigabe sehen - und genau\ndas zeigt diese Antwort.\n\n`description` kommt mit, weil die Detailseite sie unter der Vorschau\nzeigt und die Warteschlange sie nicht traegt. Das Dashboard setzt sie nie,\ndie API nimmt sie aber an - ein Text, der nach der Freigabe oeffentlich\ndasteht, gehoert vorher vor die Augen dessen, der freigibt.\n\n`locales` ist aus der Nutzlast gerechnet und nicht aus den\n`capability_flags`: Versionen aus der Zeit vor den Uebersetzungen tragen\ndort keinen Eintrag, und eine Sprache, die niemand auswaehlen kann, wird\nauch nicht geprueft.","operationId":"team_version_preview_api_v1_team_blueprints_versions__version_id__preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"integer","title":"Version Id"}},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"en-US | de | es | fr | it | nl | pl | prt | ru | tr","title":"Locale"},"description":"en-US | de | es | fr | it | nl | pl | prt | ru | tr"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Team Version Preview Api V1 Team Blueprints Versions  Version Id  Preview Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team/blueprints/versions/{version_id}/assets/{sha256}":{"get":{"tags":["🧬 Blueprints"],"summary":"Team Version Asset","description":"Die Bilder der Team-Vorschau - die dritte Tuer zu denselben Bildern.\n\nDieselbe Liste erlaubter Arten und derselbe Ausgang wie die beiden\nanderen (`_asset_antwort`): Container-Bilder bleiben auch hier drinnen,\naus demselben Grund, aus dem die Vorschau keine Konfigurationswerte zeigt.\n\nErst die Karte, dann der Bearer - wie `get_blueprint_asset`, und aus\ndemselben Grund: ein <img>-Tag sendet keinen Header. Eine gueltige Karte\nersetzt `_verlange_team`, weil `team_version_preview` sie erst NACH genau\ndieser Pruefung ausstellt.","operationId":"team_version_asset_api_v1_team_blueprints_versions__version_id__assets__sha256__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"integer","title":"Version Id"}},{"name":"sha256","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{64}$","title":"Sha256"}},{"name":"t","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Kurzlebige Team-Karte","title":"T"},"description":"Kurzlebige Team-Karte"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team/blueprints/{blueprint_id}/suspend":{"post":{"tags":["🧬 Blueprints"],"summary":"Team Suspend","description":"Ein bereits freigegebenes Listing vom Netz nehmen.\n\nVon `reject` getrennt, weil es einen anderen Anlass hat: hier war etwas\nschon oeffentlich und ist nachtraeglich aufgefallen.\n\nDIE BEGRUENDUNG IST PFLICHT, dieselbe Regel wie bei `reject`. Sie war es\nfrueher nicht - der Endpunkt nahm `note` entgegen und verwarf sie, weil es\nkeine Spalte gab. Danach stand irgendwann ein gesperrtes Listing da, und\nniemand konnte sagen, ob die Sperre noch berechtigt war. Sie landet in\n`blueprint_team_actions` und wird dem Besitzer nicht gezeigt.","operationId":"team_suspend_api_v1_team_blueprints__blueprint_id__suspend_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","title":"Blueprint Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamNoteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Team Suspend Api V1 Team Blueprints  Blueprint Id  Suspend Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team/blueprints/{blueprint_id}/feature":{"post":{"tags":["🧬 Blueprints"],"summary":"Team Feature","operationId":"team_feature_api_v1_team_blueprints__blueprint_id__feature_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","title":"Blueprint Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Team Feature Api V1 Team Blueprints  Blueprint Id  Feature Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team/blueprints":{"get":{"tags":["🧬 Blueprints"],"summary":"Team Katalog","description":"Alle Blueprints, durchsuchbar und filterbar.\n\nLaedt nie eine Nutzlast: die Liste laeuft ueber .values() mit fester\nSpaltenliste, die Groessen kommen aus den Zaehlern der Version.","operationId":"team_katalog_api_v1_team_blueprints_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Q"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Status"}},{"name":"visibility","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Visibility"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Category"}},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Locale"}},{"name":"mode","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Mode"}},{"name":"owner","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Owner"}},{"name":"flag","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Flag"}},{"name":"deleted","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Deleted"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"recent","title":"Sort"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Team Katalog Api V1 Team Blueprints Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team/blueprints/{blueprint_id}/relist":{"post":{"tags":["🧬 Blueprints"],"summary":"Team Relist","description":"Ein gesperrtes Listing zurueck auf den Marktplatz.\n\nDer Rueckweg zu `suspend`, und ohne ihn ist die Sperre keine\nModerationsentscheidung, sondern ein Loeschen mit Umweg: es gab keinen\nEndpunkt, der `listing_status` je wieder auf 'approved' gesetzt haette.\n\nDie Sichtbarkeit geht auf 'public'. Ob der Besitzer sie vor der Sperre auf\n'unlisted' stehen hatte, weiss diese Tabelle nicht - und ein Listing\nzurueckzuholen, das danach in keiner Liste auftaucht, waere die\nverwirrendere der beiden Antworten.","operationId":"team_relist_api_v1_team_blueprints__blueprint_id__relist_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","title":"Blueprint Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamNoteRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Team Relist Api V1 Team Blueprints  Blueprint Id  Relist Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team/blueprints/{blueprint_id}":{"get":{"tags":["🧬 Blueprints"],"summary":"Team Blueprint Detail","description":"Der ganze Lebenslauf eines Listings auf einmal.\n\nJede Version mit ihrer Pruefung und ihrem Siegel, jede Meldung -\neinschliesslich der erledigten -, die Praxiszahlen und die letzten\nInstallationen. Wer ein Listing vom Netz nimmt, entscheidet ueber Server,\ndie es bereits anwenden; die letzte Spalte ist der Grund, warum sie hier\nsteht.\n\nMUSS nach /team/blueprints/queue und /team/blueprints/reports deklariert\nsein, sonst landen beide als Blueprint-ID in dieser Abfrage.","operationId":"team_blueprint_detail_api_v1_team_blueprints__blueprint_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","title":"Blueprint Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Team Blueprint Detail Api V1 Team Blueprints  Blueprint Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blueprints/{blueprint_id}/certify":{"post":{"tags":["🧬 Blueprints"],"summary":"Certify Blueprint","description":"Die Huerde erneut laufen lassen.\n\nEng ratenbegrenzt: die Pruefung laedt den kompletten Payload und laeuft\nueber die gesamte Registry. Drei Versuche je Minute reichen, um nach einer\nKorrektur nachzusehen, und verhindern, dass jemand sie im Sekundentakt\nausloest.","operationId":"certify_blueprint_api_v1_blueprints__blueprint_id__certify_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","description":"Blueprint ID","title":"Blueprint Id"},"description":"Blueprint ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Certify Blueprint Api V1 Blueprints  Blueprint Id  Certify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blueprints/{blueprint_id}/certification":{"get":{"tags":["🧬 Blueprints"],"summary":"Get Certification","description":"Die Pruefkarte fuer den Besitzer, auch wenn sie durchgefallen ist.\n\nGerade der Durchfall ist die nuetzliche Auskunft: er sagt, was zu tun ist.","operationId":"get_certification_api_v1_blueprints__blueprint_id__certification_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","description":"Blueprint ID","title":"Blueprint Id"},"description":"Blueprint ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Certification Api V1 Blueprints  Blueprint Id  Certification Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team/blueprints/{blueprint_id}/signature":{"post":{"tags":["🧬 Blueprints"],"summary":"Team Grant Signature","description":"Notoq Signature vergeben.\n\nDie Auszeichnung ist eine Entscheidung, kein Schwellenwert - genau darin\nunterscheidet sie sich von Certified. Sie ist aber nicht bloss eine\nMeinung: der Endpunkt verlangt, dass DIESES Teammitglied GENAU DIESE\nVersion wirklich installiert hat. Kein Haken zum Anklicken, sondern eine\nabgeschlossene Zeile in blueprint_installs.\n\nEin Pruefstand, der das automatisch auf einer Wegwerf-Guild erledigt, war\ngeplant und wurde gestrichen: ein Bot, der von selbst Discord-Server\nanlegt und loescht, ist ein Feature, das man einmal falsch ausloest.","operationId":"team_grant_signature_api_v1_team_blueprints__blueprint_id__signature_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","title":"Blueprint Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignatureRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Team Grant Signature Api V1 Team Blueprints  Blueprint Id  Signature Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🧬 Blueprints"],"summary":"Team Withdraw Signature","description":"Signature zurueckziehen.\n\nDie NUMMER BLEIBT STEHEN, der Zustand wird 'withdrawn'. Sie auf NULL zu\nsetzen wuerde sie zur Wiedervergabe freigeben, und dann traegt ein zweiter\nBlueprint dieselbe Nummer.","operationId":"team_withdraw_signature_api_v1_team_blueprints__blueprint_id__signature_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"blueprint_id","in":"path","required":true,"schema":{"type":"integer","title":"Blueprint Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Team Withdraw Signature Api V1 Team Blueprints  Blueprint Id  Signature Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/blueprints/featured":{"get":{"tags":["🧬 Blueprint-Marktplatz"],"summary":"Featured Blueprints","description":"Was das Team hervorhebt, plus die offiziellen Starttemplates.","operationId":"featured_blueprints_api_v1_public_blueprints_featured_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Featured Blueprints Api V1 Public Blueprints Featured Get"}}}}}}},"/api/v1/public/blueprints/categories":{"get":{"tags":["🧬 Blueprint-Marktplatz"],"summary":"Blueprint Categories","description":"Kategorien mit Anzahl. Die Namen uebersetzt das Frontend.","operationId":"blueprint_categories_api_v1_public_blueprints_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Blueprint Categories Api V1 Public Blueprints Categories Get"}}}}}}},"/api/v1/public/blueprints/signature":{"get":{"tags":["🧬 Blueprint-Marktplatz"],"summary":"Signature Reihe","description":"Die nummerierte Reihe, aufsteigend.\n\nZurueckgezogene sind nicht dabei: sie behalten ihre Nummer, damit sie nie\nneu vergeben wird, aber gezeigt werden sie nicht mehr.\n\nMUSS vor /public/blueprints/{slug} stehen, sonst landet \"signature\" als\nSlug in der Detailabfrage.","operationId":"signature_reihe_api_v1_public_blueprints_signature_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Signature Reihe Api V1 Public Blueprints Signature Get"}}}}}}},"/api/v1/public/blueprints/sitemap":{"get":{"tags":["🧬 Blueprint-Marktplatz"],"summary":"Blueprint Sitemap","description":"Slug und Datum aller oeffentlichen Listings, sonst nichts.\n\nBewusst ein eigener Endpunkt statt der Liste: die ist auf 48 Eintraege\ngedeckelt, traegt Statistik mit und wuerde fuer eine Sitemap mit tausend\nEintraegen zwanzig Anfragen brauchen.\n\nMUSS vor /public/blueprints/{slug} deklariert sein, sonst landet \"sitemap\"\nals Slug in der Detailabfrage - und die Sitemap bliebe leer, ohne dass\nirgendwo ein Fehler auftaucht.","operationId":"blueprint_sitemap_api_v1_public_blueprints_sitemap_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Blueprint Sitemap Api V1 Public Blueprints Sitemap Get"}}}}}}},"/api/v1/public/blueprints":{"get":{"tags":["🧬 Blueprint-Marktplatz"],"summary":"List Public Blueprints","description":"Die Marktplatzliste.","operationId":"list_public_blueprints_api_v1_public_blueprints_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Category"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Tag"}},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Locale"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Q"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"popular","title":"Sort"}},{"name":"min_channels","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":0},{"type":"null"}],"title":"Min Channels"}},{"name":"max_channels","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":0},{"type":"null"}],"title":"Max Channels"}},{"name":"certified_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Certified Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":48,"minimum":1,"default":24,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Public Blueprints Api V1 Public Blueprints Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/blueprints/{slug}":{"get":{"tags":["🧬 Blueprint-Marktplatz"],"summary":"Public Blueprint Detail","description":"Die Detailseite. Indexierbarer Inhalt, deshalb ohne Auth.\n\nNicht gecacht, weil hier der Aufrufzaehler steigt. Die Abfragen sind\nschmal genug, dass sich das lohnt.","operationId":"public_blueprint_detail_api_v1_public_blueprints__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","maxLength":80,"title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Public Blueprint Detail Api V1 Public Blueprints  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/blueprints/{slug}/preview":{"get":{"tags":["🧬 Blueprint-Marktplatz"],"summary":"Public Blueprint Preview","description":"Kanalbaum und Rollenliste, sonst nichts.\n\nDas ist die Vorschau auf der Verkaufsseite: Namen, Arten, Verschachtelung.\nKeine Konfiguration, keine Rechte, keine Snowflakes. Wer den Blueprint\nnicht installiert, soll auch nichts davon abschreiben koennen, was Arbeit\nwar - und die IDs der Quelle gehen niemanden etwas an.\n\n`locale` ist die Sprache, in der der Server GEBAUT wuerde, nicht die\nOberflaechensprache des Besuchers. Sie gehoert hierher, weil eine Vorschau\nin einer anderen Sprache als der spaeteren Anwendung falsche Namen zeigt -\nund die Namen sind das Einzige, was diese Antwort ueberhaupt enthaelt.","operationId":"public_blueprint_preview_api_v1_public_blueprints__slug__preview_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","maxLength":80,"title":"Slug"}},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"en-US | de | es | fr | it | nl | pl | prt | ru | tr","title":"Locale"},"description":"en-US | de | es | fr | it | nl | pl | prt | ru | tr"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Public Blueprint Preview Api V1 Public Blueprints  Slug  Preview Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/blueprints/{slug}/certification":{"get":{"tags":["🧬 Blueprint-Marktplatz"],"summary":"Public Certification","description":"Die Pruefkarte, oeffentlich und datiert.\n\nAuch ein ENTZOGENES Siegel wird ausgeliefert, mit Grund und Datum. Die\nKarte verschwinden zu lassen waere der Moment, in dem das ganze System\nunglaubwuerdig wird: der Entzug ist nur nachvollziehbar, weil die Zahl,\ndie ihn ausgeloest hat, seit Wochen sichtbar hier stand.\n\nDie Ablehnungsgruende (gate_result.reasons) gehen NICHT nach aussen. Sie\nsind eine Maengelliste fuer den Besitzer, kein oeffentlicher Pranger.","operationId":"public_certification_api_v1_public_blueprints__slug__certification_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","maxLength":80,"title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Public Certification Api V1 Public Blueprints  Slug  Certification Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/blueprints/{slug}/assets/{sha256}":{"get":{"tags":["🧬 Blueprint-Marktplatz"],"summary":"Public Blueprint Asset","description":"Ein rehostetes Bild der aktuellen Version.\n\nDer Dateiname IST der Inhalt: derselbe sha256 liefert bis in alle\nEwigkeit dasselbe Bild. Deshalb `immutable` und ein Jahr Cache - eine\nMarktplatzseite mit zweihundert Emojis stellt sonst zweihundert Anfragen\nbei jedem Aufruf.\n\nDie Ratenbegrenzung liegt hoch, weil eine einzige Seite viele Bilder\nbraucht. Sie steht trotzdem da: ohne sie ist der Endpunkt eine\nAufzaehlmaschine ueber den Hashraum.","operationId":"public_blueprint_asset_api_v1_public_blueprints__slug__assets__sha256__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","maxLength":80,"title":"Slug"}},{"name":"sha256","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{64}$","title":"Sha256"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/blueprints/{slug}/card.png":{"get":{"tags":["🧬 Blueprint-Marktplatz"],"summary":"Public Card Image","description":"Das Bild fuers Teilen.\n\nEntsteht einmal je Version und liegt danach als BlueprintAsset mit\nkind='preview'. Der ETag ist der content_hash der Version: das Bild\naendert sich nur, wenn sich der Blueprint aendert, und ist deshalb\nunbegrenzt cachebar.\n\nKein cached_endpoint: der liefert JSON. Gecacht wird hier ueber die\nHTTP-Header, und das ist auch die Ebene, auf der Discord und Cloudflare\nohnehin cachen.","operationId":"public_card_image_api_v1_public_blueprints__slug__card_png_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","maxLength":80,"title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/news/feed":{"get":{"tags":["📰 Neuigkeiten (oeffentlich)"],"summary":"Get News Feed","description":"📰 News und Changelog in einem Strom - ohne Anmeldung.\n\nFuer die oeffentliche Neuigkeiten-Seite. Jede Zeile traegt `art` und sagt\ndamit selbst, ob sie eine Ankuendigung oder eine Aenderung ist.","operationId":"get_news_feed_api_v1_public_news_feed_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":48,"minimum":1,"description":"Eintraege je Seite","default":12,"title":"Limit"},"description":"Eintraege je Seite"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Versatz fuer das Nachladen","default":0,"title":"Offset"},"description":"Versatz fuer das Nachladen"},{"name":"art","in":"query","required":false,"schema":{"enum":["all","news","changelog"],"type":"string","description":"Nur diese Art","default":"all","title":"Art"},"description":"Nur diese Art"},{"name":"sort","in":"query","required":false,"schema":{"enum":["neu","alt"],"type":"string","description":"Neueste oder aelteste zuerst","default":"neu","title":"Sort"},"description":"Neueste oder aelteste zuerst"},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"enum":["bot","website","api","mixed"],"type":"string"},{"type":"null"}],"description":"Nur Changelogs aus dieser Quelle","title":"Source"},"description":"Nur Changelogs aus dieser Quelle"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/news/sitemap":{"get":{"tags":["📰 Neuigkeiten (oeffentlich)"],"summary":"Get News Sitemap","description":"🗺️ Wann sich die Neuigkeiten-Seite zuletzt geaendert hat.\n\nNur EIN Datum, und das ist Absicht: die Seite ist ein Strom und hat keine\nUnterseiten je Eintrag. Ein `lastmod`, das immer \"jetzt\" sagt, ist eine\nFalschauskunft - deshalb kommt hier der Zeitpunkt des juengsten Eintrags\nund nicht der des Abrufs.","operationId":"get_news_sitemap_api_v1_public_news_sitemap_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/servers/{server_id}/reviews/settings":{"get":{"tags":["⭐ Reviews"],"summary":"Get Settings","description":"Get current review settings.","operationId":"get_settings_api_v1_servers__server_id__reviews_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__reviews__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["⭐ Reviews"],"summary":"Update Settings","description":"Update review settings.","operationId":"update_settings_api_v1_servers__server_id__reviews_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__reviews__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["⭐ Reviews"],"summary":"Reset Settings","description":"Reset all review settings to default values.","operationId":"reset_settings_api_v1_servers__server_id__reviews_settings_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__reviews__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/reviews":{"get":{"tags":["⭐ Reviews"],"summary":"Get Reviews","description":"Get list of reviews.","operationId":"get_reviews_api_v1_servers__server_id__reviews_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of reviews","default":10,"title":"Limit"},"description":"Number of reviews"},{"name":"review_type","in":"query","required":false,"schema":{"type":"string","description":"Filter: all, purchase, general","default":"all","title":"Review Type"},"description":"Filter: all, purchase, general"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__reviews__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/reviews/{review_id}":{"delete":{"tags":["⭐ Reviews"],"summary":"Delete Review","description":"Delete a review.","operationId":"delete_review_api_v1_servers__server_id__reviews__review_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"review_id","in":"path","required":true,"schema":{"type":"integer","description":"Review ID","title":"Review Id"},"description":"Review ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__reviews__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/reviews/statistics":{"get":{"tags":["⭐ Reviews"],"summary":"Get Statistics","description":"Get review statistics.","operationId":"get_statistics_api_v1_servers__server_id__reviews_statistics_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__reviews__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/reviews/blacklist":{"get":{"tags":["⭐ Reviews"],"summary":"Get Blacklist","description":"Get blacklist.","operationId":"get_blacklist_api_v1_servers__server_id__reviews_blacklist_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__reviews__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["⭐ Reviews"],"summary":"Add To Blacklist","description":"Add user to blacklist.","operationId":"add_to_blacklist_api_v1_servers__server_id__reviews_blacklist_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlacklistCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__reviews__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/reviews/blacklist/{user_id}":{"delete":{"tags":["⭐ Reviews"],"summary":"Remove From Blacklist","description":"Remove user from blacklist.","operationId":"remove_from_blacklist_api_v1_servers__server_id__reviews_blacklist__user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__reviews__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bumpreminder/settings":{"get":{"tags":["⏰ Bump Reminder"],"summary":"Get Bump Reminder Settings","description":"Returns current bump reminder and reward settings.","operationId":"get_bump_reminder_settings_api_v1_servers__server_id__bumpreminder_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__bumpreminder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["⏰ Bump Reminder"],"summary":"Update Bump Reminder Settings","description":"Updates bump reminder and reward settings.","operationId":"update_bump_reminder_settings_api_v1_servers__server_id__bumpreminder_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BumpReminderSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__bumpreminder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["⏰ Bump Reminder"],"summary":"Reset Bump Reminder Settings","description":"Resets all bump reminder settings.","operationId":"reset_bump_reminder_settings_api_v1_servers__server_id__bumpreminder_settings_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__bumpreminder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bumpreminder/role":{"delete":{"tags":["⏰ Bump Reminder"],"summary":"Remove Bump Reminder Role","description":"Removes the configured bump reminder role.","operationId":"remove_bump_reminder_role_api_v1_servers__server_id__bumpreminder_role_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__bumpreminder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bumpreminder/status":{"get":{"tags":["⏰ Bump Reminder"],"summary":"Get Bump Reminder Status","description":"Returns detailed status of the bump reminder system.","operationId":"get_bump_reminder_status_api_v1_servers__server_id__bumpreminder_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__bumpreminder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bumpreminder/scheduled/{reminder_id}":{"delete":{"tags":["⏰ Bump Reminder"],"summary":"Cancel Scheduled Reminder","description":"Cancels a scheduled bump reminder.","operationId":"cancel_scheduled_reminder_api_v1_servers__server_id__bumpreminder_scheduled__reminder_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"reminder_id","in":"path","required":true,"schema":{"type":"integer","description":"Reminder ID","title":"Reminder Id"},"description":"Reminder ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__bumpreminder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bumpreminder/scheduled":{"get":{"tags":["⏰ Bump Reminder"],"summary":"Get Scheduled Reminders","description":"Returns all scheduled bump reminders.","operationId":"get_scheduled_reminders_api_v1_servers__server_id__bumpreminder_scheduled_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__bumpreminder__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/notifications/settings":{"get":{"tags":["💎 Boosting"],"summary":"Get Boost Notification Settings","description":"Returns the current boost notification settings.\n\nEINE parallele Welle statt ~17 sequentieller Roundtrips: die Sprache, alle\nacht Einstellungen (eine IN-Abfrage) und die Design-Farbe haengen nicht\nvoneinander ab. Die Defaults der drei uebersetzten Felder werden NACH dem\nLaden eingesetzt — sie brauchen die Sprache, aber keinen eigenen Roundtrip.","operationId":"get_boost_notification_settings_api_v1_servers__server_id__boosting_notifications_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["💎 Boosting"],"summary":"Update Boost Notification Settings","description":"Updates the boost notification settings (JSON only).","operationId":"update_boost_notification_settings_api_v1_servers__server_id__boosting_notifications_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoostNotificationSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/notifications/image":{"post":{"tags":["💎 Boosting"],"summary":"Upload Boost Notification Image","description":"Uploads a new image for boost embeds (supports PNG/GIF).","operationId":"upload_boost_notification_image_api_v1_servers__server_id__boosting_notifications_image_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_boost_notification_image_api_v1_servers__server_id__boosting_notifications_image_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["💎 Boosting"],"summary":"Delete Boost Notification Image","description":"Deletes the custom boost image (PNG or GIF).","operationId":"delete_boost_notification_image_api_v1_servers__server_id__boosting_notifications_image_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["💎 Boosting"],"summary":"Get Boost Notification Image","description":"Returns the saved image file (PNG or GIF) for preview.","operationId":"get_boost_notification_image_api_v1_servers__server_id__boosting_notifications_image_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/booster-list/config":{"get":{"tags":["💎 Boosting"],"summary":"Get Booster List Config","operationId":"get_booster_list_config_api_v1_servers__server_id__boosting_booster_list_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["💎 Boosting"],"summary":"Update Booster List Config","description":"Darstellung der Booster-Liste speichern.\n\nDie Nachricht im Kanal wird hier NICHT neu gebaut - das macht der Bot beim\nnaechsten Durchlauf seiner Aktualisierung. Ein sofortiger Neuaufbau ueber\ndie API waere ein zweiter Weg, dieselbe Nachricht zu schreiben, und beide\nkoennten sich in die Quere kommen.","operationId":"update_booster_list_config_api_v1_servers__server_id__boosting_booster_list_config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoosterListSettings"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/booster-list/colors":{"get":{"tags":["💎 Boosting"],"summary":"Get Booster Colors","operationId":"get_booster_colors_api_v1_servers__server_id__boosting_booster_list_colors_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["💎 Boosting"],"summary":"Add Booster Color","operationId":"add_booster_color_api_v1_servers__server_id__boosting_booster_list_colors_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoosterColorRoleCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["💎 Boosting"],"summary":"Delete All Booster Colors","operationId":"delete_all_booster_colors_api_v1_servers__server_id__boosting_booster_list_colors_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/booster-list/colors/{color_id}":{"put":{"tags":["💎 Boosting"],"summary":"Update Booster Color","operationId":"update_booster_color_api_v1_servers__server_id__boosting_booster_list_colors__color_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"color_id","in":"path","required":true,"schema":{"type":"integer","title":"Color Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoosterColorRoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["💎 Boosting"],"summary":"Delete Booster Color","operationId":"delete_booster_color_api_v1_servers__server_id__boosting_booster_list_colors__color_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"color_id","in":"path","required":true,"schema":{"type":"integer","title":"Color Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/status":{"get":{"tags":["💎 Boosting"],"summary":"Get Boosting Status","operationId":"get_boosting_status_api_v1_servers__server_id__boosting_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/booster-roles/settings":{"get":{"tags":["💎 Boosting"],"summary":"Get Booster Role Settings","description":"Get the booster personal roles settings (base role, award role).","operationId":"get_booster_role_settings_api_v1_servers__server_id__boosting_booster_roles_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["💎 Boosting"],"summary":"Update Booster Role Settings","description":"Update the booster personal roles settings (base role, award role).","operationId":"update_booster_role_settings_api_v1_servers__server_id__boosting_booster_roles_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoosterRoleSettings"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/booster-roles/list":{"get":{"tags":["💎 Boosting"],"summary":"List Booster Personal Roles","description":"List all personal booster roles on this server.","operationId":"list_booster_personal_roles_api_v1_servers__server_id__boosting_booster_roles_list_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/booster-roles/{user_id}":{"delete":{"tags":["💎 Boosting"],"summary":"Delete Booster Personal Role","description":"Delete a specific user's personal booster role (admin action from dashboard).","operationId":"delete_booster_personal_role_api_v1_servers__server_id__boosting_booster_roles__user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/booster-roles/candidates":{"get":{"tags":["💎 Boosting"],"summary":"List Personal Role Candidates","description":"Welche bestehenden Rollen aussehen wie eine persoenliche Booster-Rolle.\n\nDie Regel ist bewusst eng: **genau ein Mitglied traegt die Rolle, und dieses\nMitglied boostet.** Alles Weitere waere geraten. Eine Rolle, die zwei Leute\ntragen, ist keine persoenliche Rolle; eine Rolle eines Nicht-Boosters wuerde\nbeim naechsten Boost-Ende geloescht, obwohl sie nie dazugehoerte.\n\nAusgeschlossen sind ausserdem: von Discord oder Bots verwaltete Rollen\n(darunter die Booster-Rolle selbst), die eingestellte Basis- und Award-Rolle\nund alle Farbrollen der Booster-Liste - die gehoeren dem Server, nicht einer\nPerson, und ein Loeschen beim Boost-Ende waere ein Datenverlust.\n\nGeliefert wird zusaetzlich die Liste aller Booster mit ihren vergebbaren\nRollen, damit man im Dashboard auch von Hand paaren kann, wenn kein\nVorschlag passt.","operationId":"list_personal_role_candidates_api_v1_servers__server_id__boosting_booster_roles_candidates_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/booster-roles/adopt":{"post":{"tags":["💎 Boosting"],"summary":"Adopt Personal Roles","description":"Bestehende Rollen als persoenliche Booster-Rollen eintragen.\n\nNimmt eine Liste, damit \"alle Vorschlaege uebernehmen\" ein Klick ist und\nnicht dreissig.\n\nEingetragen wird nur, was sich belegen laesst: die Rolle muss zu diesem\nServer gehoeren, darf nicht verwaltet sein und darf nicht schon einer\nanderen Person gehoeren. Hat die Person bereits eine Rolle eingetragen, wird\nsie ersetzt - \"einpflegen\" heisst genau das, und ein Fehler waere hier nur\nim Weg.","operationId":"adopt_personal_roles_api_v1_servers__server_id__boosting_booster_roles_adopt_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdoptRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/server-tag/settings":{"get":{"tags":["💎 Boosting"],"summary":"Get Server Tag Settings","description":"Get the server tag role settings.","operationId":"get_server_tag_settings_api_v1_servers__server_id__boosting_server_tag_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["💎 Boosting"],"summary":"Update Server Tag Settings","description":"Update the server tag role settings. Premium only.","operationId":"update_server_tag_settings_api_v1_servers__server_id__boosting_server_tag_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerTagSettings"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/logs/settings":{"get":{"tags":["💎 Boosting"],"summary":"Get Boost Log Settings","description":"Protokoll-Einstellungen lesen (Kanal, An/Aus, Darstellung, Ereignisarten).","operationId":"get_boost_log_settings_api_v1_servers__server_id__boosting_logs_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["💎 Boosting"],"summary":"Update Boost Log Settings","description":"Protokoll-Einstellungen schreiben.","operationId":"update_boost_log_settings_api_v1_servers__server_id__boosting_logs_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoostLogSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/goal":{"get":{"tags":["💎 Boosting"],"summary":"Get Boost Goal","description":"Das frei waehlbare Boost-Ziel.","operationId":"get_boost_goal_api_v1_servers__server_id__boosting_goal_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["💎 Boosting"],"summary":"Update Boost Goal","operationId":"update_boost_goal_api_v1_servers__server_id__boosting_goal_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoostGoalSettings"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/stats":{"get":{"tags":["💎 Boosting"],"summary":"Get Boost Stats","description":"Alles fuer die Uebersichtsseite in einem Aufruf: Kennzahlen, Zielfortschritt,\nVerlauf und Bestenliste.\n\nEin Endpunkt statt vier, weil die Seite ohnehin alles gleichzeitig braucht\nund vier Aufrufe hier nur vier Runden Netzwerk waeren.","operationId":"get_boost_stats_api_v1_servers__server_id__boosting_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":90,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/events":{"get":{"tags":["💎 Boosting"],"summary":"Get Boost Events","description":"Das Ereignisprotokoll fuer das Dashboard - dieselben Zeilen, die auch in den\nProtokollkanal gehen, nur nachlesbar und filterbar.","operationId":"get_boost_events_api_v1_servers__server_id__boosting_events_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"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"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/messages":{"get":{"tags":["💎 Boosting"],"summary":"List Boost Messages","description":"Die Liste der Danke-Nachrichten - plus die Platzhalter und, solange die Liste\nleer ist, die bisherige Einzelnachricht als Uebernahmevorschlag.\n\nDer Vorschlag wird NICHT von selbst angelegt. Ein GET, der nebenbei schreibt,\nist die Sorte Ueberraschung, die man erst bemerkt, wenn man erklaeren soll,\nwoher die Nachricht kam, die niemand angelegt hat.","operationId":"list_boost_messages_api_v1_servers__server_id__boosting_messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["💎 Boosting"],"summary":"Create Boost Message","operationId":"create_boost_message_api_v1_servers__server_id__boosting_messages_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoostMessagePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/boosting/messages/{message_id}":{"put":{"tags":["💎 Boosting"],"summary":"Update Boost Message","operationId":"update_boost_message_api_v1_servers__server_id__boosting_messages__message_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoostMessagePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["💎 Boosting"],"summary":"Delete Boost Message","operationId":"delete_boost_message_api_v1_servers__server_id__boosting_messages__message_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__boosting__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/settings":{"get":{"tags":["🔒 Security"],"summary":"Get Security Settings","description":"Returns the current security settings","operationId":"get_security_settings_api_v1_servers__server_id__security_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🔒 Security"],"summary":"Update Security Settings","description":"Updates security settings","operationId":"update_security_settings_api_v1_servers__server_id__security_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecuritySettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/toggle":{"post":{"tags":["🔒 Security"],"summary":"Toggle Security System","description":"Toggles the entire security system on/off","operationId":"toggle_security_system_api_v1_servers__server_id__security_toggle_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/punishment-rules":{"get":{"tags":["🔒 Security"],"summary":"Get Punishment Rules","description":"Returns all punishment rules for this server, sorted by min_violations.","operationId":"get_punishment_rules_api_v1_servers__server_id__security_punishment_rules_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🔒 Security"],"summary":"Replace Punishment Rules","description":"Replaces ALL punishment rules at once.\nPass an empty list to reset to default (legacy fields).\nEach rule: {min_violations, action, duration_minutes?}","operationId":"replace_punishment_rules_api_v1_servers__server_id__security_punishment_rules_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PunishmentRulesUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🔒 Security"],"summary":"Upsert Punishment Rule","description":"Adds a new punishment rule or updates an existing one with the same min_violations.","operationId":"upsert_punishment_rule_api_v1_servers__server_id__security_punishment_rules_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PunishmentRuleCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/punishment-rules/{min_violations}":{"delete":{"tags":["🔒 Security"],"summary":"Delete Punishment Rule","description":"Removes a single punishment rule by its min_violations threshold.","operationId":"delete_punishment_rule_api_v1_servers__server_id__security_punishment_rules__min_violations__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"min_violations","in":"path","required":true,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"min_violations of the rule to delete","title":"Min Violations"},"description":"min_violations of the rule to delete"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/antiphishing-actions":{"get":{"tags":["🔒 Security"],"summary":"Get Antiphishing Actions","description":"Returns all configured antiphishing action rules for this server, sorted by min_confidence.","operationId":"get_antiphishing_actions_api_v1_servers__server_id__security_antiphishing_actions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🔒 Security"],"summary":"Replace Antiphishing Actions","description":"Replaces ALL antiphishing action rules at once (max. 5).\nPass an empty list to reset to default behavior (delete only <90%, ban >=90%).\nEach rule: {min_confidence, action, duration_minutes?}","operationId":"replace_antiphishing_actions_api_v1_servers__server_id__security_antiphishing_actions_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AntiPhishingActionsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🔒 Security"],"summary":"Upsert Antiphishing Action","description":"Adds a new antiphishing action rule or updates an existing one with the same min_confidence.\nMaximum 5 rules per server.","operationId":"upsert_antiphishing_action_api_v1_servers__server_id__security_antiphishing_actions_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AntiPhishingActionCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/antiphishing-actions/{min_confidence}":{"delete":{"tags":["🔒 Security"],"summary":"Delete Antiphishing Action","description":"Removes a single antiphishing action rule by its min_confidence threshold.","operationId":"delete_antiphishing_action_api_v1_servers__server_id__security_antiphishing_actions__min_confidence__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"min_confidence","in":"path","required":true,"schema":{"type":"integer","maximum":100,"minimum":70,"description":"min_confidence of the rule to delete","title":"Min Confidence"},"description":"min_confidence of the rule to delete"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/status":{"get":{"tags":["🔒 Security"],"summary":"Get Security Status","description":"Returns the current status of the security system","operationId":"get_security_status_api_v1_servers__server_id__security_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/whitelist":{"get":{"tags":["🔒 Security"],"summary":"Get Whitelist","description":"Returns the security whitelist","operationId":"get_whitelist_api_v1_servers__server_id__security_whitelist_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"whitelist_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["user","role","channel"],"type":"string"},{"type":"null"}],"description":"Filter by type","title":"Whitelist Type"},"description":"Filter by type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🔒 Security"],"summary":"Add To Whitelist","description":"Adds an entry to the security whitelist","operationId":"add_to_whitelist_api_v1_servers__server_id__security_whitelist_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhitelistCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/whitelist/{entry_id}":{"delete":{"tags":["🔒 Security"],"summary":"Remove From Whitelist","description":"Removes an entry from the security whitelist","operationId":"remove_from_whitelist_api_v1_servers__server_id__security_whitelist__entry_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","description":"Whitelist Entry ID","title":"Entry Id"},"description":"Whitelist Entry ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/link-whitelist":{"get":{"tags":["🔒 Security"],"summary":"Get Link Whitelist","description":"Returns the link whitelist","operationId":"get_link_whitelist_api_v1_servers__server_id__security_link_whitelist_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","description":"Active entries only","default":true,"title":"Active Only"},"description":"Active entries only"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🔒 Security"],"summary":"Add To Link Whitelist","description":"Adds a domain to the link whitelist","operationId":"add_to_link_whitelist_api_v1_servers__server_id__security_link_whitelist_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkWhitelistCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/link-whitelist/{entry_id}":{"delete":{"tags":["🔒 Security"],"summary":"Remove From Link Whitelist","description":"Removes a domain from the link whitelist","operationId":"remove_from_link_whitelist_api_v1_servers__server_id__security_link_whitelist__entry_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","description":"Link Whitelist Entry ID","title":"Entry Id"},"description":"Link Whitelist Entry ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/violations":{"get":{"tags":["🔒 Security"],"summary":"Get Violations","description":"Returns a paginated list of security violations","operationId":"get_violations_api_v1_servers__server_id__security_violations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"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":50,"title":"Limit"}},{"name":"violation_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by type","title":"Violation Type"},"description":"Filter by type"},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"enum":["low","medium","high","critical"],"type":"string"},{"type":"null"}],"description":"Filter by severity","title":"Severity"},"description":"Filter by severity"},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by user","title":"User Id"},"description":"Filter by user"},{"name":"resolved_only","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Resolved only","title":"Resolved Only"},"description":"Resolved only"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/violations/{violation_id}":{"get":{"tags":["🔒 Security"],"summary":"Get Violation Details","description":"Returns detailed information about a violation","operationId":"get_violation_details_api_v1_servers__server_id__security_violations__violation_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"violation_id","in":"path","required":true,"schema":{"type":"integer","description":"Violation ID","title":"Violation Id"},"description":"Violation ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/violations/{violation_id}/resolve":{"post":{"tags":["🔒 Security"],"summary":"Resolve Violation","description":"Marks a violation as resolved","operationId":"resolve_violation_api_v1_servers__server_id__security_violations__violation_id__resolve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"violation_id","in":"path","required":true,"schema":{"type":"integer","description":"Violation ID","title":"Violation Id"},"description":"Violation ID"},{"name":"resolution_notes","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Resolution notes","title":"Resolution Notes"},"description":"Resolution notes"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/violations/stats":{"get":{"tags":["🔒 Security"],"summary":"Get Violation Stats","description":"Returns statistics about security violations","operationId":"get_violation_stats_api_v1_servers__server_id__security_violations_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Timeframe in days","default":30,"title":"Days"},"description":"Timeframe in days"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/alerts":{"get":{"tags":["🔒 Security"],"summary":"Get Alerts","description":"Returns security alerts","operationId":"get_alerts_api_v1_servers__server_id__security_alerts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"resolved","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by status","title":"Resolved"},"description":"Filter by status"},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"enum":["low","medium","high","critical"],"type":"string"},{"type":"null"}],"description":"Filter by severity","title":"Severity"},"description":"Filter by severity"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/alerts/{alert_id}/resolve":{"post":{"tags":["🔒 Security"],"summary":"Resolve Alert","description":"Marks a security alert as resolved","operationId":"resolve_alert_api_v1_servers__server_id__security_alerts__alert_id__resolve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","description":"Alert ID","title":"Alert Id"},"description":"Alert ID"},{"name":"resolution_notes","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Resolution notes","title":"Resolution Notes"},"description":"Resolution notes"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/bot-protection/whitelist":{"post":{"tags":["🔒 Security"],"summary":"Add Bot To Whitelist","description":"Adds a bot to the whitelist","operationId":"add_bot_to_whitelist_api_v1_servers__server_id__security_bot_protection_whitelist_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"bot_id","in":"query","required":true,"schema":{"type":"string","description":"Bot ID","title":"Bot Id"},"description":"Bot ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/bot-protection/whitelist/{bot_id}":{"delete":{"tags":["🔒 Security"],"summary":"Remove Bot From Whitelist","description":"Removes a bot from the whitelist","operationId":"remove_bot_from_whitelist_api_v1_servers__server_id__security_bot_protection_whitelist__bot_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"bot_id","in":"path","required":true,"schema":{"type":"string","description":"Bot ID","title":"Bot Id"},"description":"Bot ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/bot-protection/roles":{"post":{"tags":["🔒 Security"],"summary":"Add Bot Role","description":"Adds a role to allowed bot roles","operationId":"add_bot_role_api_v1_servers__server_id__security_bot_protection_roles_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"role_id","in":"query","required":true,"schema":{"type":"string","description":"Role ID","title":"Role Id"},"description":"Role ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/bot-protection/roles/{role_id}":{"delete":{"tags":["🔒 Security"],"summary":"Remove Bot Role","description":"Removes a role from allowed bot roles","operationId":"remove_bot_role_api_v1_servers__server_id__security_bot_protection_roles__role_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"role_id","in":"path","required":true,"schema":{"type":"string","description":"Role ID","title":"Role Id"},"description":"Role ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/lockdown":{"post":{"tags":["🔒 Security"],"summary":"Activate Lockdown","description":"Laesst den Bot den Server sperren (Kanaele, Voice, Joins, Invites).\n\nHier stand eine Sperre, die keine war: die Funktion setzte\n`lockdown_active = True`, legte eine Warnung an und meldete Erfolg - ohne\ndass ein einziger Kanal gesperrt, eine Einladung deaktiviert oder ein\nBeitritt verhindert wurde. Das Dashboard zeigte \"Lockdown aktiv\", waehrend\nder Server offen stand. Bei einem Raid ist das die teuerste Art zu\nversagen, weil sie wie ein Erfolg aussieht.\n\nZwei Dinge folgen daraus:\n\n1. Die API setzt das Flag NICHT mehr selbst. `_initiate_lockdown` im Bot\n   bricht bei bereits gesetztem Flag ab (sonst sicherte es den schon\n   gesperrten Zustand als Backup) - ein vorab gesetztes Flag haette also\n   auch den echten Lockdown verhindert.\n2. Die Antwort meldet `queued`, nicht `lockdown_active`. Ob wirklich\n   gesperrt ist, sagt `/security/status`, sobald der Bot fertig ist. Ein\n   `True`, das die API selbst erfindet, war genau der Fehler oben.","operationId":"activate_lockdown_api_v1_servers__server_id__security_lockdown_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LockdownRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🔒 Security"],"summary":"Deactivate Lockdown","description":"Laesst den Bot die Sperre aufheben und die Rechte zurueckstellen.\n\nNur das Flag zurueckzusetzen (der bisherige Stand) war noch gefaehrlicher\nals das Setzen: die Kanalrechte blieben gesperrt, die Datenbank meldete\n\"frei\" - und danach fand `_end_lockdown` nie wieder einen Grund zu laufen.\nDie Bedingung unten ist deshalb dieselbe wie in `/security unlock`: auch\nein zurueckgesetztes Flag mit uebrig gebliebenen Backup-Zeilen ist ein\nServer, der noch entsperrt werden muss.","operationId":"deactivate_lockdown_api_v1_servers__server_id__security_lockdown_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/backups":{"get":{"tags":["🔒 Security"],"summary":"Get Backups","description":"Returns security backups","operationId":"get_backups_api_v1_servers__server_id__security_backups_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"backup_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by type","title":"Backup Type"},"description":"Filter by type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🔒 Security"],"summary":"Create Backup","description":"Creates a security backup","operationId":"create_backup_api_v1_servers__server_id__security_backups_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"backup_type","in":"query","required":true,"schema":{"enum":["security","roles","channels","full"],"type":"string","description":"Backup type","title":"Backup Type"},"description":"Backup type"},{"name":"reason","in":"query","required":false,"schema":{"type":"string","description":"Backup reason","default":"Manual Backup","title":"Reason"},"description":"Backup reason"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/backups/{backup_id}":{"delete":{"tags":["🔒 Security"],"summary":"Delete Backup","description":"Deletes a security backup","operationId":"delete_backup_api_v1_servers__server_id__security_backups__backup_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"backup_id","in":"path","required":true,"schema":{"type":"integer","description":"Backup ID","title":"Backup Id"},"description":"Backup ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/users/{user_id}/stats":{"get":{"tags":["🔒 Security"],"summary":"Get User Security Stats","description":"Returns security statistics for a user","operationId":"get_user_security_stats_api_v1_servers__server_id__security_users__user_id__stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"User ID","title":"User Id"},"description":"User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/anti-nuke/actions":{"get":{"tags":["🔒 Security"],"summary":"Get Anti Nuke Actions","description":"Returns anti-nuke actions","operationId":"get_anti_nuke_actions_api_v1_servers__server_id__security_anti_nuke_actions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"description":"Timeframe in days","default":7,"title":"Days"},"description":"Timeframe in days"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/ai-filter/settings":{"get":{"tags":["🔒 Security"],"summary":"Get Ai Filter Settings","description":"Returns AI Message Filter settings for a server","operationId":"get_ai_filter_settings_api_v1_servers__server_id__security_ai_filter_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["🔒 Security"],"summary":"Update Ai Filter Settings","description":"Updates AI Message Filter settings for a server (requires AI subscription)","operationId":"update_ai_filter_settings_api_v1_servers__server_id__security_ai_filter_settings_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIFilterSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/ai-filter/rules":{"get":{"tags":["🔒 Security"],"summary":"Get Ai Filter Rules","description":"Returns all AI filter rules for a server","operationId":"get_ai_filter_rules_api_v1_servers__server_id__security_ai_filter_rules_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🔒 Security"],"summary":"Create Ai Filter Rule","description":"Creates a new AI filter rule for a server","operationId":"create_ai_filter_rule_api_v1_servers__server_id__security_ai_filter_rules_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIFilterRuleCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🔒 Security"],"summary":"Delete All Ai Filter Rules","description":"Deletes all AI filter rules for a server","operationId":"delete_all_ai_filter_rules_api_v1_servers__server_id__security_ai_filter_rules_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/ai-filter/rules/{rule_id}":{"patch":{"tags":["🔒 Security"],"summary":"Update Ai Filter Rule","description":"Updates an existing AI filter rule","operationId":"update_ai_filter_rule_api_v1_servers__server_id__security_ai_filter_rules__rule_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"rule_id","in":"path","required":true,"schema":{"type":"integer","description":"Regel ID","title":"Rule Id"},"description":"Regel ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIFilterRuleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🔒 Security"],"summary":"Delete Ai Filter Rule","description":"Deletes an AI filter rule","operationId":"delete_ai_filter_rule_api_v1_servers__server_id__security_ai_filter_rules__rule_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"rule_id","in":"path","required":true,"schema":{"type":"integer","description":"Regel ID","title":"Rule Id"},"description":"Regel ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/warn-dm-setting":{"get":{"tags":["🔒 Security"],"summary":"Get Warn Dm Setting","description":"Returns whether warn DMs are enabled for this server (default: true)","operationId":"get_warn_dm_setting_api_v1_servers__server_id__security_warn_dm_setting_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🔒 Security"],"summary":"Update Warn Dm Setting","description":"Enable or disable warn DMs for this server","operationId":"update_warn_dm_setting_api_v1_servers__server_id__security_warn_dm_setting_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarnDmSettingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/posture/latest":{"get":{"tags":["🔒 Security"],"summary":"Get Posture Latest","description":"Latest posture scan with findings, live-overlaid finding states and recomputed score.","operationId":"get_posture_latest_api_v1_servers__server_id__security_posture_latest_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/posture/history":{"get":{"tags":["🔒 Security"],"summary":"Get Posture History","description":"Score trend over recent scans.","operationId":"get_posture_history_api_v1_servers__server_id__security_posture_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/posture/scan":{"post":{"tags":["🔒 Security"],"summary":"Trigger Posture Scan","description":"Triggers a fresh scan on the bot. Frontend polls /posture/latest for the new result.","operationId":"trigger_posture_scan_api_v1_servers__server_id__security_posture_scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/posture/findings/{check_id}/fix":{"post":{"tags":["🔒 Security"],"summary":"Fix Posture Finding","description":"Applies a one-click fix on the bot. Frontend polls /posture/latest for the result.","operationId":"fix_posture_finding_api_v1_servers__server_id__security_posture_findings__check_id__fix_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"check_id","in":"path","required":true,"schema":{"type":"string","description":"Check id, e.g. perm.everyone_admin","title":"Check Id"},"description":"Check id, e.g. perm.everyone_admin"},{"name":"target_id","in":"query","required":false,"schema":{"type":"string","description":"Target object id (role/bot/webhook/channel)","default":"","title":"Target Id"},"description":"Target object id (role/bot/webhook/channel)"},{"name":"confirm","in":"query","required":false,"schema":{"type":"boolean","description":"Confirm risky fixes","default":false,"title":"Confirm"},"description":"Confirm risky fixes"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/posture/fix-all-safe":{"post":{"tags":["🔒 Security"],"summary":"Fix All Safe Posture","description":"Applies every safe (non-confirmation) fix, then re-scans on the bot.","operationId":"fix_all_safe_posture_api_v1_servers__server_id__security_posture_fix_all_safe_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/posture/findings/{check_id}/undo":{"post":{"tags":["🔒 Security"],"summary":"Undo Posture Finding","description":"Reverts a previously applied fix on the bot.","operationId":"undo_posture_finding_api_v1_servers__server_id__security_posture_findings__check_id__undo_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"check_id","in":"path","required":true,"schema":{"type":"string","title":"Check Id"}},{"name":"target_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Target Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/posture/findings/{check_id}/ignore":{"post":{"tags":["🔒 Security"],"summary":"Ignore Posture Finding","description":"Mutes a finding (excluded from the score) without changing the server.","operationId":"ignore_posture_finding_api_v1_servers__server_id__security_posture_findings__check_id__ignore_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"check_id","in":"path","required":true,"schema":{"type":"string","title":"Check Id"}},{"name":"target_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Target Id"}},{"name":"note","in":"query","required":false,"schema":{"type":"string","maxLength":300,"title":"Note"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/posture/findings/{check_id}/accept-risk":{"post":{"tags":["🔒 Security"],"summary":"Accept Risk Posture Finding","description":"Marks a finding as an accepted risk (excluded from the score, kept visible).","operationId":"accept_risk_posture_finding_api_v1_servers__server_id__security_posture_findings__check_id__accept_risk_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"check_id","in":"path","required":true,"schema":{"type":"string","title":"Check Id"}},{"name":"target_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Target Id"}},{"name":"note","in":"query","required":false,"schema":{"type":"string","maxLength":300,"title":"Note"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/posture/findings/{check_id}/reopen":{"post":{"tags":["🔒 Security"],"summary":"Reopen Posture Finding","description":"Reverts an ignore / accept-risk decision back to open.","operationId":"reopen_posture_finding_api_v1_servers__server_id__security_posture_findings__check_id__reopen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"check_id","in":"path","required":true,"schema":{"type":"string","title":"Check Id"}},{"name":"target_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Target Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/posture/config":{"get":{"tags":["🔒 Security"],"summary":"Get Posture Config","description":"Posture monitoring / digest config (Phase 2 fields, safe defaults today).","operationId":"get_posture_config_api_v1_servers__server_id__security_posture_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🔒 Security"],"summary":"Update Posture Config","description":"Enable/disable real-time drift protection, auto-revert categories and the weekly digest.","operationId":"update_posture_config_api_v1_servers__server_id__security_posture_config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostureConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/overview":{"get":{"tags":["🔒 Security"],"summary":"Get Security Overview","description":"Alles, was die Overview-Kachelwand braucht, in einem Abruf.\n\nLiefert BEWUSST keinen uebersetzten Text, nur Schluessel, IDs und Zahlen.\nDas haelt den Cache-Schluessel sprachfrei: `vary_by` kann eine Sprache nicht\nabbilden, und ein server-weit gekeyter Cache mit uebersetzter Antwort\nliefert sonst jedem weiteren Admin die Sprache dessen, der zuerst geladen\nhat. Genau das ist `/control-center` einmal passiert.\n\n`guard=\"server\"` ist Pflicht, nicht Zierde: ohne Guard umgeht ein\nCache-Treffer den Auth-Check im Body.","operationId":"get_security_overview_api_v1_servers__server_id__security_overview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"range","in":"query","required":false,"schema":{"type":"string","pattern":"^(24h|7d|30d|90d)$","description":"Zeitraum","default":"30d","title":"Range"},"description":"Zeitraum"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/posture/baseline":{"get":{"tags":["🔒 Security"],"summary":"Get Posture Baseline","description":"Current enforced hardening baseline (or none).","operationId":"get_posture_baseline_api_v1_servers__server_id__security_posture_baseline_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🔒 Security"],"summary":"Set Posture Baseline","description":"Approve / update the enforced baseline. Notoq will continuously revert\ndangerous changes in the enforced areas (auto-fixable checks only).","operationId":"set_posture_baseline_api_v1_servers__server_id__security_posture_baseline_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostureBaselineUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/posture/baseline/break-glass":{"post":{"tags":["🔒 Security"],"summary":"Posture Break Glass","description":"Temporarily pause enforcement so legitimate changes are not reverted.","operationId":"posture_break_glass_api_v1_servers__server_id__security_posture_baseline_break_glass_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BreakGlassRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🔒 Security"],"summary":"Posture Break Glass End","description":"Resume enforcement immediately (end break-glass early).","operationId":"posture_break_glass_end_api_v1_servers__server_id__security_posture_baseline_break_glass_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/threat-intel/config":{"get":{"tags":["🔒 Security"],"summary":"Get Threat Config","description":"Cross-server threat intelligence settings for this server.","operationId":"get_threat_config_api_v1_servers__server_id__security_threat_intel_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🔒 Security"],"summary":"Update Threat Config","description":"Enable threat intelligence, set the action for flagged joins, and thresholds.","operationId":"update_threat_config_api_v1_servers__server_id__security_threat_intel_config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreatIntelConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/threat-intel/reputation/{user_id}":{"get":{"tags":["🔒 Security"],"summary":"Get Threat Reputation","description":"Look up a user's cross-server reputation (from the materialized cache).","operationId":"get_threat_reputation_api_v1_servers__server_id__security_threat_intel_reputation__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/activity":{"get":{"tags":["🔒 Security"],"summary":"Get Security Activity","description":"Unified activity feed: anti-spam/link/nuke/raid/phishing violations, security\nalerts, moderation actions, and automation/backup/threat-intel events, merged\ninto one newest-first timeline. Filterable by kind, minimum severity and time\nrange, with cursor pagination via `before` / `next_before`.","operationId":"get_security_activity_api_v1_servers__server_id__security_activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"kinds","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated feed kinds to include","title":"Kinds"},"description":"Comma-separated feed kinds to include"},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(info|low|medium|high|critical)$"},{"type":"null"}],"description":"Minimum severity to include","title":"Severity"},"description":"Minimum severity to include"},{"name":"range","in":"query","required":false,"schema":{"type":"string","pattern":"^(24h|7d|30d|all)$","description":"Time window","default":"30d","title":"Range"},"description":"Time window"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO cursor from a previous page's next_before","title":"Before"},"description":"ISO cursor from a previous page's next_before"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/security/activity/user/{user_id}":{"get":{"tags":["🔒 Security"],"summary":"Get Security Activity User","description":"Affected-user drilldown: the user's security profile (trust score, risk level,\nper-type counts) plus their recent involvement in the activity feed.","operationId":"get_security_activity_user_api_v1_servers__server_id__security_activity_user__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__security__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/social/accounts":{"get":{"tags":["📷 Social Media"],"summary":"Get Social Accounts","description":"Lists all configured social media accounts of a server.\n\nRate Limited: 80 requests/minute\nCached: 1 minute","operationId":"get_social_accounts_api_v1_servers__server_id__social_accounts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"enum":["youtube","twitch","kick"],"type":"string"},{"type":"null"}],"description":"Filter by platform","title":"Platform"},"description":"Filter by platform"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialMediaAccountListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["📷 Social Media"],"summary":"Add Social Account","description":"Adds a new social media account to monitoring.\n\nRate Limited: 80 requests/minute","operationId":"add_social_account_api_v1_servers__server_id__social_accounts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialMediaAccountCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__socialmedia__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/social/accounts/{account_id}":{"put":{"tags":["📷 Social Media"],"summary":"Update Social Account","description":"Updates the settings of a social media account.\n\nRate Limited: 80 requests/minute","operationId":"update_social_account_api_v1_servers__server_id__social_accounts__account_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"account_id","in":"path","required":true,"schema":{"type":"integer","description":"Account ID","title":"Account Id"},"description":"Account ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialMediaAccountUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__socialmedia__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📷 Social Media"],"summary":"Delete Social Account","description":"Removes a social media account from monitoring.\n\nRate Limited: 80 requests/minute","operationId":"delete_social_account_api_v1_servers__server_id__social_accounts__account_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"account_id","in":"path","required":true,"schema":{"type":"integer","description":"Account ID","title":"Account Id"},"description":"Account ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__socialmedia__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/social/autocomplete/youtube":{"get":{"tags":["📷 Social Media"],"summary":"Autocomplete Youtube","description":"Resolves a YouTube channel ID, @handle or channel URL for autocomplete.\n\nFree-text search was removed on purpose: it ran on search.list at 100 quota\nunits per keystroke and drained the daily quota within minutes, which then\nsilenced every video notification. Free text simply returns no suggestions;\nadding a channel by name still works through the add endpoint.\n\nRate Limited: 30 requests/minute (abuse guard, results are cached for 24h)","operationId":"autocomplete_youtube_api_v1_servers__server_id__social_autocomplete_youtube_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":3,"description":"Channel ID, @handle or channel URL","title":"Query"},"description":"Channel ID, @handle or channel URL"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutocompleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/social/autocomplete/twitch":{"get":{"tags":["📷 Social Media"],"summary":"Autocomplete Twitch","description":"Searches for Twitch channels for autocomplete.\n\nRate Limited: 60 requests/minute","operationId":"autocomplete_twitch_api_v1_servers__server_id__social_autocomplete_twitch_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Search term (min. 2 characters)","title":"Query"},"description":"Search term (min. 2 characters)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutocompleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/social/limits":{"get":{"tags":["📷 Social Media"],"summary":"Get Social Limits","description":"Returns limits and current usage for social media accounts.\n\nRate Limited: 80 requests/minute\nCached: 5 minutes","operationId":"get_social_limits_api_v1_servers__server_id__social_limits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LimitsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/social/platforms":{"get":{"tags":["📷 Social Media"],"summary":"Get Available Platforms","description":"Returns available platforms and their status.\n\nRate Limited: 80 requests/minute","operationId":"get_available_platforms_api_v1_servers__server_id__social_platforms_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__socialmedia__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/social/connect/{platform}":{"get":{"tags":["📷 Social Media"],"summary":"Social Connect Init","description":"Startet den Connect-Login: liefert die OAuth-Authorize-URL für die Plattform.","operationId":"social_connect_init_api_v1_servers__server_id__social_connect__platform__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"platform","in":"path","required":true,"schema":{"type":"string","description":"Platform to connect (e.g. twitch)","title":"Platform"},"description":"Platform to connect (e.g. twitch)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/social/connect/{platform}/callback":{"get":{"tags":["📷 Social Media"],"summary":"Social Connect Callback","description":"OAuth-Callback (öffentlich – wird von der Plattform aufgerufen). Tauscht Code gegen Tokens und speichert die Verbindung.","operationId":"social_connect_callback_api_v1_social_connect__platform__callback_get","parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}},{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/social/connections":{"get":{"tags":["📷 Social Media"],"summary":"List Social Connections","description":"Listet die OAuth-Verbindungen eines Servers (inkl. best-effort Live-Statistiken).","operationId":"list_social_connections_api_v1_servers__server_id__social_connections_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialConnectionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/social/connections/{connection_id}":{"delete":{"tags":["📷 Social Media"],"summary":"Delete Social Connection","description":"Trennt eine OAuth-Verbindung (und widerruft das Token best-effort).","operationId":"delete_social_connection_api_v1_servers__server_id__social_connections__connection_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"connection_id","in":"path","required":true,"schema":{"type":"integer","description":"Connection ID","title":"Connection Id"},"description":"Connection ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__socialmedia__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/social/counter-metrics":{"get":{"tags":["📷 Social Media"],"summary":"Get Counter Metrics","description":"Liefert die verfügbaren Counter-Kennzahlen pro Plattform + ob eine Connection vorhanden ist.","operationId":"get_counter_metrics_api_v1_servers__server_id__social_counter_metrics_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__socialmedia__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/social/counters":{"get":{"tags":["📷 Social Media"],"summary":"List Counters","description":"Listet die Live-Statistik-Counter eines Servers.","operationId":"list_counters_api_v1_servers__server_id__social_counters_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__socialmedia__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["📷 Social Media"],"summary":"Create Counter","description":"Erstellt einen Live-Statistik-Counter.","operationId":"create_counter_api_v1_servers__server_id__social_counters_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CounterCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__socialmedia__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/social/counters/{counter_id}":{"put":{"tags":["📷 Social Media"],"summary":"Update Counter","description":"Aktualisiert einen Counter.","operationId":"update_counter_api_v1_servers__server_id__social_counters__counter_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"counter_id","in":"path","required":true,"schema":{"type":"integer","title":"Counter Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CounterUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__socialmedia__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📷 Social Media"],"summary":"Delete Counter","description":"Löscht einen Counter.","operationId":"delete_counter_api_v1_servers__server_id__social_counters__counter_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"counter_id","in":"path","required":true,"schema":{"type":"integer","title":"Counter Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__socialmedia__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/social/role-links":{"get":{"tags":["📷 Social Media"],"summary":"List Role Links","description":"Listet die Live-Rollen-Verknüpfungen eines Servers.","operationId":"list_role_links_api_v1_servers__server_id__social_role_links_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__socialmedia__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["📷 Social Media"],"summary":"Create Role Link","description":"Erstellt eine Live-Rollen-Verknüpfung (nur twitch/kick haben Live-Status).","operationId":"create_role_link_api_v1_servers__server_id__social_role_links_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleLinkCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__socialmedia__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/social/role-links/{link_id}":{"put":{"tags":["📷 Social Media"],"summary":"Update Role Link","description":"Aktualisiert eine Rollen-Verknüpfung.","operationId":"update_role_link_api_v1_servers__server_id__social_role_links__link_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleLinkUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__socialmedia__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📷 Social Media"],"summary":"Delete Role Link","description":"Löscht eine Rollen-Verknüpfung.","operationId":"delete_role_link_api_v1_servers__server_id__social_role_links__link_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__socialmedia__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/counting/settings":{"get":{"tags":["🔢 Counting & Invite"],"summary":"Get Counting Settings","description":"Returns all counting settings.\n\nRate Limited: 80 requests/minute\nCached: 1 minute","operationId":"get_counting_settings_api_v1_servers__server_id__counting_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountingFullResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🔢 Counting & Invite"],"summary":"Update Counting Settings","description":"Updates counting settings.\n\nRate Limited: 80 requests/minute","operationId":"update_counting_settings_api_v1_servers__server_id__counting_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountingSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__counting_invite__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/counting/value":{"put":{"tags":["🔢 Counting & Invite"],"summary":"Set Counting Value","description":"Sets the counter value manually.\n\nRate Limited: 80 requests/minute","operationId":"set_counting_value_api_v1_servers__server_id__counting_value_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountingValueUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__counting_invite__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/counting/user-stats":{"get":{"tags":["🔢 Counting & Invite"],"summary":"Get Counting User Stats","description":"Returns user statistics for counting.\n\nRate Limited: 100 requests/minute\nCached: 5 minutes","operationId":"get_counting_user_stats_api_v1_servers__server_id__counting_user_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page","default":1,"title":"Page"},"description":"Page"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Entries per page","default":20,"title":"Limit"},"description":"Entries per page"},{"name":"sort_by","in":"query","required":false,"schema":{"enum":["correct","failed","accuracy","total"],"type":"string","description":"Sorting","default":"correct","title":"Sort By"},"description":"Sorting"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountingStatsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/counting/user-stats/{user_id}":{"get":{"tags":["🔢 Counting & Invite"],"summary":"Get Specific User Counting Stats","description":"Returns counting statistics for a specific user.\n\nRate Limited: 120 requests/minute","operationId":"get_specific_user_counting_stats_api_v1_servers__server_id__counting_user_stats__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__counting_invite__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/invites/settings":{"get":{"tags":["🔢 Counting & Invite"],"summary":"Get Invite Settings","description":"Returns invite tracking settings.\n\nRate Limited: 80 requests/minute\nCached: 5 minutes","operationId":"get_invite_settings_api_v1_servers__server_id__invites_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__counting_invite__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🔢 Counting & Invite"],"summary":"Update Invite Settings","description":"Updates invite tracking settings.\n\nRate Limited: 80 requests/minute","operationId":"update_invite_settings_api_v1_servers__server_id__invites_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__counting_invite__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/invites/stats/{user_id}":{"get":{"tags":["🔢 Counting & Invite"],"summary":"Get User Invite Stats","description":"Returns invite statistics for a user.\n\nRate Limited: 120 requests/minute","operationId":"get_user_invite_stats_api_v1_servers__server_id__invites_stats__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Number of recent invites","default":5,"title":"Limit"},"description":"Number of recent invites"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__counting_invite__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/invites/leaderboard":{"get":{"tags":["🔢 Counting & Invite"],"summary":"Get Invite Leaderboard","description":"Returns a leaderboard of top inviters.\n\nRate Limited: 60 requests/minute\nCached: 5 minutes","operationId":"get_invite_leaderboard_api_v1_servers__server_id__invites_leaderboard_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of top inviters","default":10,"title":"Limit"},"description":"Number of top inviters"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteLeaderboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/rss/feeds":{"get":{"tags":["💭 RSS Feeds"],"summary":"Get Rss Feeds","description":"Returns all RSS feeds of a server.\n\nRate Limited: 80 requests/minute","operationId":"get_rss_feeds_api_v1_servers__server_id__rss_feeds_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RSSFeedListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["💭 RSS Feeds"],"summary":"Create Rss Feed","description":"Creates a new RSS feed.\n\nRate Limited: 80 requests/minute","operationId":"create_rss_feed_api_v1_servers__server_id__rss_feeds_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RSSFeedCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__rssfeed__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/rss/feeds/{feed_id}":{"get":{"tags":["💭 RSS Feeds"],"summary":"Get Rss Feed","description":"Returns details for a specific RSS feed.\n\nRate Limited: 80 requests/minute","operationId":"get_rss_feed_api_v1_servers__server_id__rss_feeds__feed_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","description":"Feed ID","title":"Feed Id"},"description":"Feed ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__rssfeed__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["💭 RSS Feeds"],"summary":"Update Rss Feed","description":"Updates an RSS feed.\n\nRate Limited: 80 requests/minute","operationId":"update_rss_feed_api_v1_servers__server_id__rss_feeds__feed_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","description":"Feed ID","title":"Feed Id"},"description":"Feed ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RSSFeedUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__rssfeed__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["💭 RSS Feeds"],"summary":"Delete Rss Feed","description":"Deletes an RSS feed.\n\nRate Limited: 80 requests/minute","operationId":"delete_rss_feed_api_v1_servers__server_id__rss_feeds__feed_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","description":"Feed ID","title":"Feed Id"},"description":"Feed ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__rssfeed__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/rss/feeds/{feed_id}/toggle":{"put":{"tags":["💭 RSS Feeds"],"summary":"Toggle Rss Feed","description":"Activates/Deactivates an RSS feed.\n\nRate Limited: 80 requests/minute","operationId":"toggle_rss_feed_api_v1_servers__server_id__rss_feeds__feed_id__toggle_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","description":"Feed ID","title":"Feed Id"},"description":"Feed ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__rssfeed__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/rss/feeds/{feed_id}/test":{"post":{"tags":["💭 RSS Feeds"],"summary":"Test Rss Feed","description":"Tests an RSS feed and returns a preview of the latest posts.\n\nRate Limited: 10 requests/minute","operationId":"test_rss_feed_api_v1_servers__server_id__rss_feeds__feed_id__test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","description":"Feed ID","title":"Feed Id"},"description":"Feed ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__rssfeed__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/rss/settings":{"get":{"tags":["💭 RSS Feeds"],"summary":"Get Rss Settings","description":"Returns RSS settings.\n\nRate Limited: 80 requests/minute","operationId":"get_rss_settings_api_v1_servers__server_id__rss_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__rssfeed__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["💭 RSS Feeds"],"summary":"Update Rss Settings","description":"Updates RSS settings.\n\nRate Limited: 80 requests/minute","operationId":"update_rss_settings_api_v1_servers__server_id__rss_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RSSFeedSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__rssfeed__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/rss/suggested":{"get":{"tags":["💭 RSS Feeds"],"summary":"Get Suggested Feeds","description":"Returns predefined popular RSS feeds.\n\nRate Limited: 80 requests/minute\nCached: 10 minutes","operationId":"get_suggested_feeds_api_v1_servers__server_id__rss_suggested_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter language (de/en)","title":"Language"},"description":"Filter language (de/en)"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter category","title":"Category"},"description":"Filter category"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__rssfeed__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/rss/popular":{"get":{"tags":["💭 RSS Feeds"],"summary":"Get Popular Feeds","description":"Returns the most frequently used feeds from other servers.\n\nRate Limited: 80 requests/minute\nCached: 5 minutes","operationId":"get_popular_feeds_api_v1_servers__server_id__rss_popular_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Number of feeds","default":10,"title":"Limit"},"description":"Number of feeds"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__rssfeed__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/rss/free-games":{"get":{"tags":["💭 RSS Feeds"],"summary":"Get Free Games","description":"Returns the free games setup of a server plus a live preview.\n\nRate Limited: 30 requests/minute","operationId":"get_free_games_api_v1_servers__server_id__rss_free_games_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Override the preview region","title":"Country"},"description":"Override the preview region"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__rssfeed__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["💭 RSS Feeds"],"summary":"Upsert Free Games","description":"Creates or updates the free games announcements of a server.\n\nRate Limited: 80 requests/minute","operationId":"upsert_free_games_api_v1_servers__server_id__rss_free_games_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FreeGamesUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__rssfeed__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["💭 RSS Feeds"],"summary":"Delete Free Games","description":"Removes the free games announcements of a server.\n\nRate Limited: 80 requests/minute","operationId":"delete_free_games_api_v1_servers__server_id__rss_free_games_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__rssfeed__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/rss/feeds/{feed_id}/logs":{"get":{"tags":["💭 RSS Feeds"],"summary":"Get Feed Logs","description":"Returns logs for an RSS feed.\n\nRate Limited: 80 requests/minute","operationId":"get_feed_logs_api_v1_servers__server_id__rss_feeds__feed_id__logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","description":"Feed ID","title":"Feed Id"},"description":"Feed ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of logs","default":20,"title":"Limit"},"description":"Number of logs"},{"name":"log_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter log type","title":"Log Type"},"description":"Filter log type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__rssfeed__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autopfp/feeds":{"get":{"tags":["🖼️ AutoPFP"],"summary":"List Feeds","description":"Alle AutoPFP-Feeds eines Servers, samt Vorrat und Vorschau.","operationId":"list_feeds_api_v1_servers__server_id__autopfp_feeds_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"preview","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":0,"description":"Wie viele Vorschaubilder je Feed","default":9,"title":"Preview"},"description":"Wie viele Vorschaubilder je Feed"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🖼️ AutoPFP"],"summary":"Create Feed","description":"Legt einen AutoPFP-Feed samt seiner Quellen an.","operationId":"create_feed_api_v1_servers__server_id__autopfp_feeds_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__autopfp__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autopfp/feeds/{feed_id}":{"get":{"tags":["🖼️ AutoPFP"],"summary":"Get Feed","operationId":"get_feed_api_v1_servers__server_id__autopfp_feeds__feed_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","title":"Feed Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__autopfp__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🖼️ AutoPFP"],"summary":"Update Feed","operationId":"update_feed_api_v1_servers__server_id__autopfp_feeds__feed_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","title":"Feed Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__autopfp__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🖼️ AutoPFP"],"summary":"Delete Feed","operationId":"delete_feed_api_v1_servers__server_id__autopfp_feeds__feed_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","title":"Feed Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__autopfp__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autopfp/feeds/{feed_id}/toggle":{"put":{"tags":["🖼️ AutoPFP"],"summary":"Toggle Feed","operationId":"toggle_feed_api_v1_servers__server_id__autopfp_feeds__feed_id__toggle_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","title":"Feed Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__autopfp__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autopfp/feeds/{feed_id}/sources":{"post":{"tags":["🖼️ AutoPFP"],"summary":"Add Source","operationId":"add_source_api_v1_servers__server_id__autopfp_feeds__feed_id__sources_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","title":"Feed Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__autopfp__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autopfp/feeds/{feed_id}/sources/{source_id}":{"put":{"tags":["🖼️ AutoPFP"],"summary":"Update Source","operationId":"update_source_api_v1_servers__server_id__autopfp_feeds__feed_id__sources__source_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","title":"Feed Id"}},{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__autopfp__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🖼️ AutoPFP"],"summary":"Delete Source","operationId":"delete_source_api_v1_servers__server_id__autopfp_feeds__feed_id__sources__source_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","title":"Feed Id"}},{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__autopfp__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autopfp/feeds/{feed_id}/pool":{"get":{"tags":["🖼️ AutoPFP"],"summary":"Get Pool","description":"Was wartet, was lief schon, was wurde aussortiert - ohne Pinterest zu fragen.","operationId":"get_pool_api_v1_servers__server_id__autopfp_feeds__feed_id__pool_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","title":"Feed Id"}},{"name":"state","in":"query","required":false,"schema":{"enum":["queued","posted","skipped","failed","all"],"type":"string","description":"queued | posted | skipped | failed | all","default":"queued","title":"State"},"description":"queued | posted | skipped | failed | all"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":48,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__autopfp__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autopfp/feeds/{feed_id}/pool/{item_id}":{"delete":{"tags":["🖼️ AutoPFP"],"summary":"Drop Pool Item","description":"Ein wartendes Bild verwerfen.\n\nEs wird auf 'skipped' gesetzt statt gelöscht: gelöscht käme es beim nächsten\nAuffüllen sofort wieder herein, weil die Wiedererkennung an der Zeile hängt.\nAussortiert bleibt es für die Dauer der Sperrfrist draußen - genau das\nerwartet jemand, der auf \"verwerfen\" drückt.","operationId":"drop_pool_item_api_v1_servers__server_id__autopfp_feeds__feed_id__pool__item_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","title":"Feed Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__autopfp__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autopfp/feeds/{feed_id}/refill":{"post":{"tags":["🖼️ AutoPFP"],"summary":"Refill Now","description":"Den Bot bitten, jetzt nachzufüllen.","operationId":"refill_now_api_v1_servers__server_id__autopfp_feeds__feed_id__refill_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","title":"Feed Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__autopfp__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autopfp/feeds/{feed_id}/post-now":{"post":{"tags":["🖼️ AutoPFP"],"summary":"Post Now","description":"Sofort senden, ohne auf den Takt zu warten.","operationId":"post_now_api_v1_servers__server_id__autopfp_feeds__feed_id__post_now_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","title":"Feed Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__autopfp__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autopfp/resolve":{"post":{"tags":["🖼️ AutoPFP"],"summary":"Resolve","description":"Eine Eingabe deuten und echte Pins dazu zurückgeben.\n\nDas ist die Vorschau beim Eintippen. Sie holt WIRKLICH von Pinterest und\ngibt nicht nur zurück, dass die Adresse gültig aussieht - eine Pinnwand\nkann privat sein, ein Suchbegriff kann nichts finden, und beides sieht einer\nreinen Formatprüfung genau gleich aus wie ein Treffer.","operationId":"resolve_api_v1_servers__server_id__autopfp_resolve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__autopfp__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autopfp/suggestions":{"get":{"tags":["🖼️ AutoPFP"],"summary":"Suggestions","description":"Startquellen für die leere Fläche.","operationId":"suggestions_api_v1_servers__server_id__autopfp_suggestions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__autopfp__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autopfp/feeds/{feed_id}/logs":{"get":{"tags":["🖼️ AutoPFP"],"summary":"Get Logs","operationId":"get_logs_api_v1_servers__server_id__autopfp_feeds__feed_id__logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"feed_id","in":"path","required":true,"schema":{"type":"integer","title":"Feed Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__autopfp__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/verification/settings":{"get":{"tags":["❇️ Verify"],"summary":"Get Verification Settings","description":"Returns all verification settings and statistics.\n\nRate Limited: 80 requests/minute\nCached: 2 minutes","operationId":"get_verification_settings_api_v1_servers__server_id__verification_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationFullResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["❇️ Verify"],"summary":"Update Verification Settings","description":"Updates verification settings.\n\nRate Limited: 80 requests/minute","operationId":"update_verification_settings_api_v1_servers__server_id__verification_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__verification__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/verification/stats":{"get":{"tags":["❇️ Verify"],"summary":"Get Verification Stats","description":"Returns detailed verification statistics.\n\nRate Limited: 80 requests/minute\nCached: 2 minutes","operationId":"get_verification_stats_api_v1_servers__server_id__verification_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__verification__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/verification/logs":{"get":{"tags":["❇️ Verify"],"summary":"Get Verification Logs","description":"Returns paginated verification logs.\n\nRate Limited: 100 requests/minute\nCached: 2 minutes","operationId":"get_verification_logs_api_v1_servers__server_id__verification_logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page","default":1,"title":"Page"},"description":"Page"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Entries per page","default":20,"title":"Limit"},"description":"Entries per page"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"enum":["button","code","website","all"],"type":"string"},{"type":"null"}],"description":"Filter by type","default":"all","title":"Type"},"description":"Filter by type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationLogsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/verification/regenerate-code":{"post":{"tags":["❇️ Verify"],"summary":"Regenerate Verification Code","description":"Generates a new verification code.\n\nRate Limited: 80 requests/minute","operationId":"regenerate_verification_code_api_v1_servers__server_id__verification_regenerate_code_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__verification__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/verification/reset":{"delete":{"tags":["❇️ Verify"],"summary":"Reset Verification System","description":"Resets the verification system (deletes config but not logs).\n\nRate Limited: 80 requests/minute","operationId":"reset_verification_system_api_v1_servers__server_id__verification_reset_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__verification__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/verification/recent-users":{"get":{"tags":["❇️ Verify"],"summary":"Get Recently Verified Users","description":"Returns recently verified users.\n\nRate Limited: 100 requests/minute\nCached: 2 minutes","operationId":"get_recently_verified_users_api_v1_servers__server_id__verification_recent_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Number of users","default":10,"title":"Limit"},"description":"Number of users"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__verification__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/verification/upload-image":{"post":{"tags":["❇️ Verify"],"summary":"Upload Verification Image","description":"Uploads an image for the verification message WITH GIF SUPPORT.\n\nRate Limited: 80 requests/minute\nMax File Size: 25MB","operationId":"upload_verification_image_api_v1_servers__server_id__verification_upload_image_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"image_type","in":"query","required":true,"schema":{"enum":["image","thumbnail","author_icon","footer_icon"],"type":"string","description":"Image type","title":"Image Type"},"description":"Image type"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_verification_image_api_v1_servers__server_id__verification_upload_image_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__verification__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/verification/delete-image":{"delete":{"tags":["❇️ Verify"],"summary":"Delete Verification Image","description":"Deletes an image from the verification message.\n\nRate Limited: 80 requests/minute","operationId":"delete_verification_image_api_v1_servers__server_id__verification_delete_image_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"image_type","in":"query","required":true,"schema":{"enum":["image","thumbnail","author_icon","footer_icon"],"type":"string","description":"Image type","title":"Image Type"},"description":"Image type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__verification__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/verification/image/{image_type}":{"get":{"tags":["❇️ Verify"],"summary":"Get Verification Image","description":"Returns an image WITH correct MIME-Type for GIF support.","operationId":"get_verification_image_api_v1_servers__server_id__verification_image__image_type__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"image_type","in":"path","required":true,"schema":{"enum":["image","thumbnail","author_icon","footer_icon"],"type":"string","title":"Image Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/verification/brand/upload":{"post":{"tags":["❇️ Verify"],"summary":"Upload Brand Asset","description":"Uploads a brand asset (background image or audio) for the verification page.\nPremium only.","operationId":"upload_brand_asset_api_v1_servers__server_id__verification_brand_upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"asset_type","in":"query","required":true,"schema":{"enum":["background","audio"],"type":"string","description":"Asset type","title":"Asset Type"},"description":"Asset type"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_brand_asset_api_v1_servers__server_id__verification_brand_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__verification__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/verification/brand/delete":{"delete":{"tags":["❇️ Verify"],"summary":"Delete Brand Asset","description":"Deletes a brand asset.","operationId":"delete_brand_asset_api_v1_servers__server_id__verification_brand_delete_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"asset_type","in":"query","required":true,"schema":{"enum":["background","audio"],"type":"string","description":"Asset type","title":"Asset Type"},"description":"Asset type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__verification__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/verification/brand/{asset_type}":{"get":{"tags":["❇️ Verify"],"summary":"Get Brand Asset","description":"Returns a brand asset with the correct MIME type (for dashboard preview).","operationId":"get_brand_asset_api_v1_servers__server_id__verification_brand__asset_type__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"asset_type","in":"path","required":true,"schema":{"enum":["background","audio"],"type":"string","title":"Asset Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/verification/send":{"post":{"tags":["❇️ Verify"],"summary":"Send Verification Message","description":"Triggers the bot to send or update the verification message.\n- update_only=False: post new in channel\n- update_only=True: update existing verify message (if saved)","operationId":"send_verification_message_api_v1_servers__server_id__verification_send_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SendVerifyRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__verification__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embeds/stats":{"get":{"tags":["📔 Advanced Embeds"],"summary":"Get Embed Statistics","description":"Returns statistics about embeds for a server.\n\nRate Limited: 80 requests/minute","operationId":"get_embed_statistics_api_v1_servers__server_id__embeds_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embeds":{"get":{"tags":["📔 Advanced Embeds"],"summary":"Get Server Embeds","description":"Returns list of all embeds for a server.\n\nRate Limited: 100 requests/minute","operationId":"get_server_embeds_api_v1_servers__server_id__embeds_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page","default":1,"title":"Page"},"description":"Page"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Entries per page","default":20,"title":"Limit"},"description":"Entries per page"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by name","title":"Search"},"description":"Search by name"},{"name":"message_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["embed","text","image","embed_with_content"],"type":"string"},{"type":"null"}],"title":"Message Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbedListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["📔 Advanced Embeds"],"summary":"Create Embed","description":"Creates a new embed.\n\nRate Limited: 80 requests/minute","operationId":"create_embed_api_v1_servers__server_id__embeds_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbedTemplateCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embeds/dashboard":{"get":{"tags":["📔 Advanced Embeds"],"summary":"Get Advanced Embeds Dashboard","description":"Returns aggregated data for the Advanced Embeds dashboard (embeds list, stats, ticket panels).","operationId":"get_advanced_embeds_dashboard_api_v1_servers__server_id__embeds_dashboard_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embeds/{embed_id}":{"get":{"tags":["📔 Advanced Embeds"],"summary":"Get Embed Details","description":"Returns details for a specific embed.\n\nRate Limited: 80 requests/minute","operationId":"get_embed_details_api_v1_servers__server_id__embeds__embed_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["📔 Advanced Embeds"],"summary":"Update Embed","description":"Updates an embed.\n\nRate Limited: 80 requests/minute","operationId":"update_embed_api_v1_servers__server_id__embeds__embed_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbedTemplateUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📔 Advanced Embeds"],"summary":"Delete Embed","description":"Deletes an embed (including fields and buttons).\n\nRate Limited: 80 requests/minute","operationId":"delete_embed_api_v1_servers__server_id__embeds__embed_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embeds/{embed_id}/fields":{"post":{"tags":["📔 Advanced Embeds"],"summary":"Add Field","description":"Adds a field to an embed.\n\nRate Limited: 80 requests/minute","operationId":"add_field_api_v1_servers__server_id__embeds__embed_id__fields_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbedFieldCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embeds/{embed_id}/fields/sync":{"put":{"tags":["📔 Advanced Embeds"],"summary":"Sync Fields","description":"Replaces all fields of an embed (delete all existing, recreate from array).\nExpects a raw JSON array: [{name, value, inline, position}, ...]\nReturns the newly created fields with their real database IDs.\n\nRate Limited: 80 requests/minute","operationId":"sync_fields_api_v1_servers__server_id__embeds__embed_id__fields_sync_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"required":true,"description":"The complete new set of fields, in order.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EmbedFieldCreate"}}}}}}},"/api/v1/servers/{server_id}/embeds/{embed_id}/fields/{field_id}":{"put":{"tags":["📔 Advanced Embeds"],"summary":"Update Field","description":"Updates a field.\n\nRate Limited: 80 requests/minute","operationId":"update_field_api_v1_servers__server_id__embeds__embed_id__fields__field_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"},{"name":"field_id","in":"path","required":true,"schema":{"type":"integer","description":"Field ID","title":"Field Id"},"description":"Field ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbedFieldUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📔 Advanced Embeds"],"summary":"Delete Field","description":"Deletes a field.\n\nRate Limited: 80 requests/minute","operationId":"delete_field_api_v1_servers__server_id__embeds__embed_id__fields__field_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"},{"name":"field_id","in":"path","required":true,"schema":{"type":"integer","description":"Field ID","title":"Field Id"},"description":"Field ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embeds/{embed_id}/buttons":{"post":{"tags":["📔 Advanced Embeds"],"summary":"Add Button","description":"Adds a button to an embed.\n\nRate Limited: 80 requests/minute","operationId":"add_button_api_v1_servers__server_id__embeds__embed_id__buttons_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbedButtonCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embeds/{embed_id}/buttons/sync":{"put":{"tags":["📔 Advanced Embeds"],"summary":"Sync Buttons","description":"Replaces all buttons of an embed (delete all existing, recreate from array).\nExpects a raw JSON array: [{label, style, ...}, ...]\nReturns the newly created buttons with their real database IDs.\n\nRate Limited: 80 requests/minute","operationId":"sync_buttons_api_v1_servers__server_id__embeds__embed_id__buttons_sync_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"required":true,"description":"The complete new set of buttons, in order.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EmbedButtonCreate"}}}}}}},"/api/v1/servers/{server_id}/embeds/{embed_id}/buttons/{button_id}":{"put":{"tags":["📔 Advanced Embeds"],"summary":"Update Button","description":"Updates a button.\n\nRate Limited: 80 requests/minute","operationId":"update_button_api_v1_servers__server_id__embeds__embed_id__buttons__button_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"},{"name":"button_id","in":"path","required":true,"schema":{"type":"integer","description":"Button ID","title":"Button Id"},"description":"Button ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbedButtonUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📔 Advanced Embeds"],"summary":"Delete Button","description":"Deletes a button.\n\nRate Limited: 80 requests/minute","operationId":"delete_button_api_v1_servers__server_id__embeds__embed_id__buttons__button_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"},{"name":"button_id","in":"path","required":true,"schema":{"type":"integer","description":"Button ID","title":"Button Id"},"description":"Button ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embeds/{embed_id}/select-menus":{"post":{"tags":["📔 Advanced Embeds"],"summary":"Add Select Menu","description":"Adds a select menu to an embed (max 5 per embed, max 15 global).\n\nRate Limited: 80 requests/minute","operationId":"add_select_menu_api_v1_servers__server_id__embeds__embed_id__select_menus_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbedSelectMenuCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embeds/{embed_id}/select-menus/sync":{"put":{"tags":["📔 Advanced Embeds"],"summary":"Sync Select Menus","description":"Replaces all select menus of an embed (delete all existing, recreate from array).\nExpects a raw JSON array: [{placeholder, min_values, max_values, options: [...]}, ...]\n\nRate Limited: 80 requests/minute","operationId":"sync_select_menus_api_v1_servers__server_id__embeds__embed_id__select_menus_sync_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"required":true,"description":"The complete new set of select menus, in order.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EmbedSelectMenuCreate"}}}}}}},"/api/v1/servers/{server_id}/embeds/{embed_id}/select-menus/{menu_id}":{"put":{"tags":["📔 Advanced Embeds"],"summary":"Update Select Menu","description":"Updates a select menu. If options are provided, all existing options are replaced.\n\nRate Limited: 80 requests/minute","operationId":"update_select_menu_api_v1_servers__server_id__embeds__embed_id__select_menus__menu_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"},{"name":"menu_id","in":"path","required":true,"schema":{"type":"integer","description":"Select Menu ID","title":"Menu Id"},"description":"Select Menu ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbedSelectMenuUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📔 Advanced Embeds"],"summary":"Delete Select Menu","description":"Deletes a select menu (including all its options).\n\nRate Limited: 80 requests/minute","operationId":"delete_select_menu_api_v1_servers__server_id__embeds__embed_id__select_menus__menu_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"},{"name":"menu_id","in":"path","required":true,"schema":{"type":"integer","description":"Select Menu ID","title":"Menu Id"},"description":"Select Menu ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embeds/global-limits":{"get":{"tags":["📔 Advanced Embeds"],"summary":"Get Global Component Limits","description":"Returns global component limits and current usage for frontend.\nUseful for the frontend to disable add-buttons when limits are reached.\n\nRate Limited: 80 requests/minute","operationId":"get_global_component_limits_api_v1_servers__server_id__embeds_global_limits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embeds/{embed_id}/upload-image":{"post":{"tags":["📔 Advanced Embeds"],"summary":"Upload Embed Image","description":"Uploads an image for an embed (Base64) WITH GIF SUPPORT.\n\nRate Limited: 80 requests/minute\nMax File Size: 8MB","operationId":"upload_embed_image_api_v1_servers__server_id__embeds__embed_id__upload_image_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"},{"name":"image_type","in":"query","required":true,"schema":{"enum":["image","thumbnail","author_icon","footer_icon"],"type":"string","title":"Image Type"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_embed_image_api_v1_servers__server_id__embeds__embed_id__upload_image_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embeds/{embed_id}/delete-image":{"delete":{"tags":["📔 Advanced Embeds"],"summary":"Delete Embed Image","description":"Deletes an image from an embed.\n\nRate Limited: 80 requests/minute","operationId":"delete_embed_image_api_v1_servers__server_id__embeds__embed_id__delete_image_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"},{"name":"image_type","in":"query","required":true,"schema":{"enum":["image","thumbnail","author_icon","footer_icon"],"type":"string","title":"Image Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embeds/{embed_id}/image/{image_type}":{"get":{"tags":["📔 Advanced Embeds"],"summary":"Get Embed Image","description":"Returns an image from the embed WITH correct MIME type for GIF support.","operationId":"get_embed_image_api_v1_servers__server_id__embeds__embed_id__image__image_type__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"},{"name":"image_type","in":"path","required":true,"schema":{"enum":["image","thumbnail","author_icon","footer_icon"],"type":"string","title":"Image Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/container-assets/upload":{"post":{"tags":["📔 Advanced Embeds"],"summary":"Upload Container Asset","description":"Lädt ein Bild für einen Inline-JSON Container hoch und gibt eine ``asset://{id}``-Referenz\nzurück. Geteilt von Automation, Welcome/DM und AdvancedEmbeds (Container-Modus). Das Bild\nwird als Base64 in ``ContainerAsset`` abgelegt — nicht im Container-JSON — damit die Configs\nschlank bleiben und die Bilder nicht gegen die Embed-Limits zählen.\n\nRate Limited. Max File Size: 10MB.","operationId":"upload_container_asset_api_v1_servers__server_id__container_assets_upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"scope","in":"query","required":false,"schema":{"enum":["automation","welcome","welcome_dm","advancedembed","application_panel","boost"],"type":"string","default":"automation","title":"Scope"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_container_asset_api_v1_servers__server_id__container_assets_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/container-assets/{asset_id}":{"get":{"tags":["📔 Advanced Embeds"],"summary":"Get Container Asset","description":"Liefert die Bilddaten eines Container-Assets mit korrektem MIME-Type (für die Vorschau).","operationId":"get_container_asset_api_v1_servers__server_id__container_assets__asset_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"asset_id","in":"path","required":true,"schema":{"type":"integer","description":"Container asset ID","title":"Asset Id"},"description":"Container asset ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📔 Advanced Embeds"],"summary":"Delete Container Asset","description":"Löscht ein Container-Asset (z.B. wenn der User das Bild aus dem Builder entfernt).","operationId":"delete_container_asset_api_v1_servers__server_id__container_assets__asset_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"asset_id","in":"path","required":true,"schema":{"type":"integer","description":"Container asset ID","title":"Asset Id"},"description":"Container asset ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embeds/{embed_id}/send":{"post":{"tags":["📔 Advanced Embeds"],"summary":"Send Embed","description":"Sends an embed to a Discord channel.\nPublishes event to the bot.\n\nRate Limited: 80 requests/minute","operationId":"send_embed_api_v1_servers__server_id__embeds__embed_id__send_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"embed_id","in":"path","required":true,"schema":{"type":"integer","description":"Embed ID","title":"Embed Id"},"description":"Embed ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendEmbedRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embed-groups":{"get":{"tags":["📔 Advanced Embeds"],"summary":"Get Embed Groups","description":"Returns all embed groups for a server.\n\nRate Limited: 100 requests/minute","operationId":"get_embed_groups_api_v1_servers__server_id__embed_groups_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"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/EmbedGroupListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["📔 Advanced Embeds"],"summary":"Create Embed Group","description":"Creates a new embed group.\n\nRate Limited: 80 requests/minute","operationId":"create_embed_group_api_v1_servers__server_id__embed_groups_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbedGroupCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embed-groups/{group_id}":{"get":{"tags":["📔 Advanced Embeds"],"summary":"Get Embed Group Details","description":"Returns details for an embed group.\n\nRate Limited: 80 requests/minute","operationId":"get_embed_group_details_api_v1_servers__server_id__embed_groups__group_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","description":"Group ID","title":"Group Id"},"description":"Group ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["📔 Advanced Embeds"],"summary":"Update Embed Group","description":"Updates an embed group.\n\nRate Limited: 80 requests/minute","operationId":"update_embed_group_api_v1_servers__server_id__embed_groups__group_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","description":"Group ID","title":"Group Id"},"description":"Group ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbedGroupUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📔 Advanced Embeds"],"summary":"Delete Embed Group","description":"Deletes an embed group (embeds themselves remain intact).\n\nRate Limited: 80 requests/minute","operationId":"delete_embed_group_api_v1_servers__server_id__embed_groups__group_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","description":"Group ID","title":"Group Id"},"description":"Group ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embed-groups/{group_id}/send":{"post":{"tags":["📔 Advanced Embeds"],"summary":"Send Embed Group","description":"Sends all embeds of a group to a Discord channel.\n\nRate Limited: 80 requests/minute","operationId":"send_embed_group_api_v1_servers__server_id__embed_groups__group_id__send_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","description":"Group ID","title":"Group Id"},"description":"Group ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendEmbedRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/multi-content/send":{"post":{"tags":["📔 Advanced Embeds"],"summary":"Send Multi Content","description":"Sendet mehrere Content-Items (Embeds, Bilder, Text, etc.) nacheinander in einen Channel.\nJedes Item wird als eigene Discord-Nachricht gesendet.\nErmoeglicht z.B.: Bild -> Embed -> Bild -> Text mit Buttons\n\nRate Limited: 80 requests/minute","operationId":"send_multi_content_api_v1_servers__server_id__multi_content_send_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMultiContentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ticket-panel-options":{"get":{"tags":["📔 Advanced Embeds"],"summary":"Get Ticket Panel Options","description":"Gibt alle Ticket-Panels und deren Optionen für einen Server zurück.\nWird vom Frontend genutzt, um bei action_type='open_ticket' eine Option auszuwählen.\n\nRate Limited: 80 requests/minute","operationId":"get_ticket_panel_options_api_v1_servers__server_id__ticket_panel_options_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__embeds__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embed-import/scan":{"get":{"tags":["📔 Advanced Embeds"],"summary":"Scan Channel","description":"Scannt einen Kanal und liefert pro importierbarer Nachricht beide Zielformate.\n\nDie erste Seite eines Kanals kommt aus dem Peek-Cache, den der Smart Scan beim\nOeffnen des Wizards gefuellt hat. Dadurch ist das Aufklappen eines vorgeschlagenen\nKanals sofort da statt nach einem Discord-Roundtrip, und das Umschalten der Filter\nkostet gar keinen Call mehr.\n\nRate Limited: 80 requests/minute","operationId":"scan_channel_api_v1_servers__server_id__embed_import_scan_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"channel_id","in":"query","required":true,"schema":{"type":"string","description":"Zu scannender Kanal","title":"Channel Id"},"description":"Zu scannender Kanal"},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Snowflake fuer aeltere Nachrichten","title":"Before"},"description":"Snowflake fuer aeltere Nachrichten"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":25,"title":"Limit"}},{"name":"include_own","in":"query","required":false,"schema":{"type":"boolean","description":"Auch Notoqs eigene Nachrichten zeigen","default":false,"title":"Include Own"},"description":"Auch Notoqs eigene Nachrichten zeigen"},{"name":"include_users","in":"query","required":false,"schema":{"type":"boolean","description":"Auch normale Nutzernachrichten zeigen","default":false,"title":"Include Users"},"description":"Auch normale Nutzernachrichten zeigen"},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","description":"Peek-Cache umgehen","default":false,"title":"Refresh"},"description":"Peek-Cache umgehen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embed-import/suggestions":{"get":{"tags":["📔 Advanced Embeds"],"summary":"Get Suggestions","description":"Durchsucht den Server nach Kanaelen, in denen uebernehmbare Nachrichten stehen,\nund liefert sie nach Wahrscheinlichkeit sortiert.\n\nBewusst nur ein Verzeichnis: Zaehler, Gruende und drei Vorschauzeilen je Kanal.\nDie Nachrichten selbst holt der Scan-Endpunkt aus dem Peek-Cache, sobald der\nNutzer einen Kanal aufklappt. Vorher lagen alle Entwuerfe aller Kanaele in EINER\nAntwort, was je nach Server mehrere Megabyte waren.\n\nLaeuft erst, wenn der Nutzer den Wizard oeffnet. Kostet rund 30 Discord-Calls\nund wird deshalb fuenf Minuten in Redis zwischengespeichert.\n\nRate Limited: 80 requests/minute","operationId":"get_suggestions_api_v1_servers__server_id__embed_import_suggestions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"include_own","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Own"}},{"name":"include_users","in":"query","required":false,"schema":{"type":"boolean","description":"Menschen-Nachrichten ueberall mitzaehlen","default":false,"title":"Include Users"},"description":"Menschen-Nachrichten ueberall mitzaehlen"},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","description":"Cache umgehen","default":false,"title":"Refresh"},"description":"Cache umgehen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/embed-import/commit":{"post":{"tags":["📔 Advanced Embeds"],"summary":"Commit Import","description":"Legt die ausgewaehlten Nachrichten als Embeds an und fasst sie bei mehr als einer\nzu einer Gruppe zusammen. Der Builder laedt Gruppen bereits als Blocks, dadurch\nerscheint die komplette Sequenz nach einem einzigen loadEmbed().\n\nBilder werden hier heruntergeladen und neu gehostet: Discord-CDN-Links tragen\nsignierte Ablaufparameter und waeren nach rund 24 Stunden tot.\n\nRate Limited: 80 requests/minute","operationId":"commit_import_api_v1_servers__server_id__embed_import_commit_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportCommitRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/teams/config":{"get":{"tags":["📋 Teamliste"],"summary":"Get Team Config","description":"Returns complete team configuration\n\nRate Limited: 80 requests/minute\nCached: 2 minutes","operationId":"get_team_config_api_v1_servers__server_id__teams_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/teams/main-role":{"put":{"tags":["📋 Teamliste"],"summary":"Set Main Team Role","description":"Sets the main team role\n\nRate Limited: 80 requests/minute","operationId":"set_main_team_role_api_v1_servers__server_id__teams_main_role_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamRoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__teams__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📋 Teamliste"],"summary":"Remove Main Team Role","description":"Removes the main team role\n\nRate Limited: 80 requests/minute","operationId":"remove_main_team_role_api_v1_servers__server_id__teams_main_role_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__teams__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/teams/additional-roles":{"post":{"tags":["📋 Teamliste"],"summary":"Add Additional Team Role","description":"Adds additional team role (max 20)\n\nRate Limited: 80 requests/minute","operationId":"add_additional_team_role_api_v1_servers__server_id__teams_additional_roles_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamRoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__teams__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/teams/additional-roles/{role_id}":{"delete":{"tags":["📋 Teamliste"],"summary":"Remove Additional Team Role","description":"Removes an additional team role\n\nRate Limited: 80 requests/minute","operationId":"remove_additional_team_role_api_v1_servers__server_id__teams_additional_roles__role_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"role_id","in":"path","required":true,"schema":{"type":"string","description":"Role ID to remove","title":"Role Id"},"description":"Role ID to remove"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__teams__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/teams/timers":{"post":{"tags":["📋 Teamliste"],"summary":"Create Promotion Timer","description":"Creates a promotion timer\n\nRate Limited: 80 requests/minute","operationId":"create_promotion_timer_api_v1_servers__server_id__teams_timers_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimerCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__teams__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["📋 Teamliste"],"summary":"List Promotion Timers","description":"Lists all promotion timers\n\nRate Limited: 100 requests/minute\nCached: 2 minutes","operationId":"list_promotion_timers_api_v1_servers__server_id__teams_timers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"status","in":"query","required":false,"schema":{"enum":["all","active","processed"],"type":"string","description":"Filter status","default":"active","title":"Status"},"description":"Filter status"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimerListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/teams/timers/{user_id}":{"delete":{"tags":["📋 Teamliste"],"summary":"Delete Promotion Timer","description":"Deletes a promotion timer\n\nRate Limited: 80 requests/minute","operationId":"delete_promotion_timer_api_v1_servers__server_id__teams_timers__user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"User ID of the timer","title":"User Id"},"description":"User ID of the timer"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__teams__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/teams/send":{"post":{"tags":["📋 Teamliste"],"summary":"Send Team List","description":"Sends or updates the team list\n\nRate Limited: 80 requests/minute","operationId":"send_team_list_api_v1_servers__server_id__teams_send_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendTeamListRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__teams__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/teams/stats":{"get":{"tags":["📋 Teamliste"],"summary":"Get Team Stats","description":"Returns team statistics\n\nRate Limited: 80 requests/minute\nCached: 2 minutes","operationId":"get_team_stats_api_v1_servers__server_id__teams_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/teams/banner":{"post":{"tags":["📋 Teamliste"],"summary":"Upload Team Banner","description":"Uploads a custom banner for team list\n\nRate Limited: 80 requests/minute\nMax File Size: 25MB","operationId":"upload_team_banner_api_v1_servers__server_id__teams_banner_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_team_banner_api_v1_servers__server_id__teams_banner_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__teams__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📋 Teamliste"],"summary":"Delete Team Banner","description":"Deletes the custom banner\n\nRate Limited: 80 requests/minute","operationId":"delete_team_banner_api_v1_servers__server_id__teams_banner_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__teams__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["📋 Teamliste"],"summary":"Get Team Banner","description":"Returns the custom banner\n\nRate Limited: 80 requests/minute","operationId":"get_team_banner_api_v1_servers__server_id__teams_banner_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/teams/preview":{"get":{"tags":["📋 Teamliste"],"summary":"Get Team Preview","description":"Die Rollenabschnitte der Teamliste, mit den echten Mitgliedern darin.\n\nBildet `_get_team_groups` aus commands/teamlist.py nach. Ohne Parameter\ngilt die gespeicherte Konfiguration.","operationId":"get_team_preview_api_v1_servers__server_id__teams_preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"main_role_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Hauptrolle des Entwurfs","title":"Main Role Id"},"description":"Hauptrolle des Entwurfs"},{"name":"additional_role_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Zusatzrollen, komma-getrennt","title":"Additional Role Ids"},"description":"Zusatzrollen, komma-getrennt"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/archive":{"get":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"List Archive","description":"Backups und Templates dieses Servers aus dem alten System.\n\nBeide in EINER Liste, nach Datum sortiert. Sie waren im alten Dashboard\nzwei Reiter, aber der Unterschied war nie einer, den ein Nutzer erklaeren\nkonnte: ein Backup war ein Template mit Mitgliederliste, die nie jemand\nzurueckgespielt hat. Als Archiv sind sie dasselbe - alte Staende eines\nServers.\n\nDie Nutzlast bleibt draussen. `backup_data.data_content` und\n`server_templates.template_data` sind mehrere Megabyte gross; hier stehen\nnur die Zaehler, die ohnehin in der Kopfzeile der Altzeile liegen.","operationId":"list_archive_api_v1_servers__server_id__archive_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Archive Api V1 Servers  Server Id  Archive Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/archive/{kind}/{legacy_id}/convert":{"post":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"Convert Archive Entry","description":"Eine Altzeile in einen Blueprint verwandeln.\n\nLAEUFT IN DER API, NICHT IM BOT. Alles Noetige steht in der Datenbank; der\nBot muesste dafuer nicht einmal online sein. Das ist der Unterschied zu\neiner Erfassung, die Discord lesen muss.\n\nDAS MENGENLIMIT GILT HIER NICHT, und das ist eine Entscheidung, keine\nNachlaessigkeit: die Deckelung soll begrenzen, wie viele Vorlagen ein\nServer NEU anlegt. Sie rueckwirkend auf einen Bestand anzuwenden, den\njemand unter den alten Regeln aufgebaut hat, hiesse ihm etwas wegzunehmen,\ndas er hatte. Der SPEICHER gilt sehr wohl - das sind echte Bytes, und\ndieselbe Rechnung wie beim Import.\n\nBilder werden nachgeladen. Warum das noetig ist, steht im Kopf von\nutils/blueprint_legacy.py: das alte System hat nur Adressen gespeichert\nund die Bytes erst beim Wiederherstellen geholt.","operationId":"convert_archive_entry_api_v1_servers__server_id__archive__kind___legacy_id__convert_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"kind","in":"path","required":true,"schema":{"type":"string","pattern":"^(backup|template)$","title":"Kind"}},{"name":"legacy_id","in":"path","required":true,"schema":{"type":"integer","description":"ID der Altzeile","title":"Legacy Id"},"description":"ID der Altzeile"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvertRequest","default":{"with_images":true}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Convert Archive Entry Api V1 Servers  Server Id  Archive  Kind   Legacy Id  Convert Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/archive/{kind}/{legacy_id}":{"delete":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"Delete Archive Entry","description":"Eine Altzeile endgueltig entfernen.\n\nHART, nicht weich, und ohne Papierkorb: das Archiv IST der Papierkorb. Ein\nzweiter davor waere eine Schonfrist fuer etwas, das schon abgeloest ist.\n\nEin bereits umgewandelter Blueprint bleibt unberuehrt. Er traegt zwar\n`legacy_id`, haengt aber nicht per Fremdschluessel daran - genau dafuer ist\nes eine blosse Zahl und keine Beziehung.","operationId":"delete_archive_entry_api_v1_servers__server_id__archive__kind___legacy_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"kind","in":"path","required":true,"schema":{"type":"string","pattern":"^(backup|template)$","title":"Kind"}},{"name":"legacy_id","in":"path","required":true,"schema":{"type":"integer","description":"ID der Altzeile","title":"Legacy Id"},"description":"ID der Altzeile"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Archive Entry Api V1 Servers  Server Id  Archive  Kind   Legacy Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/backups":{"post":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"Backup Erstellen Abgeloest","operationId":"backup_erstellen_abgeloest_api_v1_servers__server_id__backups_post","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Backup Erstellen Abgeloest Api V1 Servers  Server Id  Backups Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/backups/{backup_id}/restore":{"post":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"Backup Restore Abgeloest","operationId":"backup_restore_abgeloest_api_v1_servers__server_id__backups__backup_id__restore_post","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"backup_id","in":"path","required":true,"schema":{"type":"integer","title":"Backup Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Backup Restore Abgeloest Api V1 Servers  Server Id  Backups  Backup Id  Restore Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/backups/{backup_id}":{"delete":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"Backup Loeschen Abgeloest","description":"Auch das Loeschen: der Weg dorthin ist jetzt das Archiv, und dort haengt\ner an `validate_server_access` wie hier. Ein stiller Erfolg waere schlimmer\nals ein 410 - der Nutzer glaubte sonst, er haette aufgeraeumt.","operationId":"backup_loeschen_abgeloest_api_v1_servers__server_id__backups__backup_id__delete","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"backup_id","in":"path","required":true,"schema":{"type":"integer","title":"Backup Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Backup Loeschen Abgeloest Api V1 Servers  Server Id  Backups  Backup Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/backup-config":{"put":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"Backup Config Abgeloest","operationId":"backup_config_abgeloest_api_v1_servers__server_id__backup_config_put","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Backup Config Abgeloest Api V1 Servers  Server Id  Backup Config Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/templates":{"post":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"Template Erfassen Abgeloest","operationId":"template_erfassen_abgeloest_api_v1_servers__server_id__templates_post","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Template Erfassen Abgeloest Api V1 Servers  Server Id  Templates Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/templates/{template_id}":{"delete":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"Templates Abgeloest","operationId":"templates_abgeloest_api_v1_templates__template_id__delete","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Templates Abgeloest Api V1 Templates  Template Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"Templates Abgeloest","operationId":"templates_abgeloest_api_v1_templates__template_id__patch","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Templates Abgeloest Api V1 Templates  Template Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/templates/{template_id}/report":{"post":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"Templates Abgeloest","operationId":"templates_abgeloest_api_v1_templates__template_id__report_post","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Templates Abgeloest Api V1 Templates  Template Id  Report Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/templates/{template_id}/rate":{"post":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"Templates Abgeloest","operationId":"templates_abgeloest_api_v1_templates__template_id__rate_post","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Templates Abgeloest Api V1 Templates  Template Id  Rate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/templates/{template_id}/apply":{"post":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"Templates Abgeloest","operationId":"templates_abgeloest_api_v1_templates__template_id__apply_post","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Templates Abgeloest Api V1 Templates  Template Id  Apply Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/templates/categories":{"get":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"Template Markt Abgeloest","description":"Der alte Markt hatte 7 oeffentliche Templates und EINE Nutzung\ninsgesamt. Er wird nicht nachgebaut, sondern ersetzt: /api/v1/blueprints\nist der Marktplatz, und der hat eine Pruefung.","operationId":"template_markt_abgeloest_api_v1_templates_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Template Markt Abgeloest Api V1 Templates Categories Get"}}}}}}},"/api/v1/templates/popular":{"get":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"Template Markt Abgeloest","description":"Der alte Markt hatte 7 oeffentliche Templates und EINE Nutzung\ninsgesamt. Er wird nicht nachgebaut, sondern ersetzt: /api/v1/blueprints\nist der Marktplatz, und der hat eine Pruefung.","operationId":"template_markt_abgeloest_api_v1_templates_popular_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Template Markt Abgeloest Api V1 Templates Popular Get"}}}}}}},"/api/v1/templates/market":{"get":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"Template Markt Abgeloest","description":"Der alte Markt hatte 7 oeffentliche Templates und EINE Nutzung\ninsgesamt. Er wird nicht nachgebaut, sondern ersetzt: /api/v1/blueprints\nist der Marktplatz, und der hat eine Pruefung.","operationId":"template_markt_abgeloest_api_v1_templates_market_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Template Markt Abgeloest Api V1 Templates Market Get"}}}}}}},"/api/v1/servers/{server_id}/running-jobs":{"get":{"tags":["🗃️ Archiv (abgeloest: Backup & Templates)"],"summary":"Running Jobs Abgeloest","description":"Der einzige abgeloeste Pfad, der NICHT mit 410 antwortet.\n\nEin altes Dashboard fragt ihn im Sekundentakt ab, um einen laufenden\nVorgang wiederzufinden. Ein 410 im Sekundentakt waere eine Fehlermeldung\nim Sekundentakt; eine leere Antwort heisst schlicht \"es laeuft nichts\", und\ndas stimmt seit der Umstellung immer.","operationId":"running_jobs_abgeloest_api_v1_servers__server_id__running_jobs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Running Jobs Abgeloest Api V1 Servers  Server Id  Running Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/stats":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Ticket Stats","description":"Gibt Statistiken über alle Tickets eines Servers zurück.\n\nRate Limited: 80 requests/minute\nCached: 2 minutes","operationId":"get_ticket_stats_api_v1_servers__server_id__tickets_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticket Stats Api V1 Servers  Server Id  Tickets Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Tickets","description":"Gibt eine paginierte Liste aller Tickets eines Servers zurück.\n\nRate Limited: 100 requests/minute\nCached: 2 minutes","operationId":"get_tickets_api_v1_servers__server_id__tickets_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page","default":1,"title":"Page"},"description":"Page"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Limit"},"description":"Items per page"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"creator_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by creator user ID","title":"Creator Id"},"description":"Filter by creator user ID"},{"name":"claimed_by_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by handler user ID","title":"Claimed By Id"},"description":"Filter by handler user ID"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search in reason","title":"Search"},"description":"Search in reason"},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","description":"Sort by: created_at, priority, status","default":"created_at","title":"Sort By"},"description":"Sort by: created_at, priority, status"},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"Order: asc or desc","default":"desc","title":"Order"},"description":"Order: asc or desc"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Tickets Api V1 Servers  Server Id  Tickets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/{ticket_id}":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Ticket Detail","description":"Gibt detaillierte Informationen zu einem Ticket zurück.\nValidiert Zugriff basierend auf: Admin, Ersteller, Spezifische Rollen, Team Rollen.","operationId":"get_ticket_detail_api_v1_servers__server_id__tickets__ticket_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"ticket_id","in":"path","required":true,"schema":{"type":"integer","description":"Ticket ID","title":"Ticket Id"},"description":"Ticket ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticket Detail Api V1 Servers  Server Id  Tickets  Ticket Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/{ticket_id}/full-details":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Ticket Full Details","description":"Gibt ALLE verfügbaren Informationen zu einem Ticket zurück.\nInklusive Audit-Logs, Transkript (falls gelöscht/geschlossen) und Schließungsgrund.\n\nValidiert Zugriff basierend auf: Admin, Ersteller, Spezifische Rollen, Team Rollen.","operationId":"get_ticket_full_details_api_v1_servers__server_id__tickets__ticket_id__full_details_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"ticket_id","in":"path","required":true,"schema":{"type":"integer","description":"Ticket ID","title":"Ticket Id"},"description":"Ticket ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticket Full Details Api V1 Servers  Server Id  Tickets  Ticket Id  Full Details Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/search":{"get":{"tags":["🎫 Ticket System"],"summary":"Search Tickets","description":"Durchsucht Tickets nach Stichwort, Ticketnummer, Nutzer, Teilnehmer oder Inhalt.\n\nNutzt dasselbe Praedikat wie die Ticket-Liste (utils/ticket_search.py).\n\nRate Limited: 100 requests/minute","operationId":"search_tickets_api_v1_servers__server_id__tickets_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Search term","title":"Query"},"description":"Search term"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Max results","default":15,"title":"Limit"},"description":"Max results"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Tickets Api V1 Servers  Server Id  Tickets Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ticket/settings":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Ticket Settings","description":"Gibt alle Ticket-System Einstellungen zurück.","operationId":"get_ticket_settings_api_v1_servers__server_id__ticket_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticket Settings Api V1 Servers  Server Id  Ticket Settings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/settings":{"put":{"tags":["🎫 Ticket System"],"summary":"Update Ticket Settings","description":"Aktualisiert Ticket-System Einstellungen.\n\nRate Limited: 20 requests/minute","operationId":"update_ticket_settings_api_v1_servers__server_id__tickets_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Ticket Settings Api V1 Servers  Server Id  Tickets Settings Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ticket/purchase-config":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Purchase Config","description":"Gibt die Purchase-Ticket Konfiguration zurück.","operationId":"get_purchase_config_api_v1_servers__server_id__ticket_purchase_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Purchase Config Api V1 Servers  Server Id  Ticket Purchase Config Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/purchase-config":{"put":{"tags":["🎫 Ticket System"],"summary":"Update Purchase Config","description":"Aktualisiert die Purchase-Ticket Konfiguration.\n\nRate Limited: 20 requests/minute","operationId":"update_purchase_config_api_v1_servers__server_id__tickets_purchase_config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Purchase Config Api V1 Servers  Server Id  Tickets Purchase Config Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/{ticket_id}/customer-data":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Customer Data","description":"Gibt Kundendaten für ein Ticket zurück (nur für autorisierte User).\n\nRate Limited: 80 requests/minute\nNICHT gecached aus Datenschutzgründen","operationId":"get_customer_data_api_v1_servers__server_id__tickets__ticket_id__customer_data_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"ticket_id","in":"path","required":true,"schema":{"type":"integer","description":"Ticket ID","title":"Ticket Id"},"description":"Ticket ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Customer Data Api V1 Servers  Server Id  Tickets  Ticket Id  Customer Data Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ticket/ratings":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Rating Stats","description":"Bewertungsstatistiken (Intelligenter Fallback auf Ticket-Bearbeiter).","operationId":"get_rating_stats_api_v1_servers__server_id__ticket_ratings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by supporter user ID","title":"User Id"},"description":"Filter by supporter user ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Rating Stats Api V1 Servers  Server Id  Ticket Ratings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ticket/reviews":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Ticket Reviews","description":"Paginierter Feed ALLER Ticket-Bewertungen eines Servers (für die Reviews-Seite).\nOptional filterbar nach Supporter, Mindest-Score und 'nur mit Kommentar'.\n\nRate Limited: 100 requests/minute","operationId":"get_ticket_reviews_api_v1_servers__server_id__ticket_reviews_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page","default":1,"title":"Page"},"description":"Page"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":24,"title":"Limit"},"description":"Items per page"},{"name":"supporter_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by supporter user ID","title":"Supporter Id"},"description":"Filter by supporter user ID"},{"name":"min_score","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10,"minimum":1},{"type":"null"}],"description":"Minimum score","title":"Min Score"},"description":"Minimum score"},{"name":"with_comments_only","in":"query","required":false,"schema":{"type":"boolean","description":"Nur Reviews mit Kommentar","default":false,"title":"With Comments Only"},"description":"Nur Reviews mit Kommentar"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"newest, oldest, highest, lowest","default":"newest","title":"Sort"},"description":"newest, oldest, highest, lowest"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticket Reviews Api V1 Servers  Server Id  Ticket Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/panel/send":{"post":{"tags":["🎫 Ticket System"],"summary":"Send Ticket Panel","description":"Sendet ein gespeichertes Ticket-Panel in einen Channel.","operationId":"send_ticket_panel_api_v1_servers__server_id__tickets_panel_send_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendPanelRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Send Ticket Panel Api V1 Servers  Server Id  Tickets Panel Send Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/banner":{"post":{"tags":["🎫 Ticket System"],"summary":"Upload Ticket Banner","description":"Lädt ein Custom-Banner für Tickets hoch.\n\nRate Limited: 20 requests/minute","operationId":"upload_ticket_banner_api_v1_servers__server_id__tickets_banner_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_ticket_banner_api_v1_servers__server_id__tickets_banner_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upload Ticket Banner Api V1 Servers  Server Id  Tickets Banner Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎫 Ticket System"],"summary":"Delete Ticket Banner","description":"Löscht das Custom-Banner für Tickets.\n\nRate Limited: 20 requests/minute","operationId":"delete_ticket_banner_api_v1_servers__server_id__tickets_banner_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Ticket Banner Api V1 Servers  Server Id  Tickets Banner Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ticket-panels":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Ticket Panels","description":"Lädt alle Ticket-Panels inklusive aller Optionen und Konfigurationen.","operationId":"get_ticket_panels_api_v1_servers__server_id__ticket_panels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticket Panels Api V1 Servers  Server Id  Ticket Panels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🎫 Ticket System"],"summary":"Create Ticket Panel","operationId":"create_ticket_panel_api_v1_servers__server_id__ticket_panels_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketPanelCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Ticket Panel Api V1 Servers  Server Id  Ticket Panels Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ticket-panels/{panel_id}":{"put":{"tags":["🎫 Ticket System"],"summary":"Update Ticket Panel","description":"Aendert ein Panel an Ort und Stelle.\n\nVorher konnte das Dashboard ein Panel nur loeschen und neu anlegen. Dabei\nbekam es eine neue ID, seine Optionen ebenfalls, und `message_id` ging\nverloren. Die bereits im Kanal stehende Panel-Nachricht trug danach\ncustom_ids (``ticket_dyn:<panel>:<option>``), zu denen es in der Datenbank\nnichts mehr gab - das Panel war ohne erneutes Senden nicht mehr zu\ngebrauchen. Buttons traf das bei jeder Bearbeitung, weil ihre custom_id an\nder Options-ID haengt; das Select-Menue nur, wenn sich die Panel-ID aenderte.\n\nDeshalb bleiben hier ID, Kanal und Nachricht erhalten, und die Optionen\nwerden der Reihe nach WIEDERVERWENDET statt neu angelegt: eine Bearbeitung\nlaesst die bestehende Nachricht gueltig.","operationId":"update_ticket_panel_api_v1_servers__server_id__ticket_panels__panel_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"panel_id","in":"path","required":true,"schema":{"type":"integer","title":"Panel Id"}},{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketPanelCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Ticket Panel Api V1 Servers  Server Id  Ticket Panels  Panel Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎫 Ticket System"],"summary":"Delete Ticket Panel","operationId":"delete_ticket_panel_api_v1_servers__server_id__ticket_panels__panel_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"panel_id","in":"path","required":true,"schema":{"type":"integer","title":"Panel Id"}},{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Ticket Panel Api V1 Servers  Server Id  Ticket Panels  Panel Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/{ticket_id}/transfer-targets":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Ticket Transfer Targets","description":"Die Ticketarten, in die dieses Ticket verschoben werden kann.\n\nDieselbe Auswahl wie im Fenster des Bots: ohne die aktuelle Art und ohne\ndie Arten gesperrter Panels (Tarif-Limit). Ungecacht, denn gleich danach\nwird verschoben - eine 30 s alte Liste boete eine eben geloeschte Art an.","operationId":"get_ticket_transfer_targets_api_v1_servers__server_id__tickets__ticket_id__transfer_targets_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"ticket_id","in":"path","required":true,"schema":{"type":"integer","description":"Ticket ID","title":"Ticket Id"},"description":"Ticket ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketTransferTargetsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/{ticket_id}/transfer":{"post":{"tags":["🎫 Ticket System"],"summary":"Transfer Ticket","description":"Verschiebt ein laufendes Ticket in eine andere Ticketart.\n\nHereinkommen duerfen Dashboard-Admins und das Team. Ob die Person DIESES\nTicket verschieben darf, entscheidet danach der Bot mit dem echten\nMitglied - dieselbe Pruefung wie beim Knopf im Ticket. Ein Dashboard-Admin\ngilt dort als Admin: wer den Server ueber das Dashboard verwaltet, soll\nnicht an einer fehlenden Discord-Rolle scheitern.","operationId":"transfer_ticket_api_v1_servers__server_id__tickets__ticket_id__transfer_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"ticket_id","in":"path","required":true,"schema":{"type":"integer","description":"Ticket ID","title":"Ticket Id"},"description":"Ticket ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketTransferRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Transfer Ticket Api V1 Servers  Server Id  Tickets  Ticket Id  Transfer Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/{ticket_id}/actions":{"post":{"tags":["🎫 Ticket System"],"summary":"Ticket Action","description":"Ein Ticket uebernehmen, freigeben, schliessen, wieder oeffnen oder loeschen.\n\nHereinkommen duerfen Dashboard-Admins und das Team, wie beim Verschieben.\nOb die Person DIESE Aktion an DIESEM Ticket darf, entscheidet danach der\nBot mit dem echten Mitglied - dieselbe Pruefung wie am Knopf im Ticket.\nEin Dashboard-Admin gilt dort als Admin.\n\n`data.status` ist der Zustand des Tickets danach (open, claimed, closed,\ndeleted). Jede Absage kommt als Satz in der Sprache des Nutzers.","operationId":"ticket_action_api_v1_servers__server_id__tickets__ticket_id__actions_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"ticket_id","in":"path","required":true,"schema":{"type":"integer","description":"Ticket ID","title":"Ticket Id"},"description":"Ticket ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ticket Action Api V1 Servers  Server Id  Tickets  Ticket Id  Actions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/{ticket_id}/notes":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Ticket Notes","description":"Holt alle Team-Notizen für ein Ticket.\nNur für Teammitglieder sichtbar.","operationId":"get_ticket_notes_api_v1_servers__server_id__tickets__ticket_id__notes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"ticket_id","in":"path","required":true,"schema":{"type":"integer","description":"Ticket ID","title":"Ticket Id"},"description":"Ticket ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticket Notes Api V1 Servers  Server Id  Tickets  Ticket Id  Notes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🎫 Ticket System"],"summary":"Create Ticket Note","description":"Erstellt eine neue Team-Notiz.\nLimits: Max 40 Notizen pro Ticket, Max 40.000 Zeichen gesamt.","operationId":"create_ticket_note_api_v1_servers__server_id__tickets__ticket_id__notes_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"ticket_id","in":"path","required":true,"schema":{"type":"integer","title":"Ticket Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketNoteCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Ticket Note Api V1 Servers  Server Id  Tickets  Ticket Id  Notes Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/{ticket_id}/notes/{note_id}":{"put":{"tags":["🎫 Ticket System"],"summary":"Update Ticket Note","description":"Bearbeitet eine existierende Team-Notiz.","operationId":"update_ticket_note_api_v1_servers__server_id__tickets__ticket_id__notes__note_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"ticket_id","in":"path","required":true,"schema":{"type":"integer","title":"Ticket Id"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketNoteCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Ticket Note Api V1 Servers  Server Id  Tickets  Ticket Id  Notes  Note Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎫 Ticket System"],"summary":"Delete Ticket Note","description":"Löscht eine Team-Notiz.","operationId":"delete_ticket_note_api_v1_servers__server_id__tickets__ticket_id__notes__note_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"ticket_id","in":"path","required":true,"schema":{"type":"integer","title":"Ticket Id"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Ticket Note Api V1 Servers  Server Id  Tickets  Ticket Id  Notes  Note Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/ai-support/settings":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Ai Support Settings","description":"Gibt die AI Support Einstellungen für den Server zurück.","operationId":"get_ai_support_settings_api_v1_servers__server_id__tickets_ai_support_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ai Support Settings Api V1 Servers  Server Id  Tickets Ai Support Settings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🎫 Ticket System"],"summary":"Update Ai Support Settings","description":"Aktiviert oder deaktiviert den AI Instant Support.","operationId":"update_ai_support_settings_api_v1_servers__server_id__tickets_ai_support_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AISupportSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Ai Support Settings Api V1 Servers  Server Id  Tickets Ai Support Settings Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/ai-support/contexts":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Ai Support Contexts","description":"Gibt alle AI Support Kontext-Einträge eines Servers zurück.","operationId":"get_ai_support_contexts_api_v1_servers__server_id__tickets_ai_support_contexts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","description":"Auch inaktive Kontexte laden","default":false,"title":"Include Inactive"},"description":"Auch inaktive Kontexte laden"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ai Support Contexts Api V1 Servers  Server Id  Tickets Ai Support Contexts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🎫 Ticket System"],"summary":"Create Ai Support Context","description":"Erstellt einen neuen AI Support Kontext-Eintrag.\nMax 25 Kontexte pro Server.","operationId":"create_ai_support_context_api_v1_servers__server_id__tickets_ai_support_contexts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AISupportContextCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Ai Support Context Api V1 Servers  Server Id  Tickets Ai Support Contexts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/ai-support/contexts/{context_id}":{"put":{"tags":["🎫 Ticket System"],"summary":"Update Ai Support Context","description":"Bearbeitet einen AI Support Kontext-Eintrag.","operationId":"update_ai_support_context_api_v1_servers__server_id__tickets_ai_support_contexts__context_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"context_id","in":"path","required":true,"schema":{"type":"integer","description":"Kontext ID","title":"Context Id"},"description":"Kontext ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AISupportContextUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Ai Support Context Api V1 Servers  Server Id  Tickets Ai Support Contexts  Context Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎫 Ticket System"],"summary":"Delete Ai Support Context","description":"Löscht einen AI Support Kontext-Eintrag.","operationId":"delete_ai_support_context_api_v1_servers__server_id__tickets_ai_support_contexts__context_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"context_id","in":"path","required":true,"schema":{"type":"integer","description":"Kontext ID","title":"Context Id"},"description":"Kontext ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Ai Support Context Api V1 Servers  Server Id  Tickets Ai Support Contexts  Context Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/{ticket_id}/ai-conversation":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Ai Conversation","description":"Gibt den AI-Konversationsverlauf eines Tickets zurück.","operationId":"get_ai_conversation_api_v1_servers__server_id__tickets__ticket_id__ai_conversation_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"ticket_id","in":"path","required":true,"schema":{"type":"integer","description":"Ticket ID","title":"Ticket Id"},"description":"Ticket ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page","default":1,"title":"Page"},"description":"Page"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":50,"title":"Limit"},"description":"Items per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ai Conversation Api V1 Servers  Server Id  Tickets  Ticket Id  Ai Conversation Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/ai-support/stats":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Ai Support Stats","description":"Gibt Statistiken über den AI Instant Support zurück.","operationId":"get_ai_support_stats_api_v1_servers__server_id__tickets_ai_support_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Zeitraum in Tagen","default":30,"title":"Days"},"description":"Zeitraum in Tagen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ai Support Stats Api V1 Servers  Server Id  Tickets Ai Support Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/ai-triage/settings":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Ticket Triage Settings","description":"Gibt die AI-Triage-Einstellungen zurueck (legt bei erstem Zugriff Defaults an, alles AUS).","operationId":"get_ticket_triage_settings_api_v1_servers__server_id__tickets_ai_triage_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticket Triage Settings Api V1 Servers  Server Id  Tickets Ai Triage Settings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🎫 Ticket System"],"summary":"Update Ticket Triage Settings","description":"Aktualisiert die AI-Triage-Einstellungen (mit Validierung).","operationId":"update_ticket_triage_settings_api_v1_servers__server_id__tickets_ai_triage_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriageSettingsPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Ticket Triage Settings Api V1 Servers  Server Id  Tickets Ai Triage Settings Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/ai-triage/insights":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Ticket Ai Insights","description":"Reine SQL-Aggregation ueber triagierte Tickets (Kategorien, Sentiment, Prioritaeten).\nVerbraucht KEINE AI-Quota.","operationId":"get_ticket_ai_insights_api_v1_servers__server_id__tickets_ai_triage_insights_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Zeitraum in Tagen","default":30,"title":"Days"},"description":"Zeitraum in Tagen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticket Ai Insights Api V1 Servers  Server Id  Tickets Ai Triage Insights Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/workload/settings":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Ticket Workload Settings","description":"Gibt die Auslastungs-Einstellungen zurueck (legt bei erstem Zugriff Defaults an, alles AUS).","operationId":"get_ticket_workload_settings_api_v1_servers__server_id__tickets_workload_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticket Workload Settings Api V1 Servers  Server Id  Tickets Workload Settings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🎫 Ticket System"],"summary":"Update Ticket Workload Settings","description":"Aktualisiert die Auslastungs-Einstellungen (mit Validierung) und refresht das Board.","operationId":"update_ticket_workload_settings_api_v1_servers__server_id__tickets_workload_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkloadSettingsPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Ticket Workload Settings Api V1 Servers  Server Id  Tickets Workload Settings Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/workload/stats":{"get":{"tags":["🎫 Ticket System"],"summary":"Get Ticket Workload Stats","description":"Live-Auslastungs-Snapshot fuer die Dashboard-Vorschau.\nBevorzugt den vom Bot geschriebenen Redis-Snapshot (inkl. Presence/Kapazitaet);\nfaellt auf eine reine DB-Aggregation zurueck, wenn kein frischer Snapshot existiert.","operationId":"get_ticket_workload_stats_api_v1_servers__server_id__tickets_workload_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticket Workload Stats Api V1 Servers  Server Id  Tickets Workload Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tickets/workload/send":{"post":{"tags":["🎫 Ticket System"],"summary":"Send Ticket Workload Board","description":"Postet das Auslastungs-Board sofort in den gewaehlten Kanal (bzw. den konfigurierten).","operationId":"send_ticket_workload_board_api_v1_servers__server_id__tickets_workload_send_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"channel_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Zielkanal (optional, sonst konfigurierter Board-Kanal)","title":"Channel Id"},"description":"Zielkanal (optional, sonst konfigurierter Board-Kanal)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Send Ticket Workload Board Api V1 Servers  Server Id  Tickets Workload Send Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications":{"get":{"tags":["🖊️ Bewerbungssystem"],"summary":"Get Applications","description":"List all applications of a server.\nFilter by status possible: pending, in_review, accepted, rejected, withdrawn","operationId":"get_applications_api_v1_servers__server_id__applications_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"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":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/stats":{"get":{"tags":["🖊️ Bewerbungssystem"],"summary":"Get Application Stats","description":"Statistics about all applications of a server.","operationId":"get_application_stats_api_v1_servers__server_id__applications_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Application Stats Api V1 Servers  Server Id  Applications Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/{application_id}":{"get":{"tags":["🖊️ Bewerbungssystem"],"summary":"Get Application Details","description":"Detailed information about a specific application, including source, applicant profile,\npast applications, warning count, internal notes and the audit log.","operationId":"get_application_details_api_v1_servers__server_id__applications__application_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"application_id","in":"path","required":true,"schema":{"type":"integer","description":"Application ID","title":"Application Id"},"description":"Application ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Application Details Api V1 Servers  Server Id  Applications  Application Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/application/positions":{"get":{"tags":["🖊️ Bewerbungssystem"],"summary":"Get Positions","description":"List of all application positions of a server.","operationId":"get_positions_api_v1_servers__server_id__application_positions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Positions Api V1 Servers  Server Id  Application Positions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/positions":{"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Create Position","description":"Creates a new application position.","operationId":"create_position_api_v1_servers__server_id__applications_positions_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PositionCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Position Api V1 Servers  Server Id  Applications Positions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/positions/{position_id}":{"put":{"tags":["🖊️ Bewerbungssystem"],"summary":"Update Position","description":"Updates an existing position.","operationId":"update_position_api_v1_servers__server_id__applications_positions__position_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"position_id","in":"path","required":true,"schema":{"type":"integer","description":"Position ID","title":"Position Id"},"description":"Position ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PositionUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Position Api V1 Servers  Server Id  Applications Positions  Position Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🖊️ Bewerbungssystem"],"summary":"Delete Position","description":"Deletes a position.","operationId":"delete_position_api_v1_servers__server_id__applications_positions__position_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"position_id","in":"path","required":true,"schema":{"type":"integer","description":"Position ID","title":"Position Id"},"description":"Position ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Position Api V1 Servers  Server Id  Applications Positions  Position Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/application/config":{"get":{"tags":["🖊️ Bewerbungssystem"],"summary":"Get Config","description":"Retrieve application configuration of a server.","operationId":"get_config_api_v1_servers__server_id__application_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Config Api V1 Servers  Server Id  Application Config Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/config":{"put":{"tags":["🖊️ Bewerbungssystem"],"summary":"Update Config","description":"Update application configuration.","operationId":"update_config_api_v1_servers__server_id__applications_config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Config Api V1 Servers  Server Id  Applications Config Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/application/review-roles":{"get":{"tags":["🖊️ Bewerbungssystem"],"summary":"Get Review Roles","description":"List of all review roles.","operationId":"get_review_roles_api_v1_servers__server_id__application_review_roles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Review Roles Api V1 Servers  Server Id  Application Review Roles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/review-roles":{"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Add Review Role","description":"Adds a review role.","operationId":"add_review_role_api_v1_servers__server_id__applications_review_roles_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRoleAddRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Review Role Api V1 Servers  Server Id  Applications Review Roles Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/review-roles/{role_id}":{"delete":{"tags":["🖊️ Bewerbungssystem"],"summary":"Remove Review Role","description":"Removes a review role.","operationId":"remove_review_role_api_v1_servers__server_id__applications_review_roles__role_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"role_id","in":"path","required":true,"schema":{"type":"string","description":"Role ID","title":"Role Id"},"description":"Role ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Review Role Api V1 Servers  Server Id  Applications Review Roles  Role Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/panels":{"get":{"tags":["🖊️ Bewerbungssystem"],"summary":"List Panels","description":"Lists all application panels of a server, including their limit status.","operationId":"list_panels_api_v1_servers__server_id__applications_panels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Panels Api V1 Servers  Server Id  Applications Panels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Create Panel","description":"Creates a new application panel.","operationId":"create_panel_api_v1_servers__server_id__applications_panels_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PanelCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Panel Api V1 Servers  Server Id  Applications Panels Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/panels/{panel_id}":{"put":{"tags":["🖊️ Bewerbungssystem"],"summary":"Update Panel","description":"Updates an application panel. Design fields accept null to fall back to the server config.","operationId":"update_panel_api_v1_servers__server_id__applications_panels__panel_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"panel_id","in":"path","required":true,"schema":{"type":"integer","description":"Panel ID","title":"Panel Id"},"description":"Panel ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PanelUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Panel Api V1 Servers  Server Id  Applications Panels  Panel Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🖊️ Bewerbungssystem"],"summary":"Delete Panel","description":"Deletes an application panel and removes its posted message.","operationId":"delete_panel_api_v1_servers__server_id__applications_panels__panel_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"panel_id","in":"path","required":true,"schema":{"type":"integer","description":"Panel ID","title":"Panel Id"},"description":"Panel ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Panel Api V1 Servers  Server Id  Applications Panels  Panel Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/panels/{panel_id}/positions":{"put":{"tags":["🖊️ Bewerbungssystem"],"summary":"Set Panel Positions","description":"Replaces the position assignment of a panel. The given order is the panel order.","operationId":"set_panel_positions_api_v1_servers__server_id__applications_panels__panel_id__positions_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"panel_id","in":"path","required":true,"schema":{"type":"integer","description":"Panel ID","title":"Panel Id"},"description":"Panel ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PanelPositionsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Panel Positions Api V1 Servers  Server Id  Applications Panels  Panel Id  Positions Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/panels/reorder":{"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Reorder Panels","description":"Reorders the panels of a server. The order also decides which panels stay active\non the free tier.","operationId":"reorder_panels_api_v1_servers__server_id__applications_panels_reorder_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PanelReorderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reorder Panels Api V1 Servers  Server Id  Applications Panels Reorder Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/panels/{panel_id}/send":{"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Send Panel","description":"Posts a panel to a channel (via bot event). Without a channel the one stored on the\npanel is used.","operationId":"send_panel_api_v1_servers__server_id__applications_panels__panel_id__send_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"panel_id","in":"path","required":true,"schema":{"type":"integer","description":"Panel ID","title":"Panel Id"},"description":"Panel ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PanelSendToChannelRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Send Panel Api V1 Servers  Server Id  Applications Panels  Panel Id  Send Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/panels/{panel_id}/update":{"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Update Panel Message","description":"Re-renders the posted message of a single panel.","operationId":"update_panel_message_api_v1_servers__server_id__applications_panels__panel_id__update_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"panel_id","in":"path","required":true,"schema":{"type":"integer","description":"Panel ID","title":"Panel Id"},"description":"Panel ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Panel Message Api V1 Servers  Server Id  Applications Panels  Panel Id  Update Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/panels/{panel_id}/message":{"delete":{"tags":["🖊️ Bewerbungssystem"],"summary":"Remove Panel Message","description":"Deletes the posted message of a panel but keeps the panel configuration.","operationId":"remove_panel_message_api_v1_servers__server_id__applications_panels__panel_id__message_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"panel_id","in":"path","required":true,"schema":{"type":"integer","description":"Panel ID","title":"Panel Id"},"description":"Panel ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Panel Message Api V1 Servers  Server Id  Applications Panels  Panel Id  Message Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/panel/send":{"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Send Application Panel","description":"Sends the first application panel to a channel (via bot event).\n\nKept for backward compatibility — the panel-aware route is\n``/applications/panels/{panel_id}/send``.","operationId":"send_application_panel_api_v1_servers__server_id__applications_panel_send_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PanelSendRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Send Application Panel Api V1 Servers  Server Id  Applications Panel Send Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/panel/update":{"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Update Application Panel","description":"Re-renders every posted application panel of the server.","operationId":"update_application_panel_api_v1_servers__server_id__applications_panel_update_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Application Panel Api V1 Servers  Server Id  Applications Panel Update Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/panels/{panel_id}/banner":{"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Upload Panel Banner","description":"Uploads a banner for one specific panel. Without it the panel inherits the server banner.","operationId":"upload_panel_banner_api_v1_servers__server_id__applications_panels__panel_id__banner_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"panel_id","in":"path","required":true,"schema":{"type":"integer","description":"Panel ID","title":"Panel Id"},"description":"Panel ID"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_panel_banner_api_v1_servers__server_id__applications_panels__panel_id__banner_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upload Panel Banner Api V1 Servers  Server Id  Applications Panels  Panel Id  Banner Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["🖊️ Bewerbungssystem"],"summary":"Get Panel Banner","description":"Returns the panel banner as a data URI (empty when the panel inherits the server banner).","operationId":"get_panel_banner_api_v1_servers__server_id__applications_panels__panel_id__banner_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"panel_id","in":"path","required":true,"schema":{"type":"integer","description":"Panel ID","title":"Panel Id"},"description":"Panel ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🖊️ Bewerbungssystem"],"summary":"Delete Panel Banner","description":"Removes the panel banner, so the panel falls back to the server banner again.","operationId":"delete_panel_banner_api_v1_servers__server_id__applications_panels__panel_id__banner_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"panel_id","in":"path","required":true,"schema":{"type":"integer","description":"Panel ID","title":"Panel Id"},"description":"Panel ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Panel Banner Api V1 Servers  Server Id  Applications Panels  Panel Id  Banner Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/banner":{"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Upload Banner","description":"Uploads a banner for application embeds (as Base64 in DB).","operationId":"upload_banner_api_v1_servers__server_id__applications_banner_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_banner_api_v1_servers__server_id__applications_banner_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upload Banner Api V1 Servers  Server Id  Applications Banner Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🖊️ Bewerbungssystem"],"summary":"Delete Banner","description":"Deletes the application banner (sets Base64 field to null).","operationId":"delete_banner_api_v1_servers__server_id__applications_banner_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Banner Api V1 Servers  Server Id  Applications Banner Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/application/positions/{position_id}/image":{"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Upload Position Image","description":"Lädt das Bild einer Position hoch (Base64 in der DB). Premium-only, weil das Bild\nausschließlich auf der öffentlichen Bewerbungsseite gezeigt wird.","operationId":"upload_position_image_api_v1_servers__server_id__application_positions__position_id__image_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"position_id","in":"path","required":true,"schema":{"type":"integer","description":"Position ID","title":"Position Id"},"description":"Position ID"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_position_image_api_v1_servers__server_id__application_positions__position_id__image_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upload Position Image Api V1 Servers  Server Id  Application Positions  Position Id  Image Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["🖊️ Bewerbungssystem"],"summary":"Get Position Image","description":"Liefert das Positionsbild als echte Bilddatei — so bleibt die Positionsliste schlank\nund die Vorschau im Dashboard lädt das Bild erst bei Bedarf.","operationId":"get_position_image_api_v1_servers__server_id__application_positions__position_id__image_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"position_id","in":"path","required":true,"schema":{"type":"integer","description":"Position ID","title":"Position Id"},"description":"Position ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🖊️ Bewerbungssystem"],"summary":"Delete Position Image","description":"Entfernt das Positionsbild. Kein Premium-Check: wegnehmen darf man immer.","operationId":"delete_position_image_api_v1_servers__server_id__application_positions__position_id__image_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"position_id","in":"path","required":true,"schema":{"type":"integer","description":"Position ID","title":"Position Id"},"description":"Position ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Position Image Api V1 Servers  Server Id  Application Positions  Position Id  Image Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/questions":{"get":{"tags":["🖊️ Bewerbungssystem"],"summary":"List Questions","description":"Listet die Fragen eines Scopes: Standardset (kein position_id) oder einer Position.","operationId":"list_questions_api_v1_servers__server_id__applications_questions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"position_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Position ID (leer = Standard-Fragenset)","title":"Position Id"},"description":"Position ID (leer = Standard-Fragenset)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Questions Api V1 Servers  Server Id  Applications Questions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Create Question","description":"Erstellt eine neue getypte Frage (Standardset oder positionsspezifisch).","operationId":"create_question_api_v1_servers__server_id__applications_questions_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationQuestionCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Question Api V1 Servers  Server Id  Applications Questions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/questions/{question_id}":{"put":{"tags":["🖊️ Bewerbungssystem"],"summary":"Update Question","description":"Aktualisiert eine Frage.","operationId":"update_question_api_v1_servers__server_id__applications_questions__question_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","title":"Question Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationQuestionUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Question Api V1 Servers  Server Id  Applications Questions  Question Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🖊️ Bewerbungssystem"],"summary":"Delete Question","description":"Löscht eine Frage. Bereits eingereichte Antworten bleiben erhalten (Snapshot).","operationId":"delete_question_api_v1_servers__server_id__applications_questions__question_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","title":"Question Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Question Api V1 Servers  Server Id  Applications Questions  Question Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/questions/reorder":{"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Reorder Questions","description":"Setzt die Reihenfolge der Fragen eines Scopes neu.","operationId":"reorder_questions_api_v1_servers__server_id__applications_questions_reorder_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestionReorderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reorder Questions Api V1 Servers  Server Id  Applications Questions Reorder Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/positions/reorder":{"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Reorder Positions","description":"Setzt die Reihenfolge der Positionen eines Servers neu.\n\nDer Zwilling zu `reorder_questions`, und er hat bis hierher gefehlt:\n`position_order` wurde beim Anlegen aus dem Zaehler gesetzt und danach nie\nwieder. Das war nicht nur eine fehlende Sortierung, sondern zwei\nEntscheidungen, die der Serverbetreiber nicht treffen konnte:\n\n  * WELCHE 25 IM PANEL STEHEN. Ein Discord-Select-Menue kann nicht mehr,\n    und `select_panel_positions` nimmt die ersten 25 dieser Reihenfolge.\n    Gemeldet von einem Professional-Server mit 51 Positionen.\n  * WELCHE EIN TARIFWECHSEL STEHEN LAESST. `resolve_active_locked` haelt\n    die ersten N nach (position_order, id) aktiv. Wer herunterstuft,\n    verliert sonst genau die Positionen, die er zuletzt angelegt hat -\n    auch wenn das die wichtigen sind.\n\nEs muessen ALLE Positions-IDs des Servers kommen, nicht nur die\nverschobenen: eine Teilliste liesse offen, wo der Rest landet, und genau\ndaraus entstehen Luecken und doppelte Werte in `position_order`.","operationId":"reorder_positions_api_v1_servers__server_id__applications_positions_reorder_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PositionReorderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reorder Positions Api V1 Servers  Server Id  Applications Positions Reorder Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/{application_id}/decision":{"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Decide Application","description":"Nimmt eine Bewerbung an oder lehnt sie ab. Der Bot übernimmt Embed-Update, DM und\n(bei Annahme) die Rollenvergabe.","operationId":"decide_application_api_v1_servers__server_id__applications__application_id__decision_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"application_id","in":"path","required":true,"schema":{"type":"integer","title":"Application Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationDecisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Decide Application Api V1 Servers  Server Id  Applications  Application Id  Decision Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/{application_id}/status":{"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Set Application Status","description":"Setzt eine offene Bewerbung auf 'in_review' (in Bearbeitung) oder zurück auf 'pending'.","operationId":"set_application_status_api_v1_servers__server_id__applications__application_id__status_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"application_id","in":"path","required":true,"schema":{"type":"integer","title":"Application Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Application Status Api V1 Servers  Server Id  Applications  Application Id  Status Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/{application_id}/notes":{"post":{"tags":["🖊️ Bewerbungssystem"],"summary":"Add Application Note","description":"Fügt einer Bewerbung eine interne Team-Notiz hinzu.","operationId":"add_application_note_api_v1_servers__server_id__applications__application_id__notes_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"application_id","in":"path","required":true,"schema":{"type":"integer","title":"Application Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationNoteCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Application Note Api V1 Servers  Server Id  Applications  Application Id  Notes Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/{application_id}/notes/{note_id}":{"delete":{"tags":["🖊️ Bewerbungssystem"],"summary":"Delete Application Note","description":"Löscht eine interne Team-Notiz.","operationId":"delete_application_note_api_v1_servers__server_id__applications__application_id__notes__note_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"application_id","in":"path","required":true,"schema":{"type":"integer","title":"Application Id"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Application Note Api V1 Servers  Server Id  Applications  Application Id  Notes  Note Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/applications/apply-link":{"get":{"tags":["🖊️ Bewerbungssystem"],"summary":"Get Apply Link","description":"Liefert den öffentlichen Bewerbungs-Link und den Website-/Premium-Status.","operationId":"get_apply_link_api_v1_servers__server_id__applications_apply_link_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Apply Link Api V1 Servers  Server Id  Applications Apply Link Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/categories":{"post":{"tags":["🎭 Selfroles System"],"summary":"Create Category","description":"Erstellt eine neue Selfrole-Kategorie.\n\n**Limits:**\n- Standard: 5 Kategorien\n- Premium: 12 Kategorien\n\n**Validierung:**\n- Name muss unique pro Server sein\n- max_roles muss 0-10 sein","operationId":"create_category_api_v1_servers__server_id__selfroles_categories_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["🎭 Selfroles System"],"summary":"List Categories","description":"Listet alle Selfrole-Kategorien eines Servers auf.\n\n**Cached:** 30 s (server-versioniert, Mutationen invalidieren sofort)","operationId":"list_categories_api_v1_servers__server_id__selfroles_categories_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","description":"Inaktive Kategorien einschließen?","default":false,"title":"Include Inactive"},"description":"Inaktive Kategorien einschließen?"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/categories/{category_id}":{"get":{"tags":["🎭 Selfroles System"],"summary":"Get Category","description":"Gibt Details zu einer spezifischen Kategorie zurück.\n\n**Cached:** 30 s (server-versioniert, Mutationen invalidieren sofort)","operationId":"get_category_api_v1_servers__server_id__selfroles_categories__category_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","description":"Kategorie ID","title":"Category Id"},"description":"Kategorie ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🎭 Selfroles System"],"summary":"Update Category","description":"Aktualisiert eine Selfrole-Kategorie.\n\n**Hinweis:** Nur die übergebenen Felder werden aktualisiert.","operationId":"update_category_api_v1_servers__server_id__selfroles_categories__category_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","description":"Kategorie ID","title":"Category Id"},"description":"Kategorie ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎭 Selfroles System"],"summary":"Delete Category","description":"Löscht eine Selfrole-Kategorie und alle zugehörigen Rollen.\n\n**Warnung:** Diese Aktion kann nicht rückgängig gemacht werden!","operationId":"delete_category_api_v1_servers__server_id__selfroles_categories__category_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","description":"Kategorie ID","title":"Category Id"},"description":"Kategorie ID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/categories/reorder":{"put":{"tags":["🎭 Selfroles System"],"summary":"Reorder Categories","description":"Sortiert Kategorien basierend auf der übergebenen ID-Liste neu.","operationId":"reorder_categories_api_v1_servers__server_id__selfroles_categories_reorder_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__selfroles__ReorderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/categories/{category_id}/embed":{"put":{"tags":["🎭 Selfroles System"],"summary":"Update Category Embed","description":"Aktualisiert das Embed einer Kategorie (nur bei separate_embeds_enabled).\n\n**Hinweis:** Custom Titel/Beschreibung überschreiben Standard-Felder.\nLeere Strings entfernen die Custom-Werte.","operationId":"update_category_embed_api_v1_servers__server_id__selfroles_categories__category_id__embed_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","description":"Kategorie ID","title":"Category Id"},"description":"Kategorie ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryEmbedUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/roles":{"post":{"tags":["🎭 Selfroles System"],"summary":"Create Role","description":"Fügt eine Discord-Rolle als Selfrole hinzu.\n\n**Limits:**\n- 24 Rollen pro Kategorie\n\n**Validierung:**\n- Rolle muss auf Server existieren\n- Rolle darf nicht bereits als Selfrole existieren\n- Rolle darf nicht Bot-Managed sein","operationId":"create_role_api_v1_servers__server_id__selfroles_roles_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["🎭 Selfroles System"],"summary":"List Roles","description":"Listet alle Selfroles eines Servers auf.\n\n**Cached:** 30 s (server-versioniert, Mutationen invalidieren sofort)","operationId":"list_roles_api_v1_servers__server_id__selfroles_roles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"category_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter nach Kategorie","title":"Category Id"},"description":"Filter nach Kategorie"},{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","description":"Inaktive Rollen einschließen?","default":false,"title":"Include Inactive"},"description":"Inaktive Rollen einschließen?"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/roles/{role_id}":{"get":{"tags":["🎭 Selfroles System"],"summary":"Get Role","description":"Gibt Details zu einer spezifischen Selfrole zurück.\n\n**Hinweis:** role_id ist die DB-ID, nicht die Discord Role ID!\n\n**Cached:** 30 s (server-versioniert, Mutationen invalidieren sofort)","operationId":"get_role_api_v1_servers__server_id__selfroles_roles__role_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"role_id","in":"path","required":true,"schema":{"type":"integer","description":"Selfrole Entry ID (nicht Discord Role ID!)","title":"Role Id"},"description":"Selfrole Entry ID (nicht Discord Role ID!)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🎭 Selfroles System"],"summary":"Update Role","description":"Aktualisiert eine Selfrole.\n\n**Hinweis:** Nur die übergebenen Felder werden aktualisiert.","operationId":"update_role_api_v1_servers__server_id__selfroles_roles__role_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"role_id","in":"path","required":true,"schema":{"type":"integer","description":"Selfrole Entry ID","title":"Role Id"},"description":"Selfrole Entry ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎭 Selfroles System"],"summary":"Delete Role","description":"Entfernt eine Rolle aus den Selfroles.\n\n**Hinweis:** Die Discord-Rolle selbst bleibt erhalten!","operationId":"delete_role_api_v1_servers__server_id__selfroles_roles__role_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"role_id","in":"path","required":true,"schema":{"type":"integer","description":"Selfrole Entry ID","title":"Role Id"},"description":"Selfrole Entry ID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/roles/reorder":{"put":{"tags":["🎭 Selfroles System"],"summary":"Reorder Roles","description":"Sortiert Rollen basierend auf der übergebenen ID-Liste neu.","operationId":"reorder_roles_api_v1_servers__server_id__selfroles_roles_reorder_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__selfroles__ReorderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/config":{"get":{"tags":["🎭 Selfroles System"],"summary":"Get Config","description":"Gibt die aktuelle Selfroles-Konfiguration zurück.\n\n**Cached:** 30 s (server-versioniert, Mutationen invalidieren sofort)","operationId":"get_config_api_v1_servers__server_id__selfroles_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🎭 Selfroles System"],"summary":"Update Config","description":"Aktualisiert die Selfroles-Konfiguration.\n\n**Hinweis:** Nur die übergebenen Felder werden aktualisiert.","operationId":"update_config_api_v1_servers__server_id__selfroles_config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__schemas__selfroles__ConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/config/interaction-type":{"put":{"tags":["🎭 Selfroles System"],"summary":"Update Interaction Type","description":"Ändert die Interaktionsart für Selfroles.\n\n**Typen:**\n- `select`: Select-Menüs (Standard)\n- `button`: Einzelne Buttons pro Rolle\n- `reaction`: Reaktionen unter dem Embed\n\n**Hinweis:** Bei Wechsel zu `reaction` müssen alle Rollen Emojis haben!","operationId":"update_interaction_type_api_v1_servers__server_id__selfroles_config_interaction_type_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InteractionTypeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/config/embed-mode":{"put":{"tags":["🎭 Selfroles System"],"summary":"Update Embed Mode","description":"Ändert den Embed-Modus.\n\n**Modi:**\n- `combined`: Alle Kategorien in einem Embed (Standard)\n- `separate`: Jede Kategorie bekommt ein eigenes Embed","operationId":"update_embed_mode_api_v1_servers__server_id__selfroles_config_embed_mode_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbedModeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/config/banner":{"post":{"tags":["🎭 Selfroles System"],"summary":"Upload Banner","operationId":"upload_banner_api_v1_servers__server_id__selfroles_config_banner_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_banner_api_v1_servers__server_id__selfroles_config_banner_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upload Banner Api V1 Servers  Server Id  Selfroles Config Banner Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎭 Selfroles System"],"summary":"Delete Banner","description":"Entfernt das Banner vom Selfroles-Embed.","operationId":"delete_banner_api_v1_servers__server_id__selfroles_config_banner_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/cleanup":{"post":{"tags":["🎭 Selfroles System"],"summary":"Cleanup Deleted Roles","description":"Bereinigt gelöschte Discord-Rollen aus dem Selfroles-System.\n\n**Limits:** 10x pro Stunde\n**Hinweis:** Prüft alle Rollen und entfernt nicht mehr existierende.","operationId":"cleanup_deleted_roles_api_v1_servers__server_id__selfroles_cleanup_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CleanupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/send":{"post":{"tags":["🎭 Selfroles System"],"summary":"Send Embed","description":"Sendet die Selfrole-Embeds neu.\n\n- Im 'Combined'-Modus: Sendet das Haupt-Embed.\n- Im 'Separate'-Modus: Sendet alle aktiven Kategorien in ihre konfigurierten Kanäle.","operationId":"send_embed_api_v1_servers__server_id__selfroles_send_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"channel_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Channel ID zum Senden (optional im Separate-Mode)","title":"Channel Id"},"description":"Channel ID zum Senden (optional im Separate-Mode)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/update":{"post":{"tags":["🎭 Selfroles System"],"summary":"Update Embed","description":"Aktualisiert bestehende Selfroles-Embeds (Texte, Einstellungen).\nFunktioniert für beide Modi (Combined & Separate).","operationId":"update_embed_api_v1_servers__server_id__selfroles_update_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Embed Api V1 Servers  Server Id  Selfroles Update Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/categories/{category_id}/send":{"post":{"tags":["🎭 Selfroles System"],"summary":"Send Category","description":"Sendet eine einzelne Kategorie in einen Kanal.\nVerwendet den Kategorie-Kanal oder den übergebenen Kanal.","operationId":"send_category_api_v1_servers__server_id__selfroles_categories__category_id__send_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","description":"Category ID","title":"Category Id"},"description":"Category ID"},{"name":"channel_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional Channel ID","title":"Channel Id"},"description":"Optional Channel ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/categories/{category_id}/banner":{"post":{"tags":["🎭 Selfroles System"],"summary":"Upload Category Banner","description":"Upload eines Banners für eine spezifische Kategorie","operationId":"upload_category_banner_api_v1_servers__server_id__selfroles_categories__category_id__banner_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","description":"Category ID","title":"Category Id"},"description":"Category ID"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_category_banner_api_v1_servers__server_id__selfroles_categories__category_id__banner_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎭 Selfroles System"],"summary":"Delete Category Banner","description":"Löscht das Banner einer Kategorie","operationId":"delete_category_banner_api_v1_servers__server_id__selfroles_categories__category_id__banner_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","description":"Category ID","title":"Category Id"},"description":"Category ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/categories/{category_id}/channel":{"patch":{"tags":["🎭 Selfroles System"],"summary":"Update Category Channel","description":"Setzt den Kanal für eine Kategorie","operationId":"update_category_channel_api_v1_servers__server_id__selfroles_categories__category_id__channel_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","description":"Category ID","title":"Category Id"},"description":"Category ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryChannelUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/categories/{category_id}/color":{"patch":{"tags":["🎭 Selfroles System"],"summary":"Update Category Color","description":"Setzt die Embed-Farbe für eine Kategorie","operationId":"update_category_color_api_v1_servers__server_id__selfroles_categories__category_id__color_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","description":"Category ID","title":"Category Id"},"description":"Category ID"},{"name":"color","in":"query","required":true,"schema":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","description":"Hex Color (z.B. #7289DA)","title":"Color"},"description":"Hex Color (z.B. #7289DA)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/stats":{"get":{"tags":["🎭 Selfroles System"],"summary":"Get Stats","description":"Liefert detaillierte Statistiken zum Selfroles-System zurück.\n\n**Cached:** 5 Minuten (server-versioniert, Mutationen invalidieren sofort)","operationId":"get_stats_api_v1_servers__server_id__selfroles_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelfroleStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/selfroles/logs":{"get":{"tags":["🎭 Selfroles System"],"summary":"Get Logs","description":"Gibt Logs für Selfrole-Aktivitäten zurück (paginiert).\n\n**Actions:** add_role, remove_role, category_change, etc.\n**Cached:** 1 Minute (server-versioniert, inkl. aller Filter im Key)","operationId":"get_logs_api_v1_servers__server_id__selfroles_logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Seite","default":1,"title":"Page"},"description":"Seite"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Einträge pro Seite","default":50,"title":"Limit"},"description":"Einträge pro Seite"},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter nach Action","title":"Action"},"description":"Filter nach Action"},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter nach User","title":"User Id"},"description":"Filter nach User"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/sticky-roles/config":{"get":{"tags":["📌 Sticky Roles"],"summary":"Get Config","description":"Die Konfiguration. Legt sie an, wenn es noch keine gibt.","operationId":"get_config_api_v1_servers__server_id__sticky_roles_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Config Api V1 Servers  Server Id  Sticky Roles Config Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["📌 Sticky Roles"],"summary":"Update Config","operationId":"update_config_api_v1_servers__server_id__sticky_roles_config_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__sticky_roles__ConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Config Api V1 Servers  Server Id  Sticky Roles Config Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/sticky-roles/areas":{"get":{"tags":["📌 Sticky Roles"],"summary":"List Areas","operationId":"list_areas_api_v1_servers__server_id__sticky_roles_areas_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Areas Api V1 Servers  Server Id  Sticky Roles Areas Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["📌 Sticky Roles"],"summary":"Create Area","operationId":"create_area_api_v1_servers__server_id__sticky_roles_areas_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AreaCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Area Api V1 Servers  Server Id  Sticky Roles Areas Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/sticky-roles/areas/{area_id}":{"patch":{"tags":["📌 Sticky Roles"],"summary":"Update Area","operationId":"update_area_api_v1_servers__server_id__sticky_roles_areas__area_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"area_id","in":"path","required":true,"schema":{"type":"integer","title":"Area Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AreaUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Area Api V1 Servers  Server Id  Sticky Roles Areas  Area Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📌 Sticky Roles"],"summary":"Delete Area","description":"Loescht einen Bereich samt seiner Bindungen.\n\nDie Rollen der Mitglieder bleiben, wo sie sind - geloescht wird die\nSPERRE, nicht die Zugehoerigkeit. Alles andere waere eine Massenaenderung\nan Rollen als Nebenwirkung eines Loeschklicks.","operationId":"delete_area_api_v1_servers__server_id__sticky_roles_areas__area_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"area_id","in":"path","required":true,"schema":{"type":"integer","title":"Area Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Area Api V1 Servers  Server Id  Sticky Roles Areas  Area Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/sticky-roles/areas/reorder":{"post":{"tags":["📌 Sticky Roles"],"summary":"Reorder Areas","description":"Reihenfolge setzen.\n\nNicht nur Kosmetik: bei einem Free-Server entscheidet die Reihenfolge,\nWELCHER Bereich im Kontingent liegt und damit sperrt.","operationId":"reorder_areas_api_v1_servers__server_id__sticky_roles_areas_reorder_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__sticky_roles__ReorderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reorder Areas Api V1 Servers  Server Id  Sticky Roles Areas Reorder Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/sticky-roles/snapshots":{"get":{"tags":["📌 Sticky Roles"],"summary":"List Snapshots","operationId":"list_snapshots_api_v1_servers__server_id__sticky_roles_snapshots_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"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":25,"title":"Limit"}},{"name":"state","in":"query","required":false,"schema":{"enum":["all","present","away"],"type":"string","default":"away","title":"State"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Search"}},{"name":"sort","in":"query","required":false,"schema":{"enum":["recent","roles","restores","rejoins"],"type":"string","default":"recent","title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Snapshots Api V1 Servers  Server Id  Sticky Roles Snapshots Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📌 Sticky Roles"],"summary":"Purge Snapshots","description":"Alles vergessen.\n\n`confirm` ist Pflicht, weil das nicht rueckgaengig zu machen ist: Discord\nkann nicht sagen, welche Rollen jemand hatte, der weg ist.","operationId":"purge_snapshots_api_v1_servers__server_id__sticky_roles_snapshots_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"confirm","in":"query","required":false,"schema":{"type":"boolean","description":"Muss true sein","default":false,"title":"Confirm"},"description":"Muss true sein"},{"name":"only_away","in":"query","required":false,"schema":{"type":"boolean","description":"Nur abwesende Mitglieder vergessen","default":true,"title":"Only Away"},"description":"Nur abwesende Mitglieder vergessen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Purge Snapshots Api V1 Servers  Server Id  Sticky Roles Snapshots Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/sticky-roles/snapshots/{user_id}":{"delete":{"tags":["📌 Sticky Roles"],"summary":"Delete Snapshot","operationId":"delete_snapshot_api_v1_servers__server_id__sticky_roles_snapshots__user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Snapshot Api V1 Servers  Server Id  Sticky Roles Snapshots  User Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/sticky-roles/bindings":{"get":{"tags":["📌 Sticky Roles"],"summary":"List Bindings","operationId":"list_bindings_api_v1_servers__server_id__sticky_roles_bindings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"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":25,"title":"Limit"}},{"name":"area_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Area Id"}},{"name":"role_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Id"}},{"name":"include_released","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Released"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Bindings Api V1 Servers  Server Id  Sticky Roles Bindings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["📌 Sticky Roles"],"summary":"Upsert Binding","description":"Setzt die Bindung eines Mitglieds.\n\nACHTUNG, und das steht auch im Dashboard: die ROLLE vergibt das nicht.\nDie API redet nicht mit dem Gateway. Wer die Rolle gleich mitgeben will,\nnimmt `/stickyroles assign` im Discord; hier wird nur festgehalten,\nwas gelten soll - beim naechsten Wiedereintritt greift es dann.","operationId":"upsert_binding_api_v1_servers__server_id__sticky_roles_bindings_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindingCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upsert Binding Api V1 Servers  Server Id  Sticky Roles Bindings Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/sticky-roles/bindings/{binding_id}":{"delete":{"tags":["📌 Sticky Roles"],"summary":"Release Binding","description":"Gibt eine Bindung frei - das Mitglied darf wieder waehlen.\n\nFreigeben statt loeschen: die Zeile traegt, wann gebunden wurde, wie oft\ngewechselt und wie oft dagegengelaufen. Eine geloeschte Bindung saehe aus\nwie eine, die es nie gab.","operationId":"release_binding_api_v1_servers__server_id__sticky_roles_bindings__binding_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"binding_id","in":"path","required":true,"schema":{"type":"integer","title":"Binding Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Release Binding Api V1 Servers  Server Id  Sticky Roles Bindings  Binding Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/sticky-roles/logs":{"get":{"tags":["📌 Sticky Roles"],"summary":"List Logs","operationId":"list_logs_api_v1_servers__server_id__sticky_roles_logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"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":30,"title":"Limit"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Action"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Logs Api V1 Servers  Server Id  Sticky Roles Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📌 Sticky Roles"],"summary":"Clear Logs","operationId":"clear_logs_api_v1_servers__server_id__sticky_roles_logs_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Clear Logs Api V1 Servers  Server Id  Sticky Roles Logs Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/sticky-roles/stats":{"get":{"tags":["📌 Sticky Roles"],"summary":"Get Stats","description":"Alles, was die Statistikseite braucht - in einem Zug.","operationId":"get_stats_api_v1_servers__server_id__sticky_roles_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":7,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Stats Api V1 Servers  Server Id  Sticky Roles Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/automessages":{"get":{"tags":["💭 Auto Messages"],"summary":"List Automessages","description":"Lists all AutoMessages of a server.\n\nRate Limited: 100 requests/minute\nCached: 2 minutes","operationId":"list_automessages_api_v1_servers__server_id__automessages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Automessages Api V1 Servers  Server Id  Automessages Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["💭 Auto Messages"],"summary":"Create Automessage","description":"Creates a new AutoMessage.\n\nRate Limited: 20 requests/minute\nPremium Required: Yes","operationId":"create_automessage_api_v1_servers__server_id__automessages_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoMessageCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Automessage Api V1 Servers  Server Id  Automessages Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/automessages/{message_id}":{"get":{"tags":["💭 Auto Messages"],"summary":"Get Automessage Detail","description":"Returns details of a specific AutoMessage.\n\nRate Limited: 80 requests/minute","operationId":"get_automessage_detail_api_v1_servers__server_id__automessages__message_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","description":"AutoMessage ID","title":"Message Id"},"description":"AutoMessage ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Automessage Detail Api V1 Servers  Server Id  Automessages  Message Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["💭 Auto Messages"],"summary":"Update Automessage","description":"Updates an AutoMessage.\n\nRate Limited: 30 requests/minute","operationId":"update_automessage_api_v1_servers__server_id__automessages__message_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","description":"AutoMessage ID","title":"Message Id"},"description":"AutoMessage ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoMessageUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Automessage Api V1 Servers  Server Id  Automessages  Message Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["💭 Auto Messages"],"summary":"Delete Automessage","description":"Deletes an AutoMessage.\n\nRate Limited: 20 requests/minute","operationId":"delete_automessage_api_v1_servers__server_id__automessages__message_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","description":"AutoMessage ID","title":"Message Id"},"description":"AutoMessage ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Automessage Api V1 Servers  Server Id  Automessages  Message Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/automessages/{message_id}/toggle":{"post":{"tags":["💭 Auto Messages"],"summary":"Toggle Automessage","description":"Activates/Deactivates an AutoMessage.\n\nRate Limited: 40 requests/minute","operationId":"toggle_automessage_api_v1_servers__server_id__automessages__message_id__toggle_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","description":"AutoMessage ID","title":"Message Id"},"description":"AutoMessage ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Toggle Automessage Api V1 Servers  Server Id  Automessages  Message Id  Toggle Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/automessages/{message_id}/logs":{"get":{"tags":["💭 Auto Messages"],"summary":"Get Automessage Logs","description":"Returns logs of an AutoMessage.\n\nRate Limited: 100 requests/minute\nCached: 2 minutes","operationId":"get_automessage_logs_api_v1_servers__server_id__automessages__message_id__logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","description":"AutoMessage ID","title":"Message Id"},"description":"AutoMessage ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page","default":1,"title":"Page"},"description":"Page"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Entries per page","default":20,"title":"Limit"},"description":"Entries per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Automessage Logs Api V1 Servers  Server Id  Automessages  Message Id  Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/automessage/stats":{"get":{"tags":["💭 Auto Messages"],"summary":"Get Automessage Stats","description":"Returns statistics for all AutoMessages of a server.\n\nRate Limited: 80 requests/minute\nCached: 5 minutes","operationId":"get_automessage_stats_api_v1_servers__server_id__automessage_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Automessage Stats Api V1 Servers  Server Id  Automessage Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/automessages/{message_id}/send-now":{"post":{"tags":["💭 Auto Messages"],"summary":"Send Automessage Now","description":"Sends an AutoMessage immediately (independent of schedule).\n\nRate Limited: 10 requests/minute\nIMPORTANT: Uses Redis event system - Bot must be connected!","operationId":"send_automessage_now_api_v1_servers__server_id__automessages__message_id__send_now_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"message_id","in":"path","required":true,"schema":{"type":"integer","description":"AutoMessage ID","title":"Message Id"},"description":"AutoMessage ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Send Automessage Now Api V1 Servers  Server Id  Automessages  Message Id  Send Now Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/auto-responders/limits":{"get":{"tags":["🗨️ Auto Responder"],"summary":"Get Limits","description":"Liefert die für diesen Server geltenden Limits + den aktuellen Stand.","operationId":"get_limits_api_v1_servers__server_id__auto_responders_limits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Limits Api V1 Servers  Server Id  Auto Responders Limits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/auto-responders":{"get":{"tags":["🗨️ Auto Responder"],"summary":"List Responders","operationId":"list_responders_api_v1_servers__server_id__auto_responders_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Responders Api V1 Servers  Server Id  Auto Responders Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🗨️ Auto Responder"],"summary":"Create Responder","operationId":"create_responder_api_v1_servers__server_id__auto_responders_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoResponderCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Responder Api V1 Servers  Server Id  Auto Responders Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/auto-responders/{responder_id}":{"get":{"tags":["🗨️ Auto Responder"],"summary":"Get Responder","operationId":"get_responder_api_v1_servers__server_id__auto_responders__responder_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"responder_id","in":"path","required":true,"schema":{"type":"integer","title":"Responder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Responder Api V1 Servers  Server Id  Auto Responders  Responder Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🗨️ Auto Responder"],"summary":"Update Responder","operationId":"update_responder_api_v1_servers__server_id__auto_responders__responder_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"responder_id","in":"path","required":true,"schema":{"type":"integer","title":"Responder Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoResponderUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Responder Api V1 Servers  Server Id  Auto Responders  Responder Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🗨️ Auto Responder"],"summary":"Delete Responder","operationId":"delete_responder_api_v1_servers__server_id__auto_responders__responder_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"responder_id","in":"path","required":true,"schema":{"type":"integer","title":"Responder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Responder Api V1 Servers  Server Id  Auto Responders  Responder Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/auto-responders/{responder_id}/toggle":{"post":{"tags":["🗨️ Auto Responder"],"summary":"Toggle Responder","operationId":"toggle_responder_api_v1_servers__server_id__auto_responders__responder_id__toggle_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"responder_id","in":"path","required":true,"schema":{"type":"integer","title":"Responder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Toggle Responder Api V1 Servers  Server Id  Auto Responders  Responder Id  Toggle Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/auto-responders/{responder_id}/responses":{"post":{"tags":["🗨️ Auto Responder"],"summary":"Add Response","operationId":"add_response_api_v1_servers__server_id__auto_responders__responder_id__responses_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"responder_id","in":"path","required":true,"schema":{"type":"integer","title":"Responder Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoResponderResponseCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Response Api V1 Servers  Server Id  Auto Responders  Responder Id  Responses Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/auto-responders/{responder_id}/responses/{response_id}":{"put":{"tags":["🗨️ Auto Responder"],"summary":"Update Response","operationId":"update_response_api_v1_servers__server_id__auto_responders__responder_id__responses__response_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"responder_id","in":"path","required":true,"schema":{"type":"integer","title":"Responder Id"}},{"name":"response_id","in":"path","required":true,"schema":{"type":"integer","title":"Response Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoResponderResponseUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Response Api V1 Servers  Server Id  Auto Responders  Responder Id  Responses  Response Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🗨️ Auto Responder"],"summary":"Delete Response","operationId":"delete_response_api_v1_servers__server_id__auto_responders__responder_id__responses__response_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"responder_id","in":"path","required":true,"schema":{"type":"integer","title":"Responder Id"}},{"name":"response_id","in":"path","required":true,"schema":{"type":"integer","title":"Response Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Response Api V1 Servers  Server Id  Auto Responders  Responder Id  Responses  Response Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/auto-responders/{responder_id}/responses/reorder":{"post":{"tags":["🗨️ Auto Responder"],"summary":"Reorder Responses","operationId":"reorder_responses_api_v1_servers__server_id__auto_responders__responder_id__responses_reorder_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"responder_id","in":"path","required":true,"schema":{"type":"integer","title":"Responder Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__auto_responder__ReorderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reorder Responses Api V1 Servers  Server Id  Auto Responders  Responder Id  Responses Reorder Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/auto-responders/{responder_id}/logs":{"get":{"tags":["🗨️ Auto Responder"],"summary":"List Logs","operationId":"list_logs_api_v1_servers__server_id__auto_responders__responder_id__logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"responder_id","in":"path","required":true,"schema":{"type":"integer","title":"Responder Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Logs Api V1 Servers  Server Id  Auto Responders  Responder Id  Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/automations/limits":{"get":{"tags":["⚡ Automations"],"summary":"Get Automation Limits","description":"Liefert die für diesen Server geltenden Automation-Limits + aktuellen Stand.","operationId":"get_automation_limits_api_v1_servers__server_id__automations_limits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Automation Limits Api V1 Servers  Server Id  Automations Limits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/automations":{"get":{"tags":["⚡ Automations"],"summary":"List Automations","operationId":"list_automations_api_v1_servers__server_id__automations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"enabled","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Automations Api V1 Servers  Server Id  Automations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["⚡ Automations"],"summary":"Create Automation","operationId":"create_automation_api_v1_servers__server_id__automations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Automation Api V1 Servers  Server Id  Automations Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/automations/feature/{feature_id}":{"get":{"tags":["⚡ Automations"],"summary":"List Automations For Feature","description":"Welche Automationen beruehren dieses Feature?\n\nDer Endpunkt hinter dem Abschnitt \"Automationen\" auf jeder Feature-Seite.\n\n── Warum das nicht in der Datenbank gefiltert wird ──────────────────────\n\nWeil die Zuordnung nicht in der Datenbank steht, sondern in\n`utils/automation_features.py` - und dort steht sie richtig: sie ist\nWissen ueber die Bedeutung von Ausloesern, kein Datum einer Zeile. Eine\nSpalte `feature` an der Automation waere beim naechsten neuen Ausloeser\nveraltet und muesste per Migration nachgezogen werden.\n\nDer Preis ist, dass alle Automationen des Servers gelesen werden. Bei\neinem Limit von 50 je Server ist das eine Abfrage ueber hoechstens 50\nZeilen samt Aktionen - guenstiger als der Rundlauf, den ein\nDatenbankfilter sparen wuerde.\n\nGibt zusaetzlich `vorschlag` zurueck: den Ausloeser, mit dem der Knopf\n\"Automation hierfuer anlegen\" den Erstellweg vorbelegt. Ohne ihn stuende\nman dort wieder vor der vollen Ausloeserliste und haette den Umweg ueber\ndie Feature-Seite umsonst gemacht.","operationId":"list_automations_for_feature_api_v1_servers__server_id__automations_feature__feature_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"feature_id","in":"path","required":true,"schema":{"type":"string","maxLength":64,"title":"Feature Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Automations For Feature Api V1 Servers  Server Id  Automations Feature  Feature Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/automations/{automation_id}":{"get":{"tags":["⚡ Automations"],"summary":"Get Automation","operationId":"get_automation_api_v1_servers__server_id__automations__automation_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"automation_id","in":"path","required":true,"schema":{"type":"integer","title":"Automation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Automation Api V1 Servers  Server Id  Automations  Automation Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["⚡ Automations"],"summary":"Update Automation","operationId":"update_automation_api_v1_servers__server_id__automations__automation_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"automation_id","in":"path","required":true,"schema":{"type":"integer","title":"Automation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Automation Api V1 Servers  Server Id  Automations  Automation Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["⚡ Automations"],"summary":"Delete Automation","operationId":"delete_automation_api_v1_servers__server_id__automations__automation_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"automation_id","in":"path","required":true,"schema":{"type":"integer","title":"Automation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Automation Api V1 Servers  Server Id  Automations  Automation Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/automations/{automation_id}/toggle":{"post":{"tags":["⚡ Automations"],"summary":"Toggle Automation","operationId":"toggle_automation_api_v1_servers__server_id__automations__automation_id__toggle_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"automation_id","in":"path","required":true,"schema":{"type":"integer","title":"Automation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Toggle Automation Api V1 Servers  Server Id  Automations  Automation Id  Toggle Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/automations/{automation_id}/duplicate":{"post":{"tags":["⚡ Automations"],"summary":"Duplicate Automation","operationId":"duplicate_automation_api_v1_servers__server_id__automations__automation_id__duplicate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"automation_id","in":"path","required":true,"schema":{"type":"integer","title":"Automation Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Duplicate Automation Api V1 Servers  Server Id  Automations  Automation Id  Duplicate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/automations/{automation_id}/logs":{"get":{"tags":["⚡ Automations"],"summary":"Get Automation Logs","operationId":"get_automation_logs_api_v1_servers__server_id__automations__automation_id__logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"automation_id","in":"path","required":true,"schema":{"type":"integer","title":"Automation Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Automation Logs Api V1 Servers  Server Id  Automations  Automation Id  Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payment/verify-latest":{"get":{"tags":["💫 Premium"],"summary":"Verify Latest Transaction","description":"PLAN B: Prüft die letzte Transaktion des Users direkt bei Paddle.\nErlaubt Zugriff, wenn eine erfolgreiche Zahlung in den letzten 10 Minuten stattfand.","operationId":"verify_latest_transaction_api_v1_payment_verify_latest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Verify Latest Transaction Api V1 Payment Verify Latest Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/payment/verify-transaction/{checkout_id}":{"get":{"tags":["💫 Premium"],"summary":"Verify Paddle Transaction","description":"Validiert eine Paddle-Transaktion serverseitig.\nVerhindert, dass User die Success-Page ohne Kauf aufrufen.","operationId":"verify_paddle_transaction_api_v1_payment_verify_transaction__checkout_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"checkout_id","in":"path","required":true,"schema":{"type":"string","description":"Paddle Checkout ID","title":"Checkout Id"},"description":"Paddle Checkout ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Verify Paddle Transaction Api V1 Payment Verify Transaction  Checkout Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/premium":{"get":{"tags":["💫 Premium"],"summary":"Get Server Premium Status","description":"Gibt zurück, ob ein Server Premium ist.\n\nLEGACY ENDPOINT - Nutzt neue Premium-Logik aber behält alte Response-Struktur.\nRate Limited: 80 requests/minute\n\nPerformance: Die vier DB-Zugriffe laufen parallel statt sequenziell\n(~4 Round-Trips → 1). is_server_premium ist zusätzlich im PremiumManager\ngecacht (mit korrekter Invalidierung bei jedem Premium-Write), daher kein\nzweiter, potenziell stale werdender Response-Cache auf Endpoint-Ebene.","operationId":"get_server_premium_status_api_v1_servers__server_id__premium_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Server Premium Status Api V1 Servers  Server Id  Premium Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/premium/details":{"get":{"tags":["💫 Premium"],"summary":"Get Server Premium Details","description":"Gibt erweiterte Premium-Informationen für einen Server zurück.\n\nEnthält:\n- Premium-Status\n- Beta-Status\n- Aktiviert durch User\n- Ablaufdatum\n- Quelle","operationId":"get_server_premium_details_api_v1_servers__server_id__premium_details_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Server Premium Details Api V1 Servers  Server Id  Premium Details Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/premium":{"get":{"tags":["💫 Premium"],"summary":"Get User Premium Status","description":"Gibt Premium-Status eines Users zurück.\n\nUser kann nur eigenen Status abfragen (außer Bot-Owner).","operationId":"get_user_premium_status_api_v1_users__user_id__premium_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get User Premium Status Api V1 Users  User Id  Premium Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/premium/info":{"get":{"tags":["💫 Premium"],"summary":"Get User Premium Info","description":"Gibt vollständige Premium-Informationen für einen User zurück.\n\nEnthält User-Premium und optional Server-Premium/Beta falls server_id angegeben.","operationId":"get_user_premium_info_api_v1_users__user_id__premium_info_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"server_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional: Include server-specific info","title":"Server Id"},"description":"Optional: Include server-specific info"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get User Premium Info Api V1 Users  User Id  Premium Info Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/premium/switch":{"post":{"tags":["💫 Premium"],"summary":"Switch Premium Server","description":"Aktiviert Premium für einen Server (oder wechselt zu neuem Server).\n\nUser kann nur eigenen Premium-Server wechseln.\nMaximal 5 Wechsel pro Monat.","operationId":"switch_premium_server_api_v1_users__user_id__premium_switch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"},"example":{"server_id":"123456789","reason":"Optional reason"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Switch Premium Server Api V1 Users  User Id  Premium Switch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/premium/deactivate":{"post":{"tags":["💫 Premium"],"summary":"Deactivate Premium Server","description":"Deaktiviert den aktuell aktivierten Premium-Server eines Users.\n\nWICHTIG: User kann nur Server deaktivieren die ER aktiviert hat!","operationId":"deactivate_premium_server_api_v1_users__user_id__premium_deactivate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Deactivate Premium Server Api V1 Users  User Id  Premium Deactivate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/premium/switches":{"get":{"tags":["💫 Premium"],"summary":"Get Switch History","description":"Gibt die Server-Wechsel-Historie eines Users zurück.","operationId":"get_switch_history_api_v1_users__user_id__premium_switches_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Number of entries","default":10,"title":"Limit"},"description":"Number of entries"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Switch History Api V1 Users  User Id  Premium Switches Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/premium/user/grant":{"post":{"tags":["💫 Premium"],"summary":"Admin Grant User Premium","description":"[ADMIN ONLY] Vergibt Premium an einen User.","operationId":"admin_grant_user_premium_api_v1_admin_premium_user_grant_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"},"example":{"user_id":"123456789","duration_days":30,"premium_type":"standard","reason":"Event winner"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Grant User Premium Api V1 Admin Premium User Grant Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/premium/user/revoke":{"post":{"tags":["💫 Premium"],"summary":"Admin Revoke User Premium","description":"[ADMIN ONLY] Entzieht einem User das Premium.","operationId":"admin_revoke_user_premium_api_v1_admin_premium_user_revoke_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"},"example":{"user_id":"123456789"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Revoke User Premium Api V1 Admin Premium User Revoke Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/premium/server/grant":{"post":{"tags":["💫 Premium"],"summary":"Admin Grant Server Premium","description":"[ADMIN ONLY] Vergibt Premium an einen Server (Admin-Grant).","operationId":"admin_grant_server_premium_api_v1_admin_premium_server_grant_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"},"example":{"server_id":"123456789","duration_days":30,"reason":"Partner server"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Grant Server Premium Api V1 Admin Premium Server Grant Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/premium/server/revoke":{"post":{"tags":["💫 Premium"],"summary":"Admin Revoke Server Premium","description":"[ADMIN ONLY] Entzieht einem Server das Premium.","operationId":"admin_revoke_server_premium_api_v1_admin_premium_server_revoke_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"},"example":{"server_id":"123456789"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Revoke Server Premium Api V1 Admin Premium Server Revoke Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/beta/server/grant":{"post":{"tags":["💫 Premium"],"summary":"Admin Grant Server Beta","description":"[ADMIN ONLY] Vergibt Beta-Status an einen Server.","operationId":"admin_grant_server_beta_api_v1_admin_beta_server_grant_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"},"example":{"server_id":"123456789","duration_days":60,"reason":"Beta tester","features":["feature1","feature2"]}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Grant Server Beta Api V1 Admin Beta Server Grant Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/beta/server/revoke":{"post":{"tags":["💫 Premium"],"summary":"Admin Revoke Server Beta","description":"[ADMIN ONLY] Entzieht einem Server den Beta-Status.","operationId":"admin_revoke_server_beta_api_v1_admin_beta_server_revoke_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"},"example":{"server_id":"123456789"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Revoke Server Beta Api V1 Admin Beta Server Revoke Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/premium/stats":{"get":{"tags":["💫 Premium"],"summary":"Get Premium Stats","description":"[ADMIN ONLY] Gibt Statistiken über Premium & Beta zurück.","operationId":"get_premium_stats_api_v1_admin_premium_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Premium Stats Api V1 Admin Premium Stats Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/{user_id}/pro":{"get":{"tags":["💫 Premium"],"summary":"Get User Pro Status","description":"Gibt den globalen Pro-Plan-Status eines Users zurück.\nUser kann nur eigenen Status abfragen (außer Bot-Owner).","operationId":"get_user_pro_status_api_v1_users__user_id__pro_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get User Pro Status Api V1 Users  User Id  Pro Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/pro/customization":{"get":{"tags":["💫 Premium"],"summary":"Get Pro Customization","description":"[PRO-PLAN ERFORDERLICH]\nRuft die globalen Anpassungs-Einstellungen für einen Pro-User ab.","operationId":"get_pro_customization_api_v1_users__user_id__pro_customization_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProCustomizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["💫 Premium"],"summary":"Update Pro Customization","description":"[PRO-PLAN ERFORDERLICH]\nAktualisiert die globalen Anpassungs-Einstellungen (Blur, Darken, Boni).\nHINWEIS: Dieser Endpunkt aktualisiert NICHT das Base64-Bild.","operationId":"update_pro_customization_api_v1_users__user_id__pro_customization_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProCustomizationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProCustomizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/pro/customization/background":{"put":{"tags":["💫 Premium"],"summary":"Update Pro Background","description":"[PRO-PLAN ERFORDERLICH]\nLädt ein neues globales Hintergrundbild (Base64) hoch.","operationId":"update_pro_background_api_v1_users__user_id__pro_customization_background_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProBackgroundUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProCustomizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["💫 Premium"],"summary":"Delete Pro Background","description":"[PRO-PLAN ERFORDERLICH]\nEntfernt das globale Hintergrundbild eines Pro-Users.","operationId":"delete_pro_background_api_v1_users__user_id__pro_customization_background_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProCustomizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/pro/customization/mybackground":{"put":{"tags":["💫 Premium"],"summary":"Update Mybackground","description":"[PRO-PLAN ERFORDERLICH]\nLädt ein neues /mybackground Hintergrundbild (Base64) hoch.","operationId":"update_mybackground_api_v1_users__user_id__pro_customization_mybackground_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyBackgroundUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProCustomizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["💫 Premium"],"summary":"Delete Mybackground","description":"[PRO-PLAN ERFORDERLICH]\nEntfernt das /mybackground Hintergrundbild eines Pro-Users.","operationId":"delete_mybackground_api_v1_users__user_id__pro_customization_mybackground_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProCustomizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/premium/customization":{"get":{"tags":["💫 Premium"],"summary":"Get Server Customization","description":"[PREMIUM SERVER] Ruft die Anpassungs-Einstellungen für einen Server ab.","operationId":"get_server_customization_api_v1_servers__server_id__premium_customization_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Server Customization Api V1 Servers  Server Id  Premium Customization Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["💫 Premium"],"summary":"Update Server Customization","description":"[PREMIUM SERVER] Aktualisiert Blur und Darken für den Server.","operationId":"update_server_customization_api_v1_servers__server_id__premium_customization_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerCustomizationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Server Customization Api V1 Servers  Server Id  Premium Customization Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/premium/customization/background":{"put":{"tags":["💫 Premium"],"summary":"Update Server Background","description":"[PREMIUM SERVER] Lädt ein neues Server-Hintergrundbild (Base64) hoch.","operationId":"update_server_background_api_v1_servers__server_id__premium_customization_background_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerBackgroundUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Server Background Api V1 Servers  Server Id  Premium Customization Background Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["💫 Premium"],"summary":"Delete Server Background","description":"[PREMIUM SERVER] Entfernt das Server-Hintergrundbild.","operationId":"delete_server_background_api_v1_servers__server_id__premium_customization_background_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Server Background Api V1 Servers  Server Id  Premium Customization Background Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pro/user/grant":{"post":{"tags":["💫 Premium"],"summary":"Admin Grant User Pro","description":"[ADMIN ONLY] Vergibt den globalen Pro-Plan an einen User.","operationId":"admin_grant_user_pro_api_v1_admin_pro_user_grant_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"},"example":{"user_id":"123456789","duration_days":30,"plan_type":"standard","reason":"Monatliches Abo"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Grant User Pro Api V1 Admin Pro User Grant Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/{user_id}/ai":{"get":{"tags":["💫 Premium"],"summary":"Get User Ai Status","description":"Gibt den AI-Abo-Status eines Users zurück inkl. Tier, Ablaufdatum, Switch-Info und Limits.\nUser kann nur eigenen Status abfragen (außer Bot-Owner).","operationId":"get_user_ai_status_api_v1_users__user_id__ai_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get User Ai Status Api V1 Users  User Id  Ai Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/ai/usage":{"get":{"tags":["💫 Premium"],"summary":"Get User Ai Usage Endpoint","description":"Gibt die aktuelle AI-Nutzung eines Users zurück (maßgeblich für Limit-Durchsetzung).\nEnthält Anfragen, Zeichen, verbleibende Limits und Feature-Breakdown.","operationId":"get_user_ai_usage_endpoint_api_v1_users__user_id__ai_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get User Ai Usage Endpoint Api V1 Users  User Id  Ai Usage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/ai/activate":{"post":{"tags":["💫 Premium"],"summary":"Activate Ai Server Endpoint","description":"Aktiviert AI für einen Server. Ein User kann bis zu 20 Server gleichzeitig aktivieren.\nKein Switch-Limit — beliebig oft aktivieren/deaktivieren möglich.","operationId":"activate_ai_server_endpoint_api_v1_users__user_id__ai_activate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIActivateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Activate Ai Server Endpoint Api V1 Users  User Id  Ai Activate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/ai/switch":{"post":{"tags":["💫 Premium"],"summary":"Switch Ai Server Endpoint","description":"[LEGACY] Aktiviert AI für einen weiteren Server. Kein Switch-Token mehr nötig.\nEntspricht jetzt /ai/activate. Bleibt für Rückwärtskompatibilität erhalten.","operationId":"switch_ai_server_endpoint_api_v1_users__user_id__ai_switch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIActivateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Switch Ai Server Endpoint Api V1 Users  User Id  Ai Switch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/ai/deactivate":{"post":{"tags":["💫 Premium"],"summary":"Deactivate Ai Server Endpoint","description":"Deaktiviert AI-Server eines Users.\n- Ohne server_id im Body: Deaktiviert ALLE aktiven AI-Server des Users.\n- Mit server_id im Body: Deaktiviert nur diesen spezifischen Server.\n\nDadurch kann ein anderer User den Server anschließend aktivieren.","operationId":"deactivate_ai_server_endpoint_api_v1_users__user_id__ai_deactivate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIDeactivateBody","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Deactivate Ai Server Endpoint Api V1 Users  User Id  Ai Deactivate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/ai/deactivate-all":{"post":{"tags":["💫 Premium"],"summary":"Deactivate All Ai Servers Endpoint","description":"Deaktiviert ALLE aktiven AI-Server eines Users auf einmal.\nDanach können andere User diese Server mit ihrem AI-Abo aktivieren.","operationId":"deactivate_all_ai_servers_endpoint_api_v1_users__user_id__ai_deactivate_all_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Deactivate All Ai Servers Endpoint Api V1 Users  User Id  Ai Deactivate All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ai":{"get":{"tags":["💫 Premium"],"summary":"Get Server Ai Status","description":"Gibt den AI-Status eines Servers zurück inkl. Tier, Quelle, Limits und Nutzung.\n\nWICHTIG: Die Limits stammen vom User der das AI-Abo besitzt und den Server aktiviert hat,\nnicht vom Server selbst. Das verhindert Limit-Umgehung durch Server-Wechsel.\nDas Server-Limit IST das Limit des aktivierenden Users.","operationId":"get_server_ai_status_api_v1_servers__server_id__ai_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Server Ai Status Api V1 Servers  Server Id  Ai Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ai/usage":{"get":{"tags":["💫 Premium"],"summary":"Get Server Ai Usage Endpoint","description":"Gibt detaillierte AI-Nutzungsdaten für einen Server zurück.\nWICHTIG: Limits basieren auf dem User der das AI-Abo besitzt (nicht dem Server).\nServer-Stats sind rein informativ für Feature-Breakdown.","operationId":"get_server_ai_usage_endpoint_api_v1_servers__server_id__ai_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Server Ai Usage Endpoint Api V1 Servers  Server Id  Ai Usage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/ai/custom-key":{"get":{"tags":["💫 Premium"],"summary":"Get Custom Gemini Key","description":"Gibt den gesetzten benutzerdefinierten Gemini API Key zurück (maskiert).\nAus Sicherheitsgründen werden nur die ersten 8 und letzten 4 Zeichen angezeigt.\nNur für Custom-Tier Nutzer (Tier 4) verfügbar.","operationId":"get_custom_gemini_key_api_v1_users__user_id__ai_custom_key_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Custom Gemini Key Api V1 Users  User Id  Ai Custom Key Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["💫 Premium"],"summary":"Set Custom Gemini Key","description":"Setzt oder aktualisiert den benutzerdefinierten Gemini API Key.\nNur für Custom-Tier Nutzer (Tier 4) verfügbar.\nNach dem Setzen wird der Key nur noch maskiert zurückgegeben.","operationId":"set_custom_gemini_key_api_v1_users__user_id__ai_custom_key_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomGeminiKeyBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Custom Gemini Key Api V1 Users  User Id  Ai Custom Key Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["💫 Premium"],"summary":"Delete Custom Gemini Key","description":"Entfernt den benutzerdefinierten Gemini API Key.\nDanach kann keine KI mehr verwendet werden, bis ein neuer Key gesetzt wird.","operationId":"delete_custom_gemini_key_api_v1_users__user_id__ai_custom_key_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Custom Gemini Key Api V1 Users  User Id  Ai Custom Key Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/ai/custom-limits":{"get":{"tags":["💫 Premium"],"summary":"Get Custom Ai Limits","description":"Gibt die benutzerdefinierten AI-Limits eines Custom-Tier Nutzers zurück.\nZeigt auch die aktuellen Standardwerte an, falls keine eigenen Limits gesetzt sind.","operationId":"get_custom_ai_limits_api_v1_users__user_id__ai_custom_limits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Custom Ai Limits Api V1 Users  User Id  Ai Custom Limits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["💫 Premium"],"summary":"Set Custom Ai Limits","description":"Setzt benutzerdefinierte monatliche AI-Limits für Custom-Tier Nutzer (Tier 4).\nDa der Nutzer seinen eigenen Gemini API Key verwendet, kann er die Limits selbst steuern.\nBeide Felder sind optional - nur übermittelte Felder werden aktualisiert.","operationId":"set_custom_ai_limits_api_v1_users__user_id__ai_custom_limits_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomAILimitsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Custom Ai Limits Api V1 Users  User Id  Ai Custom Limits Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/ai/providers":{"get":{"tags":["💫 Premium"],"summary":"Get Ai Providers","description":"Provider-Katalog + konfigurierte Keys (maskiert) + Fallback-Reihenfolge.","operationId":"get_ai_providers_api_v1_users__user_id__ai_providers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ai Providers Api V1 Users  User Id  Ai Providers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/ai/providers/order":{"put":{"tags":["💫 Premium"],"summary":"Set Ai Provider Order","description":"Setzt die Fallback-Reihenfolge der Provider (primär -> sekundär -> ...).","operationId":"set_ai_provider_order_api_v1_users__user_id__ai_providers_order_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIProviderOrderBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Ai Provider Order Api V1 Users  User Id  Ai Providers Order Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/ai/providers/{provider}":{"put":{"tags":["💫 Premium"],"summary":"Set Ai Provider Key","description":"Setzt/aktualisiert den API-Key eines Providers (nur Tier 4).","operationId":"set_ai_provider_key_api_v1_users__user_id__ai_providers__provider__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"provider","in":"path","required":true,"schema":{"type":"string","description":"Provider-ID (gemini/anthropic/openai)","title":"Provider"},"description":"Provider-ID (gemini/anthropic/openai)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIProviderKeyBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Ai Provider Key Api V1 Users  User Id  Ai Providers  Provider  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["💫 Premium"],"summary":"Delete Ai Provider Key","description":"Entfernt den API-Key eines Providers.","operationId":"delete_ai_provider_key_api_v1_users__user_id__ai_providers__provider__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"provider","in":"path","required":true,"schema":{"type":"string","description":"Provider-ID (gemini/anthropic/openai)","title":"Provider"},"description":"Provider-ID (gemini/anthropic/openai)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Ai Provider Key Api V1 Users  User Id  Ai Providers  Provider  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/ai/user/grant":{"post":{"tags":["💫 Premium"],"summary":"Admin Grant User Ai","description":"[ADMIN ONLY] Vergibt ein AI-Abo an einen User.","operationId":"admin_grant_user_ai_api_v1_admin_ai_user_grant_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminGrantAIBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Grant User Ai Api V1 Admin Ai User Grant Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/ai/user/revoke":{"post":{"tags":["💫 Premium"],"summary":"Admin Revoke User Ai","description":"[ADMIN ONLY] Entzieht einem User das AI-Abo (und deaktiviert ggf. den Server).","operationId":"admin_revoke_user_ai_api_v1_admin_ai_user_revoke_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"},"example":{"user_id":"123456789"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Revoke User Ai Api V1 Admin Ai User Revoke Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/ai/user/tier":{"post":{"tags":["💫 Premium"],"summary":"Admin Set User Ai Tier","description":"[ADMIN ONLY] Ändert den AI-Tier eines Users (1, 2 oder 3).\nGilt auch sofort für den aktiven Server des Users.","operationId":"admin_set_user_ai_tier_api_v1_admin_ai_user_tier_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSetAITierBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Set User Ai Tier Api V1 Admin Ai User Tier Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/ai/server/grant":{"post":{"tags":["💫 Premium"],"summary":"Admin Grant Server Ai","description":"[ADMIN ONLY] Vergibt AI direkt an einen Server (Admin-Grant, unabhängig von User-Abo).\nDer Server hat eigene AI-Kapazität ohne User-Limit-Verknüpfung.","operationId":"admin_grant_server_ai_api_v1_admin_ai_server_grant_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminGrantAIServerBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Grant Server Ai Api V1 Admin Ai Server Grant Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/ai/server/revoke":{"post":{"tags":["💫 Premium"],"summary":"Admin Revoke Server Ai","description":"[ADMIN ONLY] Entzieht einem Server das AI-Abo.","operationId":"admin_revoke_server_ai_api_v1_admin_ai_server_revoke_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"},"example":{"server_id":"123456789"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Revoke Server Ai Api V1 Admin Ai Server Revoke Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/ai/stats":{"get":{"tags":["💫 Premium"],"summary":"Get Ai Stats","description":"[ADMIN ONLY] Gibt Statistiken über AI-Abos und Nutzung zurück.","operationId":"get_ai_stats_api_v1_admin_ai_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Ai Stats Api V1 Admin Ai Stats Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/topgg/vote":{"post":{"tags":["💫 Premium"],"summary":"Topgg Vote Webhook","description":"Webhook Endpoint für Top.gg Votes.\nWird von Top.gg aufgerufen wenn jemand votet.\n\nBody Format von Top.gg:\n{\n    \"bot\": \"BOT_ID\",\n    \"user\": \"USER_ID\",\n    \"type\": \"upvote\",\n    \"isWeekend\": true/false,\n    \"query\": \"optional_query_string\"\n}","operationId":"topgg_vote_webhook_api_v1_topgg_vote_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Topgg Vote Webhook Api V1 Topgg Vote Post"}}}}}}},"/api/v1/topgg/vote-secure":{"post":{"tags":["💫 Premium"],"summary":"Topgg Vote Webhook Secure","description":"Sicherer Webhook Endpoint mit HMAC Signature Verification.\nVerwende diesen wenn Top.gg Signatures unterstützt.","operationId":"topgg_vote_webhook_secure_api_v1_topgg_vote_secure_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Topgg Vote Webhook Secure Api V1 Topgg Vote Secure Post"}}}}}}},"/api/v1/users/{user_id}/premium/trial":{"post":{"tags":["💫 Premium"],"summary":"Activate Premium Trial","description":"Aktiviert ein einmaliges 7-Tage Probe-Abo für Premium (Standard).\nVoraussetzungen:\n1. User hat aktuell kein aktives Premium.\n2. User hat das Probe-Abo noch nie genutzt.","operationId":"activate_premium_trial_api_v1_users__user_id__premium_trial_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Activate Premium Trial Api V1 Users  User Id  Premium Trial Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/settings/language":{"get":{"tags":["💫 Premium"],"summary":"Get User Language Setting","description":"Ruft die eingestellte Sprache des Users ab.","operationId":"get_user_language_setting_api_v1_users__user_id__settings_language_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get User Language Setting Api V1 Users  User Id  Settings Language Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["💫 Premium"],"summary":"Set User Language","description":"Ändert die bevorzugte Sprache für einen User.","operationId":"set_user_language_api_v1_users__user_id__settings_language_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageUpdate"},"example":{"language":"de"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set User Language Api V1 Users  User Id  Settings Language Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/settings/language":{"get":{"tags":["💫 Premium"],"summary":"Get Server Language Setting","description":"Ruft die eingestellte Sprache des Servers ab.","operationId":"get_server_language_setting_api_v1_servers__server_id__settings_language_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Server Language Setting Api V1 Servers  Server Id  Settings Language Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["💫 Premium"],"summary":"Set Server Language","description":"Ändert die Sprache für einen Server.\nErfordert Admin-Rechte auf dem Server.","operationId":"set_server_language_api_v1_servers__server_id__settings_language_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageUpdate"},"example":{"language":"de"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Server Language Api V1 Servers  Server Id  Settings Language Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ghostping/config":{"get":{"tags":["👻 Anti Ghostping"],"summary":"Get Ghostping Config","description":"Returns the current Anti-Ghost-Ping configuration.\n\nRate Limited: 80 requests/minute\nCached: 1 minute","operationId":"get_ghostping_config_api_v1_servers__server_id__ghostping_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GhostPingConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["👻 Anti Ghostping"],"summary":"Update Ghostping Config","description":"Updates the Anti-Ghost-Ping configuration.\n\nOnly basic settings can be changed:\n- is_enabled: Enable/disable system\n- notification_mode: dm, channel, or both\n- log_channel_id: Channel for logs (null to remove)\n\nRate Limited: 30 requests/minute","operationId":"update_ghostping_config_api_v1_servers__server_id__ghostping_config_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GhostPingConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ghostping/logs":{"get":{"tags":["👻 Anti Ghostping"],"summary":"Get Ghostping Logs","description":"Returns a paginated list of all Ghost Ping logs.\n\nRate Limited: 60 requests/minute\nCached: 1 minute","operationId":"get_ghostping_logs_api_v1_servers__server_id__ghostping_logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page (starts at 1)","default":1,"title":"Page"},"description":"Page (starts at 1)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Entries per page","default":50,"title":"Limit"},"description":"Entries per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GhostPingLogsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["👻 Anti Ghostping"],"summary":"Clear All Ghostping Logs","description":"Deletes all Ghost Ping logs for a server.\n\nOptional: Only delete logs older than X days.\n\nRate Limited: 30 requests/minute","operationId":"clear_all_ghostping_logs_api_v1_servers__server_id__ghostping_logs_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"older_than_days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Only delete logs older than X days","title":"Older Than Days"},"description":"Only delete logs older than X days"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ghostping/stats":{"get":{"tags":["👻 Anti Ghostping"],"summary":"Get Ghostping Stats","description":"Returns statistics about Ghost Pings.\n\nContains:\n- Total ghost pings\n- Ghost pings from last 7/30 days\n- Top ghost-pingers\n- Timeline of last 30 days\n\nRate Limited: 80 requests/minute\nCached: 5 minutes","operationId":"get_ghostping_stats_api_v1_servers__server_id__ghostping_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GhostPingStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ghostping/whitelist":{"get":{"tags":["👻 Anti Ghostping"],"summary":"Get Ghostping Whitelist","description":"Returns the Anti-Ghost-Ping whitelist.\n\nOptionally filterable by type (user, role, channel).\n\nRate Limited: 80 requests/minute\nCached: 5 minutes","operationId":"get_ghostping_whitelist_api_v1_servers__server_id__ghostping_whitelist_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"whitelist_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["user","role","channel"],"type":"string"},{"type":"null"}],"description":"Filter by type","title":"Whitelist Type"},"description":"Filter by type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhitelistResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["👻 Anti Ghostping"],"summary":"Add To Ghostping Whitelist","description":"Adds an entry to the Ghost Ping whitelist.\n\nRate Limited: 30 requests/minute","operationId":"add_to_ghostping_whitelist_api_v1_servers__server_id__ghostping_whitelist_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__ghostping__WhitelistAddRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ghostping/whitelist/{entry_id}":{"delete":{"tags":["👻 Anti Ghostping"],"summary":"Remove From Ghostping Whitelist","description":"Removes an entry from the Ghost Ping whitelist.\n\nRate Limited: 30 requests/minute","operationId":"remove_from_ghostping_whitelist_api_v1_servers__server_id__ghostping_whitelist__entry_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","description":"Whitelist Entry ID","title":"Entry Id"},"description":"Whitelist Entry ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ghostping/logs/{log_id}":{"delete":{"tags":["👻 Anti Ghostping"],"summary":"Delete Ghostping Log","description":"Deletes a single Ghost Ping log entry.\n\nRate Limited: 30 requests/minute","operationId":"delete_ghostping_log_api_v1_servers__server_id__ghostping_logs__log_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"log_id","in":"path","required":true,"schema":{"type":"integer","description":"Ghost Ping Log ID","title":"Log Id"},"description":"Ghost Ping Log ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/voice-stats":{"get":{"tags":["🔉 Voice Stats Settings"],"summary":"Get Voice Stats Channels","description":"Returns all Voice Stats Channels for a server.\n\nRate Limited: 100 requests/minute\nCached: 3 minutes","operationId":"get_voice_stats_channels_api_v1_servers__server_id__voice_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceStatsChannelListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🔉 Voice Stats Settings"],"summary":"Create Voice Stats Channel","description":"Creates a new Voice Stats Channel.\n\nIf no channel_id is provided, the bot will automatically create a new Voice Channel.\n\nRate Limited: 30 requests/minute","operationId":"create_voice_stats_channel_api_v1_servers__server_id__voice_stats_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceStatsChannelCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceStatsChannelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/voice-stats/{channel_id}":{"get":{"tags":["🔉 Voice Stats Settings"],"summary":"Get Voice Stats Channel","description":"Returns details for a specific Voice Stats Channel.\n\nRate Limited: 80 requests/minute","operationId":"get_voice_stats_channel_api_v1_servers__server_id__voice_stats__channel_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"channel_id","in":"path","required":true,"schema":{"type":"integer","description":"Voice Stats Channel Database ID","title":"Channel Id"},"description":"Voice Stats Channel Database ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceStatsChannelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["🔉 Voice Stats Settings"],"summary":"Update Voice Stats Channel","description":"Updates the configuration of a Voice Stats Channel.\n\nRate Limited: 30 requests/minute","operationId":"update_voice_stats_channel_api_v1_servers__server_id__voice_stats__channel_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"channel_id","in":"path","required":true,"schema":{"type":"integer","description":"Voice Stats Channel Database ID","title":"Channel Id"},"description":"Voice Stats Channel Database ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceStatsChannelUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceStatsChannelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🔉 Voice Stats Settings"],"summary":"Delete Voice Stats Channel","description":"Deletes a Voice Stats Channel from the configuration.\n\nThe Discord Voice Channel will NOT be deleted, only the stats configuration.\n\nRate Limited: 30 requests/minute","operationId":"delete_voice_stats_channel_api_v1_servers__server_id__voice_stats__channel_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"channel_id","in":"path","required":true,"schema":{"type":"integer","description":"Voice Stats Channel Database ID","title":"Channel Id"},"description":"Voice Stats Channel Database ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/voice-stats/available-types":{"get":{"tags":["🔉 Voice Stats Settings"],"summary":"Get Available Stats Types","description":"Returns all available stats types.\n\nRate Limited: 100 requests/minute\nCached: 10 minutes (rarely changes)","operationId":"get_available_stats_types_api_v1_voice_stats_available_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableStatsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/servers/{server_id}/voice-stats/force-update":{"post":{"tags":["🔉 Voice Stats Settings"],"summary":"Force Update Voice Stats","description":"Forces an immediate update of all active Voice Stats Channels.\n\nRate Limited: 30 requests/minute","operationId":"force_update_voice_stats_api_v1_servers__server_id__voice_stats_force_update_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceStatsForceUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/starboard/setup":{"post":{"tags":["⭐ Starboard"],"summary":"Setup Starboard","description":"Sets up the starboard system.\n\nRate Limited: 80 requests/minute","operationId":"setup_starboard_api_v1_servers__server_id__starboard_setup_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StarboardSetupRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/starboard/hall-of-fame/setup":{"post":{"tags":["⭐ Starboard"],"summary":"Setup Hall Of Fame","description":"Sets up the Hall of Fame.\n\nRate Limited: 80 requests/minute","operationId":"setup_hall_of_fame_api_v1_servers__server_id__starboard_hall_of_fame_setup_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HallOfFameSetupRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/starboard/settings":{"get":{"tags":["⭐ Starboard"],"summary":"Get Starboard Settings","description":"Returns the current starboard settings.\n\nRate Limited: 80 requests/minute\nNO Caching (settings can change at any time)","operationId":"get_starboard_settings_api_v1_servers__server_id__starboard_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StarboardConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["⭐ Starboard"],"summary":"Update Settings","description":"Updates various starboard settings.\n\n``hall_of_fame_enabled`` gehoert hierher und nicht nach\n``/hall-of-fame/setup``: der Setup-Endpunkt setzt das Flag fest auf True\n(Zeile 203). Solange es hier fehlte, gab es KEINEN Weg, die Hall of Fame\nwieder abzuschalten - der Schalter im Dashboard schickte den Wert mit,\ndie Signatur nahm ihn nicht entgegen, und das naechste Speichern schaltete\nsie ueber den Setup-Aufruf ohnehin wieder ein.\n\nRate Limited: 80 requests/minute","operationId":"update_settings_api_v1_servers__server_id__starboard_settings_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_settings_api_v1_servers__server_id__starboard_settings_patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/starboard/toggle":{"patch":{"tags":["⭐ Starboard"],"summary":"Toggle Starboard","description":"Enables or disables the starboard.\n\nRate Limited: 80 requests/minute","operationId":"toggle_starboard_api_v1_servers__server_id__starboard_toggle_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/starboard/threshold":{"patch":{"tags":["⭐ Starboard"],"summary":"Update Threshold","description":"Updates the starboard thresholds.\n\nRate Limited: 80 requests/minute","operationId":"update_threshold_api_v1_servers__server_id__starboard_threshold_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThresholdUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/starboard/blacklist":{"post":{"tags":["⭐ Starboard"],"summary":"Add To Blacklist","description":"Adds an entry to the starboard blacklist.\n\nRate Limited: 80 requests/minute","operationId":"add_to_blacklist_api_v1_servers__server_id__starboard_blacklist_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlacklistAddRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["⭐ Starboard"],"summary":"Get Blacklist","description":"Returns the starboard blacklist.\n\nRate Limited: 80 requests/minute","operationId":"get_blacklist_api_v1_servers__server_id__starboard_blacklist_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"blacklist_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["user","role","channel"],"type":"string"},{"type":"null"}],"description":"Filter by type","title":"Blacklist Type"},"description":"Filter by type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BlacklistEntryResponse"},"title":"Response Get Blacklist Api V1 Servers  Server Id  Starboard Blacklist Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/starboard/blacklist/{blacklist_type}/{target_id}":{"delete":{"tags":["⭐ Starboard"],"summary":"Remove From Blacklist","description":"Removes an entry from the starboard blacklist.\n\nRate Limited: 80 requests/minute","operationId":"remove_from_blacklist_api_v1_servers__server_id__starboard_blacklist__blacklist_type___target_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"blacklist_type","in":"path","required":true,"schema":{"enum":["channel","role","user"],"type":"string","description":"Blacklist entry type","title":"Blacklist Type"},"description":"Blacklist entry type"},{"name":"target_id","in":"path","required":true,"schema":{"type":"string","description":"Target ID","title":"Target Id"},"description":"Target ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/starboard/force-add":{"post":{"tags":["⭐ Starboard"],"summary":"Force Add Message","description":"Manually adds a message to the starboard.\n\nRate Limited: 80 requests/minute","operationId":"force_add_message_api_v1_servers__server_id__starboard_force_add_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForceAddRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/starboard/entries":{"get":{"tags":["⭐ Starboard"],"summary":"Get Starboard Entries","description":"Returns all starboard entries.\n\nRate Limited: 100 requests/minute\nCached: 1 minute","operationId":"get_starboard_entries_api_v1_servers__server_id__starboard_entries_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of entries","default":50,"title":"Limit"},"description":"Number of entries"},{"name":"sort_by","in":"query","required":false,"schema":{"enum":["star_count","recent","first_starred_at"],"type":"string","description":"Sort by","default":"star_count","title":"Sort By"},"description":"Sort by"},{"name":"only_hall_of_fame","in":"query","required":false,"schema":{"type":"boolean","description":"Only Hall of Fame","default":false,"title":"Only Hall Of Fame"},"description":"Only Hall of Fame"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StarboardEntryResponse"},"title":"Response Get Starboard Entries Api V1 Servers  Server Id  Starboard Entries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/starboard/entries/{message_id}":{"get":{"tags":["⭐ Starboard"],"summary":"Get Starboard Entry","description":"Returns details for a specific starboard entry.\n\nRate Limited: 80 requests/minute","operationId":"get_starboard_entry_api_v1_servers__server_id__starboard_entries__message_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"message_id","in":"path","required":true,"schema":{"type":"string","description":"Message ID","title":"Message Id"},"description":"Message ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/starboard/leaderboard/messages":{"get":{"tags":["⭐ Starboard"],"summary":"Get Message Leaderboard","description":"Returns the leaderboard of most starred messages.\n\nRate Limited: 100 requests/minute\nCached: 1 minute","operationId":"get_message_leaderboard_api_v1_servers__server_id__starboard_leaderboard_messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of entries","default":10,"title":"Limit"},"description":"Number of entries"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/starboard/leaderboard/users":{"get":{"tags":["⭐ Starboard"],"summary":"Get User Leaderboard","description":"Returns the leaderboard of users with the most received stars.\n\nRate Limited: 100 requests/minute\nCached: 1 minute","operationId":"get_user_leaderboard_api_v1_servers__server_id__starboard_leaderboard_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of entries","default":10,"title":"Limit"},"description":"Number of entries"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/starboard/stats/{user_id}":{"get":{"tags":["⭐ Starboard"],"summary":"Get User Starboard Stats","description":"Returns starboard statistics for a specific user.\n\nRate Limited: 80 requests/minute\nCached: 5 minutes","operationId":"get_user_starboard_stats_api_v1_servers__server_id__starboard_stats__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"User ID","title":"User Id"},"description":"User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/starboard/random":{"get":{"tags":["⭐ Starboard"],"summary":"Get Random Starred Message","description":"Returns a random starred message.\n\nRate Limited: 80 requests/minute\nCached: 1 minute","operationId":"get_random_starred_message_api_v1_servers__server_id__starboard_random_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StarboardEntryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/starboard/statistics":{"get":{"tags":["⭐ Starboard"],"summary":"Get Starboard Statistics","description":"Returns general starboard statistics for the server.\n\nRate Limited: 80 requests/minute\nCached: 5 minutes","operationId":"get_starboard_statistics_api_v1_servers__server_id__starboard_statistics_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaways":{"get":{"tags":["🎉 Giveaways"],"summary":"Get Giveaways","description":"Returns a list of all giveaways for a server.\n\n**Filters:**\n- `all`: All giveaways\n- `active`: Only active giveaways\n- `ended`: Only ended giveaways","operationId":"get_giveaways_api_v1_servers__server_id__giveaways_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["all","active","ended"],"type":"string"},{"type":"null"}],"description":"Filter by status","default":"all","title":"Status"},"description":"Filter by status"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page (starts at 1)","default":1,"title":"Page"},"description":"Page (starts at 1)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Entries per page","default":20,"title":"Limit"},"description":"Entries per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GiveawayListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🎉 Giveaways"],"summary":"Create Giveaway","description":"Creates a new giveaway.\n\n**The giveaway will NOT be sent automatically!**\nUse the `/giveaways/{id}/send` endpoint to send it.","operationId":"create_giveaway_api_v1_servers__server_id__giveaways_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GiveawayCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GiveawayResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaways/{giveaway_id}":{"get":{"tags":["🎉 Giveaways"],"summary":"Get Giveaway","description":"Returns detailed information about a giveaway.","operationId":"get_giveaway_api_v1_servers__server_id__giveaways__giveaway_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"giveaway_id","in":"path","required":true,"schema":{"type":"integer","description":"Giveaway ID","title":"Giveaway Id"},"description":"Giveaway ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GiveawayResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🎉 Giveaways"],"summary":"Update Giveaway","description":"Edits a giveaway.\n\n**Note:** Already ended giveaways cannot be edited.","operationId":"update_giveaway_api_v1_servers__server_id__giveaways__giveaway_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"giveaway_id","in":"path","required":true,"schema":{"type":"integer","description":"Giveaway ID","title":"Giveaway Id"},"description":"Giveaway ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GiveawayUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GiveawayResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎉 Giveaways"],"summary":"Delete Giveaway","description":"Deletes a giveaway completely.\n\n**Note:** Only ended or inactive giveaways can be deleted.","operationId":"delete_giveaway_api_v1_servers__server_id__giveaways__giveaway_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"giveaway_id","in":"path","required":true,"schema":{"type":"integer","description":"Giveaway ID","title":"Giveaway Id"},"description":"Giveaway ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaways/{giveaway_id}/send":{"post":{"tags":["🎉 Giveaways"],"summary":"Send Giveaway","description":"Sends a giveaway to the configured channel.\n\nThe giveaway will be activated and can then be joined by users.","operationId":"send_giveaway_api_v1_servers__server_id__giveaways__giveaway_id__send_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"giveaway_id","in":"path","required":true,"schema":{"type":"integer","description":"Giveaway ID","title":"Giveaway Id"},"description":"Giveaway ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GiveawayResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaways/{giveaway_id}/resend":{"post":{"tags":["🎉 Giveaways"],"summary":"Resend Giveaway","description":"Sends an already-sent giveaway again.\n\nThe previous message is deleted and a fresh one is posted — optionally in a\ndifferent channel (`channel_id`). Useful when the giveaway was sent to the\nwrong channel or should be pushed to the bottom of the chat again.","operationId":"resend_giveaway_api_v1_servers__server_id__giveaways__giveaway_id__resend_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"giveaway_id","in":"path","required":true,"schema":{"type":"integer","description":"Giveaway ID","title":"Giveaway Id"},"description":"Giveaway ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GiveawayResendRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GiveawayResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaways/{giveaway_id}/end":{"post":{"tags":["🎉 Giveaways"],"summary":"End Giveaway","description":"Ends a giveaway early and draws the winners.","operationId":"end_giveaway_api_v1_servers__server_id__giveaways__giveaway_id__end_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"giveaway_id","in":"path","required":true,"schema":{"type":"integer","description":"Giveaway ID","title":"Giveaway Id"},"description":"Giveaway ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GiveawayResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaways/{giveaway_id}/reroll":{"post":{"tags":["🎉 Giveaways"],"summary":"Reroll Giveaway","description":"Draws new winners for an ended giveaway.","operationId":"reroll_giveaway_api_v1_servers__server_id__giveaways__giveaway_id__reroll_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"giveaway_id","in":"path","required":true,"schema":{"type":"integer","description":"Giveaway ID","title":"Giveaway Id"},"description":"Giveaway ID"},{"name":"winner_count","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":20,"minimum":1},{"type":"null"}],"description":"Number of new winners (optional)","title":"Winner Count"},"description":"Number of new winners (optional)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GiveawayResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaways/{giveaway_id}/participants":{"get":{"tags":["🎉 Giveaways"],"summary":"Get Participants","description":"Returns all participants of a giveaway.\n\nThe participant list is **not** capped at 100 — pass a large `limit`\n(or paginate) to retrieve every entry. `search` filters by username,\nserver display name (nickname) and user ID.","operationId":"get_participants_api_v1_servers__server_id__giveaways__giveaway_id__participants_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"giveaway_id","in":"path","required":true,"schema":{"type":"integer","description":"Giveaway ID","title":"Giveaway Id"},"description":"Giveaway ID"},{"name":"filter_valid","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by validation","title":"Filter Valid"},"description":"Filter by validation"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by username, display name or user ID","title":"Search"},"description":"Search by username, display name or user ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page","default":1,"title":"Page"},"description":"Page"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"description":"Entries per page (no hard limit)","default":100,"title":"Limit"},"description":"Entries per page (no hard limit)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GiveawayParticipantsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaways/{giveaway_id}/winners":{"get":{"tags":["🎉 Giveaways"],"summary":"Get Winners","description":"Returns all winners of a giveaway.","operationId":"get_winners_api_v1_servers__server_id__giveaways__giveaway_id__winners_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"giveaway_id","in":"path","required":true,"schema":{"type":"integer","description":"Giveaway ID","title":"Giveaway Id"},"description":"Giveaway ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GiveawayWinnersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaway-recent-winners":{"get":{"tags":["🎉 Giveaways"],"summary":"Get Recent Winners","description":"Returns the most recent distinct winners of giveaways hosted by this server,\nnewest first - the people `exclude_recent_winners` would lock out.\n\nThe order is the order the bot applies: the first N entries are exactly\nthe N people excluded when a giveaway sets `exclude_recent_winners = N`.","operationId":"get_recent_winners_api_v1_servers__server_id__giveaway_recent_winners_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"How many recent winners","default":50,"title":"Limit"},"description":"How many recent winners"},{"name":"exclude_giveaway_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Leave this giveaway's own winners out","title":"Exclude Giveaway Id"},"description":"Leave this giveaway's own winners out"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecentWinnersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaways/{giveaway_id}/banner":{"post":{"tags":["🎉 Giveaways"],"summary":"Upload Giveaway Banner","description":"Uploads a banner and saves it as Base64 in the database.","operationId":"upload_giveaway_banner_api_v1_servers__server_id__giveaways__giveaway_id__banner_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"giveaway_id","in":"path","required":true,"schema":{"type":"integer","description":"Giveaway ID","title":"Giveaway Id"},"description":"Giveaway ID"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_giveaway_banner_api_v1_servers__server_id__giveaways__giveaway_id__banner_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎉 Giveaways"],"summary":"Delete Giveaway Banner","description":"Removes the banner from the database.","operationId":"delete_giveaway_banner_api_v1_servers__server_id__giveaways__giveaway_id__banner_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"giveaway_id","in":"path","required":true,"schema":{"type":"integer","description":"Giveaway ID","title":"Giveaway Id"},"description":"Giveaway ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["🎉 Giveaways"],"summary":"Get Giveaway Banner Info","description":"Gibt das Banner eines Giveaways zurück (Base64-Data-URI oder nichts).\n\nHier stand vorher eine Abfrage auf die Einstellung `giveaway_banner_filename`\nund auf eine Datei unter `picture/giveaway_bilder/`. Beides schreibt NIEMAND:\nder Upload legt das Bild als Base64 in `Giveaway.banner_image` ab. Die\nAntwort lautete deshalb bei jedem Giveaway \"kein eigenes Banner\" - das\nDashboard bekam sein hochgeladenes Bild nie wieder zu sehen und hat es beim\nnächsten Bearbeiten für gelöscht gehalten.","operationId":"get_giveaway_banner_info_api_v1_servers__server_id__giveaways__giveaway_id__banner_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"giveaway_id","in":"path","required":true,"schema":{"type":"integer","description":"Giveaway ID","title":"Giveaway Id"},"description":"Giveaway ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bot-servers":{"get":{"tags":["🎉 Giveaways"],"summary":"Get Bot Servers","description":"Returns all servers the bot is on (excluding the current server).\nUsed for the cooperation partner server selection dropdown.","operationId":"get_bot_servers_api_v1_servers__server_id__bot_servers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by server name","title":"Search"},"description":"Search by server name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaways/{giveaway_id}/coop-requests":{"get":{"tags":["🎉 Giveaways"],"summary":"Get Giveaway Coop Requests","description":"Gibt alle Coop-Anfragen eines Giveaways zurück (Hoster-Sicht).","operationId":"get_giveaway_coop_requests_api_v1_servers__server_id__giveaways__giveaway_id__coop_requests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"giveaway_id","in":"path","required":true,"schema":{"type":"integer","title":"Giveaway Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoopRequestSummaryListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaway-coop-requests":{"get":{"tags":["🎉 Giveaways"],"summary":"Get Incoming Coop Requests","description":"Gibt alle eingehenden Coop-Anfragen für diesen Server zurück (Partner-Sicht).","operationId":"get_incoming_coop_requests_api_v1_servers__server_id__giveaway_coop_requests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoopRequestListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaway-coop-requests/{request_id}/accept":{"post":{"tags":["🎉 Giveaways"],"summary":"Accept Coop Request","description":"Nimmt eine Coop-Anfrage an.\n\nKanal ist Pflicht, Ping-Rolle optional. Nach der Annahme wird das Giveaway\ndirekt auf dem Partner-Server gepostet (sofern das Hoster-Giveaway bereits aktiv ist).","operationId":"accept_coop_request_api_v1_servers__server_id__giveaway_coop_requests__request_id__accept_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoopRequestAccept"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaway-coop-requests/{request_id}/decline":{"post":{"tags":["🎉 Giveaways"],"summary":"Decline Coop Request","operationId":"decline_coop_request_api_v1_servers__server_id__giveaway_coop_requests__request_id__decline_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaway-coop-requests/{request_id}/channel":{"put":{"tags":["🎉 Giveaways"],"summary":"Set Coop Request Channel","operationId":"set_coop_request_channel_api_v1_servers__server_id__giveaway_coop_requests__request_id__channel_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoopRequestChannelUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaway-coop-requests/{request_id}/requirements":{"put":{"tags":["🎉 Giveaways"],"summary":"Set Coop Request Requirements","operationId":"set_coop_request_requirements_api_v1_servers__server_id__giveaway_coop_requests__request_id__requirements_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoopRequestRequirementsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaways/{giveaway_id}/coop-partners/{partner_server_id}":{"delete":{"tags":["🎉 Giveaways"],"summary":"Remove Coop Partner","description":"Entfernt einen Partner-Server aus der Cooperation (Hoster-Aktion).","operationId":"remove_coop_partner_api_v1_servers__server_id__giveaways__giveaway_id__coop_partners__partner_server_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"giveaway_id","in":"path","required":true,"schema":{"type":"integer","title":"Giveaway Id"}},{"name":"partner_server_id","in":"path","required":true,"schema":{"type":"string","title":"Partner Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaway-coop-requests/{request_id}/settings":{"put":{"tags":["🎉 Giveaways"],"summary":"Update Coop Request Settings","description":"Setzt alle Partner-Einstellungen für eine Coop-Anfrage in einem einzigen Aufruf.","operationId":"update_coop_request_settings_api_v1_servers__server_id__giveaway_coop_requests__request_id__settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoopRequestSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaway-coop-requests/{request_id}/resend":{"post":{"tags":["🎉 Giveaways"],"summary":"Resend Coop Partner Giveaway","description":"Postet die Partner-Kopie eines Coop-Giveaways erneut.\n\nDie vorherige Partner-Nachricht wird gelöscht und eine neue gepostet —\noptional in einem anderen Kanal. Praktisch bei Fehlklicks oder falschem Kanal.","operationId":"resend_coop_partner_giveaway_api_v1_servers__server_id__giveaway_coop_requests__request_id__resend_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GiveawayResendRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaway-coop-requests/{request_id}/banner":{"post":{"tags":["🎉 Giveaways"],"summary":"Upload Coop Partner Banner","description":"Lädt ein Banner für die Partner-Kopie eines Coop-Giveaways hoch.","operationId":"upload_coop_partner_banner_api_v1_servers__server_id__giveaway_coop_requests__request_id__banner_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_coop_partner_banner_api_v1_servers__server_id__giveaway_coop_requests__request_id__banner_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎉 Giveaways"],"summary":"Delete Coop Partner Banner","description":"Entfernt das Partner-Banner eines Coop-Giveaways.","operationId":"delete_coop_partner_banner_api_v1_servers__server_id__giveaway_coop_requests__request_id__banner_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaway-coop-requests/{request_id}/end":{"post":{"tags":["🎉 Giveaways"],"summary":"Partner End Giveaway","description":"Ermöglicht einem Partner-Server, das Coop-Giveaway vorzeitig zu beenden.","operationId":"partner_end_giveaway_api_v1_servers__server_id__giveaway_coop_requests__request_id__end_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaway-coop-requests/{request_id}/reroll":{"post":{"tags":["🎉 Giveaways"],"summary":"Partner Reroll Giveaway","description":"Ermöglicht einem Partner-Server, die Gewinner eines beendeten Coop-Giveaways neu zu würfeln.","operationId":"partner_reroll_giveaway_api_v1_servers__server_id__giveaway_coop_requests__request_id__reroll_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}},{"name":"winner_count","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":20,"minimum":1},{"type":"null"}],"title":"Winner Count"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaway-coop-requests/{request_id}/participants":{"get":{"tags":["🎉 Giveaways"],"summary":"Get Coop Request Participants","description":"Gibt alle Teilnehmer eines Coop-Giveaways zurück (Partner-Sicht).\n\nKeine 100er-Begrenzung mehr; `search` filtert nach Username, Anzeigename\n(Server-Nickname) und User-ID.","operationId":"get_coop_request_participants_api_v1_servers__server_id__giveaway_coop_requests__request_id__participants_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}},{"name":"filter_valid","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Filter Valid"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by username, display name or user ID","title":"Search"},"description":"Search by username, display name or user ID"},{"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":100000,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GiveawayParticipantsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/giveaway-coop-requests/{request_id}/winners":{"get":{"tags":["🎉 Giveaways"],"summary":"Get Coop Request Winners","description":"Gibt alle Gewinner eines Coop-Giveaways zurück (Partner-Sicht).","operationId":"get_coop_request_winners_api_v1_servers__server_id__giveaway_coop_requests__request_id__winners_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"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/GiveawayWinnersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autoroles/config":{"get":{"tags":["🧵 Auto Roles"],"summary":"Get Config","description":"Returns the Auto-Role configuration\n\nRate Limited: 80 requests/minute\nCached: 5 minutes","operationId":"get_config_api_v1_servers__server_id__autoroles_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Config Api V1 Servers  Server Id  Autoroles Config Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["🧵 Auto Roles"],"summary":"Update Config","description":"Updates the Auto-Role configuration\n\nRate Limited: 80 requests/minute","operationId":"update_config_api_v1_servers__server_id__autoroles_config_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoRoleConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Config Api V1 Servers  Server Id  Autoroles Config Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autoroles/winners":{"get":{"tags":["🧵 Auto Roles"],"summary":"Get Winners","description":"Returns the winner history\n\nRate Limited: 80 requests/minute\nCached: 3 minutes","operationId":"get_winners_api_v1_servers__server_id__autoroles_winners_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Number of entries","default":10,"title":"Limit"},"description":"Number of entries"},{"name":"award_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by award type","title":"Award Type"},"description":"Filter by award type"},{"name":"period_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by period type","title":"Period Type"},"description":"Filter by period type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Winners Api V1 Servers  Server Id  Autoroles Winners Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autoroles/exclusions":{"get":{"tags":["🧵 Auto Roles"],"summary":"Get Exclusions","description":"Returns all exclusions\n\nRate Limited: 80 requests/minute","operationId":"get_exclusions_api_v1_servers__server_id__autoroles_exclusions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Exclusions Api V1 Servers  Server Id  Autoroles Exclusions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🧵 Auto Roles"],"summary":"Create Exclusion","description":"Creates a new exclusion\n\nRate Limited: 80 requests/minute","operationId":"create_exclusion_api_v1_servers__server_id__autoroles_exclusions_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExclusionCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Exclusion Api V1 Servers  Server Id  Autoroles Exclusions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autoroles/exclusions/{exclusion_id}":{"delete":{"tags":["🧵 Auto Roles"],"summary":"Delete Exclusion","description":"Deletes an exclusion\n\nRate Limited: 80 requests/minute","operationId":"delete_exclusion_api_v1_servers__server_id__autoroles_exclusions__exclusion_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"exclusion_id","in":"path","required":true,"schema":{"type":"integer","description":"Exclusion ID","title":"Exclusion Id"},"description":"Exclusion ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Exclusion Api V1 Servers  Server Id  Autoroles Exclusions  Exclusion Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/autoroles/logs":{"get":{"tags":["🧵 Auto Roles"],"summary":"Get Logs","description":"Returns the log history\n\nRate Limited: 80 requests/minute","operationId":"get_logs_api_v1_servers__server_id__autoroles_logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Number of entries","default":50,"title":"Limit"},"description":"Number of entries"},{"name":"action_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by action type","title":"Action Type"},"description":"Filter by action type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Logs Api V1 Servers  Server Id  Autoroles Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tempvoice/settings":{"get":{"tags":["🔊 TempVoice","TempVoice"],"summary":"Get Tempvoice Settings","description":"Retrieves the current TempVoice settings (master channels).","operationId":"get_tempvoice_settings_api_v1_servers__server_id__tempvoice_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TempVoiceSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tempvoice/master":{"post":{"tags":["🔊 TempVoice","TempVoice"],"summary":"Add Tempvoice Master Channel","description":"ADDS a master voice channel to the list (max 10).","operationId":"add_tempvoice_master_channel_api_v1_servers__server_id__tempvoice_master_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TempVoiceMasterChannelRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TempVoiceMasterChannelInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tempvoice/master/{channel_id}":{"delete":{"tags":["🔊 TempVoice","TempVoice"],"summary":"Remove Tempvoice Master Channel","description":"REMOVES a master voice channel from the list.","operationId":"remove_tempvoice_master_channel_api_v1_servers__server_id__tempvoice_master__channel_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","description":"The ID of the master channel to remove","title":"Channel Id"},"description":"The ID of the master channel to remove"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardSuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/tempvoice/interface":{"post":{"tags":["🔊 TempVoice","TempVoice"],"summary":"Send Tempvoice Interface","description":"Triggers the bot to send the TempVoice interface to a channel.","operationId":"send_tempvoice_interface_api_v1_servers__server_id__tempvoice_interface_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TempVoiceSendInterfaceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardSuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/translate":{"post":{"tags":["⭐⭐ Bot Bewertungen"],"summary":"Translate Text","description":"Übersetzt Text oder eine Liste von Texten dynamisch.\nNutzt Batching und Caching für Performance.","operationId":"translate_text_api_v1_public_translate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/botreviews":{"post":{"tags":["⭐⭐ Bot Bewertungen"],"summary":"Create Review","operationId":"create_review_api_v1_servers__server_id__botreviews_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["⭐⭐ Bot Bewertungen"],"summary":"List Reviews","operationId":"list_reviews_api_v1_servers__server_id__botreviews_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"only_public","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Only Public"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(pending|approved|rejected)$"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/{review_id}/vote":{"post":{"tags":["⭐⭐ Bot Bewertungen"],"summary":"Vote Review","description":"Sets a vote (Helpful/Not Helpful).\nIf the same vote already exists, it will be removed (toggle).\nIf a different vote exists, it will be changed.","operationId":"vote_review_api_v1_reviews__review_id__vote_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"integer","title":"Review Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/{review_id}/reply":{"post":{"tags":["⭐⭐ Bot Bewertungen"],"summary":"Reply To Review","description":"Only for bot owner. Adds a reply to a review.","operationId":"reply_to_review_api_v1_reviews__review_id__reply_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"integer","title":"Review Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewReplyCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/botreviews/my":{"get":{"tags":["⭐⭐ Bot Bewertungen"],"summary":"Get My Review","operationId":"get_my_review_api_v1_servers__server_id__botreviews_my_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["⭐⭐ Bot Bewertungen"],"summary":"Update My Review","operationId":"update_my_review_api_v1_servers__server_id__botreviews_my_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Review"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["⭐⭐ Bot Bewertungen"],"summary":"Delete My Review","operationId":"delete_my_review_api_v1_servers__server_id__botreviews_my_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/reviews":{"get":{"tags":["⭐⭐ Bot Bewertungen"],"summary":"Public Reviews","operationId":"public_reviews_api_v1_public_reviews_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"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":{"$ref":"#/components/schemas/ReviewListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/avatar/{user_id}":{"get":{"tags":["🖼️ Bilder"],"summary":"Public Avatar","description":"Leitet auf das aktuelle Profilbild eines Nutzers weiter.\n\nAntwortet nie mit 404: hat das Konto kein eigenes Bild oder ist es\ngeloescht, endet die Weiterleitung auf Discords Standardavatar.","operationId":"public_avatar_api_v1_public_avatar__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"16 bis 1024","title":"Size"},"description":"16 bis 1024"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/server-icon/{server_id}":{"get":{"tags":["🖼️ Bilder"],"summary":"Public Server Icon","description":"Leitet auf das aktuelle Icon eines Servers weiter.\n\nHier ist 404 die richtige Antwort, wenn der Server wirklich kein Icon hat:\nein Standard-Server-Icon gibt es bei Discord nicht, und die Oberflaeche\nzeigt dann ihre Buchstabenkachel statt eines fremden Bildes.","operationId":"public_server_icon_api_v1_public_server_icon__server_id__get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"16 bis 1024","title":"Size"},"description":"16 bis 1024"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/ticket-banner/{filename}":{"get":{"tags":["🖼️ Bilder"],"summary":"Public Ticket Banner","description":"Liefert das hochgeladene Ticket-Banner eines Servers aus.","operationId":"public_ticket_banner_api_v1_public_ticket_banner__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","description":"Dateiname aus ticket_banner_filename","title":"Filename"},"description":"Dateiname aus ticket_banner_filename"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/config":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Get Team Role Configuration","description":"Retrieves the main and additional team roles configured for this server.","operationId":"get_team_config_api_v1_servers__server_id__team_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamRoleConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Update Team Role Configuration","description":"Updates the main and additional team roles.\nThis will overwrite any existing configuration.","operationId":"update_team_config_api_v1_servers__server_id__team_config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamRoleConfig"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamRoleConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/config/roles":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"List Configured Team Role Details","description":"Fetches the actual details (name, color) of all configured team roles.","operationId":"list_configured_team_roles_api_v1_servers__server_id__team_config_roles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamRoleListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/stats/overview":{"get":{"tags":["📅 Team Calendar"],"summary":"Get Team Statistics","description":"Gets team overview statistics. Admins only.","operationId":"get_team_statistics_api_v1_servers__server_id__team_stats_overview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/activity":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Get Team Activity Leaderboard","description":"Returns a paginated and sorted list of all team members based on their\nrelative activity score.\n\nThe score (around 100) is calculated based on messages, voice time, mod actions,\ncommands, reactions, and tickets, **relative to the team average**\nin the selected timeframe.\n\nA score of 120 means 20% more active than average.\nA score of 80 means 20% less active than average.","operationId":"get_team_activity_api_v1_servers__server_id__team_activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["1d","7d","14d","30d","60d","90d","365d"],"type":"string","description":"Time period to analyze","default":"30d","title":"Timeframe"},"description":"Time period to analyze"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort by activity score","default":"desc","title":"Sort"},"description":"Sort by activity score"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamActivityListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/activity/timeline":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Get Team Activity Timeline","description":"Returns a time series of total team messages and voice minutes,\naggregated per interval. (Python-side aggregation)","operationId":"get_team_activity_timeline_api_v1_servers__server_id__team_activity_timeline_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["7d","14d","30d","60d","90d"],"type":"string","description":"Time period to analyze","default":"30d","title":"Timeframe"},"description":"Time period to analyze"},{"name":"interval","in":"query","required":false,"schema":{"enum":["hourly","daily","weekly","monthly"],"type":"string","description":"Aggregation interval","default":"daily","title":"Interval"},"description":"Aggregation interval"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamActivityTimelineResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/activity/heatmap":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Get Team Message Activity Heatmap","description":"Returns data for a heatmap (day of week vs. hour) of team message activity.","operationId":"get_team_activity_heatmap_api_v1_servers__server_id__team_activity_heatmap_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["7d","14d","30d","60d"],"type":"string","description":"Time period to analyze","default":"30d","title":"Timeframe"},"description":"Time period to analyze"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamActivityHeatmapResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/activity/game-activity":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Get Team Game/Application Activity","description":"Shows which games and applications were most frequently used by team members\n(based on 'Playing' activity).","operationId":"get_team_game_activity_api_v1_servers__server_id__team_activity_game_activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["7d","14d","30d"],"type":"string","description":"Time period to analyze","default":"7d","title":"Timeframe"},"description":"Time period to analyze"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamGameActivityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/member/{user_id}":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Get Detailed Team Member Stats","description":"Provides a deep dive into a single team member's activity, including\na full breakdown of metrics and their relative activity score (vs team average).","operationId":"get_team_member_details_api_v1_servers__server_id__team_member__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["1d","7d","14d","30d","60d","90d","365d"],"type":"string","description":"Time period to analyze","default":"30d","title":"Timeframe"},"description":"Time period to analyze"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamMemberDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/moderators":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Get Most Active Moderators","description":"Ranks team members by their moderation actions (ban, kick, timeout).","operationId":"get_active_moderators_api_v1_servers__server_id__team_moderators_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["1d","7d","14d","30d","60d","90d","365d"],"type":"string","description":"Time period to analyze","default":"30d","title":"Timeframe"},"description":"Time period to analyze"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamModeratorListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/moderation/timeline":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Get Moderation Actions Timeline","description":"Returns a time series of all moderation actions (by team members),\naggregated by interval and broken down by type. (Python aggregation)","operationId":"get_moderation_timeline_api_v1_servers__server_id__team_moderation_timeline_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["7d","14d","30d","60d","90d"],"type":"string","description":"Time period to analyze","default":"30d","title":"Timeframe"},"description":"Time period to analyze"},{"name":"interval","in":"query","required":false,"schema":{"enum":["hourly","daily","weekly","monthly"],"type":"string","description":"Aggregation interval","default":"daily","title":"Interval"},"description":"Aggregation interval"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModTimelineResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/moderation/action-types":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Get Moderation Action Type Distribution","description":"Returns a count of all moderation actions, grouped by type.\nIdeal for a pie chart.","operationId":"get_moderation_action_types_api_v1_servers__server_id__team_moderation_action_types_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["7d","14d","30d","60d","90d","365d"],"type":"string","description":"Time period to analyze","default":"30d","title":"Timeframe"},"description":"Time period to analyze"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TypedCountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/moderation/targets":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Get Most Moderated Users","description":"Lists the users who most frequently received moderation actions\n(from team members) in the timeframe.","operationId":"get_most_moderated_users_api_v1_servers__server_id__team_moderation_targets_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["7d","14d","30d","60d","90d"],"type":"string","description":"Time period to analyze","default":"30d","title":"Timeframe"},"description":"Time period to analyze"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModeratedUserListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/supporters":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Get Most Active Supporters","description":"Ranks team members by their ticket support activity (claimed, closed, rated).","operationId":"get_active_supporters_api_v1_servers__server_id__team_supporters_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["1d","7d","14d","30d","60d","90d","365d"],"type":"string","description":"Time period to analyze","default":"30d","title":"Timeframe"},"description":"Time period to analyze"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamSupporterListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tickets/timeline":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Get Ticket Volume Timeline","description":"Returns a time series of ticket volume (opened, closed, claimed).\n(Python aggregation)","operationId":"get_ticket_timeline_api_v1_servers__server_id__team_tickets_timeline_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["7d","14d","30d","60d","90d"],"type":"string","description":"Time period to analyze","default":"30d","title":"Timeframe"},"description":"Time period to analyze"},{"name":"interval","in":"query","required":false,"schema":{"enum":["hourly","daily","weekly","monthly"],"type":"string","description":"Aggregation interval","default":"daily","title":"Interval"},"description":"Aggregation interval"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketTimelineResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tickets/kpis":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Get Ticket Performance KPIs","description":"Calculates important KPIs for ticket performance, such as\naverage time to claim and time to close.","operationId":"get_ticket_kpis_api_v1_servers__server_id__team_tickets_kpis_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["7d","14d","30d","60d","90d","365d"],"type":"string","description":"Time period to analyze","default":"30d","title":"Timeframe"},"description":"Time period to analyze"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketKPIsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tickets/ratings-distribution":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Get Ticket Rating Distribution","description":"Counts the distribution of ticket ratings (1-5 stars)\nfor tickets handled by team members.","operationId":"get_ticket_rating_distribution_api_v1_servers__server_id__team_tickets_ratings_distribution_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["7d","14d","30d","60d","90d","365d"],"type":"string","description":"Time period to analyze","default":"30d","title":"Timeframe"},"description":"Time period to analyze"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RatingDistributionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tickets/ratings-timeline":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Get Ticket Rating Timeline","description":"Shows the trend of average ticket rating over time.\n(Python aggregation)","operationId":"get_ticket_rating_timeline_api_v1_servers__server_id__team_tickets_ratings_timeline_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["7d","14d","30d","60d","90d"],"type":"string","description":"Time period to analyze","default":"30d","title":"Timeframe"},"description":"Time period to analyze"},{"name":"interval","in":"query","required":false,"schema":{"enum":["hourly","daily","weekly","monthly"],"type":"string","description":"Aggregation interval","default":"daily","title":"Interval"},"description":"Aggregation interval"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RatingTimelineResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tickets/blacklist":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Get Ticket Blacklist","description":"Retrieves the list of users who are excluded from creating tickets.","operationId":"get_ticket_blacklist_api_v1_servers__server_id__team_tickets_blacklist_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"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":{"$ref":"#/components/schemas/TicketBlacklistResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/promotions":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"List Upcoming Team Promotions","description":"Retrieves a list of all pending (future) team member promotions.","operationId":"get_upcoming_promotions_api_v1_servers__server_id__team_promotions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamPromotionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Schedule a New Team Promotion","description":"Schedules a new automatic promotion for a team member.","operationId":"create_promotion_api_v1_servers__server_id__team_promotions_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePromotion"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamPromotionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/promotions/history":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"List Processed Team Promotions","description":"Retrieves a list of past, already processed promotions.","operationId":"get_promotion_history_api_v1_servers__server_id__team_promotions_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"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":{"$ref":"#/components/schemas/TeamPromotionHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/promotions/{promotion_id}":{"delete":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Cancel a Scheduled Promotion","description":"Deletes a scheduled promotion timer.","operationId":"delete_promotion_api_v1_servers__server_id__team_promotions__promotion_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"promotion_id","in":"path","required":true,"schema":{"type":"integer","title":"Promotion Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/setup-status":{"get":{"tags":["👥 Team Manager","Team Analytics & Management"],"summary":"Check if essential team settings are configured","description":"Checks if essential settings (such as the team role) are configured.\nUsed by the frontend to trigger the onboarding wizard.","operationId":"check_team_setup_status_api_v1_servers__server_id__team_setup_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamSetupStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/moderation/templates/{action_type}":{"get":{"tags":["👥 Advanced Moderation"],"summary":"Get Reason Templates","description":"Returns all reason templates for a specific action type.","operationId":"get_reason_templates_api_v1_servers__server_id__moderation_templates__action_type__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"action_type","in":"path","required":true,"schema":{"type":"string","description":"ban, kick or timeout","title":"Action Type"},"description":"ban, kick or timeout"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/moderation/templates":{"get":{"tags":["👥 Advanced Moderation"],"summary":"Get All Reason Templates","description":"Returns all reason templates for all action types.","operationId":"get_all_reason_templates_api_v1_servers__server_id__moderation_templates_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["👥 Advanced Moderation"],"summary":"Create Reason Template","description":"Creates a new reason template.","operationId":"create_reason_template_api_v1_servers__server_id__moderation_templates_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReasonTemplateCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/moderation/templates/{template_id}":{"put":{"tags":["👥 Advanced Moderation"],"summary":"Update Reason Template","description":"Updates an existing reason template.","operationId":"update_reason_template_api_v1_servers__server_id__moderation_templates__template_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","description":"Template ID","title":"Template Id"},"description":"Template ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReasonTemplateUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["👥 Advanced Moderation"],"summary":"Delete Reason Template","description":"Deletes a reason template.","operationId":"delete_reason_template_api_v1_servers__server_id__moderation_templates__template_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","description":"Template ID","title":"Template Id"},"description":"Template ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/moderation/log-channel":{"get":{"tags":["👥 Advanced Moderation"],"summary":"Get Log Channel Settings","description":"Returns the moderation log channel settings.","operationId":"get_log_channel_settings_api_v1_servers__server_id__moderation_log_channel_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["👥 Advanced Moderation"],"summary":"Create Log Channel Settings","description":"Creates or overwrites log channel settings.","operationId":"create_log_channel_settings_api_v1_servers__server_id__moderation_log_channel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogChannelSettings"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["👥 Advanced Moderation"],"summary":"Update Log Channel Settings","description":"Updates log channel settings.","operationId":"update_log_channel_settings_api_v1_servers__server_id__moderation_log_channel_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogChannelSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["👥 Advanced Moderation"],"summary":"Delete Log Channel Settings","description":"Deletes log channel configuration.","operationId":"delete_log_channel_settings_api_v1_servers__server_id__moderation_log_channel_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/moderation/action":{"post":{"tags":["👥 Advanced Moderation"],"summary":"Execute Moderation Action","description":"Executes a moderation action (ban / kick / timeout / unban) on the server.\n\nThe API validates the request, then hands the action to the bot via Redis,\nwhich performs it on the live guild and writes the moderation log (same path\nas the slash commands). Fire-and-forget — like the Announce/Panels actions.\n\nRate Limited: 15 requests/minute","operationId":"execute_moderation_action_api_v1_servers__server_id__moderation_action_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerationActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/moderation/warn-automation":{"get":{"tags":["👥 Advanced Moderation"],"summary":"Get Warn Automation","description":"Returns warn automation config and all escalation rules.","operationId":"get_warn_automation_api_v1_servers__server_id__moderation_warn_automation_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/moderation/warn-automation/config":{"put":{"tags":["👥 Advanced Moderation"],"summary":"Update Warn Automation Config","description":"Creates or updates the warn automation config (master switch, window, DM).","operationId":"update_warn_automation_config_api_v1_servers__server_id__moderation_warn_automation_config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarnAutomationConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/moderation/warn-automation/rules":{"post":{"tags":["👥 Advanced Moderation"],"summary":"Create Warn Automation Rule","description":"Creates a new warn escalation rule (one per warn count).","operationId":"create_warn_automation_rule_api_v1_servers__server_id__moderation_warn_automation_rules_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarnRuleCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/moderation/warn-automation/rules/{rule_id}":{"put":{"tags":["👥 Advanced Moderation"],"summary":"Update Warn Automation Rule","description":"Updates an existing warn escalation rule.","operationId":"update_warn_automation_rule_api_v1_servers__server_id__moderation_warn_automation_rules__rule_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"rule_id","in":"path","required":true,"schema":{"type":"integer","description":"Rule ID","title":"Rule Id"},"description":"Rule ID"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarnRuleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["👥 Advanced Moderation"],"summary":"Delete Warn Automation Rule","description":"Deletes a warn escalation rule.","operationId":"delete_warn_automation_rule_api_v1_servers__server_id__moderation_warn_automation_rules__rule_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"rule_id","in":"path","required":true,"schema":{"type":"integer","description":"Rule ID","title":"Rule Id"},"description":"Rule ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/moderation/dm-settings":{"get":{"tags":["👥 Advanced Moderation"],"summary":"Get Moderation Dm Settings","description":"Wie die Benachrichtigungen an bestrafte Mitglieder aussehen.","operationId":"get_moderation_dm_settings_api_v1_servers__server_id__moderation_dm_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["👥 Advanced Moderation"],"summary":"Update Moderation Dm Settings","description":"DM-Privatsphaere speichern. Geschrieben wird nur bei echter Aenderung;\nder Bot erfaehrt davon sofort per Redis-Ereignis.","operationId":"update_moderation_dm_settings_api_v1_servers__server_id__moderation_dm_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DmSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__moderation_settings__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/command-permissions":{"get":{"tags":["🎛️ Command Permissions"],"summary":"Get Command Permissions","description":"Alle Befehls-Regeln und die serverweiten Schalter eines Servers.","operationId":"get_command_permissions_api_v1_servers__server_id__command_permissions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__command_permissions__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🎛️ Command Permissions"],"summary":"Update Command Permissions","description":"Regeln gebuendelt speichern und/oder auf Standard zuruecksetzen.\n\nEin Request traegt den ganzen Speichervorgang des Dashboards: geaenderte\nRegeln unter `overrides`, zurueckgesetzte Karten unter `reset`. Regeln,\ndie normalisiert dem Standard entsprechen, werden wie ein Reset\nbehandelt.","operationId":"update_command_permissions_api_v1_servers__server_id__command_permissions_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandOverridesUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__command_permissions__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/command-permissions/settings":{"put":{"tags":["🎛️ Command Permissions"],"summary":"Update Command Gate Settings","description":"Serverweite Schalter (Admin-Bypass, Prefix-Hinweise) speichern.","operationId":"update_command_gate_settings_api_v1_servers__server_id__command_permissions_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GateSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__command_permissions__ApiResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bot-profile":{"get":{"tags":["👥 Bot Profile"],"summary":"Get Bot Guild Profile","description":"Gets the current guild-specific bot profile directly from Discord API.\n\nDiscord API: GET /guilds/{guild.id}/members/{user.id}\n(There is no GET /guilds/{guild.id}/members/@me endpoint!)\n\nShows:\n- Current nickname\n- Guild-specific avatar (if set)\n- Guild-specific banner (if set)\n- Guild-specific bio (if set)\n\nRate Limited: 80 requests/minute","operationId":"get_bot_guild_profile_api_v1_servers__server_id__bot_profile_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BotGuildProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["👥 Bot Profile"],"summary":"Update Bot Guild Profile","description":"Updates the guild-specific bot profile directly via Discord API.\n\nDiscord API: PATCH /guilds/{guild.id}/members/@me\n\nCan set:\n- nick: Nickname (max 32 characters, null to remove)\n- avatar: Data URI base64 encoded avatar (null to remove)\n- banner: Data URI base64 encoded banner (null to remove)\n- bio: Guild member bio (max 190 characters, null to remove)\n\nExample Data URI:\n\"data:image/png;base64,iVBORw0KGgoAAAANS...\"\n\nRate Limited: 30 requests/minute","operationId":"update_bot_guild_profile_api_v1_servers__server_id__bot_profile_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BotGuildProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BotGuildProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["👥 Bot Profile"],"summary":"Reset Bot Guild Profile","description":"Resets the complete bot guild profile to defaults.\n\nRemoves:\n- Nickname\n- Guild Avatar\n- Guild Banner\n- Guild Bio\n\nRate Limited: 30 requests/minute","operationId":"reset_bot_guild_profile_api_v1_servers__server_id__bot_profile_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bot-profile/upload-avatar":{"post":{"tags":["👥 Bot Profile"],"summary":"Upload Bot Guild Avatar","description":"Upload avatar image and set it as bot guild avatar.\n\nRecommended size: 128x128 to 1024x1024 (square)\nAccepted formats: PNG, JPEG, GIF, WEBP\nMax size: 10MB\n\nRate Limited: 10 requests/minute","operationId":"upload_bot_guild_avatar_api_v1_servers__server_id__bot_profile_upload_avatar_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_bot_guild_avatar_api_v1_servers__server_id__bot_profile_upload_avatar_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bot-profile/upload-banner":{"post":{"tags":["👥 Bot Profile"],"summary":"Upload Bot Guild Banner","description":"Upload banner image and set it as bot guild banner.\n\nRecommended size: 600x240 (Discord Banner Ratio 5:2)\nAccepted formats: PNG, JPEG, GIF, WEBP\nMax size: 10MB\n\nRate Limited: 10 requests/minute","operationId":"upload_bot_guild_banner_api_v1_servers__server_id__bot_profile_upload_banner_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_bot_guild_banner_api_v1_servers__server_id__bot_profile_upload_banner_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bot-profile/set-avatar-from-url":{"post":{"tags":["👥 Bot Profile"],"summary":"Set Bot Guild Avatar From Url","description":"Sets bot guild avatar from URL.\n\nPractical for:\n- Direct integration with image URLs\n- Copying existing images\n\nRate Limited: 10 requests/minute","operationId":"set_bot_guild_avatar_from_url_api_v1_servers__server_id__bot_profile_set_avatar_from_url_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"image_url","in":"query","required":true,"schema":{"type":"string","title":"Image Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bot-profile/apply-server-image":{"post":{"tags":["👥 Bot Profile"],"summary":"Apply Server Image To Bot Profile","description":"Uebernimmt Server-Icon bzw. Server-Banner als Bot-Avatar bzw. Bot-Banner.\n\nDer Weg, den es ohne diesen Endpunkt gaebe: Icon herunterladen, zuschneiden,\nwieder hochladen. Drei Schritte fuer das Bild, das ohnehin schon auf dem\nServer liegt - und genau das ist hier ein Klick.\n\nWarum kein `image_url` im Body: die Adresse kaeme dann vom Browser, und\ndieser Dienst wuerde sie abrufen. Damit stuende jede Adresse offen, die\nvon hier aus erreichbar ist - auch die internen. Der Client nennt deshalb\nnur die QUELLE, aufgeloest wird sie aus der Server-Zeile.","operationId":"apply_server_image_to_bot_profile_api_v1_servers__server_id__bot_profile_apply_server_image_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyServerImageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bot-profile/avatar":{"delete":{"tags":["👥 Bot Profile"],"summary":"Remove Bot Guild Avatar","description":"Removes the guild-specific avatar (back to global avatar).\n\nRate Limited: 30 requests/minute","operationId":"remove_bot_guild_avatar_api_v1_servers__server_id__bot_profile_avatar_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bot-profile/banner":{"delete":{"tags":["👥 Bot Profile"],"summary":"Remove Bot Guild Banner","description":"Removes the guild-specific banner.\n\nRate Limited: 30 requests/minute","operationId":"remove_bot_guild_banner_api_v1_servers__server_id__bot_profile_banner_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bot-profile/branding":{"get":{"tags":["👥 Bot Profile"],"summary":"Get Branding Settings","description":"Returns the current footer/branding settings for the server.\n\n- Non-premium servers always show the default \"Powered by Notoq\" footer.\n- Premium servers can set a custom footer text or disable the footer entirely.\n\nRate Limited: 80 requests/minute","operationId":"get_branding_settings_api_v1_servers__server_id__bot_profile_branding_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["👥 Bot Profile"],"summary":"Update Branding Settings","description":"[PREMIUM] Updates the footer/branding settings for the server.\n\n- `custom_footer_text`: Custom footer text (max 100 characters, null = use default)\n- `hide_powered_by`: If true, no footer is shown at all\n\nNote: `hide_powered_by=true` takes priority over `custom_footer_text`.\n\nRate Limited: 30 requests/minute","operationId":"update_branding_settings_api_v1_servers__server_id__bot_profile_branding_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bot-profile/branding/footer":{"delete":{"tags":["👥 Bot Profile"],"summary":"Reset Branding Footer","description":"[PREMIUM] Resets the footer to the default \"Powered by Notoq\" text.\n\nClears both `custom_footer_text` and `hide_powered_by`.\n\nRate Limited: 30 requests/minute","operationId":"reset_branding_footer_api_v1_servers__server_id__bot_profile_branding_footer_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bot-profile/notoq-branding":{"get":{"tags":["👥 Bot Profile"],"summary":"Get Notoq Branding Settings","description":"Returns the current Notoq branding settings for the server.\n\n- Non-premium servers always show Notoq branding (invite/vote buttons).\n- Premium servers can hide these buttons.\n\nRate Limited: 80 requests/minute","operationId":"get_notoq_branding_settings_api_v1_servers__server_id__bot_profile_notoq_branding_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["👥 Bot Profile"],"summary":"Update Notoq Branding Settings","description":"[PREMIUM] Updates the Notoq branding setting for the server.\n\n- `hide_notoq_branding`: If true, Notoq link buttons (invite, vote) are hidden.\n\nRate Limited: 30 requests/minute","operationId":"update_notoq_branding_settings_api_v1_servers__server_id__bot_profile_notoq_branding_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotoqBrandingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/bot-profile/prefix":{"get":{"tags":["👥 Bot Profile"],"summary":"Get Prefix Settings","description":"Returns the current command prefix settings for the server.\n\n- Non-premium servers always use the default prefix \".\".\n- Premium servers can set a custom command prefix.\n\nRate Limited: 80 requests/minute","operationId":"get_prefix_settings_api_v1_servers__server_id__bot_profile_prefix_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["👥 Bot Profile"],"summary":"Update Prefix Settings","description":"[PREMIUM] Updates the custom command prefix for the server.\n\n- `custom_command_prefix`: Custom prefix (1-5 characters, null = reset to default \".\")\n- Prefix cannot contain spaces or be empty.\n\nRate Limited: 30 requests/minute","operationId":"update_prefix_settings_api_v1_servers__server_id__bot_profile_prefix_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrefixUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["👥 Bot Profile"],"summary":"Reset Prefix","description":"[PREMIUM] Resets the command prefix to the default \".\".\n\nRate Limited: 30 requests/minute","operationId":"reset_prefix_api_v1_servers__server_id__bot_profile_prefix_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/stats-init":{"get":{"tags":["✏️ User Stats"],"summary":"Get User Stats Init","description":"Combined init endpoint: returns pro status + server list in ONE request.\nReplaces 2 separate API calls (pro + servers) to speed up UserStats page load.","operationId":"get_user_stats_init_api_v1_users__user_id__stats_init_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/servers":{"get":{"tags":["✏️ User Stats"],"summary":"Get User Servers","description":"Returns all servers where the user is a member (and the bot is also present).","operationId":"get_user_servers_api_v1_users__user_id__servers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserServersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/stats/global/messages":{"get":{"tags":["✏️ User Stats"],"summary":"Get Global Message Stats","description":"Global message statistics across all servers.\nCorresponds to MessageStatsDetailed schema.","operationId":"get_global_message_stats_api_v1_users__user_id__stats_global_messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"period","in":"query","required":false,"schema":{"enum":["alltime","3years","2years","1year","180days","90days","30days","7days"],"type":"string","default":"30days","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/stats/global/voice":{"get":{"tags":["✏️ User Stats"],"summary":"Get Global Voice Stats","description":"Global voice statistics across all servers.\nCorresponds to VoiceStatsDetailed schema.","operationId":"get_global_voice_stats_api_v1_users__user_id__stats_global_voice_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"period","in":"query","required":false,"schema":{"enum":["alltime","3years","2years","1year","180days","90days","30days","7days"],"type":"string","default":"30days","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/stats/global/reactions":{"get":{"tags":["✏️ User Stats"],"summary":"Get Global Reaction Stats","description":"Global reaction statistics across all servers.\nCorresponds to ReactionStatsDetailed schema.","operationId":"get_global_reaction_stats_api_v1_users__user_id__stats_global_reactions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"period","in":"query","required":false,"schema":{"enum":["alltime","3years","2years","1year","180days","90days","30days","7days"],"type":"string","default":"30days","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReactionStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/stats/global/gaming":{"get":{"tags":["✏️ User Stats"],"summary":"Get Global Gaming Stats","description":"Global gaming/activity statistics across all servers.\nCorresponds to GamingStatsDetailed schema.\n(FIXED: Counts sessions only once across servers)","operationId":"get_global_gaming_stats_api_v1_users__user_id__stats_global_gaming_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"period","in":"query","required":false,"schema":{"enum":["alltime","3years","2years","1year","180days","90days","30days","7days"],"type":"string","default":"30days","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GamingStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/stats/global/activity":{"get":{"tags":["✏️ User Stats"],"summary":"Get Global Activity Stats","description":"Global activity statistics (commands, joins/leaves, invites).\nCorresponds to ActivityStatsDetailed schema.","operationId":"get_global_activity_stats_api_v1_users__user_id__stats_global_activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"period","in":"query","required":false,"schema":{"enum":["alltime","3years","2years","1year","180days","90days","30days","7days"],"type":"string","default":"30days","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/stats/global/channels":{"get":{"tags":["✏️ User Stats"],"summary":"Get Global Channel Stats","description":"Global channel statistics (most active channels across all servers).\nCorresponds to ChannelStatsDetailed schema.","operationId":"get_global_channel_stats_api_v1_users__user_id__stats_global_channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"period","in":"query","required":false,"schema":{"enum":["alltime","3years","2years","1year","180days","90days","30days","7days"],"type":"string","default":"30days","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/stats/global/overview":{"get":{"tags":["✏️ User Stats"],"summary":"Get Global Overview","description":"Global overview (dashboard summary) with ranks and percentages.\nVERY COMPUTATIONALLY INTENSIVE.","operationId":"get_global_overview_api_v1_users__user_id__stats_global_overview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"period","in":"query","required":false,"schema":{"enum":["alltime","3years","2years","1year","180days","90days","30days","7days"],"type":"string","default":"30days","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/stats/server/{server_id}/messages":{"get":{"tags":["✏️ User Stats"],"summary":"Get Server Message Stats","description":"Server-specific message statistics.\nCorresponds to MessageStatsDetailed schema.","operationId":"get_server_message_stats_api_v1_users__user_id__stats_server__server_id__messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"period","in":"query","required":false,"schema":{"enum":["alltime","3years","2years","1year","180days","90days","30days","7days"],"type":"string","default":"30days","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/stats/server/{server_id}/voice":{"get":{"tags":["✏️ User Stats"],"summary":"Get Server Voice Stats","description":"Server-specific voice statistics.\nCorresponds to VoiceStatsDetailed schema.","operationId":"get_server_voice_stats_api_v1_users__user_id__stats_server__server_id__voice_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"period","in":"query","required":false,"schema":{"enum":["alltime","3years","2years","1year","180days","90days","30days","7days"],"type":"string","default":"30days","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/stats/server/{server_id}/reactions":{"get":{"tags":["✏️ User Stats"],"summary":"Get Server Reaction Stats","description":"Server-specific reaction statistics.\nCorresponds to ReactionStatsDetailed schema.\n\nDen Endpunkt gab es nicht, obwohl das Dashboard ihn aufruft:\ncomponents/UserDashboard/UserReactions.jsx:799 schaltet auf ihn um, sobald\nein Server ausgewaehlt ist, und daneben stand als Kommentar \"Annahme:\nDieser Endpunkt existiert oder wird existieren\". Die Serverauswahl auf der\nReaktionsseite hat deshalb immer den Nichtverfuegbar-Hinweis gezeigt, waehrend\nNachrichten, Voice und Aktivitaet ihre serverbezogene Ansicht laengst hatten.\n\nDass `_get_reaction_count_summary` schon immer ein optionales `server_id`\nentgegennimmt und dafuer eine eigene Abfrage auf\n`leaderboard_reaction_counts` bereithaelt, ist die zweite Haelfte desselben\nBefunds: die Datenschicht war fertig, der Endpunkt darueber fehlte.","operationId":"get_server_reaction_stats_api_v1_users__user_id__stats_server__server_id__reactions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"period","in":"query","required":false,"schema":{"enum":["alltime","3years","2years","1year","180days","90days","30days","7days"],"type":"string","default":"30days","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReactionStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/stats/server/{server_id}/activity":{"get":{"tags":["✏️ User Stats"],"summary":"Get Server Activity Stats","description":"Server-specific activity statistics (commands, joins/leaves, invites).\nCorresponds to ActivityStatsDetailed schema.","operationId":"get_server_activity_stats_api_v1_users__user_id__stats_server__server_id__activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"period","in":"query","required":false,"schema":{"enum":["alltime","3years","2years","1year","180days","90days","30days","7days"],"type":"string","default":"30days","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/stats/server/{server_id}/overview":{"get":{"tags":["✏️ User Stats"],"summary":"Get Server Overview","description":"Server-specific overview (dashboard summary) with ranks and percentages.","operationId":"get_server_overview_api_v1_users__user_id__stats_server__server_id__overview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"period","in":"query","required":false,"schema":{"enum":["alltime","3years","2years","1year","180days","90days","30days","7days"],"type":"string","default":"30days","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/profile/customization":{"get":{"tags":["✏️ User Profile"],"summary":"Get Profile Customization","description":"Retrieves the profile customization settings for a user.","operationId":"get_profile_customization_api_v1_users__user_id__profile_customization_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileCustomizationSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["✏️ User Profile"],"summary":"Update Profile Customization","description":"Updates the profile customization settings for a user.","operationId":"update_profile_customization_api_v1_users__user_id__profile_customization_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileCustomizationSchema"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileCustomizationSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/profile/links":{"get":{"tags":["✏️ User Profile"],"summary":"Get profile links","description":"Retrieves all custom profile links for a user.","operationId":"get_profile_links_api_v1_users__user_id__profile_links_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserProfileLinkSchema"},"title":"Response Get Profile Links Api V1 Users  User Id  Profile Links Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["✏️ User Profile"],"summary":"Add new profile link","description":"Adds a new profile link for the authenticated user.\nLimit: Max 8 links per user.","operationId":"create_profile_link_api_v1_users__user_id__profile_links_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileLinkCreateSchema"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileLinkSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/profile/links/{link_id}":{"put":{"tags":["✏️ User Profile"],"summary":"Update profile link","description":"Updates an existing profile link.","operationId":"update_profile_link_api_v1_users__user_id__profile_links__link_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","description":"Link ID","title":"Link Id"},"description":"Link ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileLinkUpdateSchema"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileLinkSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["✏️ User Profile"],"summary":"Delete profile link","description":"Deletes a profile link.","operationId":"delete_profile_link_api_v1_users__user_id__profile_links__link_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","description":"Link ID","title":"Link Id"},"description":"Link ID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/profile/global":{"get":{"tags":["✏️ User Profile"],"summary":"Get Global Profile","description":"Retrieves the comprehensive GLOBAL profile for a user.","operationId":"get_global_profile_api_v1_users__user_id__profile_global_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/profile/server/{server_id}":{"get":{"tags":["✏️ User Profile"],"summary":"Get Server Profile","description":"Retrieves the comprehensive SERVER-SPECIFIC profile for a user.","operationId":"get_server_profile_api_v1_users__user_id__profile_server__server_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__user_profile__ServerProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/leaderboards/global/users":{"get":{"tags":["💫 All Leaderboards"],"summary":"Get Global User Leaderboard","description":"Returns the top users across ALL servers (values are summed).","operationId":"get_global_user_leaderboard_api_v1_leaderboards_global_users_get","parameters":[{"name":"metric","in":"query","required":true,"schema":{"enum":["messages","voice","level","reactions","economy","invites","counting","flag_game"],"type":"string","description":"The metric for the leaderboard","title":"Metric"},"description":"The metric for the leaderboard"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum 100 entries","default":100,"title":"Limit"},"description":"Maximum 100 entries"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaderboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/leaderboards/global/servers":{"get":{"tags":["💫 All Leaderboards"],"summary":"Get Global Server Leaderboard","description":"Returns the top servers (sum of all user stats on this server).","operationId":"get_global_server_leaderboard_api_v1_leaderboards_global_servers_get","parameters":[{"name":"metric","in":"query","required":true,"schema":{"enum":["messages","voice","level","reactions","economy","invites","counting","flag_game"],"type":"string","description":"The metric for the leaderboard","title":"Metric"},"description":"The metric for the leaderboard"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum 100 entries","default":100,"title":"Limit"},"description":"Maximum 100 entries"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaderboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/leaderboards/servers/{server_id}/leaderboard":{"get":{"tags":["💫 All Leaderboards"],"summary":"Get Server User Leaderboard","description":"Returns the top users for a specific server.","operationId":"get_server_user_leaderboard_api_v1_leaderboards_servers__server_id__leaderboard_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"metric","in":"query","required":true,"schema":{"enum":["messages","voice","level","reactions","economy","invites","counting","flag_game"],"type":"string","description":"The metric for the leaderboard","title":"Metric"},"description":"The metric for the leaderboard"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum 100 entries","default":100,"title":"Limit"},"description":"Maximum 100 entries"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaderboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/profile/customization":{"get":{"tags":["✏️ Server Profile"],"summary":"Get Server Customization","description":"Retrieves the profile customization settings for a server.","operationId":"get_server_customization_api_v1_servers__server_id__profile_customization_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerCustomizationSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["✏️ Server Profile"],"summary":"Update Server Customization","description":"Updates the profile customization settings for a server.\nRequires admin rights (`validate_server_access`).\n\nKEIN PREMIUM-CHECK - und hier stand jahrelang das Gegenteil.\n\nDer Docstring versprach \"Requires admin rights AND an active premium status\nfor the server\". Im Code steht nur `validate_server_access`. Wer das gelesen\nund geglaubt hat, hielt eine Bezahlschranke fuer gesetzt, die es nie gab.\n(Aufgefallen im Nachtaudit 2026-08-09 bei A-005, dort als Widerlegung\nNummer 4 vermerkt und nicht weiterverfolgt.)\n\nGEAENDERT WURDE DER TEXT, NICHT DAS VERHALTEN, und das ist Absicht: eine\nSchranke nachzuruesten nimmt sie kostenlosen Servern weg, die diese\nEinstellungen heute benutzen. Das ist eine Preisentscheidung und keine\nFehlerbehebung. Wenn sie fallen soll, gehoert sie ueber `can_create` /\n`feature_limits` gesetzt wie bei den uebrigen gemeterten Merkmalen - einen\nEintrag dafuer gibt es dort bisher nicht.\n\n`GET /servers/{id}/profile` liefert `is_premium` bereits mit, das Frontend\nkoennte also heute schon anzeigen, was ein Upgrade brachte, ohne dass die\nAPI jemandem etwas wegnimmt.","operationId":"update_server_customization_api_v1_servers__server_id__profile_customization_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerCustomizationSchema"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerCustomizationSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/profile":{"get":{"tags":["✏️ Server Profile"],"summary":"Get Server Profile","description":"OPTIMIERT: Retrieves the comprehensive profile for a server.\nCombines statistics from Message, Voice, Economy, Games & Community.\n\nOptimierungen:\n- asyncio.gather() für parallele DB-Queries\n- only()/values() für minimale Datenübertragung\n- Batch-Queries statt einzelner Aufrufe\n\n─── Warum hier Depends und validate_server_access stehen ───────────────\n\nSie standen bis 2026-09 NICHT hier, als einziger der 21 Endpunkte dieser\nDatei. Die Antwort traegt owner_id, die Abostufe und die interne\nAnpassungskonfiguration - jeder Unangemeldete konnte das fuer JEDE\nServer-ID abrufen, in der die Bot-Datenbank eine Zeile hat.\n\nDer Weg dahin war vermutlich der Name: es gibt einen zweiten Endpunkt\n`/public/servers/{id}/profile` (serverinfo.py), und DER ist absichtlich\noffen - er liefert die oeffentliche Profilseite und nichts darueber\nhinaus. Dieser hier ist der Dashboard-Zwilling und war nie dafuer\ngedacht.\n\nBeide Aufrufer im Frontend (ServerProfile.jsx:507,\nServerProfileSettings.jsx:848) senden bereits einen Bearer-Token; fuer sie\naendert sich nichts. Wer die oeffentlichen Daten will, nimmt weiterhin\n/public/servers/{id}/profile.","operationId":"get_server_profile_api_v1_servers__server_id__profile_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language (en-US or de)","default":"en-US","title":"Lang"},"description":"Language (en-US or de)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__server_profile__ServerProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/profile/tags":{"put":{"tags":["✏️ Server Profile"],"summary":"Update Server Tags","description":"Setzt die Tags für einen Server.\nÜberschreibt alle bestehenden Tags mit der neuen Liste.\nMaximal 5 Tags erlaubt.","operationId":"update_server_tags_api_v1_servers__server_id__profile_tags_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerTagsUpdateSchema"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response Update Server Tags Api V1 Servers  Server Id  Profile Tags Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/profile/tags/{tag_name}":{"delete":{"tags":["✏️ Server Profile"],"summary":"Delete Server Tag","description":"Entfernt einen spezifischen Tag von einem Server.","operationId":"delete_server_tag_api_v1_servers__server_id__profile_tags__tag_name__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"tag_name","in":"path","required":true,"schema":{"type":"string","description":"Name oder Slug des Tags","title":"Tag Name"},"description":"Name oder Slug des Tags"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"boolean","title":"Response Delete Server Tag Api V1 Servers  Server Id  Profile Tags  Tag Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/live-activity":{"get":{"tags":["✏️ Server Profile","Live Activity"],"summary":"Get Live Activity Dashboard","description":"Haupt-Dashboard: Aggregierte Live-Aktivität des Servers.\n\nLiefert auf einen Blick:\n- Aktuelle Voice-Aktivität (wer ist wo, wie lange)\n- Heutige/wöchentliche Nachrichten-Statistik\n- Aktivste Kanäle mit Nachrichtenfrequenz\n- Joins & Leaves (heute/Woche) mit Net Growth\n- Offene Tickets und aktive Giveaways\n- Moderations-Aktionen und Warnungen\n- Geburtstage diesen Monat\n- Auto-Role Gewinner der Woche/des Monats\n- Letzte Reviews\n\nOptimiert: Alle 24 Queries laufen parallel via asyncio.gather().\nUser/Channel-Info wird in Bulk-Lookups geladen (2 Queries statt N).","operationId":"get_live_activity_dashboard_api_v1_servers__server_id__live_activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveDashboardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/live-activity/voice":{"get":{"tags":["✏️ Server Profile","Live Activity"],"summary":"Get Live Voice Activity","description":"Wer ist gerade in welchem Voice-Channel, wie lange, mit welchem Status.","operationId":"get_live_voice_activity_api_v1_servers__server_id__live_activity_voice_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveVoiceOverview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/live-activity/feed":{"get":{"tags":["✏️ Server Profile","Live Activity"],"summary":"Get Activity Feed","description":"Chronologischer Activity Feed — kombiniert Events aus allen Quellen.\nFiltert optional nach Event-Typ. Pagination mit offset/limit.","operationId":"get_activity_feed_api_v1_servers__server_id__live_activity_feed_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Anzahl der Einträge","default":30,"title":"Limit"},"description":"Anzahl der Einträge"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Offset für Pagination","default":0,"title":"Offset"},"description":"Offset für Pagination"},{"name":"event_types","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Komma-getrennte Filter: join,leave,moderation,ticket,warning,review","title":"Event Types"},"description":"Komma-getrennte Filter: join,leave,moderation,ticket,warning,review"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityFeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/live-activity/tickets":{"get":{"tags":["✏️ Server Profile","Live Activity"],"summary":"Get Ticket Overview","description":"Ticket-Übersicht: Offene/Geclaimte, Closed heute/Woche,\nØ Claim-Zeit, Ø Bewertung, letzte 20 Tickets mit Ratings.","operationId":"get_ticket_overview_api_v1_servers__server_id__live_activity_tickets_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketStatsOverview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/live-activity/giveaways":{"get":{"tags":["✏️ Server Profile","Live Activity"],"summary":"Get Giveaway Overview","description":"Giveaway-Übersicht: Aktive + kürzlich beendete Giveaways.\nPro Giveaway: Titel, Preis, Channel, wie lange noch, Requirements,\nalle Teilnehmer (mit User-Info), und Gewinner.","operationId":"get_giveaway_overview_api_v1_servers__server_id__live_activity_giveaways_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"include_participants","in":"query","required":false,"schema":{"type":"boolean","description":"Teilnehmer-Liste mitladen?","default":true,"title":"Include Participants"},"description":"Teilnehmer-Liste mitladen?"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GiveawayOverviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/live-activity/birthdays":{"get":{"tags":["✏️ Server Profile","Live Activity"],"summary":"Get Birthday Overview","description":"Alle Geburtstage diesen Monat mit User-Info, Alter, und Countdown.","operationId":"get_birthday_overview_api_v1_servers__server_id__live_activity_birthdays_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BirthdayOverview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/live-activity/autorole-winners":{"get":{"tags":["✏️ Server Profile","Live Activity"],"summary":"Get Autorole Winners","description":"Auto-Role Gewinner der Woche und des Monats mit Statistiken.","operationId":"get_autorole_winners_api_v1_servers__server_id__live_activity_autorole_winners_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoRoleOverview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/live-activity/applications":{"get":{"tags":["✏️ Server Profile","Live Activity"],"summary":"Get Application Overview","description":"Bewerbungs-Übersicht: Pending/In Review/Accepted/Rejected + letzte 20.","operationId":"get_application_overview_api_v1_servers__server_id__live_activity_applications_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationOverview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/live-activity/reviews":{"get":{"tags":["✏️ Server Profile","Live Activity"],"summary":"Get Review Overview","description":"Bewertungs-Übersicht: Ø Rating, Verteilung (1-5★), letzte 20 Reviews.","operationId":"get_review_overview_api_v1_servers__server_id__live_activity_reviews_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewOverview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/live-activity/channels":{"get":{"tags":["✏️ Server Profile","Live Activity"],"summary":"Get Active Channels","description":"Top aktive Text-Channels (Msgs/h, Msgs/24h, Unique Users) + Voice-Channels.","operationId":"get_active_channels_api_v1_servers__server_id__live_activity_channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActiveChannelsOverview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/live-activity/moderation":{"get":{"tags":["✏️ Server Profile","Live Activity"],"summary":"Get Moderation Overview","description":"Moderations-Deep-Dive: Bans, Kicks, Timeouts, Warnungen mit User-Details.","operationId":"get_moderation_overview_api_v1_servers__server_id__live_activity_moderation_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerationOverview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/live-activity/member-movements":{"get":{"tags":["✏️ Server Profile","Live Activity"],"summary":"Get Member Movements","description":"Joins & Leaves mit Net Growth und chronologischer User-Liste.","operationId":"get_member_movements_api_v1_servers__server_id__live_activity_member_movements_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"description":"Zeitraum in Tagen","default":7,"title":"Days"},"description":"Zeitraum in Tagen"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberMovementOverview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/live-activity/announcements":{"get":{"tags":["✏️ Server Profile","Live Activity"],"summary":"Get Server Announcements","description":"Bot-Neuigkeiten (Banner) + Quick-Glance Server Stats.\nbot_news aus ServerSettings (key: 'bot_news_banners') — JSON Array.","operationId":"get_server_announcements_api_v1_servers__server_id__live_activity_announcements_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerAnnouncementsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/live-activity/top-users":{"get":{"tags":["✏️ Server Profile","Live Activity"],"summary":"Get Top Active Users","description":"Top 10 aktivste User heute: Meiste Nachrichten und meiste Voice-Zeit.\nInklusive Level/XP-Info.","operationId":"get_top_active_users_api_v1_servers__server_id__live_activity_top_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopActiveUsersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/live-activity/today":{"get":{"tags":["✏️ Server Profile","Live Activity"],"summary":"Get Today Activity","description":"Was passiert HEUTE auf dem Server?\n\nKombiniert auf einen Blick:\n- Geburtstage heute\n- Nachrichten-Aktivität (Top-Channels, Top-User)\n- Wer ist gerade im Voice\n- Alle Moderations-Aktionen heute (Bans, Kicks, Mutes, Warns)\n- Joins & Leaves heute\n- Giveaways (aktive, neue Teilnahmen, Giveaways die heute enden)\n- Tickets (geöffnet, geclaimed, geschlossen heute)\n- Log-Events (Channel/Rollen/Thread erstellt/gelöscht etc.)\n- Upcoming: Was passiert heute noch (Giveaway-Enden, Meetings)\n\nOptimiert: Alle Queries laufen parallel via asyncio.gather().\nUser-/Channel-Info in Bulk-Lookups (2 Queries statt N).","operationId":"get_today_activity_api_v1_servers__server_id__live_activity_today_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TodayActivityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/paddle":{"post":{"tags":["🪙 Paddle Zahlung"],"summary":"Paddle Webhook","operationId":"paddle_webhook_api_v1_webhooks_paddle_post","parameters":[{"name":"paddle-signature","in":"header","required":false,"schema":{"type":"string","title":"Paddle-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/discord":{"post":{"tags":["🪙 Discord Monetization"],"summary":"Discord Webhook","operationId":"discord_webhook_api_v1_webhooks_discord_post","parameters":[{"name":"x-signature-ed25519","in":"header","required":false,"schema":{"type":"string","title":"X-Signature-Ed25519"}},{"name":"x-signature-timestamp","in":"header","required":false,"schema":{"type":"string","title":"X-Signature-Timestamp"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/custom-shop/servers/{server_id}/items":{"get":{"tags":["🪙 Custom Shop","Custom Shop"],"summary":"Get Shop Items","description":"Fetches all shop items for a server\n\nQuery Parameters:\n- include_inactive: Show inactive items\n- category: Filter by category","operationId":"get_shop_items_api_v1_custom_shop_servers__server_id__items_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Inactive"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomShopItemResponse"},"title":"Response Get Shop Items Api V1 Custom Shop Servers  Server Id  Items Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🪙 Custom Shop","Custom Shop"],"summary":"Create Shop Item","description":"Creates a new shop item","operationId":"create_shop_item_api_v1_custom_shop_servers__server_id__items_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomShopItemCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomShopItemResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/custom-shop/servers/{server_id}/items/{item_id}":{"get":{"tags":["🪙 Custom Shop","Custom Shop"],"summary":"Get Shop Item","description":"Fetches a single shop item","operationId":"get_shop_item_api_v1_custom_shop_servers__server_id__items__item_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomShopItemResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["🪙 Custom Shop","Custom Shop"],"summary":"Update Shop Item","description":"Updates a shop item","operationId":"update_shop_item_api_v1_custom_shop_servers__server_id__items__item_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomShopItemUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomShopItemResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🪙 Custom Shop","Custom Shop"],"summary":"Delete Shop Item","description":"Deletes a shop item","operationId":"delete_shop_item_api_v1_custom_shop_servers__server_id__items__item_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/custom-shop/servers/{server_id}/purchases":{"get":{"tags":["🪙 Custom Shop","Custom Shop"],"summary":"Get Purchases","description":"Fetches purchase history\n\nQuery Parameters:\n- user_id: Filter by user\n- item_id: Filter by item\n- status: Filter by status (completed, failed, refunded)\n- limit: Max results (default: 50)","operationId":"get_purchases_api_v1_custom_shop_servers__server_id__purchases_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"item_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Item Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"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/CustomShopPurchaseResponse"},"title":"Response Get Purchases Api V1 Custom Shop Servers  Server Id  Purchases Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/custom-shop/servers/{server_id}/stats":{"get":{"tags":["🪙 Custom Shop","Custom Shop"],"summary":"Get Shop Stats","description":"Fetches shop statistics for a server","operationId":"get_shop_stats_api_v1_custom_shop_servers__server_id__stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/custom-shop/servers/{server_id}/items/{item_id}/stats":{"get":{"tags":["🪙 Custom Shop","Custom Shop"],"summary":"Get Item Stats","description":"Fetches detailed statistics for a single item","operationId":"get_item_stats_api_v1_custom_shop_servers__server_id__items__item_id__stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/custom-shop/servers/{server_id}/items/{item_id}/restock":{"post":{"tags":["🪙 Custom Shop","Custom Shop"],"summary":"Restock Item","description":"Restocks an item","operationId":"restock_item_api_v1_custom_shop_servers__server_id__items__item_id__restock_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestockRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/custom-shop/servers/{server_id}/purchases/{purchase_id}/refund":{"post":{"tags":["🪙 Custom Shop","Custom Shop"],"summary":"Refund Purchase","description":"Refunds a purchase","operationId":"refund_purchase_api_v1_custom_shop_servers__server_id__purchases__purchase_id__refund_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"purchase_id","in":"path","required":true,"schema":{"type":"integer","title":"Purchase Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"string","title":"Reason"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/custom-shop/servers/{server_id}/items/bulk-update":{"post":{"tags":["🪙 Custom Shop","Custom Shop"],"summary":"Bulk Update Items","description":"Updates multiple items at once","operationId":"bulk_update_items_api_v1_custom_shop_servers__server_id__items_bulk_update_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_bulk_update_items_api_v1_custom_shop_servers__server_id__items_bulk_update_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/custom-shop/servers/{server_id}/export/items":{"get":{"tags":["🪙 Custom Shop","Custom Shop"],"summary":"Export Items","description":"Exports all shop items as JSON","operationId":"export_items_api_v1_custom_shop_servers__server_id__export_items_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/catalog":{"get":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Get Catalog","description":"Alles, was das Dashboard ueber die moeglichen Wirkungen wissen muss.\n\nBewusst EIN Aufruf und keine 55: der Effekt-Editor baut daraus seine\nAuswahlfelder, und die duerfen nicht nacheinander erscheinen.\n\nDie Texte stehen NICHT hier drin, nur ihre Schluessel. Uebersetzt wird im\nFrontend, weil dort die Sprache des Betrachters bekannt ist und nicht die\ndes Kontos.","operationId":"get_catalog_api_v1_shop_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/shop/servers/{server_id}/settings":{"get":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Get Settings","operationId":"get_settings_api_v1_shop_servers__server_id__settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Update Settings","operationId":"update_settings_api_v1_shop_servers__server_id__settings_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EinstellungenAenderung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/categories":{"get":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"List Categories","operationId":"list_categories_api_v1_shop_servers__server_id__categories_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Create Category","operationId":"create_category_api_v1_shop_servers__server_id__categories_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KategorieEingabe"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/categories/{category_id}":{"patch":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Update Category","operationId":"update_category_api_v1_shop_servers__server_id__categories__category_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","title":"Category Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KategorieEingabe"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Delete Category","description":"Loescht ein Regal, nicht seine Ware.\n\nDie Artikel wandern in \"ohne Kategorie\" (das Fremdschluessel-Verhalten ist\nSET_NULL). Ein Regal wegzuraeumen darf nie heissen, den Inhalt\nwegzuwerfen - das erwartet niemand, und rueckgaengig machen kann man es\nnicht.","operationId":"delete_category_api_v1_shop_servers__server_id__categories__category_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","title":"Category Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/categories/reorder":{"post":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Reorder Categories","operationId":"reorder_categories_api_v1_shop_servers__server_id__categories_reorder_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_reorder_categories_api_v1_shop_servers__server_id__categories_reorder_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/items":{"get":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"List Items","operationId":"list_items_api_v1_shop_servers__server_id__items_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Inactive"}},{"name":"category_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Create Item","operationId":"create_item_api_v1_shop_servers__server_id__items_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArtikelEingabe"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/items/{item_id}":{"get":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Get Item","operationId":"get_item_api_v1_shop_servers__server_id__items__item_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Update Item","operationId":"update_item_api_v1_shop_servers__server_id__items__item_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArtikelAenderung"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Delete Item","description":"Loescht einen Artikel und nimmt seine laufenden Wirkungen mit.\n\nOhne den zweiten Teil bliebe ein geloeschter XP-Boost fuer immer aktiv:\ndie Zeile in `user_effects` haette kein Ablaufdatum mehr, das jemand setzt,\nund niemand koennte sie noch zuordnen.","operationId":"delete_item_api_v1_shop_servers__server_id__items__item_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/items/validate":{"post":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Validate Item","description":"Trockenlauf fuer den Effekt-Editor.\n\nGibt Beanstandungen, Staerke und Preisvorschlag zurueck, OHNE zu speichern.\nDas Dashboard ruft das bei jeder Aenderung auf, damit der Admin die Warnung\nsieht, bevor er speichert, und nicht danach.\n\nDas Durchschnittseinkommen kommt aus den echten Transaktionen dieses\nServers. Ohne diese Zahl waere jeder Preisvorschlag geraten: 5.000 Coins\nsind auf dem einen Server ein Nachmittag und auf dem anderen ein Monat.","operationId":"validate_item_api_v1_shop_servers__server_id__items_validate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_validate_item_api_v1_shop_servers__server_id__items_validate_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/items/reorder":{"post":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Reorder Items","description":"Die Reihenfolge im Dashboard ist die Reihenfolge im Laden.","operationId":"reorder_items_api_v1_shop_servers__server_id__items_reorder_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_reorder_items_api_v1_shop_servers__server_id__items_reorder_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/items/{item_id}/restock":{"post":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Restock Item","operationId":"restock_item_api_v1_shop_servers__server_id__items__item_id__restock_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_restock_item_api_v1_shop_servers__server_id__items__item_id__restock_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/purchases":{"get":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"List Purchases","operationId":"list_purchases_api_v1_shop_servers__server_id__purchases_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server 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":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"item_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Item Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/purchases/{purchase_id}/refund":{"post":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Refund Purchase","description":"Erstattet einen Kauf und nimmt die Wirkung MIT zurueck.\n\nDer zweite Teil ist der Punkt. Nur das Geld zurueckzugeben macht den Kauf\nzum Geschenk: der Kaeufer behielte den Boost und haette ihn umsonst.","operationId":"refund_purchase_api_v1_shop_servers__server_id__purchases__purchase_id__refund_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"purchase_id","in":"path","required":true,"schema":{"type":"integer","title":"Purchase Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_refund_purchase_api_v1_shop_servers__server_id__purchases__purchase_id__refund_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/stats":{"get":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Get Stats","description":"Was der Laden tut, in einer Antwort.","operationId":"get_stats_api_v1_shop_servers__server_id__stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/effects":{"get":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"List Active Effects","description":"Wer traegt gerade welche Wirkung.\n\nDiese Frage war vorher nicht zu beantworten: Boosts lagen als JSON-Text auf\ndem Profil, und \"wer hat einen XP-Boost\" haette einen Volltabellenscan ueber\nalle Profile gebraucht.","operationId":"list_active_effects_api_v1_shop_servers__server_id__effects_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/effects/{effect_id}":{"delete":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Revoke Effect","operationId":"revoke_effect_api_v1_shop_servers__server_id__effects__effect_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"effect_id","in":"path","required":true,"schema":{"type":"integer","title":"Effect Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/export":{"get":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Export Shop","description":"Das ganze Sortiment als Datei.\n\nOhne IDs und ohne Zaehler: was exportiert wird, soll auf einem ANDEREN\nServer einspielbar sein, und dort sind Zahlen aus diesem hier bestenfalls\nnutzlos. Verbunden wird ueber `key`.","operationId":"export_shop_api_v1_shop_servers__server_id__export_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/import":{"post":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Import Shop","description":"Spielt ein exportiertes Sortiment ein.\n\n`replace=False` (Standard) legt nur an, was es noch nicht gibt, und laesst\nBestehendes in Ruhe. Das ist die richtige Vorgabe: wer importiert, will\nmeistens ERGAENZEN, und ein Import, der stillschweigend ueberschreibt, ist\nnicht rueckgaengig zu machen.\n\n`replace` steht in der Adresse und nicht im Rumpf: sobald zwei Body-Felder\nnebeneinander stehen, bettet FastAPI BEIDE unter ihrem Namen ein, und der\nAufrufer muesste dann `{\"daten\": {...}, \"replace\": false}` schicken statt\nder Exportdatei selbst. Genau das tat `components/shop/api.js` nicht - der\nEndpunkt war so von der Oberflaeche aus gar nicht erreichbar.\n\nJeder Artikel geht durch DIESELBE Pruefung wie beim Anlegen von Hand:\nerst durch `ArtikelEingabe`, damit aus \"12\" eine 12 wird und ein unmoegliches\nFeld gar nicht erst ankommt, dann durch `pruefe_stammdaten` und\n`pruefe_effekte`. Ohne den ersten Schritt landete eine fremde Datei\nungeprueft in `ShopItem.create(**felder)`: eine Waehrung \"dollars\" waere im\nDiscord-Laden fuer immer unbezahlbar gewesen und haette im Browser\nklaglos Coins gekostet, und ein Preis \"abc\" haette den Import mitten im\nDurchlauf abgebrochen - mit dem, was bis dahin lief, bereits angelegt.","operationId":"import_shop_api_v1_shop_servers__server_id__import_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"replace","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Replace"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Daten"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/starter-packs":{"get":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"List Starter Packs","description":"Die fertigen Sortimente zur Auswahl.\n\nOhne Preise: die entstehen erst beim Anwenden aus dem tatsaechlichen\nDurchschnittseinkommen des Servers. Eine Zahl hier waere geraten.","operationId":"list_starter_packs_api_v1_shop_starter_packs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/shop/servers/{server_id}/starter-packs/{pack_key}":{"post":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Apply Starter Pack","description":"Legt ein fertiges Sortiment an.\n\nNichts wird ueberschrieben. Ein Artikel, dessen Schluessel es schon gibt,\nwird uebersprungen und gemeldet - wer ein Paket zweimal anwendet, will\nergaenzen und nicht seine eigenen Aenderungen verlieren.\n\nDie Preise entstehen hier: `price_factor` mal Durchschnittseinkommen,\ngerundet. Ein festes 5.000 waere auf dem einen Server ein Nachmittag und\nauf dem anderen ein Monat.","operationId":"apply_starter_pack_api_v1_shop_servers__server_id__starter_packs__pack_key__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"pack_key","in":"path","required":true,"schema":{"type":"string","title":"Pack Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/grant":{"post":{"tags":["🛒 Server-Shop","Server Shop"],"summary":"Grant Item","description":"Gibt einem Mitglied einen Artikel, ohne dass es zahlt.\n\nFuer Gewinnspiele, Wiedergutmachungen und Tests. Der Beleg wird trotzdem\ngeschrieben, mit `source=\"admin\"` und Preis 0: ein Artikel, der ohne Spur\nim Inventar auftaucht, ist spaeter nicht mehr erklaerbar, und die\nRueckerstattung braucht ihn.\n\nWirkungen, die Discord brauchen (Rollen, Nachrichten), kann die API nicht\nausfuehren - sie gehen denselben Weg wie beim Kauf im Browser: der Beleg\nwird als `pending` angelegt und der Bot liefert aus. Vorher wurden sie hier\nausgefuehrt, scheiterten an der fehlenden Gilde und standen danach als\n`needs_bot` in der Antwort. Das war ehrlich, aber folgenlos: das Mitglied\nbekam seine Rolle nicht, und der Admin hatte kein Mittel, das zu aendern,\nausser sie von Hand zu vergeben.","operationId":"grant_item_api_v1_shop_servers__server_id__grant_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_grant_item_api_v1_shop_servers__server_id__grant_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/shop":{"get":{"tags":["🛒 Server-Shop (oeffentlich)","Server Shop"],"summary":"Public Shop","description":"Der Laden, wie ihn ein Fremder sieht.","operationId":"public_shop_api_v1_public_servers__server_id__shop_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/shops/sitemap":{"get":{"tags":["🛒 Server-Shop (oeffentlich)","Server Shop"],"summary":"Shops Sitemap","description":"Die Laeden, die in die Sitemap gehoeren.\n\nNur freigegebene, und nur solche mit mindestens einem sichtbaren Artikel.\nEin Suchtreffer auf ein leeres Regal ist fuer beide Seiten verschwendet,\nund `shop-share-meta.ts` setzt genau diesen Fall ohnehin auf noindex - eine\nSitemap, die dorthin zeigt, waere ein Widerspruch in der eigenen Auskunft.\n\nBewusst schlank: nur ID und Zeitstempel. Die Sitemap baut daraus Adressen,\nsie braucht weder Namen noch Bild.","operationId":"shops_sitemap_api_v1_public_shops_sitemap_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":2000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/shop/items/{item_key}":{"get":{"tags":["🛒 Server-Shop (oeffentlich)","Server Shop"],"summary":"Public Item","operationId":"public_item_api_v1_public_servers__server_id__shop_items__item_key__get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"item_key","in":"path","required":true,"schema":{"type":"string","title":"Item Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/me":{"get":{"tags":["🛒 Server-Shop (oeffentlich)","Server Shop"],"summary":"My Shop State","description":"Guthaben, Besitz und laufende Wirkungen des Anmeldenden.\n\nKein `validate_server_access`: hier handelt ein MITGLIED fuer sich selbst,\nkein Admin fuer den Server. Wer kein Profil auf diesem Server hat, bekommt\nNullen und keine Fehlermeldung - er hat den Bot einfach noch nicht benutzt.","operationId":"my_shop_state_api_v1_shop_servers__server_id__me_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/me/purchases":{"get":{"tags":["🛒 Server-Shop (oeffentlich)","Server Shop"],"summary":"My Purchases","operationId":"my_purchases_api_v1_shop_servers__server_id__me_purchases_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/shop/servers/{server_id}/buy":{"post":{"tags":["🛒 Server-Shop (oeffentlich)","Server Shop"],"summary":"Buy","description":"Kauft einen Artikel im Browser.\n\nDie Reihenfolge ist festgelegt und nicht bequem:\n\n  1. Alles pruefen, was den Kauf verhindern koennte.\n  2. Geld abbuchen und Vorrat verringern.\n  3. Wirkungen setzen und Ware ins Inventar legen.\n  4. Beleg schreiben.\n\nSchlaegt Schritt 3 fehl, wird Schritt 2 zurueckgenommen. Andersherum\n(erst liefern, dann kassieren) waere der Fehlerfall ein Geschenk, und\ngenau den provoziert ein doppelter Klick.\n\nFuer Schritt 3 gibt es zwei Wege, und `lieferung.braucht_discord`\nentscheidet welchen: was die API selbst kann, macht sie hier; alles\nandere wird als `pending` verbucht und dem Bot uebergeben.","operationId":"buy_api_v1_shop_servers__server_id__buy_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_buy_api_v1_shop_servers__server_id__buy_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/events":{"get":{"tags":["📅 Team Calendar"],"summary":"Get Team Events","description":"Get all events. Team members have read access.","operationId":"get_team_events_api_v1_servers__server_id__team_events_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"include_cancelled","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Cancelled"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["📅 Team Calendar"],"summary":"Create Team Event","description":"Creates an event. Admins only.","operationId":"create_team_event_api_v1_servers__server_id__team_events_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEventRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/events/reach":{"get":{"tags":["📅 Team Calendar"],"summary":"Event Reach","description":"Wie viele Menschen eine Auswahl erreicht.\n\nDie Zahl steht im Formular neben der Auswahl, damit niemand eine\nBesprechung fuer eine Gruppe ansetzt, die leer ist. Ohne Auswahl ist es das\nganze Team.\n\nAls eigener Aufruf und nicht im Browser gerechnet: die Mitgliederliste einer\nGruppe steht nicht im Formular, und sie in die Seite zu laden, nur um eine\nZahl zu zeigen, waere teurer als diese Abfrage.\n\nBei einer gewaehlten Rolle zaehlt die Zahl ihre Traeger **im Team** und\nnicht in Discord. Das ist der Unterschied, den die Zahl gerade zeigen soll:\nwer nicht ins Panel kommt, bekommt den Termin nicht.","operationId":"event_reach_api_v1_servers__server_id__team_events_reach_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"group_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Kommaliste von Gruppennummern","title":"Group Ids"},"description":"Kommaliste von Gruppennummern"},{"name":"user_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Kommaliste von Nutzerkennungen","title":"User Ids"},"description":"Kommaliste von Nutzerkennungen"},{"name":"role_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Kommaliste von Rollenkennungen","title":"Role Ids"},"description":"Kommaliste von Rollenkennungen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/events/{event_id}":{"get":{"tags":["📅 Team Calendar"],"summary":"Get Event Details","description":"Get details of a specific event with grouped participants (including attendance).","operationId":"get_event_details_api_v1_servers__server_id__team_events__event_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["📅 Team Calendar"],"summary":"Update Team Event","description":"Updates an event. Admins only.","operationId":"update_team_event_api_v1_servers__server_id__team_events__event_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEventRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📅 Team Calendar"],"summary":"Cancel Team Event","description":"Cancels an event. Admins only.","operationId":"cancel_team_event_api_v1_servers__server_id__team_events__event_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}},{"name":"reason","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/events/{event_id}/attendance/add":{"post":{"tags":["📅 Team Calendar"],"summary":"Add Manual Attendance","description":"Jemanden von Hand als anwesend eintragen.\n\nBraucht `calendar.manage`. Vorher stand hier nur `validate_server_access`\nund darueber ein \"ggf. auf Admin-Rechte pruefen, wenn gewuenscht\": zu dem\nZeitpunkt war Anwesenheit eine Zahl in einer Liste. Seit Phase 8 steht sie\nals Erscheinquote in der Selbstansicht jedes Mitglieds, und damit ist sie\neine Angabe ueber eine Person. Wer sie von Hand setzen darf, entscheidet\njetzt das Rechtesystem und nicht mehr eine offene Frage im Kommentar.\n\nAus der Verbund-Runde nach Phase 7-8-9.","operationId":"add_manual_attendance_api_v1_servers__server_id__team_events__event_id__attendance_add_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualAttendanceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/events/{event_id}/attendance/{user_id}":{"delete":{"tags":["📅 Team Calendar"],"summary":"Remove Attendance","description":"Jemanden wieder aus der Anwesenheitsliste nehmen.\n\nDasselbe Recht wie beim Eintragen: eine Erscheinquote zu senken ist so viel\nwert wie sie zu heben.","operationId":"remove_attendance_api_v1_servers__server_id__team_events__event_id__attendance__user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/events/{event_id}/complete":{"post":{"tags":["📅 Team Calendar"],"summary":"Mark Event Complete","description":"Marks event as completed. Admins only.","operationId":"mark_event_complete_api_v1_servers__server_id__team_events__event_id__complete_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/events/{event_id}/rsvp":{"post":{"tags":["📅 Team Calendar"],"summary":"Rsvp To Event","description":"Team member RSVPs for event.","operationId":"rsvp_to_event_api_v1_servers__server_id__team_events__event_id__rsvp_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RSVPRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/events/{event_id}/participants":{"get":{"tags":["📅 Team Calendar"],"summary":"Get Event Participants","description":"Gets all participants of an event.","operationId":"get_event_participants_api_v1_servers__server_id__team_events__event_id__participants_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/absences":{"get":{"tags":["📅 Team Calendar"],"summary":"Get Team Absences","description":"Shows absences including user details.","operationId":"get_team_absences_api_v1_servers__server_id__team_absences_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["📅 Team Calendar"],"summary":"Report Absence","description":"Team member reports absence - optionally on their other team servers too.\n\nMit `sync_server_ids` entsteht dieselbe Abmeldung zusaetzlich auf diesen\nServern, jede nach den Regeln ihres Servers (Tuer, Freigabe,\nUeberschneidung - siehe api/utils/team_absence_sync.py). Die Abmeldung auf\nDIESEM Server haengt davon nicht ab: sie steht, bevor die anderen\ndrankommen, und `sync` in der Antwort sagt je Server, was dort geschah.","operationId":"report_absence_api_v1_servers__server_id__team_absences_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAbsenceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/absences/sync-targets":{"get":{"tags":["📅 Team Calendar"],"summary":"Get Absence Sync Targets","description":"Auf welchen anderen Servern eine Abmeldung von hier aus mit eingetragen werden kann.\n\nDas sind die Server, auf denen der aufrufende Mensch ebenfalls im Team ist\n(`team_absence_sync.team_server`), ohne diesen hier. Je Server dazu: ob er\nAbmeldungen genehmigen laesst, ob er fuer die naechste Abmeldung abgewaehlt\nist, und welche eigenen Abmeldungen dort schon laufen - damit das Formular\nvor dem Absenden zeigen kann, wo eine im Weg steht.\n\nDie Liste fragt nicht Discord, sondern die Datenbank; sie steht beim\nOeffnen des Formulars auf dem Bildschirm. Geprueft wird beim Eintragen, und\nzwar an der Tuer jedes einzelnen Servers.\n\nUeber den Public-MCP-Zugang ist die Liste leer: seine Freigabe gilt fuer\ndiesen einen Server, und die anderen gehen die KI nichts an.","operationId":"get_absence_sync_targets_api_v1_servers__server_id__team_absences_sync_targets_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/absences/{absence_id}":{"patch":{"tags":["📅 Team Calendar"],"summary":"Update Absence","description":"Eine Abmeldung nachtraeglich aendern.\n\nDas fehlte: anlegen, genehmigen und loeschen ging, aendern nicht. Wer sich\nim Datum vertippt hatte, musste loeschen und neu eintragen, und damit war\ndie Genehmigung weg und die Leitung bekam dieselbe Abmeldung ein zweites\nMal auf den Tisch.\n\n**Wer darf.** Die eigene - genehmigt nur dort, wo der Server keine\nFreigaben verlangt (`team_absence_sync.gesperrt`). Wer `absences.approve`\nhat, darf jede. Die Grenze ist absichtlich so: auf einem Server mit\nFreigabepflicht ist eine genehmigte Abmeldung eine Zusage der Leitung, und\nwer sie danach still um eine Woche verschieben koennte, haette eine Zusage\nfuer etwas, dem niemand zugestimmt hat. Ohne Freigabepflicht war\n\"genehmigt\" nie eine Zusage, sondern der Anfangszustand - dort zu sperren\nhiess nur: loeschen und neu eintragen.\n\n**Was danach passiert.** Aendert sich der Zeitraum einer genehmigten\nAbmeldung auf einem Server mit Freigabepflicht, faellt sie zurueck auf\n\"wartet\". Sonst stuende in der Uebersicht ein genehmigter Zeitraum, den\nniemand geprueft hat. Ohne Freigabepflicht bleibt sie genehmigt, wie jede\nneu eingetragene dort auch.\n\nGemeint ist ein Zeitraum, der sich wirklich aendert. Das Formular schickt\nbei jeder Aenderung alle vier Felder mit; bis hierher fiel deshalb auch\neine genehmigte Abmeldung zurueck, an der die Leitung nur einen Tippfehler\nim Grund verbessert hatte.\n\n**Mit `sync`** geht die Aenderung auch an die verknuepften Abmeldungen auf\nden anderen Servern - aber nur an der EIGENEN Abmeldung, und dort nur, wo\nman sie auch direkt aendern duerfte (`team_absence_sync.aendern`).","operationId":"update_absence_api_v1_servers__server_id__team_absences__absence_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"absence_id","in":"path","required":true,"schema":{"type":"integer","title":"Absence Id"}},{"name":"sync","in":"query","required":false,"schema":{"type":"boolean","description":"Also apply the change to the linked absences on your other servers","default":false,"title":"Sync"},"description":"Also apply the change to the linked absences on your other servers"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAbsenceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📅 Team Calendar"],"summary":"Delete Absence","description":"Deletes an absence (only own or admin).\n\nMit `sync` zieht der Mensch die eigene Abmeldung auch auf den anderen\nServern zurueck, auf denen sie in einem Zug mit dieser entstanden ist -\nje Server hinter dessen eigener Tuer. Fuer die Abmeldung eines anderen\ngilt `sync` nicht: die Leitung dieses Servers loescht, was auf ihrem\nServer steht, und sonst nichts.","operationId":"delete_absence_api_v1_servers__server_id__team_absences__absence_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"absence_id","in":"path","required":true,"schema":{"type":"integer","title":"Absence Id"}},{"name":"sync","in":"query","required":false,"schema":{"type":"boolean","description":"Also withdraw the linked absences on your other servers","default":false,"title":"Sync"},"description":"Also withdraw the linked absences on your other servers"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/absences/{absence_id}/approve":{"patch":{"tags":["📅 Team Calendar"],"summary":"Approve Absence","description":"Admin approves/rejects absence and updates events.","operationId":"approve_absence_api_v1_servers__server_id__team_absences__absence_id__approve_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"absence_id","in":"path","required":true,"schema":{"type":"integer","title":"Absence Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveAbsenceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/settings":{"get":{"tags":["📅 Team Calendar"],"summary":"Get Calendar Settings","description":"Gets calendar settings.","operationId":"get_calendar_settings_api_v1_servers__server_id__team_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["📅 Team Calendar"],"summary":"Update Calendar Settings","description":"Updates calendar settings. Admins only.","operationId":"update_calendar_settings_api_v1_servers__server_id__team_settings_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCalendarSettingsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/user-settings":{"get":{"tags":["📅 Team Calendar"],"summary":"Get User Settings","description":"Gets personal reminder settings.","operationId":"get_user_settings_api_v1_servers__server_id__team_user_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["📅 Team Calendar"],"summary":"Update User Settings","description":"Updates personal reminder settings.","operationId":"update_user_settings_api_v1_servers__server_id__team_user_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserSettingsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/templates":{"get":{"tags":["📅 Team Calendar"],"summary":"Get Event Templates","description":"Gets all event templates.","operationId":"get_event_templates_api_v1_servers__server_id__team_templates_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["📅 Team Calendar"],"summary":"Create Event Template","description":"Creates an event template. Admins only.","operationId":"create_event_template_api_v1_servers__server_id__team_templates_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTemplateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/templates/{template_id}/use":{"post":{"tags":["📅 Team Calendar"],"summary":"Create Event From Template","description":"Creates event from template. Admins only.","operationId":"create_event_from_template_api_v1_servers__server_id__team_templates__template_id__use_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}},{"name":"start_time","in":"query","required":true,"schema":{"type":"string","format":"date-time","title":"Start Time"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/templates/{template_id}":{"delete":{"tags":["📅 Team Calendar"],"summary":"Delete Event Template","description":"Deletes an event template. Admins only.","operationId":"delete_event_template_api_v1_servers__server_id__team_templates__template_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/events/{event_id}/protocol":{"get":{"tags":["📅 Team Calendar"],"summary":"Get Meeting Protocol","description":"Gets meeting protocol.","operationId":"get_meeting_protocol_api_v1_servers__server_id__team_events__event_id__protocol_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/events/{event_id}/protocol/notes":{"post":{"tags":["📅 Team Calendar"],"summary":"Add Protocol Notes","description":"Adds notes to protocol.","operationId":"add_protocol_notes_api_v1_servers__server_id__team_events__event_id__protocol_notes_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddProtocolNotesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/stats/user/{user_id}":{"get":{"tags":["📅 Team Calendar"],"summary":"Get User Statistics","description":"Gets statistics for a user.","operationId":"get_user_statistics_api_v1_servers__server_id__team_stats_user__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/settings/user":{"get":{"tags":["📅 Team Calendar"],"summary":"Get Team User Settings","description":"Gets the user's personal calendar settings.\nReturns default values if no settings exist yet.","operationId":"get_team_user_settings_api_v1_servers__server_id__team_settings_user_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["📅 Team Calendar"],"summary":"Update Team User Settings","description":"Creates or updates the user's personal calendar settings.","operationId":"update_team_user_settings_api_v1_servers__server_id__team_settings_user_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Settings Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/discord/channels":{"get":{"tags":["📅 Team Calendar"],"summary":"Get Server Channels","description":"Gets all channels of the server from Discord.","operationId":"get_server_channels_api_v1_servers__server_id__team_discord_channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/discord/roles":{"get":{"tags":["📅 Team Calendar"],"summary":"Get Server Roles","description":"Gets all roles of the server from Discord.","operationId":"get_server_roles_api_v1_servers__server_id__team_discord_roles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/me":{"get":{"tags":["👥 Team Gruppen"],"summary":"Get My Team Profile","description":"Meine Gruppen und mein aufgeloestes Rechteset.\n\nAntwortet auch dann sinnvoll, wenn der Server noch keine Gruppen hat: dann\nstehen die Rechte der automatisch angelegten Standardgruppe drin.","operationId":"get_my_team_profile_api_v1_servers__server_id__team_me_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/groups/permissions":{"get":{"tags":["👥 Team Gruppen"],"summary":"Get Permission Matrix","description":"Die Rechtematrix: welche Schluessel es gibt und wer sie hat.","operationId":"get_permission_matrix_api_v1_servers__server_id__team_groups_permissions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["👥 Team Gruppen"],"summary":"Save Permission Matrix","description":"Speichert Zellen der Matrix. Nur die geschickten, nicht die ganze Matrix.\n\nDas ist Absicht: zwei Menschen, die gleichzeitig an verschiedenen Zeilen\narbeiten, ueberschreiben sich sonst gegenseitig die halbe Tabelle. Wer nur\nschickt, was er angefasst hat, kann hoechstens dieselbe Zelle treffen.","operationId":"save_permission_matrix_api_v1_servers__server_id__team_groups_permissions_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatrixSave"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/groups/import-preview":{"get":{"tags":["👥 Team Gruppen"],"summary":"Preview Discord Import","description":"Welche Discord-Rollen kaemen als Gruppe in Frage, und was passierte damit.\n\nDer Trockenlauf sitzt bewusst in einem eigenen GET: die Vorschau ist ein\nBlick, kein Vorgang, und darf deshalb keinen POST brauchen.","operationId":"preview_discord_import_api_v1_servers__server_id__team_groups_import_preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/groups/import-from-discord":{"post":{"tags":["👥 Team Gruppen"],"summary":"Import Groups From Discord","description":"Uebernimmt Discord-Rollen als Gruppen. Mit `dry_run=true` passiert nichts.\n\nDas Ergebnis hat in beiden Faellen dieselbe Form, damit die Oberflaeche den\nTrockenlauf und den echten Lauf mit derselben Darstellung zeigen kann. Wer\nzwei Formate hat, hat zwei Darstellungen, und eine davon ist falsch.","operationId":"import_groups_from_discord_api_v1_servers__server_id__team_groups_import_from_discord_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/groups":{"get":{"tags":["👥 Team Gruppen"],"summary":"List Groups","description":"Alle Gruppen des Servers, mit Rechten und Mitgliederzahl.","operationId":"list_groups_api_v1_servers__server_id__team_groups_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["👥 Team Gruppen"],"summary":"Create Group","operationId":"create_group_api_v1_servers__server_id__team_groups_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/groups/{group_id}":{"patch":{"tags":["👥 Team Gruppen"],"summary":"Update Group","operationId":"update_group_api_v1_servers__server_id__team_groups__group_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["👥 Team Gruppen"],"summary":"Delete Group","description":"Loescht eine Gruppe.\n\n`reassign_to` zieht die Mitglieder vorher um. Ohne den Parameter verlieren\nsie die Gruppe ersatzlos, und die Oberflaeche muss vorher gefragt haben.","operationId":"delete_group_api_v1_servers__server_id__team_groups__group_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}},{"name":"reassign_to","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Gruppe, in die die Mitglieder umziehen","title":"Reassign To"},"description":"Gruppe, in die die Mitglieder umziehen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/groups/{group_id}/members":{"get":{"tags":["👥 Team Gruppen"],"summary":"List Group Members","operationId":"list_group_members_api_v1_servers__server_id__team_groups__group_id__members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["👥 Team Gruppen"],"summary":"Add Group Members","operationId":"add_group_members_api_v1_servers__server_id__team_groups__group_id__members_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberAdd"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/groups/{group_id}/members/{user_id}":{"delete":{"tags":["👥 Team Gruppen"],"summary":"Remove Group Member","operationId":"remove_group_member_api_v1_servers__server_id__team_groups__group_id__members__user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/sync/preflight":{"post":{"tags":["👥 Team Gruppen"],"summary":"Sync Preflight","description":"Was steht dem Abgleich im Weg?\n\nDer Gegner dokumentiert die Rollenhierarchie als Stolperfalle und\nueberlaesst den Rest dem Nutzer. Hier steht vorher, welche konkrete Rolle\nueber der Bot-Rolle liegt und deshalb nicht vergeben werden kann.","operationId":"sync_preflight_api_v1_servers__server_id__team_sync_preflight_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/sync/run":{"post":{"tags":["👥 Team Gruppen"],"summary":"Sync Run","description":"Trockenlauf oder echter Lauf.\n\nBeide bekommen denselben Plan aus derselben Funktion. Das ist der Grund,\nwarum der echte Lauf tut, was der Trockenlauf sagte: es ist derselbe Code,\neinmal ohne und einmal mit Schreibvorgang.","operationId":"sync_run_api_v1_servers__server_id__team_sync_run_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncRun"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/sync/log":{"get":{"tags":["👥 Team Gruppen"],"summary":"Sync Log","description":"Der Verlauf. Neueste zuerst, mit den Namen der Beteiligten.","operationId":"sync_log_api_v1_servers__server_id__team_sync_log_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":60,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/home":{"get":{"tags":["🏠 Team Start"],"summary":"Team Home","description":"Alles, was die Startseite braucht, in einer Antwort.","operationId":"team_home_api_v1_servers__server_id__team_home_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/boards":{"get":{"tags":["✅ Team Aufgaben"],"summary":"List Boards","description":"Alle Boards, auf die ich darf, mit Aufgabenzahl.","operationId":"list_boards_api_v1_servers__server_id__team_tasks_boards_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Archived"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["✅ Team Aufgaben"],"summary":"Create Board","operationId":"create_board_api_v1_servers__server_id__team_tasks_boards_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/boards/{board_id}":{"patch":{"tags":["✅ Team Aufgaben"],"summary":"Update Board","operationId":"update_board_api_v1_servers__server_id__team_tasks_boards__board_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"board_id","in":"path","required":true,"schema":{"type":"integer","title":"Board Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["✅ Team Aufgaben"],"summary":"Delete Board","description":"Loescht ein Board samt Aufgaben.\n\nArchivieren ist der Normalfall und laeuft ueber PATCH. Loeschen nimmt alles\nmit, deshalb steht die Zahl in der Antwort: die Oberflaeche fragt vorher\nund nennt sie.","operationId":"delete_board_api_v1_servers__server_id__team_tasks_boards__board_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"board_id","in":"path","required":true,"schema":{"type":"integer","title":"Board Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/board/{board_id}":{"get":{"tags":["✅ Team Aufgaben"],"summary":"Get Board","description":"Ein Board mit Spalten, Aufgaben und Schlagwoertern in einer Antwort.","operationId":"get_board_api_v1_servers__server_id__team_tasks_board__board_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"board_id","in":"path","required":true,"schema":{"type":"integer","title":"Board Id"}},{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Archived"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/boards/{board_id}/states":{"post":{"tags":["✅ Team Aufgaben"],"summary":"Create State","operationId":"create_state_api_v1_servers__server_id__team_tasks_boards__board_id__states_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"board_id","in":"path","required":true,"schema":{"type":"integer","title":"Board Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StateCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/states/{state_id}":{"patch":{"tags":["✅ Team Aufgaben"],"summary":"Update State","operationId":"update_state_api_v1_servers__server_id__team_tasks_states__state_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"state_id","in":"path","required":true,"schema":{"type":"integer","title":"State Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["✅ Team Aufgaben"],"summary":"Delete State","description":"Loescht eine Spalte.\n\nOhne `move_to` wird abgelehnt, solange noch Aufgaben darin stehen. Eine\nSpalte zu loeschen und dabei stillschweigend Aufgaben mitzunehmen waere der\nteuerste Fehlklick des ganzen Systems.","operationId":"delete_state_api_v1_servers__server_id__team_tasks_states__state_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"state_id","in":"path","required":true,"schema":{"type":"integer","title":"State Id"}},{"name":"move_to","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Spalte, in die die Aufgaben umziehen","title":"Move To"},"description":"Spalte, in die die Aufgaben umziehen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/boards/{board_id}/tasks":{"post":{"tags":["✅ Team Aufgaben"],"summary":"Create Task","operationId":"create_task_api_v1_servers__server_id__team_tasks_boards__board_id__tasks_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"board_id","in":"path","required":true,"schema":{"type":"integer","title":"Board Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/task/{task_id}":{"get":{"tags":["✅ Team Aufgaben"],"summary":"Get Task","description":"Eine Aufgabe mit Kommentaren, Aktivitaet und Checkliste.","operationId":"get_task_api_v1_servers__server_id__team_tasks_task__task_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["✅ Team Aufgaben"],"summary":"Update Task","operationId":"update_task_api_v1_servers__server_id__team_tasks_task__task_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["✅ Team Aufgaben"],"summary":"Delete Task","operationId":"delete_task_api_v1_servers__server_id__team_tasks_task__task_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/task/{task_id}/move":{"post":{"tags":["✅ Team Aufgaben"],"summary":"Move Task","description":"Spalte, Reihenfolge oder Board wechseln.\n\nBeim Boardwechsel bekommt die Aufgabe dort eine neue Nummer. Die alte steht\ndanach in der Aktivitaet, damit ein Verweis wie DEV-42 nachvollziehbar\nbleibt, auch wenn er ins Leere zeigt.","operationId":"move_task_api_v1_servers__server_id__team_tasks_task__task_id__move_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskMove"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/task/{task_id}/complete":{"post":{"tags":["✅ Team Aufgaben"],"summary":"Complete Task","description":"Eine Aufgabe erledigen: in die letzte Endspalte schieben.\n\nEs gibt diesen Endpunkt, weil \"erledigt\" von aussen (Startseite,\nDiscord-Befehl) eine Handlung ist und keine Spaltenwahl. Wer ihn aufruft,\nweiss nichts von den Spalten dieses Boards und soll es auch nicht muessen.\n\nOhne Endspalte antwortet er mit 409 statt still nichts zu tun.","operationId":"complete_task_api_v1_servers__server_id__team_tasks_task__task_id__complete_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/task/{task_id}/archive":{"post":{"tags":["✅ Team Aufgaben"],"summary":"Archive Task","operationId":"archive_task_api_v1_servers__server_id__team_tasks_task__task_id__archive_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}},{"name":"restore","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Restore"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/search":{"get":{"tags":["✅ Team Aufgaben"],"summary":"Search Tasks","description":"Titel, Nummer und Text ueber alle Boards mit Leserecht.\n\nEine Eingabe wie \"DEV-42\" wird als Nummer verstanden, alles andere als\nText. Ohne das muesste jemand wissen, dass die Nummer anders zu suchen ist\nals der Titel, und das weiss niemand.","operationId":"search_tasks_api_v1_servers__server_id__team_tasks_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/mine":{"get":{"tags":["✅ Team Aufgaben"],"summary":"My Tasks","description":"Was mir zugewiesen ist oder was ich verfolge.","operationId":"my_tasks_api_v1_servers__server_id__team_tasks_mine_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"include_watched","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Watched"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/task/{task_id}/comments":{"post":{"tags":["✅ Team Aufgaben"],"summary":"Add Comment","operationId":"add_comment_api_v1_servers__server_id__team_tasks_task__task_id__comments_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/comments/{comment_id}":{"delete":{"tags":["✅ Team Aufgaben"],"summary":"Delete Comment","description":"Eigene Kommentare darf jeder loeschen, fremde nur die Boardleitung.","operationId":"delete_comment_api_v1_servers__server_id__team_tasks_comments__comment_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"comment_id","in":"path","required":true,"schema":{"type":"integer","title":"Comment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/task/{task_id}/checklist":{"post":{"tags":["✅ Team Aufgaben"],"summary":"Add Checklist Item","operationId":"add_checklist_item_api_v1_servers__server_id__team_tasks_task__task_id__checklist_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChecklistCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/checklist/{item_id}":{"patch":{"tags":["✅ Team Aufgaben"],"summary":"Update Checklist Item","operationId":"update_checklist_item_api_v1_servers__server_id__team_tasks_checklist__item_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChecklistPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["✅ Team Aufgaben"],"summary":"Delete Checklist Item","operationId":"delete_checklist_item_api_v1_servers__server_id__team_tasks_checklist__item_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/boards/{board_id}/tags":{"post":{"tags":["✅ Team Aufgaben"],"summary":"Create Tag","operationId":"create_tag_api_v1_servers__server_id__team_tasks_boards__board_id__tags_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"board_id","in":"path","required":true,"schema":{"type":"integer","title":"Board Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/tags/{tag_id}":{"delete":{"tags":["✅ Team Aufgaben"],"summary":"Delete Tag","operationId":"delete_tag_api_v1_servers__server_id__team_tasks_tags__tag_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"tag_id","in":"path","required":true,"schema":{"type":"integer","title":"Tag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/tasks/boards/{board_id}/access":{"get":{"tags":["✅ Team Aufgaben"],"summary":"Get Board Access","operationId":"get_board_access_api_v1_servers__server_id__team_tasks_boards__board_id__access_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"board_id","in":"path","required":true,"schema":{"type":"integer","title":"Board Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["✅ Team Aufgaben"],"summary":"Set Board Access","description":"Ersetzt die Zugriffsregeln eines Boards vollstaendig.\n\nEine leere Liste macht das Board wieder fuer das ganze Team offen. Das ist\nnicht dasselbe wie \"niemand darf\": ein Board, das niemand mehr oeffnen kann,\nwaere ein Datengrab, und der Weg dorthin darf nicht ein leergeraeumtes\nFormular sein.","operationId":"set_board_access_api_v1_servers__server_id__team_tasks_boards__board_id__access_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"board_id","in":"path","required":true,"schema":{"type":"integer","title":"Board Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessSet"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/saison":{"get":{"tags":["🎃 Saison"],"summary":"Saison Zustand","description":"Was das Halloween-Paket auf diesem Server kann und was schon laeuft.","operationId":"saison_zustand_api_v1_servers__server_id__saison_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/saison/halloween":{"post":{"tags":["🎃 Saison"],"summary":"Halloween Anwenden","description":"Die gewaehlten Bausteine anlegen. Was schon laeuft, bleibt, wie es ist.\n\nAntwortet mit dem neuen Zustand und je Baustein einem Wort:\n`angelegt`, `schon_da`, `nicht_verfuegbar` oder `abgelehnt`.","operationId":"halloween_anwenden_api_v1_servers__server_id__saison_halloween_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Auswahl"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/saison/halloween/zuruecknehmen":{"post":{"tags":["🎃 Saison"],"summary":"Halloween Zuruecknehmen","description":"Nimmt zurueck, was das Paket angelegt hat - und nur das.\n\nJe Baustein so schonend wie moeglich:\n\n  karte   Schalter aus. Der eigene Hintergrund war nie weg.\n  xp      Das Ereignis wird geloescht.\n  saison  Eine GEPLANTE Saison wird geloescht. Eine LAUFENDE bleibt\n          (`laeuft_weiter`): ihre Rangliste gehoert den Mitgliedern, und\n          wer sie beenden will, tut das auf der Level-Seite, wo die\n          Abrechnung steht.\n  shop    Die Artikel verlassen das Regal (`available_until` = jetzt).\n          Geloescht wird nichts - wer einen gekauft hat, behaelt ihn.","operationId":"halloween_zuruecknehmen_api_v1_servers__server_id__saison_halloween_zuruecknehmen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Auswahl"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/news":{"get":{"tags":["📣 Team Ankuendigungen"],"summary":"List News","description":"Die Ankuendigungen, die ich sehen darf. Neueste zuerst.","operationId":"list_news_api_v1_servers__server_id__team_news_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"include_drafts","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Drafts"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["📣 Team Ankuendigungen"],"summary":"Create News","description":"Legt einen Entwurf an. Veroeffentlicht wird getrennt.","operationId":"create_news_api_v1_servers__server_id__team_news_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/news/seen":{"post":{"tags":["📣 Team Ankuendigungen"],"summary":"Mark Seen","description":"Gelesen heisst: war auf dem Bildschirm.\n\nDie Oberflaeche schickt das gesammelt, nachdem die Liste steht. Ein Aufruf\nje Karte waeren zwanzig Aufrufe fuer eine Zahl, die niemand in Echtzeit\nbraucht.","operationId":"mark_seen_api_v1_servers__server_id__team_news_seen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"integer"},"title":"Ids"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/news/{news_id}/ack":{"post":{"tags":["📣 Team Ankuendigungen"],"summary":"Acknowledge","description":"Zur Kenntnis genommen. Der Knopf, nach dem die Leitung fragt.\n\nGeprueft wird nicht nur das Recht, sondern auch die Sichtbarkeit. `news.view`\nallein wuerde bedeuten, dass jemand mit einer geratenen Nummer eine\nAnkuendigung bestaetigen kann, die gar nicht an ihn ging. Der Lesestand der\nLeitung waere dann falsch, und niemand koennte sagen, woher der Name kommt.","operationId":"acknowledge_api_v1_servers__server_id__team_news__news_id__ack_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"news_id","in":"path","required":true,"schema":{"type":"integer","title":"News Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/news/{news_id}":{"patch":{"tags":["📣 Team Ankuendigungen"],"summary":"Update News","description":"Aendert einen Entwurf oder korrigiert eine veroeffentlichte Ankuendigung.\n\nDer Lesestand bleibt beim Bearbeiten stehen. Ihn zurueckzusetzen waere die\nnaheliegende Reaktion und die falsche: eine getippte Kommastelle wuerde\nzwanzig Leute erneut zur Bestaetigung zwingen.","operationId":"update_news_api_v1_servers__server_id__team_news__news_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"news_id","in":"path","required":true,"schema":{"type":"integer","title":"News Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📣 Team Ankuendigungen"],"summary":"Delete News","operationId":"delete_news_api_v1_servers__server_id__team_news__news_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"news_id","in":"path","required":true,"schema":{"type":"integer","title":"News Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/news/{news_id}/publish":{"post":{"tags":["📣 Team Ankuendigungen"],"summary":"Publish News","description":"Veroeffentlicht und schickt nach Discord.\n\nDer Discord-Versand laeuft ueber den Bot (Redis-Ereignis) und nicht von\nhier: nur der Bot kennt den Kanal, seine Rechte darauf und die\nNachrichten-ID, die er sich merken muss.","operationId":"publish_news_api_v1_servers__server_id__team_news__news_id__publish_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"news_id","in":"path","required":true,"schema":{"type":"integer","title":"News Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/news/{news_id}/readers":{"get":{"tags":["📣 Team Ankuendigungen"],"summary":"Readers","description":"Wer gelesen, wer bestaetigt und wer noch gar nichts getan hat.\n\nDie dritte Liste ist die, um die es geht. Ohne sie waere die\nLesebestaetigung eine Zahl, mit ihr ist sie ein Werkzeug.","operationId":"readers_api_v1_servers__server_id__team_news__news_id__readers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"news_id","in":"path","required":true,"schema":{"type":"integer","title":"News Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/news/{news_id}/remind":{"post":{"tags":["📣 Team Ankuendigungen"],"summary":"Remind","description":"Erinnerung an die Offenen, per Direktnachricht.\n\nTrifft ausdruecklich nur, wer noch offen ist. Eine Erinnerung an jemanden,\nder geliefert hat, ist genau die Art Nachricht, die Erinnerungen entwertet.\n\nWas \"geliefert\" heisst, haengt an `requires_ack` und ist der Grund, warum\nhier nicht einfach \"hat gelesen\" steht: verlangt eine Ankuendigung eine\nBestaetigung, dann ist Lesen nicht die Pflicht. Wer sie geoeffnet und den\nKnopf nicht gedrueckt hat, ist genau der, den die Erinnerung meint.\n\nDieselbe Regel steht in `newsCore.openReaders`, damit die Zahl auf dem Knopf\nund die Zahl der verschickten Nachrichten dieselbe ist.","operationId":"remind_api_v1_servers__server_id__team_news__news_id__remind_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"news_id","in":"path","required":true,"schema":{"type":"integer","title":"News Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/news/templates":{"get":{"tags":["📣 Team Ankuendigungen"],"summary":"List Templates","operationId":"list_templates_api_v1_servers__server_id__team_news_templates_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["📣 Team Ankuendigungen"],"summary":"Create Template","operationId":"create_template_api_v1_servers__server_id__team_news_templates_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/news/templates/{template_id}":{"delete":{"tags":["📣 Team Ankuendigungen"],"summary":"Delete Template","operationId":"delete_template_api_v1_servers__server_id__team_news_templates__template_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/news/reach":{"get":{"tags":["📣 Team Ankuendigungen"],"summary":"Reach Preview","description":"Wie viele Menschen die aktuelle Auswahl erreicht.\n\nSteht live unter der Empfaengerauswahl. Ohne diese Zahl waehlt man Gruppen\naus und erfaehrt erst nach dem Senden, ob man drei oder dreissig Leute\nangeschrieben hat.","operationId":"reach_preview_api_v1_servers__server_id__team_news_reach_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"group_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"integer"}},{"type":"null"}],"title":"Group Ids"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/members":{"get":{"tags":["👥 Team Mitglieder"],"summary":"List Members","description":"Die Mitgliederliste mit Kennzahlen.\n\nEin Aufruf, alle Zahlen. Die Alternative waere eine Zeile je Person und ein\nNachladen je Zeile, und bei vierzig Leuten ist das eine Liste, die sich\nsichtbar aufbaut.\n\nDie Punkte stehen nur da, wenn ich sie sehen darf. Wer `members.view` hat,\naber nicht `members.discipline`, sieht die Leute und ihre Arbeit, nicht ihre\nVerwarnungen.","operationId":"list_members_api_v1_servers__server_id__team_members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/roster":{"get":{"tags":["👥 Team Mitglieder"],"summary":"Roster","description":"Wer heute zum Team gehoert. Name, Bild, sonst nichts.\n\n`GET /members` daneben beantwortet dieselbe Frage mit allen Kennzahlen -\nund verlangt dafuer `members.view`. Das ist fuer eine Personalliste richtig\nund fuer die Frage \"wer ist ueberhaupt im Team\" zu viel: der Kalender, die\nAufgaben und die Zielgruppenauswahl brauchen die Namen, damit ein Supporter\nsich abmelden oder jemanden einladen kann. Ein Recht auf die Personalakte\nhat er dafuer nicht.\n\nDeshalb hier nur die Besetzung, offen fuer jedes Teammitglied, und die\nZahlen bleiben, wo sie hingehoeren.\n\n**Warum es diesen Endpunkt ueberhaupt gibt.** Die Oberflaechen haben sich\nihre Teamliste bis hierher aus der Aktivitaets-Rangliste\n(`GET /activity`) gebaut, weil das der einzige Endpunkt war, der Namen und\nBilder aller Rollentraeger lieferte. Das ist eine Auswertung und keine\nBesetzung, und der Unterschied faellt genau dort auf, wo er weh tut:\n\n  - Wer nur ueber eine Panel-Gruppe im Team steht und die Discord-Rolle\n    nicht traegt, kommt dort nicht vor.\n  - Die Antwort liegt eine halbe Stunde im Cache. Ein neu aufgenommener\n    Mensch fehlt so lange in jeder Auswahl, die aus ihr gebaut wird.\n\n`team_user_ids` ist dieselbe Menge, die die Mitgliederliste, die\nZielgruppen und die Ankuendigungen benutzen: Traeger einer Team-Rolle plus\nalle, die in einer Gruppe stehen.\n\n`has_left` bleibt drin und wird nicht stillschweigend gefiltert. Wer den\nServer verlassen hat, aber noch in einer Gruppe steht, ist ein Eintrag, den\njemand aufraeumen muss; ihn hier wegzulassen hiesse, das Aufraeumen zu\nverstecken. Was die einzelne Oberflaeche daraus macht, entscheidet sie\nselbst.\n\n**Sechzig Sekunden Cache, und zwar aus einem konkreten Grund.**\n`team_user_ids` liest die Rollen aller Servermitglieder; auf einem grossen\nServer ist das eine Abfrage, die man nicht bei jedem Seitenaufruf jedes\nTeammitglieds haben will - und genau so wird dieser Endpunkt benutzt.\n\nDie Antwort ist fuer alle im Team dieselbe, also reicht `server_id` als\nSchluessel. Kein `vary_by_user` und kein `vary_by_lang`: hier wird nichts\nnach Aufrufer gefiltert und nichts uebersetzt. Der `guard` laeuft trotzdem\nbei **jedem** Aufruf, auch beim Treffer - sonst laege die Besetzung eines\nfremden Servers eine Minute lang frei.\n\nDie Minute ist keine Wartezeit fuer den Betrieb: `perms.invalidate` raeumt\ndiesen Eintrag mit, und die steht an jeder Stelle, die die Besetzung\naendert - Gruppenzuordnung, Rollenabgleich, Team-Rolle in den\nEinstellungen. Die TTL ist die Grenze fuer den Fall, dass eine Raeumung\nausfaellt: eine Verzoegerung, kein Dauerzustand. Dieselbe Rechnung wie\nbeim Rechte-Cache daneben.","operationId":"roster_api_v1_servers__server_id__team_roster_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/members/{user_id}":{"get":{"tags":["👥 Team Mitglieder"],"summary":"Member File","description":"Die ganze Akte in einem Aufruf.\n\nReiter der Oberflaeche und Abschnitte hier sind dieselben: Ueberblick,\nVerlauf, Verwarnungen, Anwesenheit, Arbeit, Notizen. Wer einen Reiter\noeffnet, wartet nicht noch einmal.","operationId":"member_file_api_v1_servers__server_id__team_members__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/members/penalties":{"post":{"tags":["👥 Team Mitglieder"],"summary":"Create Penalty","description":"Eine Verwarnung vergeben.\n\nNicht gegen sich selbst: eine Verwarnung, die man sich selbst ausstellt, ist\nkeine, und der Fall ist haeufiger ein Versehen als eine Absicht.","operationId":"create_penalty_api_v1_servers__server_id__team_members_penalties_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PenaltyCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/members/penalties/{penalty_id}/void":{"post":{"tags":["👥 Team Mitglieder"],"summary":"Void Penalty","description":"Eine Verwarnung zuruecknehmen.\n\nKein Loeschen. Wer eine Akte loeschen kann, kann eine Geschichte\numschreiben; hier bleibt sichtbar, dass es sie gab, wer sie zurueckgenommen\nhat und warum.","operationId":"void_penalty_api_v1_servers__server_id__team_members_penalties__penalty_id__void_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"penalty_id","in":"path","required":true,"schema":{"type":"integer","title":"Penalty Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PenaltyVoid"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/members/notes":{"post":{"tags":["👥 Team Mitglieder"],"summary":"Create Note","description":"Eine Notiz anlegen.\n\n`members.view` reicht dafuer nicht: eine Notiz in einer fremden Akte ist\neine Personalsache, auch wenn sie freundlich gemeint ist.","operationId":"create_note_api_v1_servers__server_id__team_members_notes_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/members/notes/{note_id}":{"delete":{"tags":["👥 Team Mitglieder"],"summary":"Delete Note","description":"Eine Notiz loeschen.\n\nAnders als bei einer Verwarnung ist das hier richtig: eine Notiz ist eine\nBeobachtung und keine Massnahme. Es gibt nichts, was durch ihr Verschwinden\nunauffindbar wuerde.","operationId":"delete_note_api_v1_servers__server_id__team_members_notes__note_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/members/rules/list":{"get":{"tags":["👥 Team Mitglieder"],"summary":"List Rules","description":"Die Stufen des Servers.\n\nDer Pfad endet auf `/list`, damit er nicht mit `/members/{user_id}`\nkollidiert: eine Nummer und ein Wort sind fuer den Router dasselbe, und\n\"rules\" waere sonst eine Nutzerkennung.","operationId":"list_rules_api_v1_servers__server_id__team_members_rules_list_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["👥 Team Mitglieder"],"summary":"Save Rules","description":"Die Stufen setzen, alle auf einmal.\n\nGanz ersetzen statt einzeln pflegen: es sind selten mehr als vier, sie\nhaengen voneinander ab, und eine Stufe zu vergessen faellt beim Speichern\neiner Liste eher auf als beim Loeschen einer Zeile.","operationId":"save_rules_api_v1_servers__server_id__team_members_rules_list_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RuleUpsert"},"title":"Rules"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/members/penalties/recent":{"get":{"tags":["👥 Team Mitglieder"],"summary":"Recent Penalties","description":"Die letzten Verwarnungen im Team.\n\nFuer die Leitung, die nicht Akte fuer Akte durchgehen will. Zeigt auch\nabgelaufene und zurueckgenommene, weil die Frage \"was ist zuletzt passiert\"\nbeide einschliesst.","operationId":"recent_penalties_api_v1_servers__server_id__team_members_penalties_recent_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/shifts":{"get":{"tags":["🕒 Team Dienstplan"],"summary":"Week Grid","description":"Die Woche in einem Aufruf: Plaene, Raster, wer jetzt Dienst hat, meine\nnaechste Schicht und wer wegen Urlaub gesperrt ist.\n\nEin Aufruf und nicht fuenf: das Raster ist eine Ansicht, kein Formular, und\nfuenf Ladezustaende auf einer Ansicht sind vier zu viel.","operationId":"week_grid_api_v1_servers__server_id__team_shifts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Ein Tag der gewuenschten Woche, YYYY-MM-DD","title":"Week"},"description":"Ein Tag der gewuenschten Woche, YYYY-MM-DD"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/shifts/claim":{"post":{"tags":["🕒 Team Dienstplan"],"summary":"Claim Shift","description":"Eine Schicht uebernehmen. Ein Klick, keine Bestaetigung.\n\nAlle Gruende, die dagegen sprechen, werden hier noch einmal geprueft und\nnicht nur in der Oberflaeche: die Zelle im Browser kann eine Minute alt\nsein, und in dieser Minute kann jemand anders zugegriffen haben.","operationId":"claim_shift_api_v1_servers__server_id__team_shifts_claim_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/shifts/claims/{claim_id}/drop":{"post":{"tags":["🕒 Team Dienstplan"],"summary":"Drop Shift","description":"Eine Schicht abgeben.\n\nDie Stelle wird wieder frei, die Zeile bleibt. Bei einer Schicht, die\ndanach niemand uebernommen hat, ist im Nachhinein die Frage \"wer hatte sie\nurspruenglich\" genau die, die man stellt.\n\nWer `shifts.manage` hat, darf auch fuer andere abgeben. Das ist kein\nEingriff, sondern der Fall, in dem jemand krank ist und selbst nicht mehr\ndazu kommt.","operationId":"drop_shift_api_v1_servers__server_id__team_shifts_claims__claim_id__drop_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"claim_id","in":"path","required":true,"schema":{"type":"integer","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/shifts/claims/{claim_id}/swap":{"post":{"tags":["🕒 Team Dienstplan"],"summary":"Swap Shift","description":"Eine Schicht an eine bestimmte Person uebergeben.\n\nAnders als beim Abgeben bleibt die Stelle nicht offen. Die alte Zeile wird\nauf `swapped` gesetzt und merkt sich, an wen; die neue Person bekommt eine\neigene Zeile. Beide stehen danach im Verlauf, und man sieht, dass es ein\nTausch war und kein Zufall.\n\nGeprueft wird die neue Person nach denselben Regeln wie beim Uebernehmen.\nJemanden in eine Schicht zu tauschen, die er wegen Urlaub gar nicht\nuebernehmen duerfte, waere ein Weg um die Regel herum.","operationId":"swap_shift_api_v1_servers__server_id__team_shifts_claims__claim_id__swap_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"claim_id","in":"path","required":true,"schema":{"type":"integer","title":"Claim Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwapTo"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/shifts/plans":{"post":{"tags":["🕒 Team Dienstplan"],"summary":"Create Plan","description":"Legt einen Dienstplan an.","operationId":"create_plan_api_v1_servers__server_id__team_shifts_plans_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/shifts/plans/{plan_id}":{"patch":{"tags":["🕒 Team Dienstplan"],"summary":"Update Plan","description":"Aendert einen Dienstplan.","operationId":"update_plan_api_v1_servers__server_id__team_shifts_plans__plan_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"plan_id","in":"path","required":true,"schema":{"type":"integer","title":"Plan Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🕒 Team Dienstplan"],"summary":"Delete Plan","description":"Loescht einen Dienstplan mit allen Fenstern und Uebernahmen.\n\nAnders als bei einer Verwarnung ist das hier richtig: ein Dienstplan ist\neine Absprache und keine Massnahme. Was verschwindet, ist ein Raster, und\ndie Antwort sagt, wie viele Uebernahmen daran hingen.","operationId":"delete_plan_api_v1_servers__server_id__team_shifts_plans__plan_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"plan_id","in":"path","required":true,"schema":{"type":"integer","title":"Plan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/shifts/plans/{plan_id}/slots":{"post":{"tags":["🕒 Team Dienstplan"],"summary":"Create Slot","description":"Legt ein Zeitfenster im Wochenraster an.","operationId":"create_slot_api_v1_servers__server_id__team_shifts_plans__plan_id__slots_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"plan_id","in":"path","required":true,"schema":{"type":"integer","title":"Plan Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlotCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["🕒 Team Dienstplan"],"summary":"List Slots","description":"Die Fenster eines Plans, fuer den Bearbeitungsdialog.","operationId":"list_slots_api_v1_servers__server_id__team_shifts_plans__plan_id__slots_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"plan_id","in":"path","required":true,"schema":{"type":"integer","title":"Plan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/shifts/slots/{slot_id}":{"patch":{"tags":["🕒 Team Dienstplan"],"summary":"Update Slot","description":"Aendert ein Zeitfenster.\n\nBestehende Uebernahmen bleiben stehen, auch wenn sich die Zeit verschiebt.\nSie zu loeschen waere die naheliegende Reaktion und die falsche: wer\nMontagabend zugesagt hat, hat Montagabend zugesagt, und ob die halbe Stunde\nVerschiebung fuer ihn passt, entscheidet er.","operationId":"update_slot_api_v1_servers__server_id__team_shifts_slots__slot_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"slot_id","in":"path","required":true,"schema":{"type":"integer","title":"Slot Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlotPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🕒 Team Dienstplan"],"summary":"Delete Slot","description":"Loescht ein Zeitfenster mit allen Uebernahmen daran.","operationId":"delete_slot_api_v1_servers__server_id__team_shifts_slots__slot_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"slot_id","in":"path","required":true,"schema":{"type":"integer","title":"Slot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/shifts/understaffed":{"get":{"tags":["🕒 Team Dienstplan"],"summary":"Understaffed","description":"Unterbesetzte Schichten in den naechsten Stunden.\n\nFuer die Startseite und fuer die Meldung im Team-Kanal. Nur kuenftige:\neine Schicht, die gestern unterbesetzt war, ist keine Warnung mehr, sondern\nein Vorwurf.","operationId":"understaffed_api_v1_servers__server_id__team_shifts_understaffed_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":336,"minimum":1,"default":48,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/worries":{"post":{"tags":["📮 Team Kummerkasten"],"summary":"Create Worry","description":"Einen Fall einreichen.\n\nBraucht kein besonderes Recht, nur Teamzugehoerigkeit: der Kummerkasten ist\nfuer die da, die keine Verwaltungsrechte haben.\n\nBei `anonymous` wird die Kennung **nicht** gespeichert. Die Zeile bekommt\nkein Feld, aus dem sich die Person ableiten liesse, und diese Funktion ist\ndie einzige Stelle, an der das entschieden wird.","operationId":"create_worry_api_v1_servers__server_id__team_worries_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorryCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["📮 Team Kummerkasten"],"summary":"List Worries","description":"Die Faelle, um die sich jemand kuemmern muss.\n\nBei anonymen Faellen steht kein Name, weil keiner gespeichert ist. Die\nListe sagt das ausdruecklich, statt eine leere Stelle zu lassen, die wie\nein Ladefehler aussieht.","operationId":"list_worries_api_v1_servers__server_id__team_worries_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/worries/mine":{"get":{"tags":["📮 Team Kummerkasten"],"summary":"My Worries","description":"Meine nicht anonymen Faelle.\n\nAnonyme stehen hier nicht, und das ist keine Luecke: sie haben keine\nKennung, also gibt es nichts, wonach sich suchen liesse. Wer einen anonymen\nFall wiederfinden will, braucht sein Kuerzel, und darauf weist die\nOberflaeche vor dem Absenden hin.","operationId":"my_worries_api_v1_servers__server_id__team_worries_mine_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/worries/by-code/{code}":{"get":{"tags":["📮 Team Kummerkasten"],"summary":"Worry By Code","description":"Einen Fall ueber sein Kuerzel oeffnen.\n\nDas Kuerzel ist der Zugang. Bei einem benannten Fall kommt die Pruefung\ndazu, dass er einem auch gehoert; warum das beim anonymen nicht geht, steht\nbei `_by_code`.\n\nInterne Notizen kommen hier nie mit, auch nicht fuer die Leitung: wer\nLeitung ist, oeffnet den Fall ueber die Fallliste.","operationId":"worry_by_code_api_v1_servers__server_id__team_worries_by_code__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/worries/by-code/{code}/reply":{"post":{"tags":["📮 Team Kummerkasten"],"summary":"Reply By Code","description":"Als Einreicher auf eine Antwort antworten.\n\nDer Verlauf laeuft in beide Richtungen ueber dasselbe Kuerzel. `author_id`\nbleibt bei einem anonymen Fall leer, sonst waere die Anonymitaet mit der\nersten Rueckfrage aufgehoben.\n\n`is_internal` wird hier ignoriert. Eine interne Notiz ist etwas, das die\nLeitung fuer sich schreibt, und ein Einreicher hat dafuer keinen Anlass und\nkeine Berechtigung.","operationId":"reply_by_code_api_v1_servers__server_id__team_worries_by_code__code__reply_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/worries/{worry_id}":{"get":{"tags":["📮 Team Kummerkasten"],"summary":"Worry Detail","description":"Ein Fall mit vollem Verlauf, einschliesslich interner Notizen.","operationId":"worry_detail_api_v1_servers__server_id__team_worries__worry_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"worry_id","in":"path","required":true,"schema":{"type":"integer","title":"Worry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["📮 Team Kummerkasten"],"summary":"Update Worry","description":"Zustand aendern oder zuweisen.\n\nSchliessen geht nur mit Grund. Ein Fall darf ohne Antwort enden, das kommt\nvor; ohne Grund zu enden hiesse, dass niemand mehr sagen kann, was\nentschieden wurde.","operationId":"update_worry_api_v1_servers__server_id__team_worries__worry_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"worry_id","in":"path","required":true,"schema":{"type":"integer","title":"Worry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/worries/{worry_id}/reply":{"post":{"tags":["📮 Team Kummerkasten"],"summary":"Staff Reply","description":"Als Leitung antworten oder eine interne Notiz hinterlassen.\n\nEine interne Notiz aendert den Zustand nicht: sie ist keine Antwort, und\nder Fall soll danach nicht so aussehen, als waere er beantwortet.","operationId":"staff_reply_api_v1_servers__server_id__team_worries__worry_id__reply_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"worry_id","in":"path","required":true,"schema":{"type":"integer","title":"Worry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/profile":{"get":{"tags":["📮 Team Kummerkasten"],"summary":"My Profile","description":"Alles ueber mich, in einem Aufruf.\n\nSteht in dieser Datei und nicht in `team_members.py`, weil es genau\nandersherum funktioniert: die Akte braucht `members.view` und schaut auf\njemanden, die Selbstansicht braucht **kein** Verwaltungsrecht und schaut\nauf einen selbst. Sie ist fuer die da, die sonst nichts sehen duerfen, und\ndas ist der Punkt dieser Phase.\n\nWas hier ausdruecklich nicht steht: interne Notizen ueber mich. Eine Notiz\nmit der Sichtbarkeit \"auch die Person selbst\" kommt mit, eine fuer die\nLeitung nicht, und das entscheidet dieselbe Regel wie in der Akte.","operationId":"my_profile_api_v1_servers__server_id__team_profile_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/profile/leave":{"get":{"tags":["📮 Team Kummerkasten"],"summary":"Leave Preview","description":"Was passiert, wenn ich das Team verlasse.\n\nEin eigener Aufruf und keine erfundene Warnung in der Oberflaeche: was\nwirklich passiert, haengt davon ab, woher die Gruppen kommen. Eine\nMitgliedschaft aus dem Rollenabgleich holt der naechste Lauf zurueck, und\ndas muss dranstehen, bevor jemand klickt. Eine Warnung, die etwas\nverspricht, was gleich wieder rueckgaengig gemacht wird, ist schlimmer als\nkeine.","operationId":"leave_preview_api_v1_servers__server_id__team_profile_leave_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["📮 Team Kummerkasten"],"summary":"Leave Team","description":"Das Team verlassen.\n\nWas hier **nicht** passiert, und deshalb ausdruecklich dasteht:\n\n* Niemand fliegt vom Discord-Server. Das Panel verwaltet Gruppen, nicht\n  Mitgliedschaften auf dem Server.\n* Verwarnungen, Notizen und eingereichte Faelle bleiben. Sie sind Belege,\n  und Belege verschwinden nicht dadurch, dass jemand geht. Wer austritt,\n  soll damit nicht seine Akte loeschen koennen.\n* Uebernommene Schichten bleiben uebernommen. Sie einfach fallen zu lassen\n  hiesse, ein Loch im Dienstplan zu hinterlassen, das niemand sieht.\n\nZurueckgenommen werden nur die Mitgliedschaften, die jemand von Hand\ngesetzt hat. Was aus dem Rollenabgleich kommt, holt der naechste Lauf\nohnehin zurueck.","operationId":"leave_team_api_v1_servers__server_id__team_profile_leave_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/automation/catalog":{"get":{"tags":["⚙️ Team Automatisierung"],"summary":"Automation Catalog","description":"Welche Team-Ereignisse es gibt und was sie mitbringen.\n\nBraucht `automation.manage`: wer keine Regeln bauen darf, braucht den\nKatalog nicht, und der Katalog verraet die Struktur des Team-Bereichs.","operationId":"automation_catalog_api_v1_servers__server_id__team_automation_catalog_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/automation/recent":{"get":{"tags":["⚙️ Team Automatisierung"],"summary":"Automation Recent","description":"Die juengsten echten Ereignisse.\n\nHier steht, woraus sich der Testversand bedient. Wer keine Ereignisse hat,\nbekommt eine leere Liste und in der Oberflaeche den Satz dazu: ohne\nvergangene Ereignisse laesst sich weder schaetzen noch probieren, und das\nist ehrlicher als eine erfundene Zeile.","operationId":"automation_recent_api_v1_servers__server_id__team_automation_recent_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/automation/estimate":{"post":{"tags":["⚙️ Team Automatisierung"],"summary":"Automation Estimate","description":"Wie viele der letzten dreissig Ereignisse durchgekommen waeren.\n\nDie Antwort nennt neben der Zahl die Bedingungen, die sich hier **nicht**\npruefen liessen. Rollen und Kanaele kennt nur Discord; sie stillschweigend\nals erfuellt zu zaehlen ergaebe eine zu hohe Zahl, und zu hoch heisst bei\ndieser Frage: die Regel spammt doch.","operationId":"automation_estimate_api_v1_servers__server_id__team_automation_estimate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/automation/preview":{"post":{"tags":["⚙️ Team Automatisierung"],"summary":"Automation Preview","description":"Denselben Text mit dem juengsten echten Ereignis fuellen.\n\nDer Rueckgabewert nennt die Platzhalter, die **leer** geblieben sind. Das\nist der Punkt: ein Platzhalter, der beim echten Ereignis nichts liefert,\nfaellt an einem Beispieltext nie auf, und in der Ankuendigung steht dann\neine Luecke.","operationId":"automation_preview_api_v1_servers__server_id__team_automation_preview_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/access":{"get":{"tags":["🔑 Team Zugriffsregister"],"summary":"List Access","description":"Das Register, dringlichstes zuerst.\n\nNie geprueft steht vor ueberfaellig, ueberfaellig vor bald faellig. Wer die\nSeite oeffnet, soll oben sehen, was zu tun ist.","operationId":"list_access_api_v1_servers__server_id__team_access_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🔑 Team Zugriffsregister"],"summary":"Create Entry","description":"Einen Eintrag anlegen.\n\n`last_reviewed_at` bleibt leer. Es beim Anlegen zu setzen waere die\nBehauptung, jemand habe hingesehen, und der Zustand \"nie geprueft\" ist\ngenau der, der auffallen soll.","operationId":"create_entry_api_v1_servers__server_id__team_access_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntryCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/access/offboarding/{user_id}":{"get":{"tags":["🔑 Team Zugriffsregister"],"summary":"Access Offboarding","description":"Was einer Person zu entziehen ist.\n\nEine Liste von Aufgaben und keine Zahl. \"4 Zugaenge\" sagt niemandem, welche,\nund wer es nachsehen muss, macht es nicht.\n\nEigentuemerschaft zaehlt mit: wer einen Zugang besitzt und geht,\nhinterlaesst einen Eintrag ohne Verantwortlichen. Einen Zugang zu viel\nbemerkt die naechste Pruefung, einen ohne Verantwortlichen prueft niemand\nmehr.","operationId":"access_offboarding_api_v1_servers__server_id__team_access_offboarding__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/access/{entry_id}":{"patch":{"tags":["🔑 Team Zugriffsregister"],"summary":"Update Entry","description":"Einen Eintrag aendern. Das Pruefdatum wird hier nicht angefasst.","operationId":"update_entry_api_v1_servers__server_id__team_access__entry_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntryPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🔑 Team Zugriffsregister"],"summary":"Delete Entry","description":"Einen Eintrag loeschen.\n\nLoeschen und nicht archivieren: ein Eintrag im Register beschreibt einen\nZugang, den es gibt. Gibt es ihn nicht mehr, ist der Eintrag falsch, und\nein falscher Eintrag im Archiv einer Rechenschaftsliste ist schlimmer als\nkeiner. Wer nachvollziehen will, wer wann Zugang hatte, findet das bei den\nInhabern, und die werden nicht geloescht, sondern entzogen.","operationId":"delete_entry_api_v1_servers__server_id__team_access__entry_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/access/{entry_id}/review":{"post":{"tags":["🔑 Team Zugriffsregister"],"summary":"Mark Reviewed","description":"Bestaetigen, dass jemand hingesehen hat.\n\nEin eigener Endpunkt und kein Feld im Bearbeiten-Dialog: \"geprueft\" ist\neine Handlung und keine Eigenschaft. Wer den Namen aendert, hat den Zugang\nnicht geprueft, und wenn beides im selben Formular staende, waere die\nPruefung nach drei Monaten ein Haken, den man mitsetzt.\n\nWer geprueft hat, steht dabei. Ein Datum ohne Namen beantwortet die Frage\n\"wen frage ich dazu\" nicht.","operationId":"mark_reviewed_api_v1_servers__server_id__team_access__entry_id__review_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/access/{entry_id}/holders":{"post":{"tags":["🔑 Team Zugriffsregister"],"summary":"Add Holder","description":"Jemandem Zugang eintragen.","operationId":"add_holder_api_v1_servers__server_id__team_access__entry_id__holders_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolderAdd"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/team/access/{entry_id}/holders/{holder_id}":{"delete":{"tags":["🔑 Team Zugriffsregister"],"summary":"Revoke Holder","description":"Einen Zugang entziehen.\n\nDer Eintrag bleibt stehen und bekommt ein `revoked_at`. Ihn zu loeschen\nhiesse, die Frage \"wer hatte damals Zugang\" unbeantwortbar zu machen, und\ngenau die stellt man nach einem Vorfall.","operationId":"revoke_holder_api_v1_servers__server_id__team_access__entry_id__holders__holder_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}},{"name":"holder_id","in":"path","required":true,"schema":{"type":"integer","title":"Holder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/profile":{"get":{"tags":["📅 Server Info"],"summary":"Get Server Profile","description":"Liefert alle öffentlichen Informationen für eine Server-Profilseite.\nOPTIMIERT: View-Tracking als Hintergrund-UPSERT, alle Teilabfragen parallel,\nkurzlebiger Response-Cache (Tracking zählt trotzdem jeden Aufruf).","operationId":"get_server_profile_api_v1_public_servers__server_id__profile_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__serverinfo__ServerProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/serverreviews":{"get":{"tags":["📅 Server Info"],"summary":"Get Public Server Reviews","description":"Lädt öffentliche Reviews für die Server-Profilseite.\nOPTIMIERT: Existenz-Check, Aggregation und Fetch laufen parallel;\nReviewer via select_related (1 JOIN-Query statt 2 Queries).","operationId":"get_public_server_reviews_api_v1_public_servers__server_id__serverreviews_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"review_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(purchase|general)$"},{"type":"null"}],"title":"Review Type"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","pattern":"^(newest|oldest|rating_desc|rating_asc|helpful)$","default":"newest","title":"Sort By"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerReviewsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/reviews/summary":{"get":{"tags":["📅 Server Info"],"summary":"Get Review Summary","description":"Liefert Verteilung der Sterne (z.B. wie viele 5-Sterne Bewertungen).\nOPTIMIERT: Gruppierte Aggregation + Existenz-Check parallel in einer Runde.","operationId":"get_review_summary_api_v1_public_servers__server_id__reviews_summary_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Review Summary Api V1 Public Servers  Server Id  Reviews Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/team":{"get":{"tags":["📅 Server Info"],"summary":"Get Server Team List","description":"Gibt eine öffentliche, gruppierte Team-Liste zurück.\nOPTIMIERT: Team-Mitglieder werden SQL-seitig vorgefiltert (statt alle\nMember zu laden), Rollen + Mitglieder laden parallel.","operationId":"get_server_team_list_api_v1_public_servers__server_id__team_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/stats":{"get":{"tags":["📅 Server Info"],"summary":"Get Server Detailed Stats","description":"Liefert detaillierte Statistiken über den Server.\nOPTIMIERT: Nutzt vorberechnete Summary-Tabellen statt Full-Table-Scans.","operationId":"get_server_detailed_stats_api_v1_public_servers__server_id__stats_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerDetailedStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/add":{"post":{"tags":["📅 Server Info"],"summary":"Create Review Endpoint","description":"Erstellt eine Bewertung und sendet ein Event an den Bot.","operationId":"create_review_endpoint_api_v1_reviews_add_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/reviews/{review_id}":{"put":{"tags":["📅 Server Info"],"summary":"Update Review Endpoint","description":"Aktualisiert eine bestehende Review und triggert Discord-Update via Redis.","operationId":"update_review_endpoint_api_v1_reviews__review_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"integer","title":"Review Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Review Endpoint Api V1 Reviews  Review Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📅 Server Info"],"summary":"Delete Review Endpoint","description":"Löscht eine Review und entfernt die Nachricht im Discord.","operationId":"delete_review_endpoint_api_v1_reviews__review_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"integer","title":"Review Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Review Endpoint Api V1 Reviews  Review Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/user-status":{"get":{"tags":["📅 Server Info"],"summary":"Get User Server Status","description":"Prüft mit Debug-Ausgaben, warum der User nicht erkannt wird.","operationId":"get_user_server_status_api_v1_public_servers__server_id__user_status_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"query","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/servers/{server_id}/ban":{"post":{"tags":["📅 Server Info"],"summary":"Set Server Ban Status","description":"Bannt oder Entbannt einen Server. Nur für Bot-Teammitglieder.","operationId":"set_server_ban_status_api_v1_admin_servers__server_id__ban_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Target Server ID","title":"Server Id"},"description":"Target Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerBanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Server Ban Status Api V1 Admin Servers  Server Id  Ban Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/team/check/{user_id}":{"get":{"tags":["📅 Server Info"],"summary":"Check Bot Team Membership","description":"Prüft, ob eine spezifische User-ID Teil des Bot-Teams ist.","operationId":"check_bot_team_membership_api_v1_admin_team_check__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID to check","title":"User Id"},"description":"Discord User ID to check"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/team/list":{"get":{"tags":["📅 Server Info"],"summary":"List Bot Team Members","description":"Listet alle aktuellen Bot-Teammitglieder auf.","operationId":"list_bot_team_members_api_v1_admin_team_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BotTeamMemberResponse"},"type":"array","title":"Response List Bot Team Members Api V1 Admin Team List Get"}}}}}}},"/api/v1/public/servers/{server_id}/tags":{"get":{"tags":["📅 Server Info"],"summary":"Get Server Tags","description":"Gibt die Tags eines spezifischen Servers zurück.","operationId":"get_server_tags_api_v1_public_servers__server_id__tags_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerTagsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/check-admin-access":{"get":{"tags":["📅 Server Info"],"summary":"Check Server Admin Access","description":"Prüft, ob der aktuelle User Dashboard-Zugriff auf diesen Server hat.","operationId":"check_server_admin_access_api_v1_public_servers__server_id__check_admin_access_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/server-list":{"get":{"tags":["📅 Server Info"],"summary":"List Servers","description":"High-Performance Serverliste.\nOPTIMIERT: 60s-Response-Cache (Key enthält ALLE Filter), Count+Fetch parallel,\nBatch-Queries für Premium und Reviews.","operationId":"list_servers_api_v1_public_server_list_get","parameters":[{"name":"query","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Suche nach Name oder Beschreibung","title":"Query"},"description":"Suche nach Name oder Beschreibung"},{"name":"tags","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter nach Tags (Slug)","title":"Tags"},"description":"Filter nach Tags (Slug)"},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter nach Sprache (z.B. 'de', 'en-US')","title":"Language"},"description":"Filter nach Sprache (z.B. 'de', 'en-US')"},{"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":50,"minimum":1,"default":12,"title":"Limit"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(rank|newest|members)$","default":"rank","title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/tags/popular":{"get":{"tags":["📅 Server Info"],"summary":"Get Popular Tags","description":"Lädt die am häufigsten verwendeten Server-Tags.","operationId":"get_popular_tags_api_v1_public_tags_popular_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Anzahl der Tags (Max 100)","default":50,"title":"Limit"},"description":"Anzahl der Tags (Max 100)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PopularTagSchema"},"title":"Response Get Popular Tags Api V1 Public Tags Popular Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/sitemap":{"get":{"tags":["📅 Server Info"],"summary":"Servers Sitemap","description":"Die Serverprofile, die in die Sitemap gehoeren.\n\nGENAU DIESELBE BEDINGUNG wie `_build_server_list`, und das ist der Punkt\nder Sache: die Serverliste zeigt `is_public AND is_discoverable AND NOT\nis_banned AND icon_url IS NOT NULL`. Wer eines davon nicht erfuellt, steht\nin keiner Liste, ist ueber die Oberflaeche nicht zu finden - und hatte\ntrotzdem eine indexierbare Profilseite. Diese Auskunft hier und das\n`robots`-Feld in `lib/servers-share-meta.ts` muessen dieselbe Bedingung\npruefen, sonst empfiehlt die Sitemap Seiten, die sich selbst auf noindex\nsetzen, oder laesst Seiten aus, die indexiert werden wollen.\n\nBewusst schlank: nur ID und Zeitstempel, wie bei den Laeden. Die Sitemap\nbaut daraus Adressen, sie braucht weder Namen noch Bild.\n\n`LIMIT` immer MIT `ORDER BY`. Ohne Sortierung liefert MySQL zurueck, was\ngerade billig ist; bei mehr Servern als `limit` staende dann bei jedem\nAbruf eine andere Auswahl in der Sitemap, und ein Server koennte aus dem\nIndex fallen, ohne dass sich an ihm etwas geaendert haette. `last_updated`\nzuerst, die ID als eindeutiger zweiter Schluessel.\n\n`offset` gibt es fuer den Tag, an dem 50.000 Adressen ueberschritten werden\nund die Sitemap in einen Index mit mehreren Dateien zerfaellt. Bis dahin\nholt das Frontend alles in einem Zug.","operationId":"servers_sitemap_api_v1_public_servers_sitemap_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50000,"minimum":1,"default":20000,"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/recommended":{"get":{"tags":["📅 Server Info"],"summary":"Get Recommended Servers","operationId":"get_recommended_servers_api_v1_public_servers_recommended_get","security":[{"HTTPBearer":[]}],"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":50,"minimum":1,"default":12,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/history":{"get":{"tags":["📅 Server Info"],"summary":"Get My View History","description":"Gibt die letzten 20 Server zurück, die der Nutzer angesehen hat.\nOPTIMIERT: Eine einzige JOIN-Query via values() – keine ORM-Objekt-Hydration.","operationId":"get_my_view_history_api_v1_users_me_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/RecentlyViewedResponse"},"type":"array","title":"Response Get My View History Api V1 Users Me History Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/public/discover":{"get":{"tags":["📅 Server Info"],"summary":"Discover Servers Dashboard","description":"OPTIMIERT: Batch-Queries für alle Server-Listen.","operationId":"discover_servers_dashboard_api_v1_public_discover_get","parameters":[{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/servers/{server_id}/track-view":{"post":{"tags":["📅 Server Info"],"summary":"Track Server View Endpoint","description":"Speichert, dass der User diesen Server angesehen hat.\nOPTIMIERT: 1 atomarer UPSERT im Hot-Path (statt bis zu 7 Queries);\nExistenz-Checks nur im seltenen Fehlerfall, Trimmen im Hintergrund.","operationId":"track_server_view_endpoint_api_v1_public_servers__server_id__track_view_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team-moderation/servers/{server_id}/users/{user_id}/full-profile":{"get":{"tags":["🛡️ Team Moderation","Team Moderation"],"summary":"Vollständiges Moderations-Profil eines Users","description":"Aggregiert ALLE sicherheits- und moderationsrelevanten Daten eines Users.","operationId":"get_user_full_moderation_profile_api_v1_team_moderation_servers__server_id__users__user_id__full_profile_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"include_removed_warnings","in":"query","required":false,"schema":{"type":"boolean","description":"Entfernte Warnungen einschließen","default":true,"title":"Include Removed Warnings"},"description":"Entfernte Warnungen einschließen"},{"name":"warnings_limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Max. Anzahl Warnungen","default":100,"title":"Warnings Limit"},"description":"Max. Anzahl Warnungen"},{"name":"actions_limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Max. Anzahl Moderationsaktionen","default":100,"title":"Actions Limit"},"description":"Max. Anzahl Moderationsaktionen"},{"name":"notes_limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Max. Anzahl Team-Notizen","default":50,"title":"Notes Limit"},"description":"Max. Anzahl Team-Notizen"},{"name":"movements_limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Max. Anzahl Server-Bewegungen","default":50,"title":"Movements Limit"},"description":"Max. Anzahl Server-Bewegungen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerationProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team-moderation/servers/{server_id}/users/{user_id}/warnings":{"get":{"tags":["🛡️ Team Moderation","Team Moderation"],"summary":"Warnungen eines Users","description":"Paginierte Liste aller Warnungen eines Users.","operationId":"get_user_warnings_api_v1_team_moderation_servers__server_id__users__user_id__warnings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/WarningStatus","description":"Filter nach Status","default":"all"},"description":"Filter nach Status"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Seite","default":1,"title":"Page"},"description":"Seite"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Einträge pro Seite","default":25,"title":"Limit"},"description":"Einträge pro Seite"},{"name":"sort_order","in":"query","required":false,"schema":{"$ref":"#/components/schemas/SortOrder","description":"Sortierung nach Zeitstempel","default":"desc"},"description":"Sortierung nach Zeitstempel"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarningsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team-moderation/servers/{server_id}/users/{user_id}/moderation-actions":{"get":{"tags":["🛡️ Team Moderation","Team Moderation"],"summary":"Moderationsaktionen gegen einen User","description":"Paginierte Liste aller Moderationsaktionen (Bans, Kicks, Timeouts).","operationId":"get_user_moderation_actions_api_v1_team_moderation_servers__server_id__users__user_id__moderation_actions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"action_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter nach Aktionstyp (ban, kick, timeout, etc.)","title":"Action Type"},"description":"Filter nach Aktionstyp (ban, kick, timeout, etc.)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Seite","default":1,"title":"Page"},"description":"Seite"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Einträge pro Seite","default":25,"title":"Limit"},"description":"Einträge pro Seite"},{"name":"sort_order","in":"query","required":false,"schema":{"$ref":"#/components/schemas/SortOrder","description":"Sortierung nach Zeitstempel","default":"desc"},"description":"Sortierung nach Zeitstempel"},{"name":"include_images","in":"query","required":false,"schema":{"type":"boolean","description":"Angehängte Bilder einschließen","default":true,"title":"Include Images"},"description":"Angehängte Bilder einschließen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerationActionsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team-moderation/servers/{server_id}/users/{user_id}/team-notes":{"get":{"tags":["🛡️ Team Moderation","Team Moderation"],"summary":"Team-Notizen zu einem User","description":"Paginierte Liste aller Team-Notizen zu einem User.","operationId":"get_user_team_notes_api_v1_team_moderation_servers__server_id__users__user_id__team_notes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"category","in":"query","required":false,"schema":{"$ref":"#/components/schemas/NoteCategory","description":"Filter nach Kategorie","default":"all"},"description":"Filter nach Kategorie"},{"name":"important_only","in":"query","required":false,"schema":{"type":"boolean","description":"Nur wichtige Notizen","default":false,"title":"Important Only"},"description":"Nur wichtige Notizen"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Seite","default":1,"title":"Page"},"description":"Seite"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Einträge pro Seite","default":25,"title":"Limit"},"description":"Einträge pro Seite"},{"name":"sort_order","in":"query","required":false,"schema":{"$ref":"#/components/schemas/SortOrder","description":"Sortierung nach Erstellungsdatum","default":"desc"},"description":"Sortierung nach Erstellungsdatum"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamNotesListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team-moderation/servers/{server_id}/users/{user_id}/timeline":{"get":{"tags":["🛡️ Team Moderation","Team Moderation"],"summary":"Moderations-Timeline eines Users","description":"Chronologische Timeline aller moderationsrelevanten Ereignisse.","operationId":"get_user_moderation_timeline_api_v1_team_moderation_servers__server_id__users__user_id__timeline_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Seite","default":1,"title":"Page"},"description":"Seite"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Einträge pro Seite","default":50,"title":"Limit"},"description":"Einträge pro Seite"},{"name":"include_movements","in":"query","required":false,"schema":{"type":"boolean","description":"Join/Leave Ereignisse einschließen","default":true,"title":"Include Movements"},"description":"Join/Leave Ereignisse einschließen"},{"name":"include_notes","in":"query","required":false,"schema":{"type":"boolean","description":"Team-Notizen einschließen","default":true,"title":"Include Notes"},"description":"Team-Notizen einschließen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerationTimelineResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team-moderation/servers/{server_id}/moderation-overview":{"get":{"tags":["🛡️ Team Moderation","Team Moderation"],"summary":"Moderations-Übersicht aller User mit Aktionen","description":"Liste aller User die Moderationsaktionen haben, sortiert nach Relevanz.","operationId":"get_server_moderation_overview_api_v1_team_moderation_servers__server_id__moderation_overview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Seite","default":1,"title":"Page"},"description":"Seite"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Einträge pro Seite","default":50,"title":"Limit"},"description":"Einträge pro Seite"},{"name":"sort_by","in":"query","required":false,"schema":{"enum":["warnings","actions","recent"],"type":"string","description":"Sortierung","default":"recent","title":"Sort By"},"description":"Sortierung"},{"name":"only_with_active_warnings","in":"query","required":false,"schema":{"type":"boolean","description":"Nur User mit aktiven Warnungen","default":false,"title":"Only With Active Warnings"},"description":"Nur User mit aktiven Warnungen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerationSummaryListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team-moderation/servers/{server_id}/warnings/recent":{"get":{"tags":["🛡️ Team Moderation","Team Moderation"],"summary":"Neueste Warnungen auf dem Server","description":"Paginierte Liste der neuesten Warnungen auf dem Server.","operationId":"get_server_recent_warnings_api_v1_team_moderation_servers__server_id__warnings_recent_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/WarningStatus","description":"Filter nach Status","default":"all"},"description":"Filter nach Status"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Seite","default":1,"title":"Page"},"description":"Seite"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Einträge pro Seite","default":25,"title":"Limit"},"description":"Einträge pro Seite"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WarningsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team-moderation/servers/{server_id}/actions/recent":{"get":{"tags":["🛡️ Team Moderation","Team Moderation"],"summary":"Neueste Moderationsaktionen auf dem Server","description":"Paginierte Liste der neuesten Moderationsaktionen auf dem Server.","operationId":"get_server_recent_actions_api_v1_team_moderation_servers__server_id__actions_recent_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"action_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter nach Aktionstyp","title":"Action Type"},"description":"Filter nach Aktionstyp"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Seite","default":1,"title":"Page"},"description":"Seite"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Einträge pro Seite","default":25,"title":"Limit"},"description":"Einträge pro Seite"},{"name":"include_images","in":"query","required":false,"schema":{"type":"boolean","description":"Angehängte Bilder einschließen","default":true,"title":"Include Images"},"description":"Angehängte Bilder einschließen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerationActionsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team-moderation/servers/{server_id}/statistics":{"get":{"tags":["🛡️ Team Moderation","Team Moderation"],"summary":"Server-weite Moderations-Statistiken","description":"Aggregierte Statistiken für den gesamten Server.","operationId":"get_server_moderation_statistics_api_v1_team_moderation_servers__server_id__statistics_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team-moderation/servers/{server_id}/users/{user_id}/quick-check":{"get":{"tags":["🛡️ Team Moderation","Team Moderation"],"summary":"Schneller Sicherheits-Check eines Users","description":"Schnelle Übersicht über den Moderations-Status eines Users.","operationId":"quick_user_security_check_api_v1_team_moderation_servers__server_id__users__user_id__quick_check_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team-moderation/servers/{server_id}/members/search":{"get":{"tags":["🛡️ Team Moderation","Team Moderation"],"summary":"Suche nach Mitgliedern auf dem Server","description":"Sucht Server-Member anhand von Username, Nickname oder ID.","operationId":"search_server_members_api_v1_team_moderation_servers__server_id__members_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Suchbegriff (Name oder ID)","title":"Query"},"description":"Suchbegriff (Name oder ID)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Maximale Anzahl der Ergebnisse","default":20,"title":"Limit"},"description":"Maximale Anzahl der Ergebnisse"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team-moderation/servers/{server_id}/users/{user_id}/notes":{"post":{"tags":["🛡️ Team Moderation","Team Moderation"],"summary":"Team-Notiz erstellen","description":"Fügt eine Notiz zu einem User hinzu. Max. 1000 Zeichen Gesamtlimit pro User.","operationId":"create_user_note_api_v1_team_moderation_servers__server_id__users__user_id__notes_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateNoteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamNoteDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team-moderation/servers/{server_id}/notes/{note_id}":{"patch":{"tags":["🛡️ Team Moderation","Team Moderation"],"summary":"Team-Notiz bearbeiten","description":"Bearbeitet eine existierende Notiz. Beachtet das Gesamtlimit.","operationId":"update_user_note_api_v1_team_moderation_servers__server_id__notes__note_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","description":"ID der Notiz","title":"Note Id"},"description":"ID der Notiz"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateNoteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamNoteDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🛡️ Team Moderation","Team Moderation"],"summary":"Team-Notiz löschen","description":"Löscht eine Team-Notiz.","operationId":"delete_user_note_api_v1_team_moderation_servers__server_id__notes__note_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","description":"ID der Notiz","title":"Note Id"},"description":"ID der Notiz"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team-moderation/servers/{server_id}/users/{user_id}/security-violations":{"get":{"tags":["🛡️ Team Moderation","Team Moderation"],"summary":"Sicherheitsverstöße eines Users","description":"Paginierte Liste aller Sicherheitsverstöße eines Users.","operationId":"get_user_security_violations_api_v1_team_moderation_servers__server_id__users__user_id__security_violations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","description":"Discord User ID","title":"User Id"},"description":"Discord User ID"},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter nach Schweregrad (low, medium, high, critical)","title":"Severity"},"description":"Filter nach Schweregrad (low, medium, high, critical)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Seite","default":1,"title":"Page"},"description":"Seite"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Einträge pro Seite","default":25,"title":"Limit"},"description":"Einträge pro Seite"},{"name":"sort_order","in":"query","required":false,"schema":{"$ref":"#/components/schemas/SortOrder","description":"Sortierung nach Zeitstempel","default":"desc"},"description":"Sortierung nach Zeitstempel"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecurityViolationsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/restricted-channels":{"get":{"tags":["🛡️ Restricted Channels"],"summary":"Get All Restricted Channels","description":"Gibt alle eingeschraenkten Kanaele eines Servers zurueck.\n\nRate Limited: 80 requests/minute","operationId":"get_all_restricted_channels_api_v1_servers__server_id__restricted_channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get All Restricted Channels Api V1 Servers  Server Id  Restricted Channels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🛡️ Restricted Channels"],"summary":"Create Restricted Channel","description":"Erstellt eine neue Kanal-Einschraenkung.\n\nRate Limited: 30 requests/minute","operationId":"create_restricted_channel_api_v1_servers__server_id__restricted_channels_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestrictedChannelCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/restricted-channels/stats":{"get":{"tags":["🛡️ Restricted Channels"],"summary":"Get Stats","description":"Gibt Statistiken ueber eingeschraenkte Kanaele zurueck.\n\nRate Limited: 80 requests/minute\nCached: 1 minute","operationId":"get_stats_api_v1_servers__server_id__restricted_channels_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__restricted_channels__StatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/restricted-channels/logs":{"get":{"tags":["🛡️ Restricted Channels"],"summary":"Get Logs","description":"Gibt alle Logs fuer eingeschraenkte Kanaele zurueck.\n\nRate Limited: 60 requests/minute\nCached: 1 minute","operationId":"get_logs_api_v1_servers__server_id__restricted_channels_logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Seite (1-basiert)","default":1,"title":"Page"},"description":"Seite (1-basiert)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Anzahl pro Seite","default":30,"title":"Limit"},"description":"Anzahl pro Seite"},{"name":"channel_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nach Channel filtern","title":"Channel Id"},"description":"Nach Channel filtern"},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nach User filtern","title":"User Id"},"description":"Nach User filtern"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🛡️ Restricted Channels"],"summary":"Clear Logs","description":"Loescht Logs fuer eingeschraenkte Kanaele.\n\nRate Limited: 30 requests/minute","operationId":"clear_logs_api_v1_servers__server_id__restricted_channels_logs_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"older_than_days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Nur Logs aelter als X Tage loeschen","title":"Older Than Days"},"description":"Nur Logs aelter als X Tage loeschen"},{"name":"channel_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nur Logs fuer bestimmten Channel loeschen","title":"Channel Id"},"description":"Nur Logs fuer bestimmten Channel loeschen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/restricted-channels/{config_id}":{"get":{"tags":["🛡️ Restricted Channels"],"summary":"Get Restricted Channel","description":"Gibt eine spezifische Kanal-Einschraenkung zurueck.\n\nRate Limited: 80 requests/minute","operationId":"get_restricted_channel_api_v1_servers__server_id__restricted_channels__config_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","description":"Config ID","title":"Config Id"},"description":"Config ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestrictedChannelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["🛡️ Restricted Channels"],"summary":"Update Restricted Channel","description":"Aktualisiert eine Kanal-Einschraenkung.\n\nRate Limited: 30 requests/minute","operationId":"update_restricted_channel_api_v1_servers__server_id__restricted_channels__config_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","description":"Config ID","title":"Config Id"},"description":"Config ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestrictedChannelUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🛡️ Restricted Channels"],"summary":"Delete Restricted Channel","description":"Loescht eine Kanal-Einschraenkung.\n\nRate Limited: 30 requests/minute","operationId":"delete_restricted_channel_api_v1_servers__server_id__restricted_channels__config_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","description":"Config ID","title":"Config Id"},"description":"Config ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/restricted-channels/{config_id}/toggle":{"patch":{"tags":["🛡️ Restricted Channels"],"summary":"Toggle Restricted Channel","description":"Schaltet eine Kanal-Einschraenkung an oder aus.\n\nDen Endpunkt gab es nicht, obwohl das Dashboard ihn seit jeher aufruft\n(components/RestrictedChannels.jsx, `handleToggle`). Die 404 lief dort in\n`if (res.ok && data.success)` und damit ins Leere: kein Toast, kein Fehler,\nder Schalter tat schlicht nichts. Dass `config.enabled` und\n`config.disabled` in allen sieben Sprachdateien stehen und von keiner\nCodestelle benutzt wurden, ist die zweite Haelfte desselben Befunds.\n\nUmgeschaltet wird HIER und nicht im Browser. Ein PATCH auf\n`/restricted-channels/{config_id}` mit `is_enabled: !aktuell` waere der\nkuerzere Weg gewesen, haette aber den gelesenen Zustand mitgeschickt: zwei\nAdmins, die gleichzeitig umschalten, ueberschreiben sich dann gegenseitig\nund einer sieht am Ende das Gegenteil dessen, was er angeklickt hat.\n\nRate Limited: 30 requests/minute","operationId":"toggle_restricted_channel_api_v1_servers__server_id__restricted_channels__config_id__toggle_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","description":"Config ID","title":"Config Id"},"description":"Config ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/restricted-channels/{config_id}/whitelist":{"get":{"tags":["🛡️ Restricted Channels"],"summary":"Get Whitelist","description":"Gibt alle Whitelist-Eintraege fuer eine Config zurueck.\n\nRate Limited: 80 requests/minute","operationId":"get_whitelist_api_v1_servers__server_id__restricted_channels__config_id__whitelist_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","description":"Config ID","title":"Config Id"},"description":"Config ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WhitelistEntryResponse"},"title":"Response Get Whitelist Api V1 Servers  Server Id  Restricted Channels  Config Id  Whitelist Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🛡️ Restricted Channels"],"summary":"Add Whitelist Entry","description":"Fuegt einen Whitelist-Eintrag hinzu.\n\nRate Limited: 30 requests/minute","operationId":"add_whitelist_entry_api_v1_servers__server_id__restricted_channels__config_id__whitelist_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","description":"Config ID","title":"Config Id"},"description":"Config ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__restricted_channels__WhitelistAddRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/restricted-channels/{config_id}/whitelist/{entry_id}":{"delete":{"tags":["🛡️ Restricted Channels"],"summary":"Delete Whitelist Entry","description":"Loescht einen Whitelist-Eintrag.\n\nRate Limited: 30 requests/minute","operationId":"delete_whitelist_entry_api_v1_servers__server_id__restricted_channels__config_id__whitelist__entry_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","description":"Config ID","title":"Config Id"},"description":"Config ID"},{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","description":"Whitelist Entry ID","title":"Entry Id"},"description":"Whitelist Entry ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/professional/plan":{"get":{"tags":["💠 Professional"],"summary":"Server Stufe","description":"Welche Stufe hat dieser Server, und woher kommt sie?\n\n`is_premium` ist fuer Professional True. Das Frontend, das heute auf\ndieses Feld schaut, funktioniert damit unveraendert weiter.","operationId":"server_stufe_api_v1_servers__server_id__professional_plan_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/professional/plan":{"get":{"tags":["💠 Professional"],"summary":"Eigene Stufe","description":"Die Stufe des angemeldeten Users samt Sitzplatzzahl.","operationId":"eigene_stufe_api_v1_professional_plan_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional__Antwort"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/professional/groups":{"get":{"tags":["💠 Professional"],"summary":"Verbuende Auflisten","description":"Alle Verbuende des angemeldeten Users.","operationId":"verbuende_auflisten_api_v1_professional_groups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional__Antwort"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["💠 Professional"],"summary":"Verbund Anlegen","description":"Legt einen Verbund an.\n\nNur mit Professional. Die Pruefung steht hier im Rumpf und nicht als\nAbhaengigkeit, weil dieser Endpunkt keinen Pfadparameter `server_id` hat\nund die Antwort dieselbe Form tragen soll wie die von `enforce_limit`.","operationId":"verbund_anlegen_api_v1_professional_groups_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GruppeAnlegen"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/professional/groups/{group_id}/seats":{"get":{"tags":["💠 Professional"],"summary":"Sitzplaetze","description":"Wie viele Plaetze der Verbund hat und wie viele davon belegt sind.","operationId":"sitzplaetze_api_v1_professional_groups__group_id__seats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","description":"ID des Verbunds","title":"Group Id"},"description":"ID des Verbunds"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/professional/groups/{group_id}/servers":{"post":{"tags":["💠 Professional"],"summary":"Server Hinzufuegen","description":"Nimmt einen Server in den Verbund auf.\n\nDrei Pruefungen, und jede fuer sich ist noetig:\n  * Der Verbund gehoert dem Anfragenden.\n  * Der Anfragende hat auf diesem Server die noetigen Discord-Rechte.\n    Ohne das koennte jemand fremde Server in seinen Verbund ziehen.\n  * Es ist noch ein Platz frei.\n\nEin Server, der schon einmal drin war und ausgefallen ist, wird\nreaktiviert statt neu angelegt. Die Zeile bleibt damit dieselbe und die\nHistorie im Feld `added_at` geht nicht verloren.","operationId":"server_hinzufuegen_api_v1_professional_groups__group_id__servers_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","description":"ID des Verbunds","title":"Group Id"},"description":"ID des Verbunds"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerHinzufuegen"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/professional/groups/{group_id}/servers/{server_id}":{"delete":{"tags":["💠 Professional"],"summary":"Server Entfernen","description":"Nimmt einen Server aus dem Verbund.\n\nDie Zeile wird geloescht, nicht nur stillgelegt: das hier ist die\nausdrueckliche Entscheidung des Besitzers und nicht der unfreiwillige\nAusfall, fuer den `is_active` da ist.\n\nAm Server selbst wird nichts geloescht. Er faellt auf seine eigene Stufe\nzurueck, seine gesamte Konfiguration bleibt stehen. Was ueber der neuen,\nniedrigeren Decke liegt, wird von der bestehenden Soft-Lock-Mechanik in\nutils/feature_limits.py stillgelegt, nicht entfernt.","operationId":"server_entfernen_api_v1_professional_groups__group_id__servers__server_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","description":"ID des Verbunds","title":"Group Id"},"description":"ID des Verbunds"},{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/professional/limits":{"get":{"tags":["💠 Professional"],"summary":"Limits Mit Verbrauch","description":"Alle geltenden Grenzen dieses Servers, dazu die naechsthoehere Stufe.\n\nDer Verbrauch wird NICHT hier gezaehlt. Jedes Feature hat seinen eigenen\nLimits-Endpunkt, der die Menge kennt und dabei den Bestandsschutz und den\nSoft-Lock beruecksichtigt (utils/feature_limits.usage_summary). Diese\nUebersicht wuerde beide Regeln nachbauen muessen, und eine zweite\nZaehlregel laeuft garantiert irgendwann auseinander.\n\nWas hier steht, ist deshalb die Decke je Schluessel und der Hinweis, wo\nder Zaehler dazu liegt.","operationId":"limits_mit_verbrauch_api_v1_servers__server_id__professional_limits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/professional/rollouts/sources":{"get":{"tags":["💠 Professional Sammelaktionen"],"summary":"Quellen","description":"Was steht als Vorlage bereit?\n\nDie Server des Verbunds und je Server dessen Blueprints. Das Frontend\nbraucht beides zusammen: die Auswahl laeuft ueber \"welcher Server ist mein\nMuster\", nicht ueber \"welcher Blueprint\" - Blueprints heissen oft gleich,\nServer nicht.\n\nOhne Nutzlast. `blueprint_versions.payload` ist mehrere Megabyte gross;\nhier stehen nur Name, Slug und Zeitpunkt.","operationId":"quellen_api_v1_professional_rollouts_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional_rollout__Antwort"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/professional/rollouts":{"get":{"tags":["💠 Professional Sammelaktionen"],"summary":"Rollouts Auflisten","description":"Die letzten Aktionen des Verbunds, neueste zuerst.","operationId":"rollouts_auflisten_api_v1_professional_rollouts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional_rollout__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["💠 Professional Sammelaktionen"],"summary":"Rollout Anlegen","description":"Legt eine Sammelaktion an und startet je Ziel den Trockenlauf.\n\nANGEWENDET WIRD HIER NOCH NICHTS. Erst laeuft je Ziel eine Vorschau, dann\nsieht der Nutzer, was auf welchem Server passieren wuerde, und erst danach\ngibt er frei. Das ist dieselbe Reihenfolge wie beim Einzelanwenden, und\nueber zehn Server ist sie noch wichtiger: ein REPLACE, das man auf einem\nServer bereut, ist ein Ausrutscher; ueber zehn Server ist es ein Abend.\n\nZiele, die nicht koennen, werden UEBERSPRUNGEN und nicht abgewiesen. Sonst\nscheitert eine Aktion ueber zehn Server an dem einen, auf dem gerade\njemand anders arbeitet.","operationId":"rollout_anlegen_api_v1_professional_rollouts_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolloutAnlegen"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional_rollout__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/professional/rollouts/{rollout_id}":{"get":{"tags":["💠 Professional Sammelaktionen"],"summary":"Rollout Lesen","description":"Der Zustand einer Aktion samt Fortschritt je Ziel.\n\nDas ist zugleich der Abgleich: `_ziel_abgleichen` bringt jedes offene Ziel\nmit seinem Job in Einklang. Deshalb laeuft hier keine Hintergrundaufgabe\nmit - der Abgleich passiert dann, wenn jemand hinsieht.","operationId":"rollout_lesen_api_v1_professional_rollouts__rollout_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rollout_id","in":"path","required":true,"schema":{"type":"integer","description":"ID der Sammelaktion","title":"Rollout Id"},"description":"ID der Sammelaktion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional_rollout__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/professional/rollouts/{rollout_id}/apply":{"post":{"tags":["💠 Professional Sammelaktionen"],"summary":"Rollout Anwenden","description":"Wendet an, was eine gueltige Vorschau hat.\n\nDer Trockenlauf ist die Freigabe, und er GILT 30 MINUTEN. Ueber zehn\nServer laufen die Vorschauen nicht gleichzeitig fertig; wer die Seite eine\nStunde offen liegen laesst und dann klickt, haette sonst einen Teil seiner\nServer nach einer abgelaufenen Vorschau umgebaut.\n\nAbgelaufene Ziele werden deshalb einzeln als `failed` mit dem Grund\n`plan_expired` markiert - und die frischen laufen trotzdem. Alles zu\nblockieren, weil ein Ziel von zehn abgelaufen ist, waere die schlechtere\nAntwort: dann muesste der Nutzer die ganze Aktion neu aufsetzen, obwohl\nneun Vorschauen gueltig sind. Fuer die abgelaufenen gibt es `replan`.","operationId":"rollout_anwenden_api_v1_professional_rollouts__rollout_id__apply_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rollout_id","in":"path","required":true,"schema":{"type":"integer","description":"ID der Sammelaktion","title":"Rollout Id"},"description":"ID der Sammelaktion"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolloutAnwenden","default":{"force":false}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional_rollout__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/professional/rollouts/{rollout_id}/replan":{"post":{"tags":["💠 Professional Sammelaktionen"],"summary":"Rollout Neu Planen","description":"Erneuert die Vorschau fuer Ziele, die noch nicht angewendet wurden.\n\nDer Weg zurueck aus `plan_expired`, `busy` und `bot_unreachable`. Ohne ihn\nmuesste der Nutzer die ganze Aktion neu aufsetzen und dabei Quelle, Modus\nund Auswahl von Hand wiederholen - fuer einen Server, der vor einer\nMinute noch beschaeftigt war.\n\nAngewendete Ziele bleiben unberuehrt. Ein zweiter Trockenlauf auf einem\nServer, der die Aenderung schon hat, saehe nichts mehr zu tun und wuerde\nim Bericht wie ein leerer Erfolg aussehen.","operationId":"rollout_neu_planen_api_v1_professional_rollouts__rollout_id__replan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rollout_id","in":"path","required":true,"schema":{"type":"integer","description":"ID der Sammelaktion","title":"Rollout Id"},"description":"ID der Sammelaktion"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolloutAnwenden","default":{"force":false}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional_rollout__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/professional/rollouts/{rollout_id}/cancel":{"post":{"tags":["💠 Professional Sammelaktionen"],"summary":"Rollout Abbrechen","description":"Bricht ab, was noch nicht angefangen hat.\n\nWAS SCHON LAEUFT, LAEUFT WEITER. Ein Anwenden mitten in Phase sieben\nabzubrechen hinterliesse einen halb umgebauten Server, und zwar genau den\nZustand, gegen den `blueprint_apply` seine Regel \"geloescht wird zuletzt\"\nhat. Wer einen laufenden Umbau zurueckdrehen will, nimmt den\nWiederherstellungspunkt auf dem betroffenen Server.\n\nDer Knopf heisst deshalb im Frontend auch nicht \"Abbrechen\", sondern\n\"Restliche Server zurueckstellen\".","operationId":"rollout_abbrechen_api_v1_professional_rollouts__rollout_id__cancel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rollout_id","in":"path","required":true,"schema":{"type":"integer","description":"ID der Sammelaktion","title":"Rollout Id"},"description":"ID der Sammelaktion"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional_rollout__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/professional/inbox":{"get":{"tags":["💠 Professional Posteingang"],"summary":"Posteingang","description":"Alles, was im Verbund gerade auf jemanden wartet.\n\nDer Filter `server_id` schraenkt auf EINEN Verbund-Server ein und wird\ngegen die Mitgliederliste geprueft. Ohne diese Pruefung waere der\nParameter eine Tuer in jeden Server der Datenbank.","operationId":"posteingang_api_v1_professional_inbox_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kinds","in":"query","required":false,"schema":{"type":"string","description":"Kommaliste: ticket, application","default":"ticket,application","title":"Kinds"},"description":"Kommaliste: ticket, application"},{"name":"server_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Auf einen Server einschraenken","title":"Server Id"},"description":"Auf einen Server einschraenken"},{"name":"untouched_only","in":"query","required":false,"schema":{"type":"boolean","description":"Nur, was niemand angenommen hat","default":false,"title":"Untouched Only"},"description":"Nur, was niemand angenommen hat"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"description":"Suche in Titel und Kategorie","title":"Q"},"description":"Suche in Titel und Kategorie"},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":365,"minimum":1},{"type":"null"}],"description":"Nur die letzten N Tage","title":"Days"},"description":"Nur die letzten N Tage"},{"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":{"$ref":"#/components/schemas/api__routers__professional_inbox__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/professional/inbox/counts":{"get":{"tags":["💠 Professional Posteingang"],"summary":"Posteingang Zahlen","description":"Nur die Zahlen, fuer das Abzeichen am Menuepunkt.\n\nEin eigener Endpunkt, weil das Abzeichen bei jedem Seitenwechsel\nnachgeladen wird und die volle Liste dafuer ein Vielfaches waere. Er\nzaehlt in der Datenbank statt Zeilen zu holen und zu laengen.\n\nFaellt eine der beiden Zaehlungen aus, kommt fuer sie `None` zurueck und\nnicht `0`. Das Frontend zeigt dann kein Abzeichen, statt Ruhe zu\nbehaupten.\n\nDIE REGEL GILT AUCH FUER DIE SUMMEN, und das war sie vorher nicht: `total`\nund `untouched` wurden aus dem gebildet, was UEBRIG BLIEB. Fiel die\nTicketzaehlung aus und lagen drei Bewerbungen an, stand am Menuepunkt eine\n3 - eine Zahl, die vollstaendig aussieht und es nicht ist. Genau die stille\nUntertreibung, gegen die Entscheidung 2 am Kopf dieser Datei geschrieben\nist: sie sieht nach Ruhe aus.","operationId":"posteingang_zahlen_api_v1_professional_inbox_counts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional_inbox__Antwort"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/professional/identity":{"get":{"tags":["💠 Professional Identitätsgrenze"],"summary":"Zustand","description":"Beide Features auf einen Blick: Schalter je Server, Zahlen, Protokoll.\n\nEin Endpunkt fuer beide Seiten des Frontends, weil beide dieselbe\nKopfzeile brauchen (Verbundname, Plaetze) und dieselbe Mitgliederliste.\nZwei Endpunkte hiessen zwei Abfragen auf `server_group_members` bei jedem\nSeitenwechsel.","operationId":"zustand_api_v1_professional_identity_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional_identity__Antwort"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/professional/identity/servers/{server_id}":{"patch":{"tags":["💠 Professional Identitätsgrenze"],"summary":"Schalter Setzen","description":"Die drei Richtungsschalter eines Mitglieds setzen.\n\nNone heisst \"nicht anfassen\", siehe SchalterAendern. Es wird KEIN\nBot-Ereignis abgesetzt: ein umgelegter Schalter wirkt beim naechsten\nBeitritt, und den Bestand zieht `/sweep` nach - ausdruecklich und mit\nRueckfrage, nicht als stille Nebenwirkung eines Reglers.","operationId":"schalter_setzen_api_v1_professional_identity_servers__server_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchalterAendern"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional_identity__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/professional/blocklist":{"get":{"tags":["💠 Professional Identitätsgrenze"],"summary":"Sperrliste","description":"Die Sperrliste des Verbunds.\n\n===================================================================\nWARUM ABLAUF UND SORTIERUNG IN PYTHON PASSIEREN\n===================================================================\n\nBeides ginge in SQL, und beides waere dort falsch:\n\n  * `ORDER BY expires_at` nimmt in MySQL NULL nach VORN. \"Laeuft nie ab\"\n    stuende ueber \"laeuft in einer Stunde ab\", und bei mehr als einer Seite\n    faellt genau der Eintrag heraus, den man sehen wollte. Dieselbe Falle\n    hat in /shop effects schon zugeschnappt.\n  * Ein `WHERE expires_at > NOW()` liesse die unbefristeten Eintraege\n    (NULL) heraus, denn NULL vergleicht sich mit nichts. Man muesste\n    `OR expires_at IS NULL` daneben schreiben, und genau das vergisst die\n    naechste Fassung.\n\nDer Preis ist, dass die ganze Liste eines Verbunds geladen wird, bevor\ngeblaettert wird. Bei einer von Hand verfassten Liste ist das eine\ndreistellige Zeilenzahl, kein Problem - und die Ehrlichkeit ist es wert.","operationId":"sperrliste_api_v1_professional_blocklist_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Suche in ID, Name und Grund","title":"Q"},"description":"Suche in ID, Name und Grund"},{"name":"state","in":"query","required":false,"schema":{"type":"string","description":"active | expired | all","default":"active","title":"State"},"description":"active | expired | all"},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"deny | kick | ban","title":"Action"},"description":"deny | kick | ban"},{"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":{"$ref":"#/components/schemas/api__routers__professional_identity__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["💠 Professional Identitätsgrenze"],"summary":"Sperre Anlegen","description":"Einen Menschen auf die Sperrliste des Verbunds setzen.\n\nLegt an und SETZT NICHT DURCH. Das Durchsetzen ist ein eigener Aufruf\n(`/{id}/enforce`), und das ist Absicht: das Anlegen ist eine Notiz, das\nDurchsetzen greift zehn Server an. Sie in einen Aufruf zu legen hiesse,\ndass jeder Tippfehler in der ID im schlimmsten Fall zehn Baenne auslöst -\nund dass man einen Eintrag nicht vorbereiten kann, ohne ihn auszufuehren.","operationId":"sperre_anlegen_api_v1_professional_blocklist_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SperreAnlegen"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional_identity__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/professional/blocklist/{entry_id}":{"patch":{"tags":["💠 Professional Identitätsgrenze"],"summary":"Sperre Aendern","description":"Grund, Aktion oder Ablauf eines Eintrags aendern.\n\n`clear_expiry` statt \"None heisst entfristen\": eine Verlaengerung, die\nversehentlich zur Entfristung wird, ist ein Fehler, den niemand bemerkt -\nder Eintrag laeuft dann einfach nie mehr ab.","operationId":"sperre_aendern_api_v1_professional_blocklist__entry_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SperreAendern"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional_identity__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["💠 Professional Identitätsgrenze"],"summary":"Sperre Aufheben","description":"Einen Eintrag aufheben.\n\n===================================================================\nWAS DAS AUFHEBEN NICHT TUT\n===================================================================\n\nEs entbannt niemanden. Ein Bann, den der Bot auf einem Server ausgesprochen\nhat, steht in Discords Bannliste jenes Servers, und dort gehoert er auch\nhin - er wurde ja auf jenem Server ausgesprochen. Diese Zeile zu loeschen\nhebt nur die Regel auf, nicht ihre Folgen.\n\nDas steht so in der Antwort (`entbannt: false`) und im Frontend als Satz\nim Bestaetigungsdialog. Der Gegenentwurf - ein Aufheben, das ueber zehn\nServer entbannt - waere die gefaehrlichere Bedienung: eine unbedacht\nweggeklickte Zeile liesse dann jemanden ueberall wieder herein, den\nmoeglicherweise jeder Server einzeln auch aus eigenem Anlass gebannt hat.","operationId":"sperre_aufheben_api_v1_professional_blocklist__entry_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional_identity__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/professional/blocklist/{entry_id}/enforce":{"post":{"tags":["💠 Professional Identitätsgrenze"],"summary":"Sperre Durchsetzen","description":"Einen Eintrag jetzt durchsetzen, auf allen Servern, die ihn durchsetzen.\n\nNur `kick` und `ban` haben hier etwas zu tun. `deny` wirkt erst, wenn der\nMensch sich zu verifizieren versucht, und ist darum nichts, was man\n\"jetzt\" ausfuehren koennte - das steht in der Antwort statt eines\nvorgetaeuschten Erfolgs.","operationId":"sperre_durchsetzen_api_v1_professional_blocklist__entry_id__enforce_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"integer","title":"Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional_identity__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/professional/identity/sweep":{"post":{"tags":["💠 Professional Identitätsgrenze"],"summary":"Nachziehen","description":"Den Bestand nachziehen: wer schon drin ist, merkt sonst nichts.\n\n===================================================================\nWARUM ES DIESEN ENDPUNKT UEBERHAUPT GIBT\n===================================================================\n\nBeide Features wirken beim BEITRITT. Wer schon im Server sitzt, bekommt\nkeine Rolle und wird nicht hinausgeworfen - und das ist genau der Moment,\nin dem ein Betreiber den Schalter fuer kaputt haelt und den Support\nschreibt.\n\n===================================================================\nOHNE `confirm` WIRD GEZAEHLT UND NICHTS GETAN\n===================================================================\n\nDer Lauf ist zuerst eine Vorschau. Ein Knopf, der ohne Rueckfrage\nvierhundert Rollen vergibt oder zehn Server durchbannt, ist keine\nBedienung, sondern ein Unfall mit Vorlauf.\n\nDas ZAEHLEN passiert hier, das TUN im Bot: es braucht Guilds,\nRollenrangfolge und Mitgliedslisten. Die Zahl hier ist deshalb eine\nOBERGRENZE und wird als solche benannt (`at_most`) - der Bot lehnt beim\nAusfuehren noch an den Toren 5 und 6 ab, und wie viele das sind, weiss\nhier niemand.","operationId":"nachziehen_api_v1_professional_identity_sweep_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SweepAnstossen"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional_identity__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/professional/identity/events":{"get":{"tags":["💠 Professional Identitätsgrenze"],"summary":"Protokoll","description":"Das Protokoll beider Features, filterbar.\n\nABLEHNUNGEN STEHEN HIER GLEICHBERECHTIGT NEBEN ERFOLGEN. Wenn die\nUebertragung \"nicht funktioniert\", ist der Grund fast immer eine\nAblehnung - und ohne sie im Protokoll haette der Supportfall keinen Beweis.","operationId":"protokoll_api_v1_professional_identity_events_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kinds","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Kommaliste der Arten","title":"Kinds"},"description":"Kommaliste der Arten"},{"name":"server_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Id"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":365,"minimum":1},{"type":"null"}],"title":"Days"}},{"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":{"$ref":"#/components/schemas/api__routers__professional_identity__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/professional/identity/users/{user_id}":{"get":{"tags":["💠 Professional Identitätsgrenze"],"summary":"Ein Mensch","description":"Ein Mensch im Verbund: wo verifiziert, ob gesperrt, was passiert ist.\n\nDie Ansicht, die es ohne dieses Feature nicht geben konnte und die die\neigentliche Arbeit erleichtert: bevor jemand eine Sperre setzt, will er\nwissen, wo dieser Mensch ueberhaupt ist und was Notoq schon mit ihm getan\nhat.","operationId":"ein_mensch_api_v1_professional_identity_users__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__professional_identity__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/connectors/catalog":{"get":{"tags":["🔌 Konnektoren"],"summary":"Katalog","description":"Welche Stecker es gibt und was jeder kann.\n\nSteht als Endpunkt da und nicht als feste Liste im Frontend, damit ein\nsechster Stecker nicht in zwei Repos nachgetragen werden muss. Die\nBeschreibungstexte kommen trotzdem aus den Sprachdateien: was ein Stecker\nKANN ist Wissen des Backends, wie es HEISST ist Sache der Oberflaeche.","operationId":"katalog_api_v1_connectors_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__connectors__Antwort"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/servers/{server_id}/connectors":{"get":{"tags":["🔌 Konnektoren"],"summary":"Liste","description":"Alle Konnektoren dieses Servers samt Belegung des Kontingents.","operationId":"liste_api_v1_servers__server_id__connectors_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__connectors__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🔌 Konnektoren"],"summary":"Anlegen","description":"Einen Konnektor anlegen.\n\nDer Empfangs-Token wird HIER gewuerfelt und nicht vom Betreiber gewaehlt:\ner ist der einzige Schutz des Pfades, bevor die Signatur greift, und ein\nselbstgewaehlter waere \"meinserver\".","operationId":"anlegen_api_v1_servers__server_id__connectors_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KonnektorAnlegen"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__connectors__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/connectors/{connector_id}":{"patch":{"tags":["🔌 Konnektoren"],"summary":"Aendern","description":"Namen, Schalter, Geheimnis oder Einstellungen aendern.","operationId":"aendern_api_v1_servers__server_id__connectors__connector_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"connector_id","in":"path","required":true,"schema":{"type":"integer","title":"Connector Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KonnektorAendern"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__connectors__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🔌 Konnektoren"],"summary":"Loeschen","description":"Einen Konnektor entfernen, samt Regeln und Protokoll.\n\nHier wird WIRKLICH geloescht und nicht gesperrt, anders als beim Verbund.\nDer Grund: eine gespeicherte Zugangsberechtigung zu einem fremden Dienst\nist nichts, was man aufbewahrt, weil es vielleicht noch gebraucht wird.\nWer den Konnektor nicht mehr will, will auch das Geheimnis nicht mehr bei\nuns liegen haben.","operationId":"loeschen_api_v1_servers__server_id__connectors__connector_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"connector_id","in":"path","required":true,"schema":{"type":"integer","title":"Connector Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__connectors__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/connectors/{connector_id}/rotate":{"post":{"tags":["🔌 Konnektoren"],"summary":"Token Neu","description":"Die Empfangsadresse neu wuerfeln.\n\nFuer den Fall, dass die alte irgendwo gelandet ist, wo sie nicht\nhingehoert. Der Betreiber muss sie danach beim Dienst neu eintragen, und\ndas steht im Dialog, der diesen Aufruf ausloest.","operationId":"token_neu_api_v1_servers__server_id__connectors__connector_id__rotate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"connector_id","in":"path","required":true,"schema":{"type":"integer","title":"Connector Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__connectors__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/connectors/{connector_id}/rules":{"get":{"tags":["🔌 Konnektoren"],"summary":"Regeln Lesen","operationId":"regeln_lesen_api_v1_servers__server_id__connectors__connector_id__rules_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"connector_id","in":"path","required":true,"schema":{"type":"integer","title":"Connector Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__connectors__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🔌 Konnektoren"],"summary":"Regeln Setzen","description":"Die Regeln am Stueck ersetzen.\n\nGeprueft wird VOR dem Loeschen. Sonst stuende ein Betreiber nach einer\nabgelehnten Aktion ohne seine alten Regeln da.","operationId":"regeln_setzen_api_v1_servers__server_id__connectors__connector_id__rules_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"connector_id","in":"path","required":true,"schema":{"type":"integer","title":"Connector Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegelnSetzen"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__connectors__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/connectors/{connector_id}/events":{"get":{"tags":["🔌 Konnektoren"],"summary":"Ereignisse","description":"Das Ereignisprotokoll, neueste zuerst.\n\nGeblaettert wird ueber `before_id` und nicht ueber einen Versatz: waehrend\njemand blaettert, kommen neue Ereignisse an, und ein Versatz schoebe die\nListe unter ihm weg. Sortiert wird nach `-id` und nicht nach\n`-created_at`: zwei Ereignisse derselben Zustellsekunde haetten sonst\nkeine bestimmte Ordnung, und dasselbe stuende auf Seite eins und zwei.","operationId":"ereignisse_api_v1_servers__server_id__connectors__connector_id__events_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"connector_id","in":"path","required":true,"schema":{"type":"integer","title":"Connector Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nur dieser Zustand","title":"Status"},"description":"Nur dieser Zustand"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"before_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Blaettern: aelter als diese ID","title":"Before Id"},"description":"Blaettern: aelter als diese ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__connectors__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/connectors/{connector_id}/events/{event_id}/assign":{"post":{"tags":["🔌 Konnektoren"],"summary":"Zuweisen","description":"Ein unzugeordnetes Ereignis von Hand einem Mitglied zuweisen.\n\nDIE STELLE, AN DER DIE EHRLICHKEIT DES FEATURES SICHTBAR WIRD. Ko-fi\nliefert keine Discord-ID; wo nichts zu erkennen war, wurde nichts geraten,\nsondern dieser Knopf angeboten. Nach der Zuweisung geht das Ereignis\nzurueck in die Warteschlange und die Aktionen laufen nach.","operationId":"zuweisen_api_v1_servers__server_id__connectors__connector_id__events__event_id__assign_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"connector_id","in":"path","required":true,"schema":{"type":"integer","title":"Connector Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZuweisenEingabe"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__connectors__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/connectors/{connector_id}/test":{"post":{"tags":["🔌 Konnektoren"],"summary":"Testereignis","description":"Ein Probeereignis einspeisen, um die Regeln zu pruefen.\n\nEs laeuft durch DIESELBE Maschine wie ein echtes: gleiche Regeln, gleiche\nAktionen, gleicher Arbeiter. Ein Test, der einen eigenen Weg nimmt, prueft\nden eigenen Weg.\n\nDer Ausloeser ist der angemeldete Betreiber selbst. Damit bekommt er die\nRolle, die er testet, und sieht sofort, ob sie ankommt - statt ein\nfremdes Mitglied zu beschenken.","operationId":"testereignis_api_v1_servers__server_id__connectors__connector_id__test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"connector_id","in":"path","required":true,"schema":{"type":"integer","title":"Connector Id"}},{"name":"trigger","in":"query","required":true,"schema":{"type":"string","description":"Welche Ereignisart geprobt wird","title":"Trigger"},"description":"Welche Ereignisart geprobt wird"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__connectors__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/connectors/{connector_id}/runs":{"get":{"tags":["🔌 Konnektoren"],"summary":"Durchlaeufe","description":"Die letzten Spiegel-Durchlaeufe.","operationId":"durchlaeufe_api_v1_servers__server_id__connectors__connector_id__runs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"connector_id","in":"path","required":true,"schema":{"type":"integer","title":"Connector Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__connectors__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/connectors/{connector_id}/sync":{"post":{"tags":["🔌 Konnektoren"],"summary":"Spiegeln","description":"Einen Spiegel-Durchlauf anstossen.\n\nWie beim Empfang: hier entsteht nur die ABSICHT als Zeile, die Arbeit tut\nder Cog. Ein Spiegel ueber 10000 Zeilen dauert bei Notions Drosselung\nrund eine Stunde; im Anfrage-Zyklus waere das ein Zeitueberlauf und ein\nhalb geschriebener Spiegel.","operationId":"spiegeln_api_v1_servers__server_id__connectors__connector_id__sync_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"connector_id","in":"path","required":true,"schema":{"type":"integer","title":"Connector Id"}},{"name":"dataset","in":"query","required":true,"schema":{"type":"string","description":"members | tickets | economy | moderation","title":"Dataset"},"description":"members | tickets | economy | moderation"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__connectors__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/connectors/{connector_id}/oauth/start":{"get":{"tags":["🔌 Konnektoren"],"summary":"Oauth Start","description":"Die Adresse liefern, zu der der Betreiber geschickt wird.\n\nDer `state` traegt die Konnektor-ID und ein Zufallsstueck. Er wird am\nKonnektor hinterlegt und beim Rueckweg in konstanter Zeit verglichen: ohne\ndas koennte jemand einen fremden Rueckweg auf seinen eigenen Konnektor\numbiegen und sich dessen Zugang unterschieben.","operationId":"oauth_start_api_v1_servers__server_id__connectors__connector_id__oauth_start_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"connector_id","in":"path","required":true,"schema":{"type":"integer","title":"Connector Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__connectors__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/minecraft/plugin/pair":{"post":{"tags":["⛏️ Minecraft Plugin"],"summary":"Pair","description":"Einen Verbindungscode gegen ein Token tauschen (4.2).\n\nDas Token steht NUR in dieser Antwort und wird nie wieder gezeigt; das\nLog bekommt den Hinweis (`nqmc_…abcd`), nie das Token.","operationId":"pair_api_v1_minecraft_plugin_pair_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/minecraft/plugin/version":{"get":{"tags":["⛏️ Minecraft Plugin"],"summary":"Version","description":"Die neueste Plugin-Version (4.11). Ohne Anmeldung: auch ein nicht\nverbundenes Plugin soll wissen, dass es ein Update gibt - und die\nDownload-Seite im Frontend liest hier, welches Jar sie anbietet.","operationId":"version_api_v1_minecraft_plugin_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/minecraft/plugin/download/{datei}":{"get":{"tags":["⛏️ Minecraft Plugin"],"summary":"Download","description":"Das Jar der eigenen Freigabe (data/minecraft, utils/minecraft_download.py).\n\nOhne Anmeldung: die Download-Seite auf notoq.xyz verlinkt es direkt, und\nBetreiber holen es per `wget` auf den Server. Der Name traegt die\nVersion, eine neue Version ist also eine neue Adresse - deshalb darf ein\nZwischenspeicher die Datei ein Jahr behalten (`immutable`).","operationId":"download_api_v1_minecraft_plugin_download__datei__get","parameters":[{"name":"datei","in":"path","required":true,"schema":{"type":"string","title":"Datei"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/minecraft/plugin/config":{"get":{"tags":["⛏️ Minecraft Plugin"],"summary":"Config","description":"Die Plugin-Sicht der Einstellungen (4.3, 4.9).\n\nETag ist Stand und Abdruck der Sicht (`_etag`). Unveraendert -> 304 ohne\nKoerper. Auch eine gesperrte Instanz bekommt ihre Sicht - mit allen\nFunktionen aus -, damit das Plugin anzeigen kann, was los ist.","operationId":"config_api_v1_minecraft_plugin_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/minecraft/plugin/sync":{"post":{"tags":["⛏️ Minecraft Plugin"],"summary":"Sync","description":"Lebenszeichen und Befehle, als Long-Poll (4.4).\n\nSofort zurueck, wenn Befehle anstehen oder der Konfigurationsstand des\nPlugins nicht der aktuelle ist; sonst warten, bis ein Befehl kommt oder\n`wait` um ist. Gewartet wird OHNE Datenbank: der Wecker\n(api/utils/minecraft_warten.py) schaut fuer alle Wartenden dieses\nProzesses einmal je Sekunde nach.\n\nEine gesperrte Instanz (ueber der Instanzgrenze) bekommt 403 suspended -\nihr Lebenszeichen ist trotzdem verbucht, das Dashboard zeigt sie also\nals gesperrt und nicht als offline.","operationId":"sync_api_v1_minecraft_plugin_sync_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/minecraft/plugin/ack":{"post":{"tags":["⛏️ Minecraft Plugin"],"summary":"Ack","description":"Quittungen fuer ausgelieferte Befehle (4.5).","operationId":"ack_api_v1_minecraft_plugin_ack_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/minecraft/plugin/events":{"post":{"tags":["⛏️ Minecraft Plugin"],"summary":"Events","description":"Ereignisse aus dem Spiel (4.6). Hoechstens 100 je Stapel und 256 KB.\n\nAntwort `{accepted, duplicates, rejected}` - ein abgewiesenes Ereignis\nkippt nicht den Stapel, es steht nur mit Grund in `rejected`.","operationId":"events_api_v1_minecraft_plugin_events_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/minecraft/plugin/link/code":{"post":{"tags":["⛏️ Minecraft Plugin"],"summary":"Link Code","description":"`/link` im Spiel (4.7): `{code, url, expires_at}`.","operationId":"link_code_api_v1_minecraft_plugin_link_code_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/minecraft/plugin/link/remove":{"post":{"tags":["⛏️ Minecraft Plugin"],"summary":"Link Remove","description":"`/unlink` im Spiel (2.2, 4.7a). Nur fuer einen Spieler, der gerade im\nNetzwerk dieses Discord-Servers online ist - und nur fuer eine\nVerknuepfung, die auf DIESEM Server entstand.\n\n`{uuid}` -> `{removed: true}`; 404 `not_linked`, 409 `not_online`,\n403 `not_origin` (auf einem anderen Server verknuepft: loesen geht dann\nnur ueber `/minecraft unlink` in Discord oder das Notoq-Profil - das Token\nbeweist den Server, nicht den Spieler).","operationId":"link_remove_api_v1_minecraft_plugin_link_remove_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/minecraft/plugin/players/{uuid}/link":{"get":{"tags":["⛏️ Minecraft Plugin"],"summary":"Player Link","description":"`NotoqApi.fetchLink` (4.7b): `{link: {...} | null}` ohne Nebenwirkung.\n\nWarum ein eigener Weg und nicht `/players/check`: der prueft den Beitritt\nund stellt bei Pflicht-Verknuepfung nebenbei einen Link-Code aus. Ein\nanderes Plugin, das nur wissen will, wer hinter einem Spieler steht, soll\ndabei keinen Code erzeugen.\n\nSichtbar nach der Regel aus 2.2: Mitglied UND hier gespielt. Anders als\nbeim Beitritt steht hier niemand im Spiel - gefragt werden darf nach\nJEDER UUID, und ohne \"hier gespielt\" erfuehre jeder Server, welcher\nMensch aus seinem Discord hinter einem beliebigen Minecraft-Konto steht.","operationId":"player_link_api_v1_minecraft_plugin_players__uuid__link_get","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","title":"Uuid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/minecraft/plugin/players/check":{"post":{"tags":["⛏️ Minecraft Plugin"],"summary":"Players Check","description":"Darf dieser Spieler beitreten? (4.8)","operationId":"players_check_api_v1_minecraft_plugin_players_check_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/minecraft/plugin/players/banned":{"post":{"tags":["⛏️ Minecraft Plugin"],"summary":"Players Banned","description":"Einspruchscode fuer den Bann-Bildschirm eines fremden Bann-Plugins (4.8a).\n\n`{\"appeal\": {code, url, expires_at}}` oder `{\"appeal\": null}`, wenn\nEinsprueche aus sind oder die Stufe sie nicht hat. 422 `offline_uuid` fuer\neine UUID der Version 3 (wie `/link/code`): auf einem Offline-Server\nbewiese der Code nicht, wem das Konto gehoert. Jeder Aufruf bringt einen\nfrischen Code; die vorigen bleiben gueltig und fuehren zum selben\nEinspruch.","operationId":"players_banned_api_v1_minecraft_plugin_players_banned_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/servers/{server_id}/minecraft":{"get":{"tags":["⛏️ Minecraft"],"summary":"Uebersicht","description":"Alles, was die Seite beim Aufbau braucht (5.5).\n\nStufe, Funktionsschalter, Grenzen, Einstellungen mit Vorgaben, Instanzen,\nGruppen, Plugin-Version, Regelkatalog und Warnungen. Legt nichts an: ein\nServer, der die Seite nur ansieht, bekommt keine Zeile in `connectors`.","operationId":"uebersicht_api_v1_servers__server_id__minecraft_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["⛏️ Minecraft"],"summary":"Alles Trennen","description":"Minecraft abbauen: alle Instanzen trennen (die Plugins sehen 401) und die\nEinstellungen loeschen. Spieler und Statistik nur mit `delete_data`;\nVerknuepfungen bleiben immer - sie gehoeren den Menschen.","operationId":"alles_trennen_api_v1_servers__server_id__minecraft_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"delete_data","in":"query","required":false,"schema":{"type":"boolean","description":"Auch Spieler und Statistik loeschen","default":false,"title":"Delete Data"},"description":"Auch Spieler und Statistik loeschen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/minecraft/settings":{"patch":{"tags":["⛏️ Minecraft"],"summary":"Einstellungen Speichern","description":"Einen Abschnitt speichern: `{section, values}` -> `{settings, config_version, changed}`.\n\n`values` darf eine Teilaenderung sein - Objekte werden tief\nzusammengefuehrt, Listen ersetzt (utils/minecraft.py). Jede Aenderung\nzaehlt den Konfigurationsstand hoch und schickt `config.changed` an alle\nInstanzen; eine Speicherung ohne Aenderung tut beides nicht.","operationId":"einstellungen_speichern_api_v1_servers__server_id__minecraft_settings_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"content":{"application/json":{"schema":{"title":"Koerper"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/minecraft/pairing":{"post":{"tags":["⛏️ Minecraft"],"summary":"Verbinden","description":"Einen Verbindungscode erzeugen (2.1): `{code, expires_at, expires_in_s}`.\n\nIst die Instanzgrenze schon erreicht, gibt es keinen Code, sondern\n`403 limit_reached` - der Betreiber erfaehrt es hier und nicht erst in\nder Serverkonsole.","operationId":"verbinden_api_v1_servers__server_id__minecraft_pairing_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/minecraft/pairing/{code}":{"get":{"tags":["⛏️ Minecraft"],"summary":"Verbindung Pruefen","description":"`{status: pending|used|expired, instance?}` - der Assistent fragt das,\nwaehrend er \"Warte auf deinen Server ...\" zeigt.","operationId":"verbindung_pruefen_api_v1_servers__server_id__minecraft_pairing__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"code","in":"path","required":true,"schema":{"type":"string","maxLength":16,"title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/minecraft/instances/{instance_id}":{"patch":{"tags":["⛏️ Minecraft"],"summary":"Instanz Umbenennen","description":"`{name}` -> die Instanz, wie die Uebersicht sie zeigt.","operationId":"instanz_umbenennen_api_v1_servers__server_id__minecraft_instances__instance_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"instance_id","in":"path","required":true,"schema":{"type":"integer","title":"Instance Id"}}],"requestBody":{"content":{"application/json":{"schema":{"title":"Koerper"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["⛏️ Minecraft"],"summary":"Instanz Trennen","description":"Eine Instanz trennen. Ihr Token ist danach wertlos, das Plugin sieht 401.","operationId":"instanz_trennen_api_v1_servers__server_id__minecraft_instances__instance_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"instance_id","in":"path","required":true,"schema":{"type":"integer","title":"Instance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/minecraft/instances/{instance_id}/test":{"post":{"tags":["⛏️ Minecraft"],"summary":"Instanz Testen","description":"Eine Testnachricht in den Chat dieser Instanz (`{text?}`).\n\nOhne Text schickt der Dienst einen eigenen Satz. Das Frontend sollte\neinen uebersetzten mitgeben: der Betreiber liest ihn gleich im Spiel.","operationId":"instanz_testen_api_v1_servers__server_id__minecraft_instances__instance_id__test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"instance_id","in":"path","required":true,"schema":{"type":"integer","title":"Instance Id"}}],"requestBody":{"content":{"application/json":{"schema":{"title":"Koerper"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/minecraft/players":{"get":{"tags":["⛏️ Minecraft"],"summary":"Spieler","description":"Die Spieler dieses Servers, seitenweise:\n`{players[], total, page, per_page, has_more}`.\n\nEine Verknuepfung steht nur dabei, wenn sie fuer DIESEN Server sichtbar\nist (2.2): der Mensch ist hier Mitglied und hat hier gespielt.","operationId":"spieler_api_v1_servers__server_id__minecraft_players_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"query","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Name oder UUID","title":"Query"},"description":"Name oder UUID"},{"name":"filter","in":"query","required":false,"schema":{"type":"string","description":"all | online | linked | unlinked | banned","default":"all","title":"Filter"},"description":"all | online | linked | unlinked | banned"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"last_seen | playtime | name","default":"last_seen","title":"Sort"},"description":"last_seen | playtime | name"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/minecraft/players/{uuid}":{"get":{"tags":["⛏️ Minecraft"],"summary":"Spieler Akte","description":"Ein Spieler: `{player, sessions[], reports[]}`.","operationId":"spieler_akte_api_v1_servers__server_id__minecraft_players__uuid__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"uuid","in":"path","required":true,"schema":{"type":"string","maxLength":40,"title":"Uuid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/minecraft/players/{uuid}/actions":{"post":{"tags":["⛏️ Minecraft"],"summary":"Spieler Aktion","description":"Eine Handlung am Spieler (Premium): message, kick, ban, pardon, reward, sync.\n\nDie Befehle werden eingereiht und dorthin geleitet, wo sie laufen koennen\n(utils/minecraft_dienst.spieler_aktion). Antwort:\n`{type, queued[{id, type, instance_id}], online, waits_for_player}`.","operationId":"spieler_aktion_api_v1_servers__server_id__minecraft_players__uuid__actions_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"uuid","in":"path","required":true,"schema":{"type":"string","maxLength":40,"title":"Uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"title":"Koerper"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/minecraft/stats":{"get":{"tags":["⛏️ Minecraft"],"summary":"Statistik","description":"Die Statistik (Premium). `days` wird auf `minecraft.stats_days` der Stufe\ngedeckelt; die Antwort sagt mit `days`, `requested_days` und `capped`,\nwas wirklich gerechnet wurde. `tz` legt die Stosszeiten (`heatmap`) in die\nOrtszeit - ohne sie stehen sie in UTC, und der Abend eines Servers in\nBerlin laege zwei Spalten zu frueh.","operationId":"statistik_api_v1_servers__server_id__minecraft_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","description":"7 | 30 | 90 | 365","default":30,"title":"Days"},"description":"7 | 30 | 90 | 365"},{"name":"tz","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"IANA-Zeitzone fuer die Stosszeiten","title":"Tz"},"description":"IANA-Zeitzone fuer die Stosszeiten"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/minecraft/rules":{"get":{"tags":["⛏️ Minecraft"],"summary":"Regeln Lesen","description":"`{rules[], limit{allowed, used}, locked}`. Auch ohne Premium lesbar:\nRegeln aus einer frueheren Buchung stehen still, sind aber da (Abschnitt 3).","operationId":"regeln_lesen_api_v1_servers__server_id__minecraft_rules_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["⛏️ Minecraft"],"summary":"Regeln Setzen","description":"Die Regeln am Stueck ersetzen (`{rules[]}`), geprueft VOR dem Loeschen.","operationId":"regeln_setzen_api_v1_servers__server_id__minecraft_rules_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"content":{"application/json":{"schema":{"title":"Koerper"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/minecraft/activity":{"get":{"tags":["⛏️ Minecraft"],"summary":"Aktivitaet","description":"Was zuletzt aus dem Spiel kam, neueste zuerst:\n`{events[], has_more, next_before_id}`.","operationId":"aktivitaet_api_v1_servers__server_id__minecraft_activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"before_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Blaettern: aelter als diese ID","title":"Before Id"},"description":"Blaettern: aelter als diese ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Limit"}},{"name":"include_chat","in":"query","required":false,"schema":{"type":"boolean","description":"Chatzeilen mitliefern","default":false,"title":"Include Chat"},"description":"Chatzeilen mitliefern"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/minecraft/giveaways":{"get":{"tags":["⛏️ Minecraft"],"summary":"Gewinnspiele","description":"Laufende Gewinnspiele mit ihren Preisen im Spiel: `{giveaways[], enabled, locked}`.","operationId":"gewinnspiele_api_v1_servers__server_id__minecraft_giveaways_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/minecraft/giveaways/{giveaway_id}":{"put":{"tags":["⛏️ Minecraft"],"summary":"Gewinnspiel Preise","description":"Die Befehle, die jeder Gewinner im Spiel bekommt (`{commands[]}`, Premium).\nEine leere Liste entfernt den Preis - das geht auf jeder Stufe.","operationId":"gewinnspiel_preise_api_v1_servers__server_id__minecraft_giveaways__giveaway_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"giveaway_id","in":"path","required":true,"schema":{"type":"integer","title":"Giveaway Id"}}],"requestBody":{"content":{"application/json":{"schema":{"title":"Koerper"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/minecraft/link/{code}":{"get":{"tags":["⛏️ Minecraft öffentlich"],"summary":"Link Ansehen","description":"Einen Link-Code ansehen, ohne ihn einzuloesen:\n`{status: pending|used|expired, player{uuid,name,edition,head_url}, server{id,name,icon_url}, expires_at}`.","operationId":"link_ansehen_api_v1_minecraft_link__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","maxLength":16,"title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["⛏️ Minecraft öffentlich"],"summary":"Link Einloesen","description":"Einen Link-Code einloesen: dieses Minecraft-Konto gehoert ab jetzt zum\nangemeldeten Discord-Konto, auf jedem Server mit Notoq.\n\n`{result: linked|unchanged, link_id, player, discord{id,name,avatar_url}, first_time}`.\nDerselbe Klick ein zweites Mal ist `unchanged` und kein Fehler.","operationId":"link_einloesen_api_v1_minecraft_link__code__post","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","maxLength":16,"title":"Code"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"title":"Koerper"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/minecraft/appeal/{code}":{"get":{"tags":["⛏️ Minecraft öffentlich"],"summary":"Einspruch Ansehen","description":"Einen Einspruchscode ansehen, ohne ihn einzuloesen:\n`{status: pending|used|expired|disabled, player{uuid,name,head_url}, server{id,name,icon_url},\nreason, expires_at, appeals_enabled}`.\n\n`disabled` und `appeals_enabled` sagen vorab, dass der Server gerade\nkeine Einsprueche gegen Banne annimmt - die Seite kann es zeigen, statt\nerst nach der Anmeldung mit 403 zu scheitern.","operationId":"einspruch_ansehen_api_v1_minecraft_appeal__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","maxLength":16,"title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["⛏️ Minecraft öffentlich"],"summary":"Einspruch Starten","description":"Den Einspruch anlegen (`punishment_type = \"mc_ban\"`): `{appeal_token, appeal_id, case_number}`.\n\nDas Formular fuellt der Mensch danach auf `/appeal/{appeal_token}` aus,\nwie jeden anderen Einspruch. Derselbe Mensch ein zweites Mal bekommt\ndenselben Einspruch (Doppelklick, Zurueck-Taste) - und jeder weitere Code\ndesselben Spielers auf diesem Server auch, solange der Einspruch nicht\nangenommen ist: Versuche, Frist und `max_appeals_per_punishment` zaehlen\nje Bann, nicht je Code.","operationId":"einspruch_starten_api_v1_minecraft_appeal__code__post","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","maxLength":16,"title":"Code"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/minecraft":{"get":{"tags":["⛏️ Minecraft öffentlich"],"summary":"Meine Konten","description":"`{links[{id, uuid, name, edition, linked_at, linked_via, head_url, verified, verified_at}],\nmicrosoft_verify}`.\n\n`microsoft_verify` sagt der Seite, ob sie den Nachweis ueber Microsoft\nanbieten darf - solange er aus ist, gibt es seine Routen nicht (Kopf der\nDatei), und ein Knopf dorthin fuehrte ins Leere.","operationId":"meine_konten_api_v1_users_me_minecraft_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/me/minecraft/{link_id}":{"delete":{"tags":["⛏️ Minecraft öffentlich"],"summary":"Konto Loesen","description":"Eine eigene Verknuepfung aufheben. Ueberall, wo der Spieler gespielt hat,\ngehen `link.removed` an die Plugins und an den Bot (Rollen und Raenge\nwerden entzogen). Nur die EIGENE: eine fremde ID ist hier 404.","operationId":"konto_loesen_api_v1_users_me_minecraft__link_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"integer","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__utils__minecraft_http__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/release":{"get":{"tags":["🎮 Game Center"],"summary":"Release","description":"Die neueste Fassung: `{\"release\": {version, published_at, size},\n\"passwort\": bool}`, `release` null, solange es kein Release mit Installer\ngibt. Die Adresse der Datei steht hier nicht - die gibt `/download`\nheraus, waehrend der Beta nur gegen das Passwort.\n\n503, wenn GitHub noch nie geantwortet hat: \"noch kein Release\" weiss in\ndem Fall niemand.","operationId":"release_api_v1_gamecenter_release_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/gamecenter/download":{"post":{"tags":["🎮 Game Center"],"summary":"Download","description":"Die Adresse des Installers: `{\"url\"}`.\n\n403 bei falschem Passwort - geprueft, bevor irgendetwas ueber das Release\nverraten wird. 404, solange es kein Release mit Installer gibt, 503 ohne\nAuskunft von GitHub.","operationId":"download_api_v1_gamecenter_download_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownloadBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/gratis":{"get":{"tags":["🎮 Game Center"],"summary":"Gratis","description":"Die laufenden Gratis-Angebote bei Epic, Steam und GOG fuer das Regal\nauf der Startseite (Phase 8): `{\"angebote\": [...], \"stand\"}` - die Form\nsteht in utils/gamecenter_gratis.py. 503, wenn alle Laeden scheitern.\n\nOhne Anmeldung: die Liste ist oeffentlich und fuer alle gleich. Gemerkt\nwird schon in utils/free_games.py (15 Minuten je Land und Sprache), dazu\ndarf ein Zwischenspeicher sie zehn Minuten behalten - Epic wechselt\nwoechentlich, Steam und GOG selten oefter als taeglich.","operationId":"gratis_api_v1_gamecenter_gratis_get","parameters":[{"name":"sprache","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Sprache"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/valorant/konten":{"post":{"tags":["🎮 Game Center"],"summary":"Valorant Konten","description":"Rang, Level und Card von Valorant-Konten: `{\"konten\": [...]}`, je\nEintrag der Anfrage und in derselben Reihenfolge `{\"ok\": true, ...}` oder\n`{\"ok\": false, \"fehler\": ...}` - die Form steht in utils/valorant_rang.py.\n\nNur mit Notoq-Token: hinter der Route steht der HenrikDev-Schluessel, und\nohne Anmeldung waere sie ein offener Proxy fuer ihn. 503, solange kein\nSchluessel eingetragen ist - erst nach der Anmeldung geprueft, damit ein\nFremder nicht erfaehrt, wie der Server eingerichtet ist.","operationId":"valorant_konten_api_v1_gamecenter_valorant_konten_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValorantKontenBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/gamecenter/valorant/sitzung":{"post":{"tags":["🎮 Game Center"],"summary":"Valorant Sitzung","description":"Die Ranglistenspiele einer Sitzung fuer den Session-Rueckblick:\n`{\"ok\": true, \"spiele\", \"rr\", \"rang\"}` oder `{\"ok\": false, \"fehler\"}` -\ndie Form steht in utils/valorant_rang.py.\n\nZugang, 503 und no-store wie bei `/konten`.","operationId":"valorant_sitzung_api_v1_gamecenter_valorant_sitzung_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValorantSitzungBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/gamecenter/valorant/matches":{"post":{"tags":["🎮 Game Center"],"summary":"Valorant Matches","description":"Die letzten Matches eines Valorant-Kontos mit den eigenen Zahlen,\nfuer lokale wie fuer Cloud-Konten: `{\"ok\": true, \"matches\", \"rang\",\n\"stand\"}` oder `{\"ok\": false, \"fehler\"}` - Form und Regeln in\nutils/valorant_matches.py.\n\nZugang, 503 und no-store wie bei `/konten`: hinter der Route steht der\nHenrikDev-Schluessel, und der Schluessel wird erst nach der Anmeldung\ngeprueft.","operationId":"valorant_matches_api_v1_gamecenter_valorant_matches_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValorantMatchesBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/gamecenter/konto":{"get":{"tags":["🎮 Game Center"],"summary":"Notoq Konto","description":"Premium und Supreme des angemeldeten Kontos - die Form steht in\nutils/gamecenter_notoq.py. Entschieden wird ueber den PremiumManager, wie\nim Bot. 503, wenn die Datenbank nicht antwortet: die App behaelt dann\nihren letzten Stand, statt jemanden auszusperren.","operationId":"notoq_konto_api_v1_gamecenter_konto_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/gamecenter/server":{"get":{"tags":["🎮 Game Center"],"summary":"Notoq Server","description":"Level auf den eigenen Servern und deren anstehende Events - Form,\nGrenzen und die Sichtbarkeitsregel fuer Events stehen in\nutils/gamecenter_notoq.py. 503, wenn die Datenbank nicht antwortet: ein\nhalbes Ergebnis hielte die App fuer abgesagte Events.","operationId":"notoq_server_api_v1_gamecenter_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/gamecenter/tresor/":{"get":{"tags":["🎮 Game Center Tresor"],"summary":"Uebersicht","description":"Profil vorhanden?, Plan, alle eigenen Tresore mit Rolle, Status,\nRevision und Aufgaben, offene Discord-Einladungen, Grenzen. Das eigene\nAbo wird dabei frisch geprueft und auf die eigenen Tresore angewendet.","operationId":"uebersicht_api_v1_gamecenter_tresor__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/gamecenter/tresor/profil":{"get":{"tags":["🎮 Game Center Tresor"],"summary":"Profil Lesen","description":"`{profil: Profil | null}` - nur Verschluesseltes und Oeffentliches.","operationId":"profil_lesen_api_v1_gamecenter_tresor_profil_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["🎮 Game Center Tresor"],"summary":"Profil Aendern","description":"Passwort (`kdf` + `uk_pw`) und/oder Code (`uk_rk`) -> `{profil}` mit\nversion + 1; 409 konflikt bei altem Stand.","operationId":"profil_aendern_api_v1_gamecenter_tresor_profil_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfilAendernBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["🎮 Game Center Tresor"],"summary":"Profil Anlegen","description":"Tresor einrichten -> 201 `{profil}`; 409 profil_vorhanden.","operationId":"profil_anlegen_api_v1_gamecenter_tresor_profil_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfilBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/gamecenter/tresor/profil/zuruecksetzen":{"post":{"tags":["🎮 Game Center Tresor"],"summary":"Profil Zuruecksetzen","description":"Neues Schluesselpaar: persoenlicher Tresor weg, Mitgliedschaften\n`zurueckgesetzt`, `rotation_noetig` in den Gruppen -> `{profil}`.","operationId":"profil_zuruecksetzen_api_v1_gamecenter_tresor_profil_zuruecksetzen_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfilBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/gamecenter/tresor/persoenlich":{"post":{"tags":["🎮 Game Center Tresor"],"summary":"Persoenlich Anlegen","description":"\"Meine Cloud\" anlegen -> 201 `{tresor}`. Eigenes Abo noetig.","operationId":"persoenlich_anlegen_api_v1_gamecenter_tresor_persoenlich_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersoenlichBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/gamecenter/tresor/gruppen":{"post":{"tags":["🎮 Game Center Tresor"],"summary":"Gruppe Anlegen","description":"Gruppe anlegen -> 201 `{tresor}`. Eigenes Abo, hoechstens 5.","operationId":"gruppe_anlegen_api_v1_gamecenter_tresor_gruppen_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GruppeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/gamecenter/tresor/praesenz":{"get":{"tags":["🎮 Game Center Tresor"],"summary":"Praesenz Lesen","description":"`{gerade: [...]}` - wer gerade auf welchem Konto meiner Tresore spielt.","operationId":"praesenz_lesen_api_v1_gamecenter_tresor_praesenz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["🎮 Game Center Tresor"],"summary":"Praesenz Melden","description":"`{puuid}` alle 60 s waehrend des Spiels, `{puuid: null}` am Ende ->\n204 (auch, wenn die PUUID in keiner eigenen Gruppe liegt).","operationId":"praesenz_melden_api_v1_gamecenter_tresor_praesenz_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PraesenzBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/gamecenter/tresor/spielzeit":{"get":{"tags":["🎮 Game Center Tresor"],"summary":"Spielzeit","description":"Echte Spielzeit je Eintrag und Tresor (utils/gamecenter_spielzeit.py).","operationId":"spielzeit_api_v1_gamecenter_tresor_spielzeit_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/gamecenter/tresor/matches":{"get":{"tags":["🎮 Game Center Tresor"],"summary":"Matches Lesen","description":"Die Matches der Cloud-Konten (utils/valorant_matches.py):\n`?eintrag=&vor=&anzahl=` -> `{matches, weiter}`, `?seit=` (alle meine\naktiven Tresore, 7 Tage) und `?eintrag=&seit=` (30 Tage) -> `{matches,\nabgeschnitten}`. 404 fuer fremde Eintraege, 400 fuer `vor` mit `seit`.\n`seit` steht in der Adresse: ein `+` der Zone als %2B.","operationId":"matches_lesen_api_v1_gamecenter_tresor_matches_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eintrag","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":9007199254740991,"minimum":1},{"type":"null"}],"title":"Eintrag"}},{"name":"vor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":9007199254740991,"minimum":1},{"type":"null"}],"title":"Vor"}},{"name":"anzahl","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"title":"Anzahl"}},{"name":"seit","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Seit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/tresor/einladungen/vorschau":{"post":{"tags":["🎮 Game Center Tresor"],"summary":"Einladung Vorschau","description":"Was hinter einem Link steht - verbraucht nichts. 404\neinladung_ungueltig.","operationId":"einladung_vorschau_api_v1_gamecenter_tresor_einladungen_vorschau_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/gamecenter/tresor/einladungen/einloesen":{"post":{"tags":["🎮 Game Center Tresor"],"summary":"Einladung Einloesen","description":"Link einloesen -> `{tresor_id, status: \"wartet\"}`. Profil noetig.","operationId":"einladung_einloesen_api_v1_gamecenter_tresor_einladungen_einloesen_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/gamecenter/tresor/einladungen/{inv}/annehmen":{"post":{"tags":["🎮 Game Center Tresor"],"summary":"Einladung Annehmen","description":"Discord-Einladung annehmen -> `{tresor_id, status}` (`aktiv` mit\ngueltigem `vorab`, sonst `schluessel`). Nur das Ziel.","operationId":"einladung_annehmen_api_v1_gamecenter_tresor_einladungen__inv__annehmen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"inv","in":"path","required":true,"schema":{"type":"integer","maximum":9007199254740991,"minimum":1,"title":"Inv"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/tresor/einladungen/{inv}/ablehnen":{"post":{"tags":["🎮 Game Center Tresor"],"summary":"Einladung Ablehnen","description":"Discord-Einladung ablehnen -> 204. Nur das Ziel.","operationId":"einladung_ablehnen_api_v1_gamecenter_tresor_einladungen__inv__ablehnen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"inv","in":"path","required":true,"schema":{"type":"integer","maximum":9007199254740991,"minimum":1,"title":"Inv"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/tresor/{tresor_id}":{"get":{"tags":["🎮 Game Center Tresor"],"summary":"Tresor Details","description":"Tresor, Mitglieder, eigene Schluessel, Eintraege, Einladungen,\nHinweise. 404 auch, wenn man nicht Mitglied ist.","operationId":"tresor_details_api_v1_gamecenter_tresor__tresor_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["🎮 Game Center Tresor"],"summary":"Umbenennen","description":"Gruppe umbenennen -> `{tresor}`. Besitzer und Verwalter.","operationId":"umbenennen_api_v1_gamecenter_tresor__tresor_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NameBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎮 Game Center Tresor"],"summary":"Tresor Loeschen","description":"Tresor samt allem loeschen -> 204. Der Besitzer.","operationId":"tresor_loeschen_api_v1_gamecenter_tresor__tresor_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/tresor/{tresor_id}/verlassen":{"post":{"tags":["🎮 Game Center Tresor"],"summary":"Verlassen","description":"Gruppe verlassen -> 204; setzt `rotation_noetig`. Nicht der Besitzer.","operationId":"verlassen_api_v1_gamecenter_tresor__tresor_id__verlassen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/tresor/{tresor_id}/besitz":{"post":{"tags":["🎮 Game Center Tresor"],"summary":"Besitz Uebertragen","description":"Besitz uebertragen -> 204. Ziel aktiv, Verwalter oder Mitglied, mit Abo.","operationId":"besitz_uebertragen_api_v1_gamecenter_tresor__tresor_id__besitz_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BesitzBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/tresor/{tresor_id}/rotation":{"post":{"tags":["🎮 Game Center Tresor"],"summary":"Rotation","description":"Schluessel erneuern (`rotation_noetig`) -> 204. Besitzer, Verwalter.","operationId":"rotation_api_v1_gamecenter_tresor__tresor_id__rotation_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotationBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/tresor/{tresor_id}/eintraege":{"post":{"tags":["🎮 Game Center Tresor"],"summary":"Eintrag Anlegen","description":"Konto hinzufuegen -> 201 `{eintrag}`.","operationId":"eintrag_anlegen_api_v1_gamecenter_tresor__tresor_id__eintraege_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EintragBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/tresor/{tresor_id}/eintraege/{eid}":{"put":{"tags":["🎮 Game Center Tresor"],"summary":"Eintrag Aendern","description":"Konto aendern -> `{eintrag}`; `login_enc: null` entfernt das Login.","operationId":"eintrag_aendern_api_v1_gamecenter_tresor__tresor_id__eintraege__eid__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"integer","maximum":9007199254740991,"minimum":1,"title":"Eid"}},{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EintragAendernBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎮 Game Center Tresor"],"summary":"Eintrag Entfernen","description":"Konto entfernen -> 204. Auch schreibgeschuetzt.","operationId":"eintrag_entfernen_api_v1_gamecenter_tresor__tresor_id__eintraege__eid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"integer","maximum":9007199254740991,"minimum":1,"title":"Eid"}},{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/tresor/{tresor_id}/eintraege/{eid}/verschieben":{"post":{"tags":["🎮 Game Center Tresor"],"summary":"Eintrag Verschieben","description":"Konto in einen anderen Tresor -> 201 `{eintrag}` mit neuer ID.","operationId":"eintrag_verschieben_api_v1_gamecenter_tresor__tresor_id__eintraege__eid__verschieben_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"integer","maximum":9007199254740991,"minimum":1,"title":"Eid"}},{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerschiebenBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/tresor/{tresor_id}/eintraege/{eid}/nutzung":{"post":{"tags":["🎮 Game Center Tresor"],"summary":"Nutzung","description":"Login angezeigt oder kopiert -> 204 (Verlauf, je 10 min einmal).","operationId":"nutzung_api_v1_gamecenter_tresor__tresor_id__eintraege__eid__nutzung_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"integer","maximum":9007199254740991,"minimum":1,"title":"Eid"}},{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NutzungBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/tresor/{tresor_id}/mitglieder/{konto}":{"patch":{"tags":["🎮 Game Center Tresor"],"summary":"Rolle Aendern","description":"Rolle wechseln -> `{mitglied}`; mit Login-Uebergabe bzw. Rotation.","operationId":"rolle_aendern_api_v1_gamecenter_tresor__tresor_id__mitglieder__konto__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"konto","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Konto"}},{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolleBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🎮 Game Center Tresor"],"summary":"Mitglied Entfernen","description":"Mitglied entfernen -> 204; `rotation` Pflicht, wenn es je aktiv war.","operationId":"mitglied_entfernen_api_v1_gamecenter_tresor__tresor_id__mitglieder__konto__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"konto","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Konto"}},{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/EntfernenBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/tresor/{tresor_id}/mitglieder/{konto}/schluessel":{"post":{"tags":["🎮 Game Center Tresor"],"summary":"Schluessel Uebergeben","description":"Bestaetigen bzw. versiegeln: Uebergaben an das Ziel -> 204.","operationId":"schluessel_uebergeben_api_v1_gamecenter_tresor__tresor_id__mitglieder__konto__schluessel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"konto","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Konto"}},{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchluesselBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/tresor/{tresor_id}/nutzer":{"get":{"tags":["🎮 Game Center Tresor"],"summary":"Nutzer Suchen","description":"Discord-Benutzername genau -> `{treffer: [...]}`, hoechstens 5.","operationId":"nutzer_suchen_api_v1_gamecenter_tresor__tresor_id__nutzer_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}},{"name":"name","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/tresor/{tresor_id}/einladungen":{"post":{"tags":["🎮 Game Center Tresor"],"summary":"Einladung Anlegen","description":"Link -> 201 `{id, token, link, laeuft_ab_am}`; Discord -> 201 `{id}`.","operationId":"einladung_anlegen_api_v1_gamecenter_tresor__tresor_id__einladungen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EinladungBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/tresor/{tresor_id}/einladungen/{inv}":{"delete":{"tags":["🎮 Game Center Tresor"],"summary":"Einladung Zurueckziehen","description":"Einladung zurueckziehen -> 204. Besitzer, Verwalter.","operationId":"einladung_zurueckziehen_api_v1_gamecenter_tresor__tresor_id__einladungen__inv__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"inv","in":"path","required":true,"schema":{"type":"integer","maximum":9007199254740991,"minimum":1,"title":"Inv"}},{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gamecenter/tresor/{tresor_id}/verlauf":{"get":{"tags":["🎮 Game Center Tresor"],"summary":"Verlauf","description":"`{eintraege, weiter}` - 50 je Seite, neueste zuerst.","operationId":"verlauf_api_v1_gamecenter_tresor__tresor_id__verlauf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tresor_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Tresor Id"}},{"name":"vor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":9007199254740991,"minimum":1},{"type":"null"}],"title":"Vor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connectors/hook/{hook_token}":{"post":{"tags":["🔌 Konnektoren Empfang"],"summary":"Konnektor Empfang","description":"Ein Ereignis eines fremden Dienstes annehmen.\n\nReihenfolge, und sie ist Absicht: erst Konnektor, dann Signatur, dann\nUebersetzung, dann Kontingent, dann Regeln, dann schreiben. Jeder Schritt\nist eine Tuer, die sich schliessen kann, und die teuersten stehen hinten.","operationId":"konnektor_empfang_connectors_hook__hook_token__post","parameters":[{"name":"hook_token","in":"path","required":true,"schema":{"type":"string","minLength":16,"maxLength":64,"description":"Der Pfadanteil aus der Empfangsadresse","title":"Hook Token"},"description":"Der Pfadanteil aus der Empfangsadresse"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connectors/oauth/{kind}/callback":{"get":{"tags":["🔌 Konnektoren Empfang"],"summary":"Oauth Rueckkehr","description":"Den Zugang eintauschen und zurueck ins Dashboard schicken.","operationId":"oauth_rueckkehr_connectors_oauth__kind__callback_get","parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","description":"patreon | notion","title":"Kind"},"description":"patreon | notion"},{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats/overview":{"get":{"tags":["📊 Server Stats"],"summary":"Get Server Stats Overview","description":"Komplette Server-Statistiken fuer den gewaehlten Zeitraum.","operationId":"get_server_stats_overview_api_v1_servers__server_id__stats_overview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single date YYYY-MM-DD","title":"Date"},"description":"Single date YYYY-MM-DD"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range start YYYY-MM-DD","title":"Start Date"},"description":"Range start YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range end YYYY-MM-DD","title":"End Date"},"description":"Range end YYYY-MM-DD"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":2020},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"title":"Month"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Week of month (1-5)","title":"Week"},"description":"Week of month (1-5)"},{"name":"weekday","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":6,"minimum":0},{"type":"null"}],"description":"0=Mon, 6=Sun","title":"Weekday"},"description":"0=Mon, 6=Sun"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerStatsOverview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats/messages":{"get":{"tags":["📊 Server Stats"],"summary":"Get Server Stats Messages","description":"Nachrichten-Statistiken fuer den gewaehlten Zeitraum.","operationId":"get_server_stats_messages_api_v1_servers__server_id__stats_messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single date YYYY-MM-DD","title":"Date"},"description":"Single date YYYY-MM-DD"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range start YYYY-MM-DD","title":"Start Date"},"description":"Range start YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range end YYYY-MM-DD","title":"End Date"},"description":"Range end YYYY-MM-DD"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":2020},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"title":"Month"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Week of month (1-5)","title":"Week"},"description":"Week of month (1-5)"},{"name":"weekday","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":6,"minimum":0},{"type":"null"}],"description":"0=Mon, 6=Sun","title":"Weekday"},"description":"0=Mon, 6=Sun"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerStatsMessages"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats/voice":{"get":{"tags":["📊 Server Stats"],"summary":"Get Server Stats Voice","description":"Voice-Statistiken fuer den gewaehlten Zeitraum.","operationId":"get_server_stats_voice_api_v1_servers__server_id__stats_voice_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single date YYYY-MM-DD","title":"Date"},"description":"Single date YYYY-MM-DD"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range start YYYY-MM-DD","title":"Start Date"},"description":"Range start YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range end YYYY-MM-DD","title":"End Date"},"description":"Range end YYYY-MM-DD"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":2020},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"title":"Month"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Week of month (1-5)","title":"Week"},"description":"Week of month (1-5)"},{"name":"weekday","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":6,"minimum":0},{"type":"null"}],"description":"0=Mon, 6=Sun","title":"Weekday"},"description":"0=Mon, 6=Sun"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerStatsVoice"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats/reactions":{"get":{"tags":["📊 Server Stats"],"summary":"Get Server Stats Reactions","description":"Reaktions-Statistiken fuer den gewaehlten Zeitraum.","operationId":"get_server_stats_reactions_api_v1_servers__server_id__stats_reactions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single date YYYY-MM-DD","title":"Date"},"description":"Single date YYYY-MM-DD"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range start YYYY-MM-DD","title":"Start Date"},"description":"Range start YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range end YYYY-MM-DD","title":"End Date"},"description":"Range end YYYY-MM-DD"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":2020},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"title":"Month"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Week of month (1-5)","title":"Week"},"description":"Week of month (1-5)"},{"name":"weekday","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":6,"minimum":0},{"type":"null"}],"description":"0=Mon, 6=Sun","title":"Weekday"},"description":"0=Mon, 6=Sun"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerStatsReactions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats/members":{"get":{"tags":["📊 Server Stats"],"summary":"Get Server Stats Members","description":"Member Join/Leave Statistiken fuer den gewaehlten Zeitraum.","operationId":"get_server_stats_members_api_v1_servers__server_id__stats_members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single date YYYY-MM-DD","title":"Date"},"description":"Single date YYYY-MM-DD"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range start YYYY-MM-DD","title":"Start Date"},"description":"Range start YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range end YYYY-MM-DD","title":"End Date"},"description":"Range end YYYY-MM-DD"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":2020},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"title":"Month"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Week of month (1-5)","title":"Week"},"description":"Week of month (1-5)"},{"name":"weekday","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":6,"minimum":0},{"type":"null"}],"description":"0=Mon, 6=Sun","title":"Weekday"},"description":"0=Mon, 6=Sun"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerStatsMemberFlow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats/moderation":{"get":{"tags":["📊 Server Stats"],"summary":"Get Server Stats Moderation","description":"Moderations-Statistiken fuer den gewaehlten Zeitraum.","operationId":"get_server_stats_moderation_api_v1_servers__server_id__stats_moderation_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single date YYYY-MM-DD","title":"Date"},"description":"Single date YYYY-MM-DD"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range start YYYY-MM-DD","title":"Start Date"},"description":"Range start YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range end YYYY-MM-DD","title":"End Date"},"description":"Range end YYYY-MM-DD"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":2020},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"title":"Month"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Week of month (1-5)","title":"Week"},"description":"Week of month (1-5)"},{"name":"weekday","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":6,"minimum":0},{"type":"null"}],"description":"0=Mon, 6=Sun","title":"Weekday"},"description":"0=Mon, 6=Sun"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerStatsModeration"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats/commands":{"get":{"tags":["📊 Server Stats"],"summary":"Get Server Stats Commands","description":"Command-Nutzungs-Statistiken fuer den gewaehlten Zeitraum.","operationId":"get_server_stats_commands_api_v1_servers__server_id__stats_commands_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single date YYYY-MM-DD","title":"Date"},"description":"Single date YYYY-MM-DD"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range start YYYY-MM-DD","title":"Start Date"},"description":"Range start YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range end YYYY-MM-DD","title":"End Date"},"description":"Range end YYYY-MM-DD"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":2020},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"title":"Month"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Week of month (1-5)","title":"Week"},"description":"Week of month (1-5)"},{"name":"weekday","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":6,"minimum":0},{"type":"null"}],"description":"0=Mon, 6=Sun","title":"Weekday"},"description":"0=Mon, 6=Sun"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerStatsCommands"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats/levels":{"get":{"tags":["📊 Server Stats"],"summary":"Get Server Stats Levels","description":"Level-System Statistiken (aktueller Stand).","operationId":"get_server_stats_levels_api_v1_servers__server_id__stats_levels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerStatsLevels"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats/leaderboard/{category}":{"get":{"tags":["📊 Server Stats"],"summary":"Get Server Stats Leaderboard","description":"Flexible Leaderboards fuer verschiedene Kategorien.","operationId":"get_server_stats_leaderboard_api_v1_servers__server_id__stats_leaderboard__category__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"category","in":"path","required":true,"schema":{"enum":["messages","voice","reactions","commands","xp","engagement","invites"],"type":"string","title":"Category"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single date YYYY-MM-DD","title":"Date"},"description":"Single date YYYY-MM-DD"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range start YYYY-MM-DD","title":"Start Date"},"description":"Range start YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range end YYYY-MM-DD","title":"End Date"},"description":"Range end YYYY-MM-DD"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":2020},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"title":"Month"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Week of month (1-5)","title":"Week"},"description":"Week of month (1-5)"},{"name":"weekday","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":6,"minimum":0},{"type":"null"}],"description":"0=Mon, 6=Sun","title":"Weekday"},"description":"0=Mon, 6=Sun"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerStatsLeaderboard"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats/pulse":{"get":{"tags":["📊 Server Stats"],"summary":"Get Server Stats Pulse","description":"Die Uebersicht in einer einzigen Anfrage.\n\nVorher lud die Statistik-Startseite eine schmale Zusammenfassung und\nverlinkte auf acht Unterseiten, die jede fuer sich noch einmal alles\nholten. Diese Route ist der Ersatz: sie liefert den kompletten Kopf des\nBereichs - Kennzahlen mit Vergleich, Verlauf, Gesundheit, Verteilung,\nRhythmus, Kanalbewegung, Bindung, Lebenszyklus, Prognose, Ausreisser und\ndie daraus abgeleiteten Hinweise.\n\nOhne Premium wird davon nur die erste Haelfte ueberhaupt gerechnet.","operationId":"get_server_stats_pulse_api_v1_servers__server_id__stats_pulse_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single date YYYY-MM-DD","title":"Date"},"description":"Single date YYYY-MM-DD"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range start YYYY-MM-DD","title":"Start Date"},"description":"Range start YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range end YYYY-MM-DD","title":"End Date"},"description":"Range end YYYY-MM-DD"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":2020},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"title":"Month"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Week of month (1-5)","title":"Week"},"description":"Week of month (1-5)"},{"name":"weekday","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":6,"minimum":0},{"type":"null"}],"description":"0=Mon, 6=Sun","title":"Weekday"},"description":"0=Mon, 6=Sun"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsPuls"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats/pulse/deep":{"get":{"tags":["📊 Server Stats"],"summary":"Get Server Stats Pulse Deep","description":"Die Auswertungen unter dem Kopf der Uebersicht.\n\nGesundheit, Beitragsverteilung, Rhythmus, Kanalbewegung, Bindung,\nLebenszyklus, Prognose, Ausreisser und die daraus abgeleiteten Hinweise.\n\nSteht seit dem Aufteilen getrennt von ``/stats/pulse``: die acht\nFachseiten brauchen nur den Kopf und sollen nicht auf siebzig Tage\nRollup-Aufbau warten, den sie nicht lesen. Die Uebersicht fragt beides\ngleichzeitig ab und fuellt sich von oben nach unten.\n\nKomplett Premium - ohne gibt es hier nichts zu kuerzen, sondern nichts zu\nzeigen.","operationId":"get_server_stats_pulse_deep_api_v1_servers__server_id__stats_pulse_deep_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single date YYYY-MM-DD","title":"Date"},"description":"Single date YYYY-MM-DD"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range start YYYY-MM-DD","title":"Start Date"},"description":"Range start YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range end YYYY-MM-DD","title":"End Date"},"description":"Range end YYYY-MM-DD"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":2020},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"title":"Month"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Week of month (1-5)","title":"Week"},"description":"Week of month (1-5)"},{"name":"weekday","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":6,"minimum":0},{"type":"null"}],"description":"0=Mon, 6=Sun","title":"Weekday"},"description":"0=Mon, 6=Sun"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsPulsTiefe"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats/rhythm":{"get":{"tags":["📊 Server Stats"],"summary":"Get Server Stats Rhythm","description":"Das 7x24-Raster fuer Text UND Voice.\n\nBeide nebeneinander, weil sie auf den meisten Servern auseinanderfallen -\nund genau diese Differenz ist die Auskunft, die ein einzelnes Raster\nnicht geben kann.","operationId":"get_server_stats_rhythm_api_v1_servers__server_id__stats_rhythm_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single date YYYY-MM-DD","title":"Date"},"description":"Single date YYYY-MM-DD"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range start YYYY-MM-DD","title":"Start Date"},"description":"Range start YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range end YYYY-MM-DD","title":"End Date"},"description":"Range end YYYY-MM-DD"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":2020},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"title":"Month"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Week of month (1-5)","title":"Week"},"description":"Week of month (1-5)"},{"name":"weekday","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":6,"minimum":0},{"type":"null"}],"description":"0=Mon, 6=Sun","title":"Weekday"},"description":"0=Mon, 6=Sun"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsRhythmus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats/retention":{"get":{"tags":["📊 Server Stats"],"summary":"Get Server Stats Retention","description":"Kohorten-Bindung und Lebenszyklus der Mitglieder.","operationId":"get_server_stats_retention_api_v1_servers__server_id__stats_retention_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"weeks","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":1,"default":8,"title":"Weeks"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single date YYYY-MM-DD","title":"Date"},"description":"Single date YYYY-MM-DD"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range start YYYY-MM-DD","title":"Start Date"},"description":"Range start YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range end YYYY-MM-DD","title":"End Date"},"description":"Range end YYYY-MM-DD"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":2020},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"title":"Month"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Week of month (1-5)","title":"Week"},"description":"Week of month (1-5)"},{"name":"weekday","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":6,"minimum":0},{"type":"null"}],"description":"0=Mon, 6=Sun","title":"Weekday"},"description":"0=Mon, 6=Sun"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsBindung"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats/contributors":{"get":{"tags":["📊 Server Stats"],"summary":"Get Server Stats Contributors","description":"Beitragsverteilung: wie viele Koepfe tragen wie viel.","operationId":"get_server_stats_contributors_api_v1_servers__server_id__stats_contributors_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single date YYYY-MM-DD","title":"Date"},"description":"Single date YYYY-MM-DD"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range start YYYY-MM-DD","title":"Start Date"},"description":"Range start YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range end YYYY-MM-DD","title":"End Date"},"description":"Range end YYYY-MM-DD"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":2020},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"title":"Month"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Week of month (1-5)","title":"Week"},"description":"Week of month (1-5)"},{"name":"weekday","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":6,"minimum":0},{"type":"null"}],"description":"0=Mon, 6=Sun","title":"Weekday"},"description":"0=Mon, 6=Sun"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsVerteilung"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats/channel-health":{"get":{"tags":["📊 Server Stats"],"summary":"Get Server Stats Channel Health","description":"Kanalbewegung gegen den Vorzeitraum: steigend, fallend, verstummt.","operationId":"get_server_stats_channel_health_api_v1_servers__server_id__stats_channel_health_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single date YYYY-MM-DD","title":"Date"},"description":"Single date YYYY-MM-DD"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range start YYYY-MM-DD","title":"Start Date"},"description":"Range start YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range end YYYY-MM-DD","title":"End Date"},"description":"Range end YYYY-MM-DD"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":2020},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"title":"Month"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Week of month (1-5)","title":"Week"},"description":"Week of month (1-5)"},{"name":"weekday","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":6,"minimum":0},{"type":"null"}],"description":"0=Mon, 6=Sun","title":"Weekday"},"description":"0=Mon, 6=Sun"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsKanalgesundheit"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/stats/forecast":{"get":{"tags":["📊 Server Stats"],"summary":"Get Server Stats Forecast","description":"Fortschreibung des Verlaufs plus die Tage, die aus ihm herausfallen.","operationId":"get_server_stats_forecast_api_v1_servers__server_id__stats_forecast_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"horizon","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":7,"default":14,"title":"Horizon"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single date YYYY-MM-DD","title":"Date"},"description":"Single date YYYY-MM-DD"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range start YYYY-MM-DD","title":"Start Date"},"description":"Range start YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Range end YYYY-MM-DD","title":"End Date"},"description":"Range end YYYY-MM-DD"},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":2020},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":12,"minimum":1},{"type":"null"}],"title":"Month"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Week of month (1-5)","title":"Week"},"description":"Week of month (1-5)"},{"name":"weekday","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":6,"minimum":0},{"type":"null"}],"description":"0=Mon, 6=Sun","title":"Weekday"},"description":"0=Mon, 6=Sun"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsVorhersage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/onboarding/progress":{"get":{"tags":["🚀 Onboarding"],"summary":"Get Onboarding Progress","description":"Get onboarding setup progress for a server.","operationId":"get_onboarding_progress_api_v1_servers__server_id__onboarding_progress_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/onboarding/use-case":{"post":{"tags":["🚀 Onboarding"],"summary":"Set Use Case","description":"Set the onboarding use-case for a server.","operationId":"set_use_case_api_v1_servers__server_id__onboarding_use_case_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UseCaseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/onboarding/quick-setup":{"post":{"tags":["🚀 Onboarding"],"summary":"Quick Setup","description":"One-click feature activation with sensible defaults.","operationId":"quick_setup_api_v1_servers__server_id__onboarding_quick_setup_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickSetupRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/onboarding/dismiss-step":{"post":{"tags":["🚀 Onboarding"],"summary":"Dismiss Step","description":"Dismiss an onboarding step so it no longer counts toward progress.","operationId":"dismiss_step_api_v1_servers__server_id__onboarding_dismiss_step_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DismissStepRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/onboarding/status":{"patch":{"tags":["🚀 Onboarding"],"summary":"Update Onboarding Status","description":"Manage onboarding status: mark overlay complete, restore dismissed step, or reset.","operationId":"update_onboarding_status_api_v1_servers__server_id__onboarding_status_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/onboarding/track-visit":{"post":{"tags":["🚀 Onboarding"],"summary":"Track Visit","description":"Track a settings page visit for the 'continue where you left off' feature.","operationId":"track_visit_api_v1_servers__server_id__onboarding_track_visit_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackVisitRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/onboarding/custom-steps":{"patch":{"tags":["🚀 Onboarding"],"summary":"Update Custom Steps","description":"Customize which onboarding steps are active for this server.","operationId":"update_custom_steps_api_v1_servers__server_id__onboarding_custom_steps_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomStepsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/onboarding/set-server-language":{"post":{"tags":["🚀 Onboarding"],"summary":"Set Server Language","description":"Set the server's default language (affects bot messages on Discord).","operationId":"set_server_language_api_v1_servers__server_id__onboarding_set_server_language_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetServerLanguageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/onboarding/bootstrap":{"get":{"tags":["🚀 Onboarding"],"summary":"Onboarding Bootstrap","description":"Everything the onboarding flow needs, in one round trip.","operationId":"onboarding_bootstrap_api_v1_servers__server_id__onboarding_bootstrap_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"identity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Identity"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/onboarding/apply-blueprint":{"post":{"tags":["🚀 Onboarding"],"summary":"Apply Blueprint","description":"Activate several features at once and report the outcome per feature.","operationId":"apply_blueprint_api_v1_servers__server_id__onboarding_apply_blueprint_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyBlueprintRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/onboarding/identity":{"post":{"tags":["🚀 Onboarding"],"summary":"Set Identity","description":"Store the server profile chosen in the onboarding flow.","operationId":"set_identity_api_v1_servers__server_id__onboarding_identity_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentityRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/onboarding/complete":{"post":{"tags":["🚀 Onboarding"],"summary":"Complete Onboarding","description":"Mark the onboarding flow as finished and record how it went.","operationId":"complete_onboarding_api_v1_servers__server_id__onboarding_complete_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/referral/my-link":{"get":{"tags":["🎁 Referral System","Referral System"],"summary":"Get Referral Link","description":"Gibt den personalisierten Referral-Link des Users zurück.\nDer Link enthält die User-ID als state-Parameter.","operationId":"get_referral_link_api_v1_referral_my_link_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/referral/preference":{"get":{"tags":["🎁 Referral System","Referral System"],"summary":"Get Referral Preference","description":"Gibt die Referral-Reward-Präferenz des Users zurück.\nRewards werden automatisch mit dieser Einstellung eingelöst, sobald ein Referral validiert wird.","operationId":"get_referral_preference_api_v1_referral_preference_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["🎁 Referral System","Referral System"],"summary":"Set Referral Preference","description":"Setzt die Referral-Reward-Präferenz des Users.\nZukünftige Rewards werden automatisch als dieser Typ eingelöst.","operationId":"set_referral_preference_api_v1_referral_preference_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RewardPreferenceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/referral/stats":{"get":{"tags":["🎁 Referral System","Referral System"],"summary":"Get Referral Stats","description":"Gibt Referral-Statistiken des Users zurück.","operationId":"get_referral_stats_api_v1_referral_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/referral/history":{"get":{"tags":["🎁 Referral System","Referral System"],"summary":"Get Referral History","description":"Gibt die paginierte Referral-Historie des Users zurück.","operationId":"get_referral_history_api_v1_referral_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Seitennummer","default":1,"title":"Page"},"description":"Seitennummer"},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Einträge pro Seite","default":20,"title":"Per Page"},"description":"Einträge pro Seite"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/referral/rewards":{"get":{"tags":["🎁 Referral System","Referral System"],"summary":"Get Referral Rewards","description":"Gibt die Referral-Rewards des Users zurück.","operationId":"get_referral_rewards_api_v1_referral_rewards_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: unclaimed, claimed, expired, revoked","title":"Status Filter"},"description":"Filter: unclaimed, claimed, expired, revoked"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/referral/rewards/{reward_id}/claim":{"post":{"tags":["🎁 Referral System","Referral System"],"summary":"Claim Referral Reward","description":"Löst einen Referral-Reward ein.\nDer User kann zwischen 'premium' (2 Wochen Premium), 'supreme' (2 Wochen Supreme) und 'ai' (2 Wochen AI) wählen.\nRewards stacken sich auf bestehende Laufzeit.","operationId":"claim_referral_reward_api_v1_referral_rewards__reward_id__claim_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"reward_id","in":"path","required":true,"schema":{"type":"integer","title":"Reward Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimRewardRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tracking/upsell":{"post":{"tags":["📈 Upsell Tracking","Upsell Tracking"],"summary":"Track Upsell Event","description":"Speichert ein Upsell-Funnel-Event (view/click/checkout/purchase) für Analytics.\nRate-limit großzügig, damit auch view-Events in Listen/Grids tracked werden können.","operationId":"track_upsell_event_api_v1_tracking_upsell_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsellEventIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tracking/upsell/funnel":{"get":{"tags":["📈 Upsell Tracking","Upsell Tracking"],"summary":"Get Upsell Funnel","description":"Conversion-Funnel Zusammenfassung pro Variante (view → click → checkout → purchase).\nAdmin-gated: nur User mit is_banned=False und in einer vordefinierten Admin-Liste.\nFür den Moment: jeder authentifizierte User kann eigene Aggregation sehen.\nEmpfohlen: später mit Admin-Check absichern.","operationId":"get_upsell_funnel_api_v1_tracking_upsell_funnel_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tracking/upsell/stats":{"get":{"tags":["📈 Upsell Tracking","Upsell Tracking"],"summary":"Get Upsell Stats","description":"Detaillierte Upsell-Banner-Statistiken für Admin/Owner.\nLiefert Zusammenfassungen (7d/30d/all-time) + Tages-Zeitreihen (7d/30d) pro Variante.","operationId":"get_upsell_stats_api_v1_tracking_upsell_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tracking/upsell/stats/breakdown":{"get":{"tags":["📈 Upsell Tracking","Upsell Tracking"],"summary":"Get Upsell Breakdown","description":"Erweiterte Aufschlüsselungen für die Upsell-Banner:\n  - by_language: pro Locale (ES/PT/FR/DE/EN-US/...) Views, Clicks, Purchases\n    je Variante, für 7d / 30d / current_week / previous_week / Gesamt.\n  - by_weekday: Mo-So Verteilung. Vergleich current_week vs previous_week\n    und 30-Tage-Durchschnitt pro Wochentag.\n\nAggregation läuft in Python, weil `meta` als JSON gespeichert ist und sich\nSQL-Pfad-Syntax zwischen MySQL/Postgres/SQLite unterscheidet. Datenmenge\npro 30 Tagen ist klein genug (ein UpsellEvent pro Banner-Mount + Click).","operationId":"get_upsell_breakdown_api_v1_tracking_upsell_stats_breakdown_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/telemetry/events":{"post":{"tags":["📊 Seiten-Telemetrie","📊 Seiten-Telemetrie"],"summary":"Ereignisse Melden","description":"Nimmt einen Stapel Dashboard-Ereignisse entgegen. Antwortet immer 204.\n\n─── Die Regel, an der hier alles haengt ───────────────────────────────\n\nDie Messung ist eine NEBENSACHE. Keine Seite darf daran scheitern, dass\nihr Zaehler nicht durchkommt. Deshalb ist die Antwort immer 204: ein\nunbrauchbares Ereignis wird still verworfen, ein Datenbankfehler gefangen\nund gedrosselt protokolliert. Ein 400 waere hier die falsche Reaktion -\ndas Frontend koennte damit nichts anfangen, ausser es dem Nutzer zu\nzeigen, und der hat nichts falsch gemacht.\n\n─── Warum in Python aggregiert wird, bevor etwas in die Datenbank geht ─\n\nEin Stapel enthaelt regelmaessig dasselbe mehrfach: derselbe Fehler bei\njedem Neuzeichnen, dieselbe Seite bei einem Hin und Zurueck. Zu Zaehlern\nzusammengefasst werden aus fuenfzig Ereignissen ein paar Zeilen, und die\ngehen als EIN Upsert je Tabelle raus - vier Anfragen statt fuenfzig.","operationId":"ereignisse_melden_api_v1_telemetry_events_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StapelIn"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/telemetry/pages":{"get":{"tags":["📊 Seiten-Telemetrie","📊 Seiten-Telemetrie"],"summary":"Seitenaufrufe Auswerten","description":"Welche Dashboard-Seite wurde wie oft geoeffnet, von wie vielen Servern.\n\nNur fuer das Bot-Team: die Zahlen sind plattformweit. Ein Server-Admin\nsaehe hier, welche Seiten ANDERE Server benutzen - das waere eine Auskunft\nueber fremde Kunden und hat auf dem Server-Dashboard nichts zu suchen.\n\n─── Warum ungecacht ───────────────────────────────────────────────────\n\n`@cached_endpoint` waere hier leicht zu haben, aber falsch: die Ansicht\nruft eine Handvoll Menschen auf, die Abfrage laeuft ueber den Index\n(datum, route), und fuenf Minuten alte Zahlen machen genau die eine Frage\nunbeantwortbar, die man beim Einbauen stellt - \"ich habe die Seite gerade\ngeoeffnet, warum steht sie nicht drin?\".\n\n─── `server` ist die belastbarere Zahl ────────────────────────────────\n\n`aufrufe` zaehlt jedes Oeffnen; wer eine Seite fuenfzigmal neu laedt,\nsteht darin fuenfzigmal. `server` zaehlt, auf wie vielen verschiedenen\nServern die Seite ueberhaupt jemand geoeffnet hat - das ist die Zahl, an\nder man ablesen kann, ob eine Funktion benutzt wird.","operationId":"seitenaufrufe_auswerten_api_v1_telemetry_pages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Zeitraum in Tagen","default":30,"title":"Days"},"description":"Zeitraum in Tagen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Seitenaufrufe Auswerten Api V1 Telemetry Pages Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/telemetry/uebersicht":{"get":{"tags":["📊 Seiten-Telemetrie","📊 Seiten-Telemetrie"],"summary":"Telemetrie Uebersicht","description":"Was kaputt ist, was getan wird und wo Schluss ist - in einer Antwort.\n\nDrei Abfragen und ein Aufruf, weil die drei Karten im Team-Dashboard\nzusammen erscheinen und denselben Zeitraum teilen. Drei Endpunkte waeren\ndrei Rundreisen fuer eine Ansicht.\n\nNur fuer das Bot-Team, aus demselben Grund wie `/pages`: die Zahlen sind\nplattformweit.","operationId":"telemetrie_uebersicht_api_v1_telemetry_uebersicht_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Zeitraum in Tagen","default":30,"title":"Days"},"description":"Zeitraum in Tagen"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Telemetrie Uebersicht Api V1 Telemetry Uebersicht Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/telemetry/verlauf":{"get":{"tags":["📊 Seiten-Telemetrie","📊 Seiten-Telemetrie"],"summary":"Telemetrie Verlauf","description":"Eine Telemetriereihe ueber die Zeit - Stunde, Tag, Woche, Monat, Jahr.\n\nNur fuer das Bot-Team, aus demselben Grund wie `/pages` und\n`/uebersicht`: die Zahlen sind plattformweit.\n\n─── `wert` ist der eigentliche Griff ──────────────────────────────────\n\nOhne ihn steht in der Reihe die Summe ueber alles - gut, um zu sehen, dass\nheute Nacht etwas los war. Mit ihm steht dort EINE Fehlersignatur oder EINE\nAktion, und das ist die Frage, die man nach einem Ausrollen stellt: hoert\ndas auf?\n\n─── Warum die Zahl der Punkte und nicht ein Zeitraum ──────────────────\n\nWeil \"die letzten 48\" in jeder Aufloesung dasselbe meint und keine\nUmrechnung braucht - 48 Stunden, 48 Tage, 48 Monate. Ein `tage`-Parameter\nhaette bei `aufloesung=year` 48 Tage bedeutet und eine Reihe mit einem\nPunkt ergeben, ohne dass jemand einen Fehler gesehen haette.\n\n─── Warum ungecacht ───────────────────────────────────────────────────\n\nWie `/pages`: die Ansicht ruft eine Handvoll Menschen auf, die Abfrage\nlaeuft ueber einen Index, und fuenf Minuten alte Zahlen machen genau die\nFrage unbeantwortbar, wegen der jemand hinsieht - \"wir haben gerade\nausgerollt, hoert es auf?\".","operationId":"telemetrie_verlauf_api_v1_telemetry_verlauf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"serie","in":"query","required":false,"schema":{"type":"string","description":"seiten | aktionen | fehler | abbrueche","default":"seiten","title":"Serie"},"description":"seiten | aktionen | fehler | abbrueche"},{"name":"aufloesung","in":"query","required":false,"schema":{"type":"string","description":"hour | day | week | month | year","default":"hour","title":"Aufloesung"},"description":"hour | day | week | month | year"},{"name":"punkte","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":2,"description":"Wie viele Faecher zurueck, das laufende mitgezaehlt","default":48,"title":"Punkte"},"description":"Wie viele Faecher zurueck, das laufende mitgezaehlt"},{"name":"wert","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"description":"Auf EINE Route/Aktion/Signatur einschraenken","title":"Wert"},"description":"Auf EINE Route/Aktion/Signatur einschraenken"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Telemetrie Verlauf Api V1 Telemetry Verlauf Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/reports":{"get":{"tags":["📄 Plattform-Berichte","📄 Plattform-Berichte"],"summary":"Berichte Liste","description":"Die Plattform-Berichte als Karten, neueste zuerst.\n\n─── Warum ungecacht ───────────────────────────────────────────────────\n\nWie bei der Telemetrie: die Ansicht ruft eine Handvoll Menschen auf, die\nAbfrage laeuft ueber `(is_published, created_at)`, und fuenf Minuten alte\nZahlen machen genau die Frage unbeantwortbar, die man nach einem Lauf\nstellt - \"ich habe den Bericht gerade geschrieben, wo ist er?\".","operationId":"berichte_liste_api_v1_bot_team_reports_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"topic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"telemetry | growth | revenue | support | quality | other","title":"Topic"},"description":"telemetry | growth | revenue | support | quality | other"},{"name":"include_hidden","in":"query","required":false,"schema":{"type":"boolean","description":"Auch unveroeffentlichte zeigen","default":false,"title":"Include Hidden"},"description":"Auch unveroeffentlichte zeigen"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"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":"object","additionalProperties":true,"title":"Response Berichte Liste Api V1 Bot Team Reports Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot-team/reports/{report_id}":{"get":{"tags":["📄 Plattform-Berichte","📄 Plattform-Berichte"],"summary":"Bericht Lesen","description":"Ein Bericht vollstaendig - mit Abschnitten, Massnahmen und Belegen.\n\n`evidence` geht mit raus und wird nicht weggelassen: es ist die einzige\nMoeglichkeit nachzusehen, ob ein Satz je gestimmt hat. Die\nTelemetrietabellen laufen weiter, `dashboard_stunden` haelt nur vierzehn\nTage - was hier nicht steht, ist spaeter nicht mehr rekonstruierbar.","operationId":"bericht_lesen_api_v1_bot_team_reports__report_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Bericht Lesen Api V1 Bot Team Reports  Report Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/notices":{"get":{"tags":["📌 Server Notices","Server Notices"],"summary":"Get Server Notice","description":"Der offene Hinweis dieses Servers - hoechstens einer.\n\n`notice: null` ist der Normalfall und kein Fehler: die allermeisten Server\nhaben keinen offenen Hinweis, und genau das ist beabsichtigt.","operationId":"get_server_notice_api_v1_servers__server_id__notices_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/notices/{notice_id}/dismiss":{"post":{"tags":["📌 Server Notices","Server Notices"],"summary":"Dismiss Server Notice","description":"Weggeklickt. Der Eintrag bleibt stehen, er wird nur nicht mehr gezeigt.\n\nGeloescht wird nichts: `facts` und der Text sind die Belegkette dafuer,\nwarum dieser Server diesen Satz gelesen hat, und die ueberlebt das\nWegklicken.","operationId":"dismiss_server_notice_api_v1_servers__server_id__notices__notice_id__dismiss_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"notice_id","in":"path","required":true,"schema":{"type":"integer","title":"Notice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/partner/v1/servers/{server_id}/purchase-reviews":{"get":{"tags":["🤝 Partner – Purchase Reviews"],"summary":"Alle Purchase-Bewertungen (paginiert, filterbar)","description":"Gibt Purchase-Bewertungen zurück inkl. Reviewer-Infos (Name, Avatar).\nAnonyme Bewertungen erscheinen ohne Reviewer-Daten.\n\nFilter:\n- `min_rating` / `max_rating`: Sternfilter (1-5)\n- `service`: Teilsuche im Servicenamen","operationId":"get_purchase_reviews_partner_v1_servers__server_id__purchase_reviews_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Seitennummer","default":1,"title":"Page"},"description":"Seitennummer"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Einträge pro Seite","default":10,"title":"Page Size"},"description":"Einträge pro Seite"},{"name":"min_rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Minimale Sternzahl","title":"Min Rating"},"description":"Minimale Sternzahl"},{"name":"max_rating","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"description":"Maximale Sternzahl","title":"Max Rating"},"description":"Maximale Sternzahl"},{"name":"service","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"description":"Servicename (Teilsuche)","title":"Service"},"description":"Servicename (Teilsuche)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseReviewsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/partner/v1/servers/{server_id}/purchase-reviews/stats":{"get":{"tags":["🤝 Partner – Purchase Reviews"],"summary":"Durchschnitt & Verteilung aller Purchase-Bewertungen","description":"Gibt Gesamtanzahl, Durchschnittsbewertung und Sternverteilung zurück.\nImmer über alle Purchase-Reviews, unabhängig von Filtern.","operationId":"get_purchase_review_stats_partner_v1_servers__server_id__purchase_reviews_stats_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__partner_reviews__StatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/verify-public/{server_id}/info":{"get":{"tags":["🔓 Public Verification"],"summary":"Get Verification Info","operationId":"get_verification_info_api_v1_verify_public__server_id__info_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/verify-public/{server_id}/branding/background":{"get":{"tags":["🔓 Public Verification"],"summary":"Get Branding Background","operationId":"get_branding_background_api_v1_verify_public__server_id__branding_background_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/verify-public/{server_id}/branding/audio":{"get":{"tags":["🔓 Public Verification"],"summary":"Get Branding Audio","operationId":"get_branding_audio_api_v1_verify_public__server_id__branding_audio_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/verify-public/{server_id}/preflight":{"post":{"tags":["🔓 Public Verification"],"summary":"Preflight","operationId":"preflight_api_v1_verify_public__server_id__preflight_post","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/verify-public/{server_id}/start":{"get":{"tags":["🔓 Public Verification"],"summary":"Start Verification","operationId":"start_verification_api_v1_verify_public__server_id__start_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"preflight","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preflight"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/verify-public/callback":{"get":{"tags":["🔓 Public Verification"],"summary":"Verification Callback","operationId":"verification_callback_api_v1_verify_public_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/appeals/settings":{"get":{"tags":["📨 Appeal System"],"summary":"Get Appeal Settings","description":"Liefert die Appeal-Einstellungen des Servers (legt Defaults an, falls keine existieren).","operationId":"get_appeal_settings_api_v1_servers__server_id__appeals_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Appeal Settings Api V1 Servers  Server Id  Appeals Settings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["📨 Appeal System"],"summary":"Update Appeal Settings","description":"Aktualisiert die Appeal-Einstellungen.","operationId":"update_appeal_settings_api_v1_servers__server_id__appeals_settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppealSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Appeal Settings Api V1 Servers  Server Id  Appeals Settings Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/appeals/questions":{"get":{"tags":["📨 Appeal System"],"summary":"List Questions","description":"Listet alle Formular-Fragen des Servers (sortiert nach Position).","operationId":"list_questions_api_v1_servers__server_id__appeals_questions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Questions Api V1 Servers  Server Id  Appeals Questions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["📨 Appeal System"],"summary":"Create Question","description":"Erstellt eine neue Formular-Frage.","operationId":"create_question_api_v1_servers__server_id__appeals_questions_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppealQuestionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Question Api V1 Servers  Server Id  Appeals Questions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/appeals/questions/{question_id}":{"put":{"tags":["📨 Appeal System"],"summary":"Update Question","description":"Aktualisiert eine Formular-Frage.","operationId":"update_question_api_v1_servers__server_id__appeals_questions__question_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","title":"Question Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppealQuestionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Question Api V1 Servers  Server Id  Appeals Questions  Question Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["📨 Appeal System"],"summary":"Delete Question","description":"Löscht eine Formular-Frage. Bereits eingereichte Antworten bleiben erhalten.","operationId":"delete_question_api_v1_servers__server_id__appeals_questions__question_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","title":"Question Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Question Api V1 Servers  Server Id  Appeals Questions  Question Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/appeals/questions/reorder":{"post":{"tags":["📨 Appeal System"],"summary":"Reorder Questions","description":"Setzt die Reihenfolge der Formular-Fragen neu.","operationId":"reorder_questions_api_v1_servers__server_id__appeals_questions_reorder_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__appeals__ReorderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reorder Questions Api V1 Servers  Server Id  Appeals Questions Reorder Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/appeals":{"get":{"tags":["📨 Appeal System"],"summary":"List Appeals","description":"Listet eingereichte Appeals (paginiert, filterbar).","operationId":"list_appeals_api_v1_servers__server_id__appeals_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: awaiting/pending/under_review/approved/rejected/expired","title":"Status"},"description":"Filter: awaiting/pending/under_review/approved/rejected/expired"},{"name":"punishment_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: ban/kick/mute/mc_ban","title":"Punishment Type"},"description":"Filter: ban/kick/mute/mc_ban"},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter nach Discord User ID","title":"User Id"},"description":"Filter nach Discord User ID"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Suche nach User-Tag","title":"Search"},"description":"Suche nach User-Tag"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Appeals Api V1 Servers  Server Id  Appeals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/appeals/stats":{"get":{"tags":["📨 Appeal System"],"summary":"Appeal Stats","description":"Liefert Zähler pro Status für das Dashboard-Übersichts-Widget.","operationId":"appeal_stats_api_v1_servers__server_id__appeals_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Appeal Stats Api V1 Servers  Server Id  Appeals Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/appeals/{appeal_id}/decision":{"post":{"tags":["📨 Appeal System"],"summary":"Decide Appeal","description":"Nimmt einen Appeal an oder lehnt ihn ab. Der Bot übernimmt die Folgeaktionen\n(Unban / Timeout entfernen / DM / Invite) abhängig von den Einstellungen.","operationId":"decide_appeal_api_v1_servers__server_id__appeals__appeal_id__decision_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"appeal_id","in":"path","required":true,"schema":{"type":"integer","title":"Appeal Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppealDecisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Decide Appeal Api V1 Servers  Server Id  Appeals  Appeal Id  Decision Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/appeals/{appeal_id}/status":{"post":{"tags":["📨 Appeal System"],"summary":"Set Appeal Status","description":"Setzt einen offenen Appeal auf 'pending' oder 'under_review'.","operationId":"set_appeal_status_api_v1_servers__server_id__appeals__appeal_id__status_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"appeal_id","in":"path","required":true,"schema":{"type":"integer","title":"Appeal Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppealStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Appeal Status Api V1 Servers  Server Id  Appeals  Appeal Id  Status Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/appeals/{appeal_id}/notes":{"post":{"tags":["📨 Appeal System"],"summary":"Add Note","description":"Fügt einem Appeal eine interne Staff-Notiz hinzu.","operationId":"add_note_api_v1_servers__server_id__appeals__appeal_id__notes_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"appeal_id","in":"path","required":true,"schema":{"type":"integer","title":"Appeal Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppealNoteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Note Api V1 Servers  Server Id  Appeals  Appeal Id  Notes Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/appeals/{appeal_id}/notes/{note_id}":{"delete":{"tags":["📨 Appeal System"],"summary":"Delete Note","description":"Löscht eine Staff-Notiz.","operationId":"delete_note_api_v1_servers__server_id__appeals__appeal_id__notes__note_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"appeal_id","in":"path","required":true,"schema":{"type":"integer","title":"Appeal Id"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Note Api V1 Servers  Server Id  Appeals  Appeal Id  Notes  Note Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/appeals/blocks":{"get":{"tags":["📨 Appeal System"],"summary":"List Blocks","description":"Listet alle vom Appeal-System ausgeschlossenen User.","operationId":"list_blocks_api_v1_servers__server_id__appeals_blocks_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Blocks Api V1 Servers  Server Id  Appeals Blocks Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["📨 Appeal System"],"summary":"Create Block","description":"Sperrt einen User vom Appeal-System (er kann keine neuen Appeals mehr einreichen).","operationId":"create_block_api_v1_servers__server_id__appeals_blocks_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppealBlockCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Block Api V1 Servers  Server Id  Appeals Blocks Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/appeals/blocks/{user_id}":{"delete":{"tags":["📨 Appeal System"],"summary":"Delete Block","description":"Hebt die Appeal-Sperre eines Users auf.","operationId":"delete_block_api_v1_servers__server_id__appeals_blocks__user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Block Api V1 Servers  Server Id  Appeals Blocks  User Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/appeals/{appeal_id}":{"get":{"tags":["📨 Appeal System"],"summary":"Get Appeal","description":"Vollständige Detailansicht eines Appeals inkl. Antworten, Notizen, Verlauf und Strafhistorie.","operationId":"get_appeal_api_v1_servers__server_id__appeals__appeal_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"appeal_id","in":"path","required":true,"schema":{"type":"integer","title":"Appeal Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Appeal Api V1 Servers  Server Id  Appeals  Appeal Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/appeals-public/{token}":{"get":{"tags":["🔓 Public Appeals"],"summary":"Get Appeal Info","description":"Liefert alle Daten, die die Appeal-Seite zum Rendern braucht.","operationId":"get_appeal_info_api_v1_appeals_public__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/appeals-public/{token}/submit":{"post":{"tags":["🔓 Public Appeals"],"summary":"Submit Appeal","description":"Reicht den Appeal ein. Validiert Eligibility + Antworten und benachrichtigt den Bot.","operationId":"submit_appeal_api_v1_appeals_public__token__submit_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__appeals_public__SubmitRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/appeals-public/{token}/discord/start":{"get":{"tags":["🔓 Public Appeals"],"summary":"Discord Login Start","description":"Startet den Discord-OAuth-Flow zur Identitäts-Verifizierung des Appellanten.","operationId":"discord_login_start_api_v1_appeals_public__token__discord_start_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/appeals-public/discord/callback":{"get":{"tags":["🔓 Public Appeals"],"summary":"Discord Login Callback","description":"OAuth-Callback: verifiziert, dass der eingeloggte Discord-User der bestrafte User ist.","operationId":"discord_login_callback_api_v1_appeals_public_discord_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/applications-public/{server_id}":{"get":{"tags":["🔓 Public Applications"],"summary":"Get Apply Info","description":"Alle Daten, die die öffentliche Bewerbungsseite zum Rendern braucht.\n\nMit ``panel`` zeigt die Seite denselben Ausschnitt wie das gleichnamige Discord-Panel.","operationId":"get_apply_info_api_v1_applications_public__server_id__get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"panel","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Nur die Positionen dieses Panels zeigen","title":"Panel"},"description":"Nur die Positionen dieses Panels zeigen"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/applications-public/{server_id}/positions/{position_id}/image":{"get":{"tags":["🔓 Public Applications"],"summary":"Get Public Position Image","description":"Positionsbild für die öffentliche Bewerbungsseite. Nur erreichbar, solange der\nWebsite-Modus aktiv ist — sonst wären die Bilder eines Servers frei abrufbar.","operationId":"get_public_position_image_api_v1_applications_public__server_id__positions__position_id__image_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"position_id","in":"path","required":true,"schema":{"type":"integer","title":"Position Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/applications-public/{server_id}/mine/{application_id}":{"get":{"tags":["🔓 Public Applications"],"summary":"Get My Application","description":"Vollständige Ansicht einer EIGENEN Bewerbung für den eingeloggten User: Antworten,\nFortschritt, Verlauf und wer sie bearbeitet. Alles, was der Bewerber sehen darf.","operationId":"get_my_application_api_v1_applications_public__server_id__mine__application_id__get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"application_id","in":"path","required":true,"schema":{"type":"integer","title":"Application Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/applications-public/{server_id}/positions/{position_id}/questions":{"get":{"tags":["🔓 Public Applications"],"summary":"Get Position Questions","description":"Fragen einer Position (aufgelöst: eigene Fragen, Standardset oder Fallback).","operationId":"get_position_questions_api_v1_applications_public__server_id__positions__position_id__questions_get","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"position_id","in":"path","required":true,"schema":{"type":"integer","title":"Position Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/applications-public/{server_id}/submit":{"post":{"tags":["🔓 Public Applications"],"summary":"Submit Application","description":"Reicht eine Website-Bewerbung ein.","operationId":"submit_application_api_v1_applications_public__server_id__submit_post","parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__applications_public__SubmitRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-assistant/{server_id}/discord-meta":{"get":{"tags":["🤖 Notoq AI Assistant"],"summary":"Get Discord Meta","description":"Kompakter Payload für die Mention-Picker im AI-Chat (Channels / Rollen / Users).\nAnders als /servers/{id}/channels|roles|users gibt es alles in einem Call zurück.","operationId":"get_discord_meta_api_v1_ai_assistant__server_id__discord_meta_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"member_limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":10,"description":"Max Member im flachen Picker","default":100,"title":"Member Limit"},"description":"Max Member im flachen Picker"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-assistant/{server_id}/status":{"get":{"tags":["🤖 Notoq AI Assistant"],"summary":"Get Ai Assistant Status","description":"Liefert Verfügbarkeit + Limits, damit das Frontend Upsell/Hinweise anzeigen kann.","operationId":"get_ai_assistant_status_api_v1_ai_assistant__server_id__status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-assistant/models":{"get":{"tags":["🤖 Notoq AI Assistant"],"summary":"Get Models","description":"Gibt die im AI-Chat wählbaren Modelle (alle Provider) mit Metadaten zurück.\nchat_only=True filtert reine Moderations-Modelle aus dem Picker. `providers`\nliefert den Provider-Katalog (Gruppierung/Labels im Picker).","operationId":"get_models_api_v1_ai_assistant_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/ai-assistant/{server_id}/settings":{"get":{"tags":["🤖 Notoq AI Assistant"],"summary":"Get Ai Settings","description":"Liefert die server-weiten AI-Einstellungen — aktuell das Moderations-/\nTicket-Modell (die \"average AI\"). Betrifft NICHT den AI-Chat.","operationId":"get_ai_settings_api_v1_ai_assistant__server_id__settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["🤖 Notoq AI Assistant"],"summary":"Update Ai Settings","description":"Aktualisiert das server-weite Moderations-/Ticket-Modell.\n\nNur der AI-Abo-Besitzer dieses Servers (der User, der den Server als\nAI-Server aktiviert hat) darf das Automations-Modell ändern.","operationId":"update_ai_settings_api_v1_ai_assistant__server_id__settings_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAISettingsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-assistant/{server_id}/usage":{"get":{"tags":["🤖 Notoq AI Assistant"],"summary":"Get Ai Usage Breakdown","description":"Detaillierte AI-Nutzungsstatistik für die Einstellungen im Dashboard:\nGesamtzähler, Aufschlüsselung nach Feature und nach Modell (inkl. Prozente).","operationId":"get_ai_usage_breakdown_api_v1_ai_assistant__server_id__usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-assistant/{server_id}/conversations":{"get":{"tags":["🤖 Notoq AI Assistant"],"summary":"List Conversations","description":"Liste aller nicht-archivierten Konversationen für diesen Server+User.","operationId":"list_conversations_api_v1_ai_assistant__server_id__conversations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🤖 Notoq AI Assistant"],"summary":"Create Conversation","description":"Erstellt eine neue Konversation.","operationId":"create_conversation_api_v1_ai_assistant__server_id__conversations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_conversation_api_v1_ai_assistant__server_id__conversations_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-assistant/{server_id}/conversation/{conv_id}":{"get":{"tags":["🤖 Notoq AI Assistant"],"summary":"Get Conversation By Id","description":"Lädt eine einzelne Konversation.","operationId":"get_conversation_by_id_api_v1_ai_assistant__server_id__conversation__conv_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🤖 Notoq AI Assistant"],"summary":"Delete Conversation","description":"Archiviert (soft-delete) eine Konversation.","operationId":"delete_conversation_api_v1_ai_assistant__server_id__conversation__conv_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["🤖 Notoq AI Assistant"],"summary":"Patch Conversation","description":"Ändert Titel und/oder Modell einer Konversation.","operationId":"patch_conversation_api_v1_ai_assistant__server_id__conversation__conv_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_patch_conversation_api_v1_ai_assistant__server_id__conversation__conv_id__patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-assistant/{server_id}/conversation":{"get":{"tags":["🤖 Notoq AI Assistant"],"summary":"Get Conversation Legacy","description":"Legacy: Lädt die neueste Konversation.","operationId":"get_conversation_legacy_api_v1_ai_assistant__server_id__conversation_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🤖 Notoq AI Assistant"],"summary":"Reset Conversation Legacy","description":"Legacy: Löscht die neueste Konversation.","operationId":"reset_conversation_legacy_api_v1_ai_assistant__server_id__conversation_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-assistant/{server_id}/chat":{"post":{"tags":["🤖 Notoq AI Assistant"],"summary":"Chat","description":"Hauptendpoint: User schickt Nachricht, KI antwortet, Verlauf wird gespeichert.","operationId":"chat_api_v1_ai_assistant__server_id__chat_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-assistant/{server_id}/chat/stream":{"post":{"tags":["🤖 Notoq AI Assistant"],"summary":"Chat Stream","description":"Streaming-Variante des Chat-Endpoints. Liefert SSE-Events während der Agent\narbeitet, sodass das Frontend Live-Updates anzeigen kann (Thinking, Tool-Calls,\nTool-Results, Zwischen-Text, finale Antwort).","operationId":"chat_stream_api_v1_ai_assistant__server_id__chat_stream_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-assistant/{server_id}/summarize":{"post":{"tags":["🤖 Notoq AI Assistant"],"summary":"Summarize Channel","description":"Fasst die letzten N Nachrichten eines Channels zusammen.\nGreift live auf Discord zu (nur Nachrichten die der Bot sehen darf).","operationId":"summarize_channel_api_v1_ai_assistant__server_id__summarize_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummarizeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummarizeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-assistant/{server_id}/announcement":{"post":{"tags":["🤖 Notoq AI Assistant"],"summary":"Draft Announcement","description":"Entwirft (und postet optional) eine Ankündigung.","operationId":"draft_announcement_api_v1_ai_assistant__server_id__announcement_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnouncementRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnouncementResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-assistant/{server_id}/plans/{plan_id}":{"get":{"tags":["🤖 Notoq AI Assistant"],"summary":"Get Plan Endpoint","description":"Lädt einen Action-Plan zur Anzeige in der Approval-Karte.","operationId":"get_plan_endpoint_api_v1_ai_assistant__server_id__plans__plan_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-assistant/{server_id}/plans/{plan_id}/cancel":{"post":{"tags":["🤖 Notoq AI Assistant"],"summary":"Cancel Plan Endpoint","description":"Bricht einen wartenden Plan ab (markiert ihn als cancelled).","operationId":"cancel_plan_endpoint_api_v1_ai_assistant__server_id__plans__plan_id__cancel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-assistant/{server_id}/plans/{plan_id}/execute":{"post":{"tags":["🤖 Notoq AI Assistant"],"summary":"Execute Plan Endpoint","description":"Führt einen approved Plan aus. Streamt SSE-Events pro Aktion. Wird vom\nFrontend nach Klick auf 'Approve' aufgerufen.","operationId":"execute_plan_endpoint_api_v1_ai_assistant__server_id__plans__plan_id__execute_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monetization/servers/{server_id}/state":{"get":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Get Monetization State","description":"Alles, was die Oberflaeche fuer ihre eine Entscheidung braucht.\n\nNEBENWIRKUNG MIT ABSICHT: dieser Aufruf gewaehrt den Reverse Trial, falls\ner ansteht. Das ist der Nachzuegler-Pfad. Der Bot vergibt beim Guild-Join,\naber der Join-Pfad verpasst jeden Server, bei dem der Bot gerade neu\nstartete oder ein Ausfall lief. Ein Trial, den ein Teil der Neuzugaenge\nnie bekommt, verfaelscht spaeter den Vergleich der Modi: die Zahlen sehen\nnach einem schwachen Modell aus, obwohl sie ein Leck zeigen.\n\n`ensure_reverse_trial` ist mehrfach aufrufbar und tut in neunundneunzig\nvon hundert Faellen nichts, ausser eine Zeile zu lesen.","operationId":"get_monetization_state_api_v1_monetization_servers__server_id__state_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monetization/config/public":{"get":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Get Public Config","description":"Nur die Felder, die die Oberflaeche zum Rendern braucht.\n\nGetrennt vom Verwaltungs-Endpunkt, damit `reverse_trial_backfill` und die\nNachfass-Schwellen nicht in jedem Browser landen. Nicht weil sie geheim\nwaeren, sondern weil ausgeliefertes Wissen zu Wissen wird, auf das sich\njemand verlaesst.","operationId":"get_public_config_api_v1_monetization_config_public_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/monetization/servers/{server_id}/trial/start":{"post":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Start Trial","description":"Der Klick-Trial, fuer den Modus `cardless_optin`.\n\nIm Modus `reverse` wird dieser Endpunkt nicht gebraucht, weil der Trial\nungefragt kommt. Er bleibt trotzdem erreichbar: ein Server, der aus dem\nZeitfenster gefallen ist, aber noch keinen Trial hatte, bekommt hierueber\nseinen, und der Umschalten-Knopf in der Verwaltung soll nicht bedeuten,\ndass die halbe Oberflaeche ins Leere greift.","operationId":"start_trial_api_v1_monetization_servers__server_id__trial_start_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monetization/servers/{server_id}/trial":{"get":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Get Trial","description":"Nur der Trial-Zustand, ohne den Rest des Sammelendpunkts.","operationId":"get_trial_api_v1_monetization_servers__server_id__trial_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monetization/servers/{server_id}/gain-preview":{"get":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Get Gain Preview","description":"Was auf diesem Server freigeschaltet wuerde, gezaehlt.\n\nDas Gegenstueck zur Verlust-Vorschau (`/subscriptions/{scope}/loss-preview`)\nund mit derselben Zaehlung gebaut. Der Unterschied ist die Blickrichtung:\ndie Verlustliste sieht ein Kunde beim Kuendigen, diese Liste sieht ein\nServer ohne Abo.\n\nAUF EINEM PREMIUM-SERVER IST DIE LISTE LEER, und das ist kein Sonderfall,\nsondern die einzig richtige Antwort: die Free-Decke gilt dort nicht, also\ngibt es nichts freizuschalten. `is_premium` steht mit in der Antwort, damit\ndie Oberflaeche den Unterschied zwischen \"nichts zu holen\" und \"schon\nalles da\" nicht raten muss.\n\nJEDE ZAHL IST GEZAEHLT. `used` kommt aus der Datenbank, die beiden Decken\naus der Limit-Tabelle. Nichts davon ist hochgerechnet - die Oberflaeche\nbraucht deshalb keinen Schaetzungs-Hinweis und darf auch keinen erfinden.","operationId":"get_gain_preview_api_v1_monetization_servers__server_id__gain_preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monetization/servers/{server_id}/recap":{"get":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Get Recap","description":"Der eingetragene Kanal und der Stand der letzten Zustellung.\n\n`last_sent_week` ist die Kalenderwoche des zuletzt geposteten Rueckblicks\n(`2026-32`), oder null. Sie steht hier, weil die Oberflaeche sonst nicht\nzwischen \"noch nie\" und \"diese Woche war nichts zu berichten\"\nunterscheiden kann - und ein Montag ohne Nachricht ohne diese\nUnterscheidung wie ein Defekt aussieht.","operationId":"get_recap_api_v1_monetization_servers__server_id__recap_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Put Recap","description":"Den Kanal setzen, oder mit `channel_id: null` den Rueckblick abschalten.\n\nDer Kanal wird gegen DIESEN Server geprueft. Ohne die Pruefung waere das\nhier die bequemste Fernsteuerung des ganzen Projekts: eine fremde Kanal-ID\neintragen und der Bot postet ab dem naechsten Montag woechentlich in einen\nServer, auf den der Eintragende keinerlei Anspruch hat. Der Cog loest die\nID zwar ueber `guild.get_channel` auf und trifft damit nur Kanaele des\neigenen Servers - aber darauf allein zu bauen hiesse, die Absicherung an\neiner Stelle zu haben, die sie nur nebenbei mitbringt.","operationId":"put_recap_api_v1_monetization_servers__server_id__recap_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecapIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monetization/servers/{server_id}/drafts":{"get":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Get Drafts","operationId":"get_drafts_api_v1_monetization_servers__server_id__drafts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"include_applied","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Applied"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monetization/servers/{server_id}/drafts/{feature_key}":{"put":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Put Draft","description":"Einen Entwurf ablegen.\n\nKein Premium noetig, das ist der Punkt der ganzen Uebung. Server-Zugriff\nnatuerlich schon: ein Entwurf ist eine Schreiboperation auf fremdem Grund.","operationId":"put_draft_api_v1_monetization_servers__server_id__drafts__feature_key__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"feature_key","in":"path","required":true,"schema":{"type":"string","maxLength":64,"title":"Feature Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Delete Draft","operationId":"delete_draft_api_v1_monetization_servers__server_id__drafts__feature_key__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"feature_key","in":"path","required":true,"schema":{"type":"string","maxLength":64,"title":"Feature Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monetization/servers/{server_id}/drafts/{feature_key}/applied":{"post":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Mark Applied","description":"Der Entwurf ist uebernommen worden.\n\nDie Uebernahme selbst laeuft ueber den normalen Speichern-Endpunkt des\njeweiligen Features. Absichtlich: dessen Pruefungen sind die richtigen,\nund ein zweiter Schreibpfad haette sie irgendwann nicht mehr alle.","operationId":"mark_applied_api_v1_monetization_servers__server_id__drafts__feature_key__applied_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"feature_key","in":"path","required":true,"schema":{"type":"string","maxLength":64,"title":"Feature Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monetization/payment-issue":{"get":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Get Payment Issue","operationId":"get_payment_issue_api_v1_monetization_payment_issue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/monetization/annual-nudge":{"get":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Get Annual Nudge","description":"Ist dieser Nutzer reif fuer den Jahresplan-Vorschlag?\n\nNutzerbezogen und OHNE Server-ID, weil die Kaufseite keine hat. Dieselbe\nPruefung steckt zwar schon im Sammelendpunkt, aber die ist an einen Server\ngebunden - und die Frage \"zahlst du lange genug monatlich\" hat mit dem\neinzelnen Server nichts zu tun.\n\nDer Jahresplan ist der staerkste Einzelhebel gegen Abwanderung, den es in\ndiesem Produkt gibt: Jahreszahler kuendigen etwa halb so oft, und sie haben\neinen Abbuchungsversuch im Jahr statt zwoelf, an denen etwas schiefgehen\nkann. Genau deshalb ist die Pruefung streng - wer erst seit zwei Wochen\nzahlt, hat den Wert noch nicht erlebt und liest den Vorschlag als\nNachfassen.","operationId":"get_annual_nudge_api_v1_monetization_annual_nudge_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/monetization/payment-issue/seen":{"post":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Mark Payment Issue Seen","description":"Zaehlt, dass der Hinweis angezeigt wurde.\n\nNicht um ihn danach auszublenden. Der Hinweis bleibt, solange das Problem\nbesteht, weil sein Verschwinden bedeuten wuerde, dass es geloest sei. Die\nZahl beantwortet eine andere Frage: ob ein Kunde, dessen Frist verstrichen\nist, den Hinweis ueberhaupt je gesehen hat. Ist die Zahl null, war nicht\ner nachlaessig, sondern die Platzierung falsch.","operationId":"mark_payment_issue_seen_api_v1_monetization_payment_issue_seen_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/monetization/cancel/intent":{"post":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Cancel Intent","description":"Der Nutzer hat einen Kuendigungsgrund genannt. Was bieten wir an?\n\nDer Endpunkt kuendigt NICHTS. Er nimmt den Grund entgegen und sagt, welches\nGegenangebot dazu passt. Die Kuendigung selbst laeuft unveraendert ueber\nPaddle, und der Weg dorthin bleibt an jeder Stelle einen Klick entfernt.\nEin Rettungsfluss, der den Ausgang verstellt, rettet niemanden; er erzeugt\nRueckbuchungen und Screenshots.","operationId":"cancel_intent_api_v1_monetization_cancel_intent_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelIntentIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/monetization/subscription/pause":{"post":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Pause Subscription","description":"Das eigene Abo pausieren statt zu kuendigen.\n\nUEBERGANGSFASSUNG. Der neue Weg ist POST /subscriptions/{scope}/pause in\napi/routers/subscriptions.py; der kann zusaetzlich ein Wiederanlaufdatum.\nDieser Endpunkt bleibt, solange das alte Frontend ihn ruft.\n\n`scope` ist neu und sollte gesetzt werden. Ohne ihn sucht dieser Endpunkt\ndas zu pausierende Abo weiterhin in fester Reihenfolge Premium, Supreme,\nAI und nimmt das erste gefundene. Wer Premium UND Supreme hat und Supreme\npausieren will, pausiert damit Premium. Das ist der Fehler, den `scope`\nbehebt; ein Pflichtparameter waere aber ein Bruch fuer jedes Frontend, das\nnoch nicht nachgezogen ist, deshalb loggt der Fall nur eine Warnung.\n\nDAS IST DAS EINZIGE GEGENANGEBOT MIT ECHTER MECHANIK. Rabatt, Hilfe und\nJahresplan sind Vorschlaege; die Pause ist eine Handlung, und sie ist der\nGrund, warum der Rettungsfluss ueberhaupt gebaut wurde: etwa ein Viertel\nder Kuendigungswilligen pausiert, wenn man es ihnen anbietet, und bleibt\ndanach im Schnitt fuenfeinhalb Monate laenger.\n\nZWEI ENTSCHEIDUNGEN, DIE ZUSAMMENGEHOEREN:\n\n`effective_from = next_billing_period`. Es wird NICHT sofort pausiert.\nWer den Monat bezahlt hat, behaelt ihn - alles andere waere ein Entzug\nbezahlter Leistung, getarnt als Entgegenkommen. Die Pause beginnt, wenn\ndie naechste Abbuchung faellig waere, und genau die faellt dann aus.\n\nUnd: pausiert wird ueber PADDLE, nicht in unserer Datenbank. Ein Abo, das\nbei uns als pausiert gilt und bei Paddle weiterlaeuft, bucht munter weiter\nab, waehrend der Kunde glaubt, er zahle nicht mehr. Das ist der Vorfall,\nnach dem man Rueckbuchungen bekommt.\n\nDer Nutzer loest das selbst aus, an seinem eigenen Abo. Wir tun hier\nnichts, was er nicht auch im Paddle-Portal tun koennte - nur an der\nStelle, an der er gerade steht.","operationId":"pause_subscription_api_v1_monetization_subscription_pause_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"premium | professional | supreme | ai. Ohne Angabe wird das erstbeste Abo pausiert, was bei Mehrfach-Abonnenten falsch ist.","title":"Scope"},"description":"premium | professional | supreme | ai. Ohne Angabe wird das erstbeste Abo pausiert, was bei Mehrfach-Abonnenten falsch ist."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monetization/cancel/outcome":{"post":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Cancel Outcome","description":"Wie der Rettungsfluss ausgegangen ist.","operationId":"cancel_outcome_api_v1_monetization_cancel_outcome_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelOutcomeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/monetization/admin/config":{"get":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Admin Get Config","operationId":"admin_get_config_api_v1_monetization_admin_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Admin Put Config","description":"Den Schalter umlegen.\n\n`mode_changed_at` wird NUR gesetzt, wenn sich der Modus tatsaechlich\naendert, nicht bei jedem Speichern. Das Datum ist die Naht, an der der\nTrichterbericht schneidet: wer die Kulanzfrist anpasst, verschiebt damit\nnicht den Beginn der laufenden Messung.","operationId":"admin_put_config_api_v1_monetization_admin_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__monetization__ConfigUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/monetization/admin/funnel":{"get":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Admin Funnel","description":"Der Bericht, der die Kartenfrage endgueltig beantwortet.\n\nDIE ZAHL, AUF DIE ES ANKOMMT, ist `paid_per_1000_reached` und nicht die\nQuote Trial-zu-Kauf. Der Unterschied ist der Grund, warum diese Frage in\nder Branche seit Jahren falsch beantwortet wird: schaltet man von \"ohne\nKarte\" auf \"mit Karte\", springt die Quote Trial-zu-Kauf von etwa vierzehn\nauf etwa vierundvierzig Prozent, und in jedem Dashboard sieht das nach\neinem Sieg aus. Was gleichzeitig einbricht, ist die Zahl derer, die\nueberhaupt starten, und die steht in keiner Quote.\n\nDeshalb rechnet dieser Bericht pro erreichtem Server, nicht pro Trial. Die\nModi stehen nebeneinander, jeder mit seiner eigenen Grundgesamtheit,\naufgeteilt nach dem Modus, unter dem der Trial VERGEBEN wurde - nicht nach\ndem, der gerade eingestellt ist.\n\n`still_premium_30d` ist die Gegenprobe: eine Umwandlung, die nach vier\nWochen wieder weg ist, war ein Aufschub und kein Verkauf. Ohne diese\nSpalte gewinnt regelmaessig der Modus, der am haertesten drueckt.","operationId":"admin_funnel_api_v1_monetization_admin_funnel_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"default":90,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monetization/admin/cancellations":{"get":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Admin Cancellations","description":"Kuendigungsgruende und Rettungsquote je Grund.\n\nDie Auswertung je GRUND und nicht in Summe, weil die Summe nichts sagt:\neine Gesamtquote von zwoelf Prozent kann bedeuten, dass ueberall\nmittelmaessig gerettet wird, oder dass die Pause bei \"gerade zu teuer\"\nhervorragend zieht und der Rest gar nicht. Nur das Zweite ist umsetzbar.","operationId":"admin_cancellations_api_v1_monetization_admin_cancellations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"default":90,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monetization/admin/payment-issues":{"get":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Admin Payment Issues","description":"Wie viel Umsatz die Kulanzfrist tatsaechlich zurueckholt.\n\n`recovered` sind Abos, bei denen eine Abbuchung scheiterte und danach doch\ndurchging. Vor dieser Aenderung waeren das alles Kuendigungen gewesen, die\nniemand gewollt hat: der alte Pfad entzog beim ersten Fehlversuch sofort.","operationId":"admin_payment_issues_api_v1_monetization_admin_payment_issues_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"default":90,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monetization/admin/sweep":{"post":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Admin Sweep","description":"Die beiden Nachlaeufe von Hand anstossen.\n\nIm Normalbetrieb laufen sie als Hintergrundaufgabe. Dieser Endpunkt ist\nfuer den Fall, dass der Bot laenger stand: dann haengen Trials auf\n\"laeuft noch\", die seit Tagen abgelaufen sind, und Kulanzfristen, die\nhaetten vollzogen werden muessen.","operationId":"admin_sweep_api_v1_monetization_admin_sweep_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/monetization/upgrade-spotlight":{"get":{"tags":["💳 Monetarisierung","Monetarisierung"],"summary":"Get Upgrade Spotlight","description":"Der eine Server, dem Premium gerade am meisten braechte.\n\nAntwort:\n\n    server        der Kandidat (id, name, icon_url, banner_url, Zahlen)\n                  oder null, wenn es keinen gibt\n    reasons       die gezaehlten Posten aus `gain_preview` fuer DIESEN\n                  Server, groesster Anlass zuerst; kann leer sein\n    at_limit      wie viele davon gerade AUF der Decke stehen\n    trial         der Trial-Zustand dieses Servers (Phase, Anspruch, Tage)\n    candidates    wie viele Server des Nutzers kein Abo tragen. Aus dem\n                  Vorfilter, nicht aus der Einzelpruefung: ein Abo, das\n                  abgelaufen ist und erst beim Nachsehen deaktiviert\n                  wird, zaehlt hier noch als getragen\n    managed       {total, preview} - ALLE Server, die dieser Nutzer\n                  verwaltet, und die ersten fuenf davon mit Wappen. Die\n                  Preisseite zeigt damit, wie viele Server die\n                  \"alle Server\"-Stufe abdecken wuerde, und legt ihre\n                  Wappen nebeneinander. Steht auch dann da, wenn es\n                  keinen Kandidaten gibt (alles schon Premium)\n    is_premium_user  hat der Nutzer selbst schon ein Abo?\n\n`server` ist null, wenn der Nutzer keinen Server verwaltet, alle seine\nServer bereits ein Abo tragen oder er gar nicht angemeldet ist. Die\nOberflaeche faellt dann auf ihr allgemeines Band zurueck - ein erfundener\nServer waere die schlechtere Antwort.","operationId":"get_upgrade_spotlight_api_v1_monetization_upgrade_spotlight_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/subscriptions/me":{"get":{"tags":["💳 Abo-Verwaltung"],"summary":"Meine Abos","description":"ALLE Abos des angemeldeten Nutzers, in einer Antwort.\n\nDer Grund fuer einen Sammelendpunkt statt vier Einzelabrufen ist derselbe\nwie beim Sammelendpunkt in monetization.py: die Oberflaeche leitet aus\nALLEN Abos EINE Darstellung ab. Vier Einzelabrufe sind vier Gelegenheiten,\ndass drei da sind und der vierte noch laedt, und der Nutzer in dieser\nSekunde eine Karte sieht, die es nicht gibt.\n\nProfessional erscheint hier ohne Sonderfall, weil es in derselben Liste\nsteht wie Premium und Supreme. Genau das war die Luecke: es gab keinen\nOrt, an dem alle Abos eines Nutzers zusammenkamen.","operationId":"meine_abos_api_v1_subscriptions_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__subscriptions__Antwort"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/subscriptions/{scope}/loss-preview":{"get":{"tags":["💳 Abo-Verwaltung"],"summary":"Verlust Vorschau","description":"Was bei einer Kuendigung dieses Abos ausgeht, gezaehlt.\n\nLiefert nur Posten mit `lost > 0`. Eine leere Liste ist ein gueltiges\nErgebnis: an diesem Abo haengt nichts, was der Nutzer selbst gebaut hat.","operationId":"verlust_vorschau_api_v1_subscriptions__scope__loss_preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__subscriptions__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscriptions/{scope}/value":{"get":{"tags":["💳 Abo-Verwaltung"],"summary":"Wertquittung","description":"Was dieses Abo fuer den Nutzer getan hat.\n\nSteht im Fluss VOR der Verlustliste. Die Reihenfolge ist Absicht: erst\nwas es gebracht hat, dann was ausgeht. Umgekehrt liest sich dieselbe\nInformation als Drohung.","operationId":"wertquittung_api_v1_subscriptions__scope__value_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__subscriptions__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscriptions/{scope}/invoices":{"get":{"tags":["💳 Abo-Verwaltung"],"summary":"Rechnungen","description":"Der Rechnungsverlauf dieses Abos, aus Paddle.\n\nNur bezahlte und abgerechnete Transaktionen. Ein abgebrochener\nKaufversuch ist keine Rechnung und hat in einem Rechnungsverlauf nichts\nzu suchen.","operationId":"rechnungen_api_v1_subscriptions__scope__invoices_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}},{"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/api__routers__subscriptions__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscriptions/invoices/{txn_id}/pdf":{"get":{"tags":["💳 Abo-Verwaltung"],"summary":"Rechnung Pdf","description":"Das Rechnungs-PDF, DURCHGEREICHT statt verlinkt.\n\nWarum nicht einfach die Paddle-Adresse an den Browser geben: sie ist\nsigniert, kurzlebig und traegt keine Zugangspruefung von uns. Wer sie\nweitergibt, gibt eine fremde Rechnung weiter. Ausserdem verlaesst der\nNutzer damit die Seite, und der ganze Umbau existiert, damit er das nicht\nmehr muss.\n\nVorbild ist utils/blueprint_ticket.py, das dasselbe Problem fuer\nBlueprint-Bilder schon geloest hat.\n\nDIE ZUGANGSPRUEFUNG STEHT VOR DEM ABRUF: die Transaktion muss zu einem Abo\nDIESES Nutzers gehoeren. Ohne sie waere jede txn_-ID der Welt abrufbar,\nsobald man angemeldet ist.","operationId":"rechnung_pdf_api_v1_subscriptions_invoices__txn_id__pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"txn_id","in":"path","required":true,"schema":{"type":"string","title":"Txn Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscriptions/{scope}/cancel":{"post":{"tags":["💳 Abo-Verwaltung"],"summary":"Kuendigen","description":"Echte Kuendigung, wirksam zum Periodenende.\n\n`effective_from: next_billing_period` und nichts anderes. Wer bis zum 14.\nbezahlt hat, hat bis zum 14. alles. Ein Sofort-Entzug waere ein Entzug\nbezahlter Leistung und der schnellste Weg zu einer Rueckbuchung, die die\nPaddle-Gebuehr plus den Kunden plus den Ruf kostet.\n\nPaddle setzt daraufhin einen `scheduled_change` und laesst den Status auf\n`active`. Genau daran haengt der Ruecknahme-Streifen: solange die\nKuendigung nur geplant ist, laesst sie sich mit einem Klick zuruecknehmen.","operationId":"kuendigen_api_v1_subscriptions__scope__cancel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KuendigenIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__subscriptions__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscriptions/{scope}/cancel/undo":{"post":{"tags":["💳 Abo-Verwaltung"],"summary":"Kuendigung Zuruecknehmen","description":"Die geplante Kuendigung zuruecknehmen.\n\nEin PATCH mit `scheduled_change: null`, mehr ist es nicht. Paddle laesst\nbeim Update ausdruecklich nur diesen einen Wert zu, um eine geplante\nAenderung zu entfernen.\n\nDAS IST DER BILLIGSTE RUECKGEWINN, DEN ES GIBT, und er fehlte bisher\nvollstaendig: wer gekuendigt hatte und es sich anders ueberlegte, musste\nentweder warten, bis das Abo auslaeuft, und neu kaufen, oder den Support\nanschreiben.","operationId":"kuendigung_zuruecknehmen_api_v1_subscriptions__scope__cancel_undo_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__subscriptions__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscriptions/{scope}/pause":{"post":{"tags":["💳 Abo-Verwaltung"],"summary":"Pausieren","description":"Pause MIT Datum, wirksam zum Periodenende.\n\nDer Unterschied zur alten Pause in monetization.py ist zweifach:\n\n1. `scope` ist Pflicht. Die alte Fassung suchte das zu pausierende Abo in\n   fester Reihenfolge Premium, Supreme, AI und nahm das erste gefundene.\n   Wer Premium und Supreme hat und Supreme pausieren will, pausierte\n   Premium.\n2. `resume_at`. Ein Datum macht aus \"ich bin erstmal raus\" ein\n   Wiedersehen. Ohne Datum pausiert Paddle unbefristet.\n\n`effective_from: next_billing_period`, aus demselben Grund wie bei der\nKuendigung: der bezahlte Monat bleibt.\n\nZUM WIEDERANLAUF: Paddle beginnt beim Fortsetzen eine neue\nAbrechnungsperiode und bucht dann den vollen Betrag ab. Das ist Paddles\nVorgabe und wir aendern sie nicht, aber die Oberflaeche sagt es vorher.\nEine ueberraschende Abbuchung nach einer Pause ist genau die Sorte\nErlebnis, die eine Rueckbuchung ausloest.\n\nWORAUF `resume_at` ANKERT, und warum das einmal falsch war:\n\nDie Pause BEGINNT zum Periodenende, nicht heute. Das Rueckkehrdatum muss\ndeshalb ab dem Periodenende weiterzaehlen. Vorher stand hier\n`datetime.now() + 30 Tage * months` - gerechnet ab HEUTE, waehrend die\nPause erst spaeter anfing. Die Pause war damit immer um die gesamte\nRestlaufzeit zu kurz: wer neun Tage vor der Verlaengerung zwei Monate\npausierte, bekam sieben Wochen. Wer ein Jahresabo kurz nach der\nVerlaengerung pausierte, bekam ein `resume_at`, das rund zehn Monate VOR\ndem Pausenbeginn lag.\n\nDer Dialog rechnete von Anfang an richtig (PauseDialog.jsx nennt das\nPeriodenende ausdruecklich als Basis). Genannt wurde dem Kunden also das\nrichtige Datum, gebucht das falsche.","operationId":"pausieren_api_v1_subscriptions__scope__pause_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PausierenIn","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__subscriptions__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscriptions/{scope}/resume":{"post":{"tags":["💳 Abo-Verwaltung"],"summary":"Fortsetzen","description":"Ein pausiertes Abo vorzeitig fortsetzen.\n\n`effective_from: immediately` ist hier richtig und der einzige Ort in\ndieser Datei, an dem es steht: der Nutzer WILL, dass es sofort wieder\nlaeuft. Ein \"ab naechster Periode\" waere hier die Bevormundung.\n\nLiegt die Pause noch als geplante Aenderung an (also noch nicht in Kraft),\nist das Zuruecknehmen dieser Aenderung das Richtige, nicht ein Resume.\nPaddle wuerde ein Resume auf ein aktives Abo mit\n`subscription_update_when_not_paused` ablehnen.","operationId":"fortsetzen_api_v1_subscriptions__scope__resume_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__subscriptions__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscriptions/{scope}/change-plan":{"post":{"tags":["💳 Abo-Verwaltung"],"summary":"Plan Wechseln","description":"Intervallwechsel, Hoch- und Herunterstufen.\n\nHERUNTERSTUFEN IST DER WICHTIGSTE NEUE AUSWEG. Ein Professional-Kunde, dem\nder Verbund zu teuer ist, hatte bisher genau zwei Moeglichkeiten: voller\nPreis oder nichts. Der Sprung von Professional auf Premium haelt den\nKunden und zwei Drittel des Umsatzes. Der Sprung auf null haelt nichts.\n\nZUR ABRECHNUNG: `prorated_next_billing_period`. Die zu viel gezahlte Zeit\nwird auf der naechsten Rechnung gutgeschrieben, statt zu verfallen. Die\nAlternative `do_not_bill` waere fuer uns billiger und fuer den Kunden ein\nstiller Verlust: er gibt Professional heute ab und bekommt fuer den Rest\ndes bezahlten Monats nichts. `prorated_immediately` wiederum loeste eine\nsofortige Rueckzahlung aus, mitten in einem Rettungsgespraech, und das ist\nein Zahlungsvorgang, den in diesem Moment niemand erwartet.\n\nZUM VERBUND: er bleibt beim Herunterstufen VOLLSTAENDIG STEHEN. Gruppen,\nMitglieder und alle Einstellungen werden nicht angefasst, sie werden nur\nwirkungslos: resolve_server_plan findet kein gueltiges Professional-Abo\ndes Besitzers mehr und die Server fallen auf ihre eigene Stufe. Das ist\nbereits so implementiert und kostet hier keine Zeile Code. Wer spaeter\nzurueck auf Professional geht, hat seinen Verbund unveraendert wieder.\nGenau das steht auch im Herunterstufen-Dialog, woertlich.","operationId":"plan_wechseln_api_v1_subscriptions__scope__change_plan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanWechselIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__subscriptions__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscriptions/{scope}/discount":{"post":{"tags":["💳 Abo-Verwaltung"],"summary":"Rueckhalte Rabatt","description":"30 Prozent auf drei Monate, hoechstens einmal in zwoelf Monaten.\n\nDIE RABATT-ID KOMMT AUS DER UMGEBUNG, NIE AUS DEM REQUEST. Stuende sie im\nRumpf, koennte sich jeder Nutzer jeden im Konto angelegten Rabatt selbst\ngewaehren, auch einen mit 100 Prozent.\n\nZUM ZEITPUNKT, und das ist die Stelle, an der man einen Kunden versehentlich\nbetruegt: `effective_from: next_billing_period` und NICHT `immediately`.\nDer Rabatt im Paddle-Konto ist auf drei Abrechnungszeitraeume begrenzt\n(maximum_recurring_intervals). Wuerde er mitten in der bereits bezahlten\nPeriode beginnen, verbrauchte diese Periode einen der drei Zeitraeume, und\nder Kunde bekaeme statt drei verbilligten Rechnungen nur zwei. Wir\nversprechen drei, also muss er drei bekommen.\n\nNebeneffekt derselben Entscheidung: kein `proration_billing_mode` noetig\nund keine Gutschrift mitten in der Periode.","operationId":"rueckhalte_rabatt_api_v1_subscriptions__scope__discount_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RabattIn","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__subscriptions__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscriptions/{scope}/payment-method-transaction":{"post":{"tags":["💳 Abo-Verwaltung"],"summary":"Zahlungsmittel Transaktion","description":"Die Transaktions-ID fuer das Paddle.js-Overlay.\n\nDIE EINE AUSNAHME VON \"ALLES IN NOTOQ\". Kartendaten duerfen unsere Server\nnicht beruehren, das ist PCI-DSS und nicht verhandelbar. Der Unterschied\nzu vorher ist trotzdem gross:\n\n  vorher:  Klick fuehrt auf customer-portal.paddle.com, andere Domain,\n           anderes Design, der Nutzer sucht dort selbst.\n  jetzt:   diese ID geht an Paddle.js, das ein Overlay AUF notoq.xyz\n           oeffnet. Der Nutzer verlaesst die Seite nicht.\n\nDer Aufruf ist bei Paddle ein GET, obwohl unser Endpunkt POST ist. Das ist\nkein Versehen: aus Sicht des Nutzers entsteht hier etwas (eine Sitzung zum\nKartenwechsel), und ein GET von uns waere zwischenspeicherbar. Eine\nzwischengespeicherte Transaktions-ID ist eine, die nicht mehr geht.","operationId":"zahlungsmittel_transaktion_api_v1_subscriptions__scope__payment_method_transaction_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__subscriptions__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscriptions/monthly-report":{"get":{"tags":["💳 Abo-Verwaltung"],"summary":"Monatsbericht Lesen","description":"Bekommt der Nutzer den Monatsbericht, und koennte er ihn bekommen?","operationId":"monatsbericht_lesen_api_v1_subscriptions_monthly_report_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__subscriptions__Antwort"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["💳 Abo-Verwaltung"],"summary":"Monatsbericht Schalten","description":"Den Monatsbericht an- oder abstellen. Zweimal dasselbe ist kein Fehler.\n\nOhne Pruefung auf `eligible`: der Schalter ist ein Wunsch des Nutzers und\nkein Anspruch. Wer ihn ohne laufendes Abo einschaltet, bekommt schlicht\nkeinen Bericht, bis wieder eines laeuft - und dann den, den er wollte.\n\nZurueck kommt derselbe Stand wie beim Lesen, damit die Oberflaeche den\nSchalter nach dem Speichern auf das setzt, was wirklich gilt.","operationId":"monatsbericht_schalten_api_v1_subscriptions_monthly_report_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonatsberichtIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__subscriptions__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/subscriptions/{scope}/confirmation-address":{"get":{"tags":["💳 Abo-Verwaltung"],"summary":"Bestaetigungsadresse","description":"Wohin die Bestaetigung geht, maskiert.\n\nSteht in Schritt 3 des Flusses sichtbar ueber dem Bestaetigen-Knopf. Das\nkostet nichts und faengt den Fall ab, dass jemand vor zwei Jahren mit\neiner toten Adresse gekauft hat und die Bestaetigung nie sieht.\n\nMaskiert, weil die vollstaendige Adresse hier nichts zu suchen hat: sie\nsteht schon im Konto, und dieser Endpunkt beantwortet nur die Frage\n\"welche von beiden\".","operationId":"bestaetigungsadresse_api_v1_subscriptions__scope__confirmation_address_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__subscriptions__Antwort"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/spotlight/manifest":{"get":{"tags":["🔍 Spotlight"],"summary":"Spotlight Manifest","description":"Der statische Suchindex einer Sprache.\n\nNICHT serverabhängig: die Landkarte ist für jeden Server dieselbe. Genau\ndeshalb steht der Endpunkt ohne `server_id` da und alle Server einer\nSprache teilen sich denselben Cache-Eintrag im Browser.\n\nDer ETag ist der Punkt: das Manifest ändert sich nur bei einem Deploy.\nJeder spätere Besuch bekommt eine 304 und lädt nichts — der zweite\nSeitenaufruf hat die Suche also ohne einen einzigen übertragenen Byte.","operationId":"spotlight_manifest_api_v1_spotlight_manifest_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sprache","in":"query","required":false,"schema":{"type":"string","description":"Anzeigesprache","default":"en-US","title":"Sprache"},"description":"Anzeigesprache"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/spotlight/live":{"get":{"tags":["🔍 Spotlight"],"summary":"Spotlight Live","description":"Was auf DIESEM Server gerade existiert: Kanäle, Rollen, Mitglieder, Tickets.\n\nAntwortet in derselben Form wie das Manifest, damit der Browser beide\nMengen ohne Umrechnung zusammenwerfen kann.\n\nDie Grenzen (20 Kanäle, 20 Rollen, 12 Mitglieder, 10 Tickets) sind keine\nSparmaßnahme: eine Palette zeigt ohnehin nie mehr als eine Bildschirmhöhe,\nund wer mehr braucht, sucht auf der jeweiligen Seite weiter — dort steht\ndie vollständige Liste mit Filtern.","operationId":"spotlight_live_api_v1_servers__server_id__spotlight_live_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":80,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/spotlight/run":{"post":{"tags":["🔍 Spotlight"],"summary":"Spotlight Run","description":"Führt eine Aktion aus.\n\nAntwortet mit `protokoll_id`, wenn sich die Aktion zurücknehmen lässt —\ndas ist das Signal für die Oberfläche, ein Rückgängig-Band zu zeigen\nstatt vorher zu fragen.","operationId":"spotlight_run_api_v1_servers__server_id__spotlight_run_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AktionsAnfrage"},{"type":"null"}],"title":"Anfrage"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/spotlight/undo":{"post":{"tags":["🔍 Spotlight"],"summary":"Spotlight Undo","description":"Nimmt eine Aktion zurück.","operationId":"spotlight_undo_api_v1_servers__server_id__spotlight_undo_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RuecknahmeAnfrage"},{"type":"null"}],"title":"Anfrage"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/spotlight/vorgang/{job_id}":{"get":{"tags":["🔍 Spotlight"],"summary":"Spotlight Vorgang","description":"Wie weit ist der Auftrag, den `/run` angestoßen hat?\n\nDas Limit ist absichtlich hoch: die Palette fragt im Sekundentakt, und\nzwar nur, solange ein Auftrag wirklich läuft.","operationId":"spotlight_vorgang_api_v1_servers__server_id__spotlight_vorgang__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","description":"BlueprintJob.id aus /run","title":"Job Id"},"description":"BlueprintJob.id aus /run"},{"name":"art","in":"query","required":false,"schema":{"type":"string","description":"Vorgangsart aus /run","default":"blueprint","title":"Art"},"description":"Vorgangsart aus /run"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/vorschlaege":{"get":{"tags":["💡 Vorschlaege"],"summary":"Vorschlaege","description":"Der fertige, sortierte Stapel.\n\nDie Antwort hat DIESELBE Form wie ein Signal aus `lib/manage-signale.js`.\nDas ist der ganze Trick aus Teil 4: der Backend-Stapel ist eine weitere\nQUELLE in derselben Grammatik, keine zweite Liste daneben. Es gibt eine\nRangfolge, eine Sortierung, eine Kartenform.","operationId":"vorschlaege_api_v1_servers__server_id__vorschlaege_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"},{"name":"pfad","in":"query","required":false,"schema":{"type":"string","maxLength":120,"description":"Wo der Nutzer gerade steht, z.B. /settings/levels","default":"","title":"Pfad"},"description":"Wo der Nutzer gerade steht, z.B. /settings/levels"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/vorschlaege/rueckmeldung":{"post":{"tags":["💡 Vorschlaege"],"summary":"Rueckmeldung","description":"Eine Reaktion mitschreiben.\n\nDAS LIMIT IST HOCH, weil \"gezeigt\" je Karte und Aufruf kommt: drei\nsichtbare Karten sind drei Meldungen, und wer durch den Stapel dreht,\nerzeugt mehr. Ein enges Limit haette hier den Effekt, dass ausgerechnet\ndie aktivsten Nutzer nicht mehr gelernt werden.","operationId":"rueckmeldung_api_v1_servers__server_id__vorschlaege_rueckmeldung_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RueckmeldungsAnfrage"},{"type":"null"}],"title":"Anfrage"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/vorschlaege/heilungen":{"get":{"tags":["💡 Vorschlaege"],"summary":"Heilungen","description":"Was der Bot aufgeraeumt hat - das Blatt hinter der Sammelkarte.\n\nEs ist derselbe Inhalt, den der Wochenbericht unter \"Was ich erledigt\nhabe\" fuehrt. DERSELBE, nicht ein aehnlicher: beide lesen diese Zeilen,\ndamit Bericht und Karte nicht auseinanderlaufen koennen.","operationId":"heilungen_api_v1_servers__server_id__vorschlaege_heilungen_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/wochenbericht":{"get":{"tags":["💡 Vorschlaege"],"summary":"Wochenbericht","description":"Der Bericht ueber die vergangene Woche.\n\nOhne `woche` die zuletzt abgeschlossene. Mit `woche` ein Archiveintrag -\ndas ist der ganze Sinn der Archivierung: \"was ich erledigt habe\" ueber\nzwoelf Wochen gelesen ist der Beleg dafuer, dass der Bot arbeitet.","operationId":"wochenbericht_api_v1_servers__server_id__wochenbericht_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"woche","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Montag im Format JJJJ-MM-TT","title":"Woche"},"description":"Montag im Format JJJJ-MM-TT"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/wochenbericht/archiv":{"get":{"tags":["💡 Vorschlaege"],"summary":"Wochenbericht Archiv","description":"Welche Wochen es gibt. Nur die Kennungen, nicht die Inhalte.","operationId":"wochenbericht_archiv_api_v1_servers__server_id__wochenbericht_archiv_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/insel/live":{"get":{"tags":["🏝️ Insel"],"summary":"Insel Live","description":"Die Live-Aktivitaeten dieses Servers.\n\nDie Antwort nennt ihren eigenen naechsten Takt. Siehe den Kopf von\n`utils/insel_live.py`: nur dort ist bekannt, ob gerade etwas mit einer\nProzentzahl laeuft - und nur dann lohnt eine Frage alle zehn Sekunden.","operationId":"insel_live_api_v1_servers__server_id__insel_live_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/gesundheit":{"get":{"tags":["🩺 Gesundheit"],"summary":"Server Gesundheit","description":"Alles, was Notoq auf diesem Server gerade aufhaelt - nach Schwere sortiert.\n\nAntwort: `zusammenfassung` (Zaehler je Schwere), `befunde` (je Befund\nid, bereich, schwere, art, systeme, objekt, problem {key, params}, fix,\nseiten, zustellung), `neu_autorisieren` (Link und fehlende Rechte, wenn\nserverweit etwas fehlt), `bot` (Admin? hoechste Rolle) und `stand`.","operationId":"server_gesundheit_api_v1_servers__server_id__gesundheit_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/gesundheit/beheben":{"post":{"tags":["🩺 Gesundheit"],"summary":"Server Gesundheit Beheben","description":"Notoq in EINEM Kanal die fehlenden Rechte selbst geben.\n\nGeht nur, wo Discord es erlaubt: Notoq sieht den Kanal, darf dort\nBerechtigungen verwalten, und die Rechte hat es serverweit. Alles andere\nbeantwortet der Bot ehrlich mit einem Grund, und die Seite zeigt dann die\nAnleitung.","operationId":"server_gesundheit_beheben_api_v1_servers__server_id__gesundheit_beheben_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","description":"Discord Server ID","title":"Server Id"},"description":"Discord Server ID"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/BehebenAnfrage"},{"type":"null"}],"title":"Anfrage"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/handoff/{code}":{"get":{"tags":["🔍 Spotlight"],"summary":"Handoff Ansehen","description":"Schaut nach, wohin ein Ticket führt — ohne es zu verbrauchen.\n\nDie Antwort sagt der Seite, was sie tun soll:\n\n    bereit      angemeldet und berechtigt: gleich einlösen\n    anmeldung   niemand angemeldet: zur Discord-Anmeldung, danach zurück\n    fremd       jemand anderes ist angemeldet: Konto wechseln anbieten\n    abgelaufen / verbraucht / unbekannt: erklären, warum es nicht geht","operationId":"handoff_ansehen_handoff__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","maxLength":24,"title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/handoff/{code}/einloesen":{"post":{"tags":["🔍 Spotlight"],"summary":"Handoff Einloesen","description":"Löst das Ticket ein und gibt die Zieladresse zurück.\n\nAb hier ist der Code verbraucht. Der Aufrufer bekommt eine fertige\nAdresse mitsamt Reiter, Feld und Ankunftshinweis — die Seite muss nichts\nmehr zusammensetzen.","operationId":"handoff_einloesen_handoff__code__einloesen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","maxLength":24,"title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/oauth-protected-resource/mcp":{"get":{"tags":["🔌 Owner MCP"],"summary":"Protected Resource","description":"RFC 9728. Die Pfadvariante mit /mcp ist kein Versehen: findet ein Client\ndie Kopfzeile nicht, probiert er zuerst\n/.well-known/oauth-protected-resource/<mcp-pfad> und erst danach die\nWurzelvariante. Beide zu bedienen kostet nichts und erspart einen\nFehlversuch.","operationId":"protected_resource__well_known_oauth_protected_resource_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"tags":["🔌 Owner MCP"],"summary":"Protected Resource","description":"RFC 9728. Die Pfadvariante mit /mcp ist kein Versehen: findet ein Client\ndie Kopfzeile nicht, probiert er zuerst\n/.well-known/oauth-protected-resource/<mcp-pfad> und erst danach die\nWurzelvariante. Beide zu bedienen kostet nichts und erspart einen\nFehlversuch.","operationId":"protected_resource__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/openid-configuration":{"get":{"tags":["🔌 Owner MCP"],"summary":"Authorization Server","description":"RFC 8414. openid-configuration zeigt auf dasselbe Dokument — manche\nClients fragen zuerst dort nach.","operationId":"authorization_server__well_known_openid_configuration_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server/mcp":{"get":{"tags":["🔌 Owner MCP"],"summary":"Authorization Server","description":"RFC 8414. openid-configuration zeigt auf dasselbe Dokument — manche\nClients fragen zuerst dort nach.","operationId":"authorization_server__well_known_oauth_authorization_server_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"tags":["🔌 Owner MCP"],"summary":"Authorization Server","description":"RFC 8414. openid-configuration zeigt auf dasselbe Dokument — manche\nClients fragen zuerst dort nach.","operationId":"authorization_server__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp":{"get":{"tags":["🔌 Owner MCP"],"summary":"Mcp No Stream","description":"Wir eröffnen keinen Server-zu-Client-Strom und führen keine Sitzungen —\n405 ist hier die vorgesehene Antwort, kein Fehler.","operationId":"mcp_no_stream_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["🔌 Owner MCP"],"summary":"Mcp Endpoint","description":"Der MCP-Endpunkt. Nimmt eine JSON-RPC-Nachricht entgegen.\n\nReihenfolge der Prüfungen, und jede hat ihren Grund:\n  1. Origin — Schutz vor DNS-Rebinding, von der Spezifikation verlangt\n  2. Protokollversion — eine unbekannte Version muss 400 ergeben\n  3. Bearer-Token — hier entsteht der 401, über den Claude den\n     Anmeldeserver überhaupt erst findet\n  4. Rumpf lesen und beantworten","operationId":"mcp_endpoint_mcp_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"delete":{"tags":["🔌 Owner MCP"],"summary":"Mcp No Stream","description":"Wir eröffnen keinen Server-zu-Client-Strom und führen keine Sitzungen —\n405 ist hier die vorgesehene Antwort, kein Fehler.","operationId":"mcp_no_stream_mcp_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/docs":{"get":{"tags":["🔌 Owner MCP"],"summary":"Mcp Docs","description":"Eine Seite, die sagt, wie man sich verbindet. Erreichbar ohne Anmeldung —\nsie verrät nichts ausser der Adresse und den Werkzeugnamen, und genau die\nbraucht man beim Einrichten.","operationId":"mcp_docs_mcp_docs_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/mcp/oauth/register":{"post":{"tags":["🔌 Owner MCP"],"summary":"Register Client","description":"RFC 7591. Claude meldet sich selbst an und bekommt eine client_id.\n\nDer Body ist JSON (nicht form-urlencoded — das gilt nur für /token).\n\nWichtig: Eine Registrierung allein gewährt gar nichts. Sie sagt nur \"dieser\nClient darf es versuchen\"; ob jemand hereinkommt, entscheidet erst die\nAnmeldung in /authorize. Deshalb ist dieser Endpunkt offen — genau so ist\nDCR gedacht.","operationId":"register_client_mcp_oauth_register_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/oauth/authorize":{"get":{"tags":["🔌 Owner MCP"],"summary":"Authorize Form","description":"Zeigt die Anmeldeseite. Prüft vorher, dass Client und Redirect stimmen —\nein Fehler hier darf NICHT an eine fremde Adresse weitergeleitet werden,\nsonst wäre das ein offener Umleitungsdienst.","operationId":"authorize_form_mcp_oauth_authorize_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["🔌 Owner MCP"],"summary":"Authorize Submit","description":"Prüft die Zugangsdaten und stellt bei Erfolg einen Autorisierungscode aus.\n\nDie Prüfkette, in dieser Reihenfolge:\n  1. Client und Redirect bekannt (schon oben, hier nochmal — der POST kommt\n     mit eigener Query und darf sich nicht auf den GET verlassen)\n  2. Konto existiert und hat ein Passwort\n  3. Passwort stimmt\n  4. Zweiter Faktor, falls eingerichtet\n  5. **is_owner** — und das ist der eigentliche Türsteher\n\nPunkt 5 steht am Ende, damit die Antwort für Nicht-Eigentümer identisch zu\neinem falschen Passwort aussieht. Sonst wäre die Seite ein Prüfgerät dafür,\nwelche E-Mail-Adresse dem Bot gehört.","operationId":"authorize_submit_mcp_oauth_authorize_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_authorize_submit_mcp_oauth_authorize_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp/oauth/discord":{"post":{"tags":["🔌 Owner MCP"],"summary":"Discord Start","description":"Schickt den Browser zu Discord. Nur aus dem Formular der Anmeldeseite.\n\nGeprüft wird vorher dasselbe wie auf der Anmeldeseite. Der Grund ist\nderselbe: ein Fehler darf nicht an eine fremde Adresse weitergeleitet\nwerden, sonst wäre der Endpunkt ein offener Umleitungsdienst.\n\n─── Warum POST und nicht GET ──────────────────────────────────────────\n\nAls GET war das ein Link, und ein Link laesst sich verschicken. Die erste\nFassung band den Rueckweg per Keks an den Browser; der Angriff brauchte\ndaraufhin nur einen anderen Link:\n\n  Der Angreifer meldet per offener Registrierung einen Client mit eigener\n  Rueckkehradresse an und schickt dem Eigentuemer DIESEN Startpunkt statt\n  des discord.com-Links. Dessen Browser setzt sich den Keks selbst, laeuft\n  zu Discord, kommt zurueck — Keks und Nonce passen, weil beide aus\n  demselben Browser stammen — und der Code fuer die Identitaet des\n  Eigentuemers geht an die Adresse des Angreifers. Am Ende steht ein\n  Owner-MCP-Token in fremder Hand, und das oeffnet notoq_sql auf der\n  Produktionsdatenbank.\n\nEin POST ist kein Link. Ein Formular auf fremder Seite hilft auch nicht:\nder Keks traegt `samesite=lax` und geht bei einem Cross-Site-POST nicht mit.","operationId":"discord_start_mcp_oauth_discord_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/oauth/discord/callback":{"get":{"tags":["🔌 Owner MCP"],"summary":"Discord Callback","description":"Die Rückkehr von Discord. Hier entscheidet sich, ob ein Code entsteht.\n\nDer Türsteher ist hier strenger als beim Passwortweg, und das mit Absicht:\nverlangt wird nicht nur, dass das Konto laut Datenbank der Eigentümer ist,\nsondern dass Discord JETZT meldet, die bestätigte Adresse dieses Kontos sei\nOWNER_EMAIL. `is_owner()` liest gespeicherte Adressen, und eine davon stammt\nihrerseits aus einer früheren Discord-Runde — am MCP soll die Entscheidung\nnicht an einem Altbestand hängen, den niemand mehr prüft.\n\nEbenfalls Absicht: hier entsteht kein Konto. Der Dashboard-Weg legt eines\nan, wenn keines passt (dort ist das richtig); hier wäre es eine Einladung,\ndurch blosses Klicken Zeilen in der Kontotabelle zu erzeugen.","operationId":"discord_callback_mcp_oauth_discord_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/oauth/token":{"post":{"tags":["🔌 Owner MCP"],"summary":"Token Endpoint","description":"Tauscht Code gegen Token, bzw. erneuert ein abgelaufenes Token.\n\nDie Parameter kommen als `application/x-www-form-urlencoded` — Claude sendet\nbeides so. FastAPI's `Form(...)` erzwingt genau diesen Parser; nähme man\nhier ein Pydantic-Modell, käme bei jeder Anfrage ein 415 zurück.","operationId":"token_endpoint_mcp_oauth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_token_endpoint_mcp_oauth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp/oauth/revoke":{"post":{"tags":["🔌 Owner MCP"],"summary":"Revoke Endpoint","description":"RFC 7009. Beendet eine Anbindung.\n\nWiderrufen wird die gesamte session_id, nicht nur die eine Zeile: sonst\nbliebe das zuletzt rotierte Token gültig und der Widerruf wäre wirkungslos.\nAntwortet immer mit 200 — die Spezifikation verlangt, dass ein unbekanntes\nToken kein Fehler ist.","operationId":"revoke_endpoint_mcp_oauth_revoke_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_revoke_endpoint_mcp_oauth_revoke_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ai-access":{"get":{"tags":["🔌 Public MCP"],"summary":"Zustand","description":"Ist dieser Server verbunden, und was ist zuletzt passiert?","operationId":"zustand_api_v1_servers__server_id__ai_access_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["🔌 Public MCP"],"summary":"Freischalten","description":"Schaltet den Server fuer KI-Zugriff frei.\n\n`skip_enabled_check`, weil der Server hier per Definition noch nicht\nfreigeschaltet ist. Alles andere wird voll geprueft — insbesondere, ob der\nAufrufer Eigentuemer oder Administrator ist.","operationId":"freischalten_api_v1_servers__server_id__ai_access_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FreigabeEingabe"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["🔌 Public MCP"],"summary":"Schreibrecht Aendern","description":"Schaltet das Vorschlagen von Aenderungen an oder aus, ohne die Verbindung zu kappen.","operationId":"schreibrecht_aendern_api_v1_servers__server_id__ai_access_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_schreibrecht_aendern_api_v1_servers__server_id__ai_access_patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["🔌 Public MCP"],"summary":"Widerrufen","description":"Kappt den KI-Zugriff auf diesen Server.\n\nOffene Vorschlaege werden mit zurueckgezogen: einen Vorgang stehen zu\nlassen, der nach dem Widerruf noch bestaetigt werden koennte, waere ein\nWiderruf, der nicht widerruft.","operationId":"widerrufen_api_v1_servers__server_id__ai_access_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ai-access/plans":{"get":{"tags":["🔌 Public MCP"],"summary":"Vorgangsliste","operationId":"vorgangsliste_api_v1_servers__server_id__ai_access_plans_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ai-access/plans/{plan_id}":{"get":{"tags":["🔌 Public MCP"],"summary":"Vorgang","description":"Ein Vorgang mit allen Eingriffen — das, was die Bestaetigungskarte zeigt.","operationId":"vorgang_api_v1_servers__server_id__ai_access_plans__plan_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ai-access/plans/{plan_id}/approve":{"post":{"tags":["🔌 Public MCP"],"summary":"Bestaetigen","description":"Bestaetigt einen Vorgang und fuehrt ihn aus.\n\nMit den Rechten dessen, der klickt. Wer selbst nicht schreiben darf, loest\nhier nichts aus, auch wenn der Vorschlagende es duerfte.","operationId":"bestaetigen_api_v1_servers__server_id__ai_access_plans__plan_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ai-access/plans/{plan_id}/reject":{"post":{"tags":["🔌 Public MCP"],"summary":"Ablehnen","operationId":"ablehnen_api_v1_servers__server_id__ai_access_plans__plan_id__reject_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/servers/{server_id}/ai-access/audit":{"get":{"tags":["🔌 Public MCP"],"summary":"Nachweisbuch","description":"Was eine KI auf diesem Server getan hat.\n\nDer Grund, warum dieser Dienst sich verantworten laesst: ein Werkzeugaufruf\nist von aussen unsichtbar — keine Dashboard-Sitzung, kein Discord-Befehl,\nkein Browserverlauf. Ohne diese Liste gaebe es keine Spur davon.","operationId":"nachweisbuch_api_v1_servers__server_id__ai_access_audit_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"server_id","in":"path","required":true,"schema":{"type":"string","title":"Server Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"only_writes","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Only Writes"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-access/connections":{"get":{"tags":["🔌 Public MCP"],"summary":"Verbindungen","description":"Die KI-Verbindungen dieses Kontos, ueber alle Server hinweg.\n\nKontobezogen und nicht serverbezogen, weil eine Verbindung es auch ist:\nwer Claude einmal anbindet, bindet es an sein Konto, nicht an einen\neinzelnen Server.","operationId":"verbindungen_api_v1_ai_access_connections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/ai-access/connections/{session_id}":{"delete":{"tags":["🔌 Public MCP"],"summary":"Verbindung Kappen","description":"Beendet eine Verbindung. Wirkt, sobald das laufende Access-Token ablaeuft —\nlaenger als eine halbe Stunde kann das nicht dauern.","operationId":"verbindung_kappen_api_v1_ai_access_connections__session_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/oauth-protected-resource/mcp/public":{"get":{"tags":["🔌 Public MCP"],"summary":"Protected Resource","description":"RFC 9728. Sagt dem Client, welcher Anmeldeserver fuer diese Adresse gilt.","operationId":"protected_resource__well_known_oauth_protected_resource_mcp_public_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/openid-configuration/mcp/public":{"get":{"tags":["🔌 Public MCP"],"summary":"Authorization Server","description":"RFC 8414 — alle vier Adressen, unter denen Clients danach suchen.\n\nUnser Issuer hat einen PFAD (/mcp/public), und dafuer nennt die\nMCP-Spezifikation drei Formen, die ein Client der Reihe nach probieren\nSOLL:\n\n  1. Pfad eingeschoben:   /.well-known/oauth-authorization-server/mcp/public\n  2. dasselbe als OIDC:   /.well-known/openid-configuration/mcp/public\n  3. Pfad angehaengt:     /mcp/public/.well-known/openid-configuration\n\nDie dritte kostet eine Zeile und faellt sonst genau dem Client zur Last,\nder nur sie probiert — der meldet dann \"Server nicht erreichbar\", waehrend\nder Server unter zwei anderen Adressen antwortet. Die vierte Zeile ist die\nangehaengte Form der ersten; auch die kommt in der Praxis vor.\n\nVier Dekoratoren, EIN Dokument: eine Kopie waere die naechste Stelle, an\nder ein neuer Endpunkt fehlt.","operationId":"authorization_server__well_known_openid_configuration_mcp_public_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server/mcp/public":{"get":{"tags":["🔌 Public MCP"],"summary":"Authorization Server","description":"RFC 8414 — alle vier Adressen, unter denen Clients danach suchen.\n\nUnser Issuer hat einen PFAD (/mcp/public), und dafuer nennt die\nMCP-Spezifikation drei Formen, die ein Client der Reihe nach probieren\nSOLL:\n\n  1. Pfad eingeschoben:   /.well-known/oauth-authorization-server/mcp/public\n  2. dasselbe als OIDC:   /.well-known/openid-configuration/mcp/public\n  3. Pfad angehaengt:     /mcp/public/.well-known/openid-configuration\n\nDie dritte kostet eine Zeile und faellt sonst genau dem Client zur Last,\nder nur sie probiert — der meldet dann \"Server nicht erreichbar\", waehrend\nder Server unter zwei anderen Adressen antwortet. Die vierte Zeile ist die\nangehaengte Form der ersten; auch die kommt in der Praxis vor.\n\nVier Dekoratoren, EIN Dokument: eine Kopie waere die naechste Stelle, an\nder ein neuer Endpunkt fehlt.","operationId":"authorization_server__well_known_oauth_authorization_server_mcp_public_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/public/oauth/register":{"post":{"tags":["🔌 Public MCP"],"summary":"Register Client","description":"RFC 7591. Der Client meldet sich selbst an und bekommt eine client_id.\n\nEine Registrierung gewaehrt nichts. Sie sagt \"dieser Client darf es\nversuchen\"; ob jemand hereinkommt, entscheidet die Anmeldung, und was er\ndann darf, entscheidet access.py bei jedem Aufruf.","operationId":"register_client_mcp_public_oauth_register_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/public/oauth/authorize":{"get":{"tags":["🔌 Public MCP"],"summary":"Authorize Form","description":"Zeigt die Zustimmungsseite. Prueft vorher Client, Redirect und PKCE.","operationId":"authorize_form_mcp_public_oauth_authorize_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["🔌 Public MCP"],"summary":"Authorize Submit","description":"Passwortweg. Prueft Zugangsdaten und stellt bei Erfolg einen Code aus.\n\nAnders als beim Owner-MCP gibt es hier keinen Tuersteher nach der\nPasswortpruefung — aber eine zusaetzliche Bedingung: das Konto muss mit\nDiscord verknuepft sein. Ohne Discord-Identitaet gibt es keine Server, auf\ndie sich irgendein Werkzeug beziehen koennte; der Nutzer kaeme herein und\nfaende eine leere Liste, ohne zu verstehen, warum.","operationId":"authorize_submit_mcp_public_oauth_authorize_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_authorize_submit_mcp_public_oauth_authorize_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp/public/oauth/discord":{"post":{"tags":["🔌 Public MCP"],"summary":"Discord Start","description":"Schickt den Browser zu Discord. Nur aus dem Formular der Zustimmungsseite.\n\n─── Warum POST und nicht GET ──────────────────────────────────────────\n\nAls GET war das hier ein Link — und ein Link laesst sich verschicken. Die\nerste Fassung band den Rueckweg per Keks an den Browser und hielt den\nAngriff damit fuer erledigt; er brauchte nur einen anderen Link:\n\n  Der Angreifer meldet per offener Registrierung einen Client mit seiner\n  eigenen Rueckkehradresse an und schickt dem Opfer nicht den\n  discord.com-Link, sondern DIESEN Startpunkt. Der Browser des Opfers\n  setzt sich den Keks dann selbst, laeuft zu Discord, kommt zurueck — Keks\n  und Nonce passen zusammen, weil beide aus demselben Browser stammen —\n  und der Code fuer die Identitaet des Opfers geht an die Adresse des\n  Angreifers. Der Link zeigte dabei auf die echte Notoq-Domain, war also\n  glaubwuerdiger als der vorige.\n\nEin POST ist kein Link. Und ein Formular auf einer fremden Seite hilft\nnicht: der Keks traegt `samesite=lax`, und bei einem Cross-Site-POST geht\ner nicht mit. Wer hier ankommt, hat die Zustimmungsseite gesehen — mit dem\nNamen des Clients und der Liste dessen, was er darf.","operationId":"discord_start_mcp_public_oauth_discord_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/public/oauth/discord/callback":{"get":{"tags":["🔌 Public MCP"],"summary":"Discord Callback","description":"Rueckkehr von Discord. Hier entsteht die Verbindung — und ggf. das Konto.\n\nDer Owner-MCP legt an dieser Stelle bewusst kein Konto an: es gibt genau\neines, und wenn es fehlt, stimmt etwas anderes nicht. Hier ist es\numgekehrt. Wer seinen Server per Discord verwaltet und nie im Dashboard\nwar, hat kein Notoq-Konto — ihn mitten im Ablauf auf eine Registrierung zu\nschicken, waere ein Abbruch, kein Hinweis. `_resolve_or_create_discord`\nist derselbe Weg, den auch die Dashboard-Anmeldung nimmt.","operationId":"discord_callback_mcp_public_oauth_discord_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/public/oauth/token":{"post":{"tags":["🔌 Public MCP"],"summary":"Token Endpoint","description":"Tauscht Code gegen Token oder erneuert ein abgelaufenes.\n\nDie Parameter kommen form-urlencoded. `Form(...)` erzwingt genau diesen\nParser; ein Pydantic-Modell an dieser Stelle ergaebe bei jeder Anfrage 415.","operationId":"token_endpoint_mcp_public_oauth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_token_endpoint_mcp_public_oauth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp/public/oauth/revoke":{"post":{"tags":["🔌 Public MCP"],"summary":"Revoke Endpoint","description":"RFC 7009. Beendet eine Anbindung.\n\nWiderrufen wird die ganze session_id: sonst bliebe das zuletzt rotierte\nToken gueltig und der Widerruf waere wirkungslos. Antwortet immer mit 200,\nein unbekanntes Token ist laut Spezifikation kein Fehler.","operationId":"revoke_endpoint_mcp_public_oauth_revoke_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_revoke_endpoint_mcp_public_oauth_revoke_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp/public/.well-known/openid-configuration":{"get":{"tags":["🔌 Public MCP"],"summary":"Authorization Server","description":"RFC 8414 — alle vier Adressen, unter denen Clients danach suchen.\n\nUnser Issuer hat einen PFAD (/mcp/public), und dafuer nennt die\nMCP-Spezifikation drei Formen, die ein Client der Reihe nach probieren\nSOLL:\n\n  1. Pfad eingeschoben:   /.well-known/oauth-authorization-server/mcp/public\n  2. dasselbe als OIDC:   /.well-known/openid-configuration/mcp/public\n  3. Pfad angehaengt:     /mcp/public/.well-known/openid-configuration\n\nDie dritte kostet eine Zeile und faellt sonst genau dem Client zur Last,\nder nur sie probiert — der meldet dann \"Server nicht erreichbar\", waehrend\nder Server unter zwei anderen Adressen antwortet. Die vierte Zeile ist die\nangehaengte Form der ersten; auch die kommt in der Praxis vor.\n\nVier Dekoratoren, EIN Dokument: eine Kopie waere die naechste Stelle, an\nder ein neuer Endpunkt fehlt.","operationId":"authorization_server_mcp_public__well_known_openid_configuration_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/public/.well-known/oauth-authorization-server":{"get":{"tags":["🔌 Public MCP"],"summary":"Authorization Server","description":"RFC 8414 — alle vier Adressen, unter denen Clients danach suchen.\n\nUnser Issuer hat einen PFAD (/mcp/public), und dafuer nennt die\nMCP-Spezifikation drei Formen, die ein Client der Reihe nach probieren\nSOLL:\n\n  1. Pfad eingeschoben:   /.well-known/oauth-authorization-server/mcp/public\n  2. dasselbe als OIDC:   /.well-known/openid-configuration/mcp/public\n  3. Pfad angehaengt:     /mcp/public/.well-known/openid-configuration\n\nDie dritte kostet eine Zeile und faellt sonst genau dem Client zur Last,\nder nur sie probiert — der meldet dann \"Server nicht erreichbar\", waehrend\nder Server unter zwei anderen Adressen antwortet. Die vierte Zeile ist die\nangehaengte Form der ersten; auch die kommt in der Praxis vor.\n\nVier Dekoratoren, EIN Dokument: eine Kopie waere die naechste Stelle, an\nder ein neuer Endpunkt fehlt.","operationId":"authorization_server_mcp_public__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/public/.well-known/oauth-protected-resource":{"get":{"tags":["🔌 Public MCP"],"summary":"Protected Resource Angehaengt","description":"RFC 9728 in der angehaengten Form, aus demselben Grund wie oben.\n\nDer Wegweiser in der 401 nennt die eingeschobene Form — aber ein Client,\nder ohne Handschlag anfaengt, sucht hier.","operationId":"protected_resource_angehaengt_mcp_public__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/public":{"get":{"tags":["🔌 Public MCP"],"summary":"Mcp Kein Strom","description":"Wir eroeffnen keinen Server-zu-Client-Strom. 405 ist die richtige\nAntwort und nicht 404: der Endpunkt existiert, er kann das nur nicht.","operationId":"mcp_kein_strom_mcp_public_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["🔌 Public MCP"],"summary":"Mcp Endpoint","description":"Der MCP-Endpunkt. Nimmt eine JSON-RPC-Nachricht entgegen.\n\nDie Reihenfolge der Pruefungen, jede mit ihrem Grund:\n  1. Origin — Schutz vor DNS-Rebinding, von der Spezifikation verlangt\n  2. Protokollversion — eine unbekannte Version muss 400 ergeben\n  3. Bearer-Token — hier entsteht die 401, ueber die der Client den\n     Anmeldeserver ueberhaupt erst findet\n  4. Rumpf lesen und beantworten","operationId":"mcp_endpoint_mcp_public_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"delete":{"tags":["🔌 Public MCP"],"summary":"Mcp Kein Strom","description":"Wir eroeffnen keinen Server-zu-Client-Strom. 405 ist die richtige\nAntwort und nicht 404: der Endpunkt existiert, er kann das nur nicht.","operationId":"mcp_kein_strom_mcp_public_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/public/diagnose":{"get":{"tags":["🔌 Public MCP"],"summary":"Diagnose","description":"Was die CORS-Schicht fuer DEINE Herkunft entscheidet — in einem Aufruf.\n\n    curl -s -H 'Origin: https://chatgpt.com'              https://api.notoq.xyz/mcp/public/diagnose | jq\n\n─── Wozu ein eigener Endpunkt ────────────────────────────────────────\n\nZweimal hintereinander war die teuerste Frage nicht \"was ist kaputt\",\nsondern \"laeuft der Stand ueberhaupt, von dem ich rede\". Ein Preflight\nantwortet mit 403 — und ob das der alte Code ist, der neue mit einem\nPfadfehler, oder etwas VOR uns (Reverse Proxy, Cloudflare), sieht man dem\nStatus nicht an. Man rate dann in Deploy-Zyklen von zwanzig Minuten.\n\nDiese Antwort trennt die drei Faelle. Schon ihr Vorhandensein ist die\nhalbe Auskunft: gibt es 404, laeuft ein Stand VOR diesem Endpunkt, und\njede weitere Messung am CORS ist verschwendet.\n\n─── Was hier NICHT hineingehoert ─────────────────────────────────────\n\nDer Endpunkt ist ohne Anmeldung erreichbar, also darf nichts darin\nstehen, was nicht ohnehin von aussen messbar ist: die Entscheidung der\nCORS-Schicht kann jeder mit einem Preflight selbst erfragen, die\nAdressen stehen in den oeffentlichen Metadaten. Keine\nUmgebungsvariablen, keine Zaehler, keine Namen von Servern oder Konten.","operationId":"diagnose_mcp_public_diagnose_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/public/docs":{"get":{"tags":["🔌 Public MCP"],"summary":"Docs Page","description":"Die Seite, auf die man jemanden schickt, der fragt, wie das geht.\n\nOhne Anmeldung erreichbar und verraet nichts, was nicht ohnehin beim\nEinrichten sichtbar wird: die Adresse und die Werkzeugnamen.","operationId":"docs_page_mcp_public_docs_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"AIActivateBody":{"properties":{"server_id":{"type":"string","title":"Server Id","description":"Discord Server ID to activate AI for"}},"type":"object","required":["server_id"],"title":"AIActivateBody"},"AIConfigRequest":{"properties":{"custom_max_characters":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Custom Max Characters","description":"(Legacy) Monatliches Zeichen-Limit (null = Standard)"},"custom_max_tokens":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Custom Max Tokens","description":"Monatliches Token-Limit (null = Standard)"},"custom_max_requests":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Custom Max Requests","description":"Monatliches Anfragen-Limit (null = Standard)"},"clear":{"type":"boolean","title":"Clear","description":"Auf Standard zurücksetzen (Felder leeren)","default":false}},"type":"object","title":"AIConfigRequest"},"AIDeactivateBody":{"properties":{"server_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Id","description":"Discord Server ID to deactivate (None = all servers)"}},"type":"object","title":"AIDeactivateBody"},"AIFilterRuleCreate":{"properties":{"name":{"type":"string","maxLength":50,"minLength":2,"title":"Name","description":"Name of the preset filter (must be one of the predefined filters)"},"whitelisted_channel_ids":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Whitelisted Channel Ids","description":"Channel IDs where this filter is ignored (max 50)"}},"type":"object","required":["name"],"title":"AIFilterRuleCreate"},"AIFilterRuleUpdate":{"properties":{"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"whitelisted_channel_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50},{"type":"null"}],"title":"Whitelisted Channel Ids","description":"Kanal-IDs, in denen diese Regel ignoriert wird (max 50)"}},"type":"object","title":"AIFilterRuleUpdate"},"AIFilterSettingsUpdate":{"properties":{"ai_message_filter_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai Message Filter Enabled"},"ai_filter_delete_after":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":0.0},{"type":"null"}],"title":"Ai Filter Delete After","description":"Sekunden bis Chat-Benachrichtigung gelöscht wird (0 = nie)"}},"type":"object","title":"AIFilterSettingsUpdate"},"AIProviderKeyBody":{"properties":{"api_key":{"type":"string","minLength":1,"title":"Api Key","description":"API-Key des Providers"}},"type":"object","required":["api_key"],"title":"AIProviderKeyBody"},"AIProviderOrderBody":{"properties":{"order":{"items":{"type":"string"},"type":"array","title":"Order","description":"Provider-IDs in gewünschter Fallback-Reihenfolge"}},"type":"object","required":["order"],"title":"AIProviderOrderBody"},"AISupportContextCreate":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title"},"content":{"type":"string","minLength":1,"title":"Content"},"category":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Category"}},"type":"object","required":["title","content"],"title":"AISupportContextCreate","description":"Schema zum Erstellen eines AI Support Kontexts"},"AISupportContextUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Title"},"content":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Content"},"category":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Category"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"AISupportContextUpdate","description":"Schema zum Bearbeiten eines AI Support Kontexts"},"AISupportSettingsUpdate":{"properties":{"ai_support_enabled":{"type":"boolean","title":"Ai Support Enabled"}},"type":"object","required":["ai_support_enabled"],"title":"AISupportSettingsUpdate","description":"Update für AI Support Einstellungen (globale Einstellung)"},"AccessSet":{"properties":{"entries":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Entries"}},"type":"object","title":"AccessSet"},"AchievementCreate":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name"},"metric":{"type":"string","maxLength":50,"title":"Metric"},"threshold":{"type":"integer","minimum":1.0,"title":"Threshold"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Category"},"rarity":{"type":"string","maxLength":20,"title":"Rarity","default":"common"},"points":{"anyOf":[{"type":"integer","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Points"},"icon_emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Icon Emoji"},"icon_type":{"type":"string","maxLength":20,"title":"Icon Type","default":"emoji"},"color":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Color"},"badge_frame":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Badge Frame"},"is_secret":{"type":"boolean","title":"Is Secret","default":false},"comparator":{"type":"string","maxLength":10,"title":"Comparator","default":"gte"},"reward_coins":{"type":"integer","minimum":0.0,"title":"Reward Coins","default":0},"reward_xp":{"type":"integer","minimum":0.0,"title":"Reward Xp","default":0},"reward_role_ids":{"items":{"type":"string"},"type":"array","title":"Reward Role Ids"},"reward_remove_role_ids":{"items":{"type":"string"},"type":"array","title":"Reward Remove Role Ids"},"reward_title":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Reward Title"},"announce":{"type":"boolean","title":"Announce","default":true},"repeatable":{"type":"boolean","title":"Repeatable","default":false},"prerequisite_ids":{"items":{"type":"integer"},"type":"array","title":"Prerequisite Ids"}},"type":"object","required":["name","metric","threshold"],"title":"AchievementCreate"},"AchievementUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"threshold":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Threshold"},"category":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Category"},"rarity":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Rarity"},"points":{"anyOf":[{"type":"integer","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Points"},"icon_emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Icon Emoji"},"icon_type":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Icon Type"},"icon_url":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Icon Url"},"color":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Color"},"badge_frame":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Badge Frame"},"is_secret":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Secret"},"comparator":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Comparator"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"},"reward_coins":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Reward Coins"},"reward_xp":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Reward Xp"},"reward_role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Reward Role Ids"},"reward_remove_role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Reward Remove Role Ids"},"reward_title":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Reward Title"},"announce":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Announce"},"repeatable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Repeatable"},"prerequisite_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Prerequisite Ids"}},"type":"object","title":"AchievementUpdate"},"ActionIn":{"properties":{"action_type":{"type":"string","maxLength":40,"title":"Action Type"},"config":{"additionalProperties":true,"type":"object","title":"Config"}},"type":"object","required":["action_type"],"title":"ActionIn"},"ActiveChannelInfo":{"properties":{"channel":{"$ref":"#/components/schemas/ChannelSnippet"},"message_count_last_hour":{"type":"integer","title":"Message Count Last Hour","default":0},"message_count_last_24h":{"type":"integer","title":"Message Count Last 24H","default":0},"unique_users_last_hour":{"type":"integer","title":"Unique Users Last Hour","default":0},"last_message_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Message At"}},"type":"object","required":["channel"],"title":"ActiveChannelInfo","description":"Info über einen aktiven Channel."},"ActiveChannelsOverview":{"properties":{"most_active_text":{"items":{"$ref":"#/components/schemas/ActiveChannelInfo"},"type":"array","title":"Most Active Text","default":[]},"most_active_voice":{"items":{"$ref":"#/components/schemas/VoiceChannelActivity"},"type":"array","title":"Most Active Voice","default":[]}},"type":"object","title":"ActiveChannelsOverview","description":"Übersicht aktiver Text- und Voice-Channels."},"ActiveUserInfo":{"properties":{"user":{"$ref":"#/components/schemas/UserSnippet"},"messages_today":{"type":"integer","title":"Messages Today","default":0},"messages_this_week":{"type":"integer","title":"Messages This Week","default":0},"voice_minutes_today":{"type":"integer","title":"Voice Minutes Today","default":0},"level":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Level"},"experience":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Experience"},"current_activity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Activity"}},"type":"object","required":["user"],"title":"ActiveUserInfo","description":"Ein aktuell besonders aktiver User."},"ActivityFeedItem":{"properties":{"event_type":{"type":"string","title":"Event Type","description":"join, leave, moderation, ticket, giveaway, review, warning, level_up"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"user":{"anyOf":[{"$ref":"#/components/schemas/UserSnippet"},{"type":"null"}]},"target_user":{"anyOf":[{"$ref":"#/components/schemas/UserSnippet"},{"type":"null"}]},"channel":{"anyOf":[{"$ref":"#/components/schemas/ChannelSnippet"},{"type":"null"}]},"details":{"additionalProperties":true,"type":"object","title":"Details"}},"type":"object","required":["event_type","timestamp"],"title":"ActivityFeedItem","description":"Ein einzelner Eintrag im Activity-Feed."},"ActivityFeedResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server_id":{"type":"string","title":"Server Id"},"items":{"items":{"$ref":"#/components/schemas/ActivityFeedItem"},"type":"array","title":"Items","default":[]},"total_count":{"type":"integer","title":"Total Count","default":0},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","required":["server_id"],"title":"ActivityFeedResponse","description":"Paginated Activity Feed."},"ActivityHeatmapResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"metric":{"type":"string","title":"Metric"},"days_analyzed":{"type":"integer","title":"Days Analyzed"},"start_date":{"type":"string","format":"date-time","title":"Start Date"},"end_date":{"type":"string","format":"date-time","title":"End Date"},"data":{"items":{"$ref":"#/components/schemas/HeatmapDataPoint"},"type":"array","title":"Data"},"peak_times":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Peak Times","description":"Top 5 aktivste Zeiten"}},"type":"object","required":["success","metric","days_analyzed","start_date","end_date","data","peak_times"],"title":"ActivityHeatmapResponse","description":"Response für Activity-Heatmap"},"ActivityStatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"period":{"type":"string","title":"Period"},"user_id":{"type":"string","title":"User Id"},"server_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Id"},"stats":{"additionalProperties":true,"type":"object","title":"Stats","example":{"average_commands_per_day":5.2,"server_breakdown":[],"top_commands":[],"total_commands":156,"total_invites_used":8,"total_server_joins":2,"total_server_leaves":1,"trend":{},"unique_commands":23}},"insights":{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array","title":"Insights"}},"type":"object","required":["period","user_id","stats","insights"],"title":"ActivityStatsResponse","description":"Response für Aktivitäts-Statistiken."},"ActivityTimelineItem":{"properties":{"type":{"type":"string","title":"Type"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"icon":{"type":"string","title":"Icon"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"priority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta"},"detail_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail Id"}},"type":"object","required":["type","timestamp","title","description","icon"],"title":"ActivityTimelineItem","description":"Timeline Item"},"AddDashboardRoleRequest":{"properties":{"role_id":{"type":"string","title":"Role Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["role_id"],"title":"AddDashboardRoleRequest"},"AddMemberBody":{"properties":{"discord_id":{"type":"string","title":"Discord Id"},"role":{"type":"string","title":"Role"}},"type":"object","required":["discord_id","role"],"title":"AddMemberBody"},"AddProtocolNotesRequest":{"properties":{"notes":{"type":"string","title":"Notes"}},"type":"object","required":["notes"],"title":"AddProtocolNotesRequest"},"AddStatsRoleRequest":{"properties":{"role_id":{"type":"string","title":"Role Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["role_id"],"title":"AddStatsRoleRequest","description":"Request Schema zum Hinzufügen einer Stats-Access-Rolle"},"AdminGrantAIBody":{"properties":{"user_id":{"type":"string","title":"User Id","description":"Discord User ID"},"tier":{"type":"integer","maximum":4.0,"minimum":1.0,"title":"Tier","description":"AI Tier (1, 2, 3 or 4=Custom)","default":1},"duration_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Days","description":"Duration in days (None = lifetime)"},"plan_type":{"type":"string","title":"Plan Type","description":"Plan type: standard, lifetime, subscription","default":"standard"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Reason for granting AI"}},"type":"object","required":["user_id"],"title":"AdminGrantAIBody"},"AdminGrantAIServerBody":{"properties":{"server_id":{"type":"string","title":"Server Id","description":"Discord Server ID"},"tier":{"type":"integer","maximum":3.0,"minimum":1.0,"title":"Tier","description":"AI Tier (1, 2 or 3)","default":1},"duration_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Days","description":"Duration in days (None = permanent)"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Reason for granting"}},"type":"object","required":["server_id"],"title":"AdminGrantAIServerBody"},"AdminSetAITierBody":{"properties":{"user_id":{"type":"string","title":"User Id","description":"Discord User ID"},"tier":{"type":"integer","maximum":4.0,"minimum":1.0,"title":"Tier","description":"New AI Tier (1, 2, 3 or 4=Custom)"}},"type":"object","required":["user_id","tier"],"title":"AdminSetAITierBody"},"AdoptEntry":{"properties":{"user_id":{"type":"string","title":"User Id"},"role_id":{"type":"string","title":"Role Id"}},"type":"object","required":["user_id","role_id"],"title":"AdoptEntry"},"AdoptRequest":{"properties":{"entries":{"items":{"$ref":"#/components/schemas/AdoptEntry"},"type":"array","maxItems":100,"title":"Entries"}},"type":"object","title":"AdoptRequest"},"AktieVergabe":{"properties":{"symbol":{"type":"string","maxLength":10,"minLength":1,"title":"Symbol"},"anteile":{"type":"number","maximum":1000000000.0,"exclusiveMinimum":0.0,"title":"Anteile"},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","required":["symbol","anteile"],"title":"AktieVergabe","description":"Anteile gutschreiben.\n\nKein Betrag: `amount_invested` entsteht aus Anteilen mal Grundpreis.\nKaeme er von aussen, stuende ein Einstandswert da, den kein Kurs erklaert."},"AktionsAnfrage":{"properties":{"aktion":{"type":"string","maxLength":64,"title":"Aktion","default":""},"ziel":{"additionalProperties":true,"type":"object","title":"Ziel"}},"type":"object","title":"AktionsAnfrage","description":"Was ausgeführt werden soll.\n\n═══════════════════════════════════════════════════════════════════════\n WARUM `aktion` EINEN VORGABEWERT HAT, OBWOHL ES PFLICHT IST\n═══════════════════════════════════════════════════════════════════════\n\nWeil ein Pflichtfeld ohne Vorgabe FastAPI dazu bringt, mit 422 zu\nantworten — und ein 422 ist eine Antwort in der Sprache des Frameworks,\nnicht in der dieser Oberfläche. Die Palette kennt nur ihre eigenen\nSchlüssel; alles andere wurde dort zu \"Das hat nicht geklappt\", und\ngenau dieser Satz hat eine Woche gekostet.\n\nMit Vorgabewert landet eine Anfrage ohne `aktion` im Rumpf des Handlers,\nund der antwortet mit `unbekannte_aktion` — einem Satz, den der Mensch\ndavor lesen kann, in allen sieben Sprachen.\n\nDas macht die Anfrage NICHT lockerer: eine leere Aktion steht in keinem\nRegister und wird abgewiesen wie jede unbekannte. Es verschiebt nur, WER\ndie Absage formuliert."},"AlertResponse":{"properties":{"id":{"type":"integer","title":"Id"},"type":{"type":"string","title":"Type"},"severity":{"type":"string","title":"Severity"},"title":{"type":"string","title":"Title"},"message":{"type":"string","title":"Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_actionable":{"type":"boolean","title":"Is Actionable"}},"type":"object","required":["id","type","severity","title","message","created_at","is_actionable"],"title":"AlertResponse","description":"Alert Response"},"AnnounceRequest":{"properties":{"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"Announce only this user (must have birthday today)"},"force":{"type":"boolean","title":"Force","description":"Re-announce even if already celebrated today","default":false}},"type":"object","title":"AnnounceRequest"},"AnnouncementRequest":{"properties":{"brief":{"type":"string","maxLength":2000,"minLength":3,"title":"Brief","description":"Kurzer Brief, was im Anouncement stehen soll"},"tone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone","description":"Tonalität: friendly | professional | hype | casual","default":"friendly"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Optional explizite Zielsprache (sonst Userprefix)"},"post_to_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post To Channel Id","description":"Wenn gesetzt: direkt in diesen Channel posten"}},"type":"object","required":["brief"],"title":"AnnouncementRequest"},"AnnouncementResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"draft":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft"},"posted":{"type":"boolean","title":"Posted","default":false},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"AnnouncementResponse"},"AnomalyDetection":{"properties":{"type":{"type":"string","title":"Type"},"severity":{"type":"string","title":"Severity"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["type","severity","title","description","timestamp"],"title":"AnomalyDetection","description":"Detected Anomaly"},"AntiPhishingActionCreate":{"properties":{"min_confidence":{"type":"integer","maximum":100.0,"minimum":70.0,"title":"Min Confidence","description":"Ab dieser KI-Konfidenz (%) greift die Regel (70–100). Höchste zutreffende Schwelle gewinnt."},"action":{"type":"string","enum":["delete_only","warn","timeout","kick","ban"],"title":"Action","description":"delete_only=Nur löschen, warn=Verwarnung, timeout=Timeout, kick=Kick, ban=Ban"},"duration_minutes":{"anyOf":[{"type":"integer","maximum":43200.0,"minimum":1.0},{"type":"null"}],"title":"Duration Minutes","description":"Dauer in Minuten (nur für action='timeout' erforderlich)"}},"type":"object","required":["min_confidence","action"],"title":"AntiPhishingActionCreate","description":"Eine konfigurierbare Aktion bei einer bestimmten KI-Konfidenz-Schwelle."},"AntiPhishingActionsUpdate":{"properties":{"actions":{"items":{"$ref":"#/components/schemas/AntiPhishingActionCreate"},"type":"array","maxItems":5,"minItems":0,"title":"Actions"}},"type":"object","required":["actions"],"title":"AntiPhishingActionsUpdate","description":"Ersetzt alle Antiphishing-Aktions-Regeln auf einmal (max. 5)."},"AppealBlockCreate":{"properties":{"user_id":{"type":"string","maxLength":30,"minLength":15,"title":"User Id"},"reason":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Reason"}},"type":"object","required":["user_id"],"title":"AppealBlockCreate"},"AppealDecisionRequest":{"properties":{"decision":{"type":"string","title":"Decision","description":"approve oder reject"},"reason":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Reason"}},"type":"object","required":["decision"],"title":"AppealDecisionRequest"},"AppealNoteCreate":{"properties":{"content":{"type":"string","maxLength":2000,"minLength":1,"title":"Content"}},"type":"object","required":["content"],"title":"AppealNoteCreate"},"AppealQuestionCreate":{"properties":{"question_text":{"type":"string","maxLength":500,"minLength":1,"title":"Question Text"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"question_type":{"$ref":"#/components/schemas/QuestionType","default":"paragraph"},"options":{"items":{"type":"string"},"type":"array","maxItems":25,"title":"Options"},"is_required":{"type":"boolean","title":"Is Required","default":true},"max_length":{"type":"integer","maximum":4000.0,"minimum":1.0,"title":"Max Length","default":1000},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["question_text"],"title":"AppealQuestionCreate"},"AppealQuestionUpdate":{"properties":{"question_text":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Question Text"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"question_type":{"anyOf":[{"$ref":"#/components/schemas/QuestionType"},{"type":"null"}]},"options":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":25},{"type":"null"}],"title":"Options"},"is_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Required"},"max_length":{"anyOf":[{"type":"integer","maximum":4000.0,"minimum":1.0},{"type":"null"}],"title":"Max Length"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"AppealQuestionUpdate"},"AppealSettingsUpdate":{"properties":{"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled"},"appeal_for_bans":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Appeal For Bans"},"appeal_for_kicks":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Appeal For Kicks"},"appeal_for_mutes":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Appeal For Mutes"},"staff_channel_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Staff Channel Id"},"reviewer_role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Reviewer Role Ids"},"ping_role_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Ping Role Id"},"ping_on_new_appeal":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ping On New Appeal"},"waiting_period_minutes":{"anyOf":[{"type":"integer","maximum":43200.0,"minimum":0.0},{"type":"null"}],"title":"Waiting Period Minutes"},"cooldown_minutes":{"anyOf":[{"type":"integer","maximum":525600.0,"minimum":0.0},{"type":"null"}],"title":"Cooldown Minutes"},"max_appeals_per_punishment":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":1.0},{"type":"null"}],"title":"Max Appeals Per Punishment"},"one_active_appeal":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"One Active Appeal"},"appeal_window_hours":{"anyOf":[{"type":"integer","maximum":8760.0,"minimum":0.0},{"type":"null"}],"title":"Appeal Window Hours"},"require_discord_login":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Require Discord Login"},"auto_reverse_on_approve":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Reverse On Approve"},"dm_on_decision":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dm On Decision"},"include_invite_on_approve":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Invite On Approve"},"invite_channel_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Invite Channel Id"},"create_thread_per_appeal":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Create Thread Per Appeal"},"dm_message":{"anyOf":[{"type":"string","maxLength":1500},{"type":"null"}],"title":"Dm Message"},"page_welcome_message":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Page Welcome Message"},"page_closed_message":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Page Closed Message"},"approved_message":{"anyOf":[{"type":"string","maxLength":1500},{"type":"null"}],"title":"Approved Message"},"rejected_message":{"anyOf":[{"type":"string","maxLength":1500},{"type":"null"}],"title":"Rejected Message"}},"type":"object","title":"AppealSettingsUpdate"},"AppealStatusRequest":{"properties":{"status":{"type":"string","title":"Status","description":"pending oder under_review"}},"type":"object","required":["status"],"title":"AppealStatusRequest"},"ApplicantInfo":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"}},"type":"object","required":["user_id","username"],"title":"ApplicantInfo"},"ApplicationDecisionRequest":{"properties":{"decision":{"type":"string","pattern":"^(accept|reject)$","title":"Decision"},"feedback":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Feedback"}},"type":"object","required":["decision"],"title":"ApplicationDecisionRequest"},"ApplicationItem":{"properties":{"application_id":{"type":"integer","title":"Application Id"},"applicant":{"$ref":"#/components/schemas/UserSnippet"},"position_name":{"type":"string","title":"Position Name"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At"},"reviewed_by":{"anyOf":[{"$ref":"#/components/schemas/UserSnippet"},{"type":"null"}]}},"type":"object","required":["application_id","applicant","position_name","status","created_at"],"title":"ApplicationItem","description":"Eine Bewerbung in der Übersicht."},"ApplicationListItem":{"properties":{"id":{"type":"integer","title":"Id"},"applicant":{"$ref":"#/components/schemas/ApplicantInfo"},"position":{"$ref":"#/components/schemas/PositionInfo"},"status":{"type":"string","title":"Status"},"source":{"type":"string","title":"Source","default":"discord"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At"},"reviewed_by":{"anyOf":[{"$ref":"#/components/schemas/api__schemas__bewerbung__ReviewerInfo"},{"type":"null"}]}},"type":"object","required":["id","applicant","position","status","created_at"],"title":"ApplicationListItem"},"ApplicationListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/ApplicationListItem"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"}},"type":"object","required":["success","data","pagination"],"title":"ApplicationListResponse"},"ApplicationNoteCreateRequest":{"properties":{"content":{"type":"string","maxLength":2000,"minLength":1,"title":"Content"}},"type":"object","required":["content"],"title":"ApplicationNoteCreateRequest"},"ApplicationOverview":{"properties":{"pending_count":{"type":"integer","title":"Pending Count","default":0},"in_review_count":{"type":"integer","title":"In Review Count","default":0},"accepted_this_month":{"type":"integer","title":"Accepted This Month","default":0},"rejected_this_month":{"type":"integer","title":"Rejected This Month","default":0},"recent_applications":{"items":{"$ref":"#/components/schemas/ApplicationItem"},"type":"array","title":"Recent Applications","default":[]}},"type":"object","title":"ApplicationOverview","description":"Bewerbungs-Übersicht."},"ApplicationQuestionCreateRequest":{"properties":{"position_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position Id"},"question_text":{"type":"string","maxLength":500,"minLength":1,"title":"Question Text"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"question_type":{"type":"string","pattern":"^(short|paragraph|select|boolean)$","title":"Question Type","default":"paragraph"},"options":{"items":{"type":"string"},"type":"array","maxItems":25,"title":"Options"},"is_required":{"type":"boolean","title":"Is Required","default":true},"max_length":{"type":"integer","maximum":4000.0,"minimum":1.0,"title":"Max Length","default":1000},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["question_text"],"title":"ApplicationQuestionCreateRequest"},"ApplicationQuestionUpdateRequest":{"properties":{"question_text":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Question Text"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"question_type":{"anyOf":[{"type":"string","pattern":"^(short|paragraph|select|boolean)$"},{"type":"null"}],"title":"Question Type"},"options":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":25},{"type":"null"}],"title":"Options"},"is_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Required"},"max_length":{"anyOf":[{"type":"integer","maximum":4000.0,"minimum":1.0},{"type":"null"}],"title":"Max Length"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"ApplicationQuestionUpdateRequest"},"ApplicationStatusRequest":{"properties":{"status":{"type":"string","pattern":"^(pending|in_review)$","title":"Status"}},"type":"object","required":["status"],"title":"ApplicationStatusRequest"},"ApplyBlueprintRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BlueprintItem"},"type":"array","maxItems":12,"title":"Items"},"identity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Identity"}},"type":"object","required":["items"],"title":"ApplyBlueprintRequest"},"ApplyRequest":{"properties":{"blueprint_id":{"type":"integer","title":"Blueprint Id"},"plan_job_id":{"type":"integer","title":"Plan Job Id","description":"Der Trockenlauf, der freigibt"},"mode":{"type":"string","title":"Mode","description":"merge | overwrite | replace","default":"merge"},"force":{"type":"boolean","title":"Force","description":"harte Warnungen uebergehen, ausser Rechte","default":false},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale","description":"en-US | de | es | fr | it | nl | pl | prt | ru | tr"},"selection":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Selection"}},"type":"object","required":["blueprint_id","plan_job_id"],"title":"ApplyRequest"},"ApplyServerImageRequest":{"properties":{"target":{"type":"string","enum":["avatar","banner"],"title":"Target","description":"Welches Bot-Bild gesetzt wird"},"source":{"type":"string","enum":["server_icon","server_banner"],"title":"Source","description":"Welches Server-Bild uebernommen wird"}},"type":"object","required":["target","source"],"title":"ApplyServerImageRequest","description":"Request Body: Server-Bild als Bot-Bild uebernehmen (\"ein Klick\").\n\nDer Client schickt bewusst KEINE URL, sondern nur, WELCHES der beiden\nServer-Bilder gemeint ist. Die Adresse loest der Server aus seiner\neigenen Zeile auf - eine vom Browser gelieferte URL waere eine\nAnfrage, die dieser Dienst im internen Netz ausfuehrt."},"ApproveAbsenceRequest":{"properties":{"approve":{"type":"boolean","title":"Approve"},"rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejection Reason"}},"type":"object","required":["approve"],"title":"ApproveAbsenceRequest"},"AreaCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Description"},"emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Emoji"},"color":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color"},"role_ids":{"items":{"type":"string"},"type":"array","title":"Role Ids"},"lock_mode":{"type":"string","enum":["permanent","cooldown","limited","off"],"title":"Lock Mode","default":"permanent"},"switch_cooldown_hours":{"type":"integer","maximum":87600.0,"minimum":1.0,"title":"Switch Cooldown Hours","default":720},"max_switches":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Max Switches","default":1},"enforce_scope":{"type":"string","enum":["self_service","all"],"title":"Enforce Scope","default":"self_service"},"allow_leave":{"type":"boolean","title":"Allow Leave","default":false},"reset_on_leave":{"type":"boolean","title":"Reset On Leave","default":false},"restore_on_rejoin":{"type":"boolean","title":"Restore On Rejoin","default":true},"bypass_role_ids":{"items":{"type":"string"},"type":"array","title":"Bypass Role Ids"},"deny_message":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Deny Message"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name"],"title":"AreaCreate"},"AreaUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Description"},"emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Emoji"},"color":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color"},"role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Role Ids"},"lock_mode":{"anyOf":[{"type":"string","enum":["permanent","cooldown","limited","off"]},{"type":"null"}],"title":"Lock Mode"},"switch_cooldown_hours":{"anyOf":[{"type":"integer","maximum":87600.0,"minimum":1.0},{"type":"null"}],"title":"Switch Cooldown Hours"},"max_switches":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Max Switches"},"enforce_scope":{"anyOf":[{"type":"string","enum":["self_service","all"]},{"type":"null"}],"title":"Enforce Scope"},"allow_leave":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Leave"},"reset_on_leave":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reset On Leave"},"restore_on_rejoin":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Restore On Rejoin"},"bypass_role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Bypass Role Ids"},"deny_message":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Deny Message"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"position_order":{"anyOf":[{"type":"integer","maximum":999.0,"minimum":0.0},{"type":"null"}],"title":"Position Order"}},"type":"object","title":"AreaUpdate"},"ArtikelAenderung":{"properties":{"key":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Key"},"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tagline":{"anyOf":[{"type":"string","maxLength":140},{"type":"null"}],"title":"Tagline"},"emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Emoji"},"image_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Image Url"},"color":{"anyOf":[{"type":"string","maxLength":9},{"type":"null"}],"title":"Color"},"rarity":{"type":"string","title":"Rarity","default":"common"},"category_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Id"},"position":{"type":"integer","title":"Position","default":0},"currency":{"type":"string","title":"Currency","default":"coins"},"price":{"type":"integer","minimum":0.0,"title":"Price","default":0},"sale_price":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Sale Price"},"sale_starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sale Starts At"},"sale_ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sale Ends At"},"price_step":{"type":"integer","minimum":0.0,"title":"Price Step","default":0},"price_cap":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Price Cap"},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_listed":{"type":"boolean","title":"Is Listed","default":true},"stock_total":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Stock Total"},"limit_per_user":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Limit Per User"},"purchase_cooldown_seconds":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Purchase Cooldown Seconds"},"available_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Available From"},"available_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Available Until"},"schedule":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Schedule"},"required_level":{"type":"integer","minimum":0.0,"title":"Required Level","default":0},"required_prestige":{"type":"integer","minimum":0.0,"title":"Required Prestige","default":0},"required_role_ids":{"items":{"type":"string"},"type":"array","title":"Required Role Ids"},"blocked_role_ids":{"items":{"type":"string"},"type":"array","title":"Blocked Role Ids"},"required_item_keys":{"items":{"type":"string"},"type":"array","title":"Required Item Keys"},"auto_use":{"type":"boolean","title":"Auto Use","default":false},"is_consumable":{"type":"boolean","title":"Is Consumable","default":true},"charges":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Charges"},"is_stackable":{"type":"boolean","title":"Is Stackable","default":true},"max_stack":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Max Stack"},"is_tradeable":{"type":"boolean","title":"Is Tradeable","default":false},"is_giftable":{"type":"boolean","title":"Is Giftable","default":false},"is_sellable":{"type":"boolean","title":"Is Sellable","default":true},"sell_ratio":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Sell Ratio","default":0.75},"inventory_expires_after_seconds":{"anyOf":[{"type":"integer","minimum":60.0},{"type":"null"}],"title":"Inventory Expires After Seconds"},"use_cooldown_seconds":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Use Cooldown Seconds"},"is_mystery":{"type":"boolean","title":"Is Mystery","default":false},"effects":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Effects"}},"type":"object","title":"ArtikelAenderung","description":"Wie die Eingabe, aber ohne Pflichtfeld."},"ArtikelEingabe":{"properties":{"key":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Key"},"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tagline":{"anyOf":[{"type":"string","maxLength":140},{"type":"null"}],"title":"Tagline"},"emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Emoji"},"image_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Image Url"},"color":{"anyOf":[{"type":"string","maxLength":9},{"type":"null"}],"title":"Color"},"rarity":{"type":"string","title":"Rarity","default":"common"},"category_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Id"},"position":{"type":"integer","title":"Position","default":0},"currency":{"type":"string","title":"Currency","default":"coins"},"price":{"type":"integer","minimum":0.0,"title":"Price","default":0},"sale_price":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Sale Price"},"sale_starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sale Starts At"},"sale_ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sale Ends At"},"price_step":{"type":"integer","minimum":0.0,"title":"Price Step","default":0},"price_cap":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Price Cap"},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_listed":{"type":"boolean","title":"Is Listed","default":true},"stock_total":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Stock Total"},"limit_per_user":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Limit Per User"},"purchase_cooldown_seconds":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Purchase Cooldown Seconds"},"available_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Available From"},"available_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Available Until"},"schedule":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Schedule"},"required_level":{"type":"integer","minimum":0.0,"title":"Required Level","default":0},"required_prestige":{"type":"integer","minimum":0.0,"title":"Required Prestige","default":0},"required_role_ids":{"items":{"type":"string"},"type":"array","title":"Required Role Ids"},"blocked_role_ids":{"items":{"type":"string"},"type":"array","title":"Blocked Role Ids"},"required_item_keys":{"items":{"type":"string"},"type":"array","title":"Required Item Keys"},"auto_use":{"type":"boolean","title":"Auto Use","default":false},"is_consumable":{"type":"boolean","title":"Is Consumable","default":true},"charges":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Charges"},"is_stackable":{"type":"boolean","title":"Is Stackable","default":true},"max_stack":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Max Stack"},"is_tradeable":{"type":"boolean","title":"Is Tradeable","default":false},"is_giftable":{"type":"boolean","title":"Is Giftable","default":false},"is_sellable":{"type":"boolean","title":"Is Sellable","default":true},"sell_ratio":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Sell Ratio","default":0.75},"inventory_expires_after_seconds":{"anyOf":[{"type":"integer","minimum":60.0},{"type":"null"}],"title":"Inventory Expires After Seconds"},"use_cooldown_seconds":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Use Cooldown Seconds"},"is_mystery":{"type":"boolean","title":"Is Mystery","default":false},"effects":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Effects"}},"type":"object","required":["name"],"title":"ArtikelEingabe","description":"Die Felder eines Artikels.\n\nFast alles ist optional: ein Artikel soll mit Name und Preis anlegbar sein.\nWer im Dashboard drei Felder ausfuellen muss, um etwas zu sehen, hoert nach\ndem zweiten auf."},"AssetBody":{"properties":{"data":{"type":"string","title":"Data","description":"data-URI oder roher Base64"},"filename":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Filename","default":"avatar.png"},"content_type":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Content Type","default":"image/png"}},"type":"object","required":["data"],"title":"AssetBody"},"AufgabeEingabe":{"properties":{"art":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Art"},"ziel":{"anyOf":[{"type":"integer","maximum":1000000000000.0,"minimum":1.0},{"type":"null"}],"title":"Ziel"},"zeitraum":{"anyOf":[{"type":"string","enum":["taeglich","woechentlich"]},{"type":"null"}],"title":"Zeitraum"},"belohnung_faktor":{"anyOf":[{"type":"number","maximum":5.0,"minimum":0.0},{"type":"null"}],"title":"Belohnung Faktor"},"belohnung_gems":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":0.0},{"type":"null"}],"title":"Belohnung Gems"},"position_order":{"anyOf":[{"type":"integer","maximum":9999.0,"minimum":0.0},{"type":"null"}],"title":"Position Order"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"AufgabeEingabe","description":"Eine Tagesaufgabe.\n\nGegen den gemessenen Abbruch: 926 Spieler mit Daily-Serie 1, 19 mit 2,\n4 mit 3. Die Serienbelohnung beantwortet \"warum morgen\", eine Aufgabe\nbeantwortet \"was heute\"."},"Aufraeumen":{"properties":{"bestaetigung":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bestaetigung"},"nur_zaehlen":{"type":"boolean","title":"Nur Zaehlen","default":false},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","title":"Aufraeumen"},"Auswahl":{"properties":{"bausteine":{"items":{"type":"string","enum":["karte","xp","saison","shop"]},"type":"array","maxItems":4,"minItems":1,"title":"Bausteine"}},"type":"object","required":["bausteine"],"title":"Auswahl"},"AutoBlueprintRequest":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"log_channel_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Log Channel Id"}},"type":"object","title":"AutoBlueprintRequest","description":"Schalter und Meldekanal, beide wahlweise.\n\nDas Dashboard schickt sie einzeln - je nachdem, was gerade angefasst wird.\nEin fehlendes Feld heisst \"bleibt, wie es ist\"; `log_channel_id: null`\nheisst \"keinen Meldekanal mehr\". Unterschieden wird das ueber\n`model_fields_set`: ein Standardwert allein kann es nicht, beides kaeme als\nNone an."},"AutoMessageCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Name of the automatic message"},"channel_id":{"type":"string","title":"Channel Id","description":"Target channel ID"},"interval_type":{"$ref":"#/components/schemas/IntervalType","description":"Timing type"},"interval_minutes":{"anyOf":[{"type":"integer","maximum":525600.0,"minimum":30.0},{"type":"null"}],"title":"Interval Minutes","description":"Interval in minutes (min 30)"},"daily_hour":{"anyOf":[{"type":"integer","maximum":23.0,"minimum":0.0},{"type":"null"}],"title":"Daily Hour","description":"Hour for daily sending"},"daily_minute":{"anyOf":[{"type":"integer","maximum":59.0,"minimum":0.0},{"type":"null"}],"title":"Daily Minute","description":"Minute for daily sending"},"weekly_weekday":{"anyOf":[{"type":"integer","maximum":6.0,"minimum":0.0},{"type":"null"}],"title":"Weekly Weekday","description":"Weekday for weekly sending (0=Monday ... 6=Sunday)"},"weekly_hour":{"anyOf":[{"type":"integer","maximum":23.0,"minimum":0.0},{"type":"null"}],"title":"Weekly Hour","description":"Hour for weekly sending"},"weekly_minute":{"anyOf":[{"type":"integer","maximum":59.0,"minimum":0.0},{"type":"null"}],"title":"Weekly Minute","description":"Minute for weekly sending"},"monthly_day":{"anyOf":[{"type":"integer","maximum":31.0,"minimum":1.0},{"type":"null"}],"title":"Monthly Day","description":"Day of month for monthly sending (clamped to month end)"},"monthly_hour":{"anyOf":[{"type":"integer","maximum":23.0,"minimum":0.0},{"type":"null"}],"title":"Monthly Hour","description":"Hour for monthly sending"},"monthly_minute":{"anyOf":[{"type":"integer","maximum":59.0,"minimum":0.0},{"type":"null"}],"title":"Monthly Minute","description":"Minute for monthly sending"},"yearly_month":{"anyOf":[{"type":"integer","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Yearly Month","description":"Month for yearly sending"},"yearly_day":{"anyOf":[{"type":"integer","maximum":31.0,"minimum":1.0},{"type":"null"}],"title":"Yearly Day","description":"Day for yearly sending"},"yearly_hour":{"anyOf":[{"type":"integer","maximum":23.0,"minimum":0.0},{"type":"null"}],"title":"Yearly Hour","description":"Hour for yearly sending"},"yearly_minute":{"anyOf":[{"type":"integer","maximum":59.0,"minimum":0.0},{"type":"null"}],"title":"Yearly Minute","description":"Minute for yearly sending"},"timezone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Timezone","description":"IANA time zone of the hour/minute fields (default UTC)"},"use_first_send":{"type":"boolean","title":"Use First Send","description":"Use custom start time?","default":false},"first_send_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Send At","description":"Desired first send time"},"content":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Content","description":"Text content (max 2000 characters)"},"embed_enabled":{"type":"boolean","title":"Embed Enabled","description":"Enable embed?","default":false},"embed_title":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Embed Title","description":"Embed title (max 256 characters)"},"embed_description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Embed Description","description":"Embed description (max 4000 characters)"},"embed_color":{"anyOf":[{"type":"string","pattern":"^#?[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Embed Color","description":"Embed color (Hex)"},"embed_thumbnail_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Thumbnail Url","description":"Thumbnail URL"},"embed_image_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Image Url","description":"Image URL"},"embed_footer_text":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Footer Text","description":"Footer text"},"embed_footer_icon_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Footer Icon Url","description":"Footer icon URL (gespeichert, aber vom Container nicht gerendert)"},"embed_author_name":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Embed Author Name","description":"Author name"},"embed_author_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Author Url","description":"Author URL"},"embed_author_icon_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Author Icon Url","description":"Author icon URL (gespeichert, aber vom Container nicht gerendert)"},"embed_fields":{"items":{"$ref":"#/components/schemas/EmbedField"},"type":"array","maxItems":25,"title":"Embed Fields","description":"Embed fields (max 25)"}},"type":"object","required":["name","channel_id","interval_type"],"title":"AutoMessageCreate","description":"Schema for AutoMessage creation"},"AutoMessageUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"interval_type":{"anyOf":[{"$ref":"#/components/schemas/IntervalType"},{"type":"null"}]},"interval_minutes":{"anyOf":[{"type":"integer","maximum":525600.0,"minimum":30.0},{"type":"null"}],"title":"Interval Minutes"},"daily_hour":{"anyOf":[{"type":"integer","maximum":23.0,"minimum":0.0},{"type":"null"}],"title":"Daily Hour"},"daily_minute":{"anyOf":[{"type":"integer","maximum":59.0,"minimum":0.0},{"type":"null"}],"title":"Daily Minute"},"weekly_weekday":{"anyOf":[{"type":"integer","maximum":6.0,"minimum":0.0},{"type":"null"}],"title":"Weekly Weekday"},"weekly_hour":{"anyOf":[{"type":"integer","maximum":23.0,"minimum":0.0},{"type":"null"}],"title":"Weekly Hour"},"weekly_minute":{"anyOf":[{"type":"integer","maximum":59.0,"minimum":0.0},{"type":"null"}],"title":"Weekly Minute"},"monthly_day":{"anyOf":[{"type":"integer","maximum":31.0,"minimum":1.0},{"type":"null"}],"title":"Monthly Day"},"monthly_hour":{"anyOf":[{"type":"integer","maximum":23.0,"minimum":0.0},{"type":"null"}],"title":"Monthly Hour"},"monthly_minute":{"anyOf":[{"type":"integer","maximum":59.0,"minimum":0.0},{"type":"null"}],"title":"Monthly Minute"},"yearly_month":{"anyOf":[{"type":"integer","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Yearly Month"},"yearly_day":{"anyOf":[{"type":"integer","maximum":31.0,"minimum":1.0},{"type":"null"}],"title":"Yearly Day"},"yearly_hour":{"anyOf":[{"type":"integer","maximum":23.0,"minimum":0.0},{"type":"null"}],"title":"Yearly Hour"},"yearly_minute":{"anyOf":[{"type":"integer","maximum":59.0,"minimum":0.0},{"type":"null"}],"title":"Yearly Minute"},"timezone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Timezone"},"use_first_send":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use First Send"},"first_send_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Send At"},"content":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Content"},"embed_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Embed Enabled"},"embed_title":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Embed Title"},"embed_description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Embed Description"},"embed_color":{"anyOf":[{"type":"string","pattern":"^#?[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Embed Color"},"embed_thumbnail_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Thumbnail Url"},"embed_image_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Image Url"},"embed_footer_text":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Footer Text"},"embed_footer_icon_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Footer Icon Url"},"embed_author_name":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Embed Author Name"},"embed_author_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Author Url"},"embed_author_icon_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Author Icon Url"},"embed_fields":{"anyOf":[{"items":{"$ref":"#/components/schemas/EmbedField"},"type":"array","maxItems":25},{"type":"null"}],"title":"Embed Fields"}},"type":"object","title":"AutoMessageUpdate","description":"Schema for AutoMessage updates (all fields optional).\n\nJede Laenge hier ist dieselbe wie in ``AutoMessageBase``. Sie auseinander\nlaufen zu lassen heisst, dass POST und PUT unterschiedliche Daten\nakzeptieren - und genau das war der Fall (siehe Kommentar dort)."},"AutoResponderCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"trigger":{"type":"string","maxLength":200,"minLength":1,"title":"Trigger"},"match_mode":{"$ref":"#/components/schemas/MatchMode","default":"contains"},"case_sensitive":{"type":"boolean","title":"Case Sensitive","default":false},"is_active":{"type":"boolean","title":"Is Active","default":true},"reply_to_message":{"type":"boolean","title":"Reply To Message","default":true},"ping_author":{"type":"boolean","title":"Ping Author","default":false},"delete_trigger_message":{"type":"boolean","title":"Delete Trigger Message","default":false},"cooldown_seconds":{"type":"integer","maximum":86400.0,"minimum":0.0,"title":"Cooldown Seconds","default":0},"cooldown_scope":{"$ref":"#/components/schemas/CooldownScope","default":"user"},"allowed_role_ids":{"items":{"type":"string"},"type":"array","title":"Allowed Role Ids"},"denied_role_ids":{"items":{"type":"string"},"type":"array","title":"Denied Role Ids"},"allowed_channel_ids":{"items":{"type":"string"},"type":"array","title":"Allowed Channel Ids"},"denied_channel_ids":{"items":{"type":"string"},"type":"array","title":"Denied Channel Ids"},"selection_mode":{"$ref":"#/components/schemas/SelectionMode","default":"random"},"ai_enabled":{"type":"boolean","title":"Ai Enabled","default":false},"ai_system_prompt":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Ai System Prompt"},"responses":{"items":{"$ref":"#/components/schemas/AutoResponderResponseCreate"},"type":"array","maxItems":10,"title":"Responses"}},"type":"object","required":["name","trigger"],"title":"AutoResponderCreate","description":"Create-Schema. Mindestens eine Response wird beim ersten POST mit angelegt,\nfalls `responses` mitgegeben wird. Sonst muss man die Response separat\nper POST /servers/{id}/auto-responders/{id}/responses anlegen."},"AutoResponderResponseCreate":{"properties":{"content":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Content"},"embed_enabled":{"type":"boolean","title":"Embed Enabled","default":false},"embed_title":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Embed Title"},"embed_description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Embed Description"},"embed_color":{"anyOf":[{"type":"string","pattern":"^#?[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Embed Color"},"embed_thumbnail_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Thumbnail Url"},"embed_image_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Image Url"},"embed_footer_text":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Footer Text"},"embed_footer_icon_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Footer Icon Url"},"embed_author_name":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Embed Author Name"},"embed_author_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Author Url"},"embed_author_icon_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Author Icon Url"},"embed_fields":{"items":{"$ref":"#/components/schemas/EmbedFieldIO"},"type":"array","maxItems":25,"title":"Embed Fields"},"weight":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Weight","default":1},"position":{"type":"integer","maximum":999.0,"minimum":0.0,"title":"Position","default":0}},"type":"object","title":"AutoResponderResponseCreate"},"AutoResponderResponseUpdate":{"properties":{"content":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Content"},"embed_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Embed Enabled"},"embed_title":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Embed Title"},"embed_description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Embed Description"},"embed_color":{"anyOf":[{"type":"string","pattern":"^#?[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Embed Color"},"embed_thumbnail_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Thumbnail Url"},"embed_image_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Image Url"},"embed_footer_text":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Footer Text"},"embed_footer_icon_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Footer Icon Url"},"embed_author_name":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Embed Author Name"},"embed_author_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Author Url"},"embed_author_icon_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Author Icon Url"},"embed_fields":{"anyOf":[{"items":{"$ref":"#/components/schemas/EmbedFieldIO"},"type":"array","maxItems":25},{"type":"null"}],"title":"Embed Fields"},"weight":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Weight"},"position":{"anyOf":[{"type":"integer","maximum":999.0,"minimum":0.0},{"type":"null"}],"title":"Position"}},"type":"object","title":"AutoResponderResponseUpdate"},"AutoResponderUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"trigger":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Trigger"},"match_mode":{"anyOf":[{"$ref":"#/components/schemas/MatchMode"},{"type":"null"}]},"case_sensitive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Case Sensitive"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"reply_to_message":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reply To Message"},"ping_author":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ping Author"},"delete_trigger_message":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Delete Trigger Message"},"cooldown_seconds":{"anyOf":[{"type":"integer","maximum":86400.0,"minimum":0.0},{"type":"null"}],"title":"Cooldown Seconds"},"cooldown_scope":{"anyOf":[{"$ref":"#/components/schemas/CooldownScope"},{"type":"null"}]},"allowed_role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Role Ids"},"denied_role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Denied Role Ids"},"allowed_channel_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Channel Ids"},"denied_channel_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Denied Channel Ids"},"selection_mode":{"anyOf":[{"$ref":"#/components/schemas/SelectionMode"},{"type":"null"}]},"ai_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai Enabled"},"ai_system_prompt":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Ai System Prompt"}},"type":"object","title":"AutoResponderUpdate"},"AutoRoleConfigUpdate":{"properties":{"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled"},"weekly_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Weekly Enabled"},"weekly_messages_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weekly Messages Role Id"},"weekly_voice_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weekly Voice Role Id"},"weekly_activity_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weekly Activity Role Id"},"weekly_invites_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weekly Invites Role Id"},"monthly_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Monthly Enabled"},"monthly_messages_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Monthly Messages Role Id"},"monthly_voice_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Monthly Voice Role Id"},"monthly_activity_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Monthly Activity Role Id"},"min_messages_threshold":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":1.0},{"type":"null"}],"title":"Min Messages Threshold"},"min_voice_minutes_threshold":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":1.0},{"type":"null"}],"title":"Min Voice Minutes Threshold"},"exclude_bot_accounts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Exclude Bot Accounts"},"announcement_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Announcement Channel Id"},"send_dm_notification":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Send Dm Notification"}},"type":"object","title":"AutoRoleConfigUpdate","description":"Update Schema for Auto Role Config.\n\nOHNE `monthly_invites_role_id` UND `min_invites_threshold`, obwohl die\nAntwort sie fuehrt: `AutoRoleConfig` in models.py hat diese beiden Spalten\nNICHT - nur `weekly_invites_role_id` existiert. `update_config` setzt jedes\nFeld des Update-Modells per `setattr` auf die Instanz; fuer eine Spalte,\ndie es nicht gibt, legt das nur ein Python-Attribut an, und `save()`\nschreibt es nie. Die Antwort las den Wert danach von genau dieser Instanz\nzurueck - der Aufrufer bekam also seinen eigenen Wert als Bestaetigung,\nund die naechste Abfrage lieferte wieder den Vorgabewert. Eine Einstellung,\ndie nach dem Neuladen leer ist, ist schlimmer als eine, die es nicht gibt."},"AutoRoleOverview":{"properties":{"weekly_winners":{"items":{"$ref":"#/components/schemas/AutoRoleWinnerItem"},"type":"array","title":"Weekly Winners","default":[]},"monthly_winners":{"items":{"$ref":"#/components/schemas/AutoRoleWinnerItem"},"type":"array","title":"Monthly Winners","default":[]}},"type":"object","title":"AutoRoleOverview","description":"Auto-Role Gewinner-Übersicht (Woche + Monat)."},"AutoRoleWinnerItem":{"properties":{"user":{"$ref":"#/components/schemas/UserSnippet"},"award_type":{"type":"string","title":"Award Type"},"period_type":{"type":"string","title":"Period Type"},"stat_value":{"type":"integer","title":"Stat Value"},"stat_details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Stat Details"},"awarded_at":{"type":"string","format":"date-time","title":"Awarded At"},"role_id":{"type":"string","title":"Role Id"}},"type":"object","required":["user","award_type","period_type","stat_value","awarded_at","role_id"],"title":"AutoRoleWinnerItem","description":"Ein Auto-Role Gewinner."},"AutocompleteOption":{"properties":{"name":{"type":"string","title":"Name"},"value":{"type":"string","title":"Value"}},"type":"object","required":["name","value"],"title":"AutocompleteOption"},"AutocompleteResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"options":{"items":{"$ref":"#/components/schemas/AutocompleteOption"},"type":"array","title":"Options"}},"type":"object","required":["success","options"],"title":"AutocompleteResponse"},"AutomationCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Description"},"enabled":{"type":"boolean","title":"Enabled","default":true},"trigger_type":{"type":"string","maxLength":40,"title":"Trigger Type"},"trigger_config":{"additionalProperties":true,"type":"object","title":"Trigger Config"},"condition_mode":{"type":"string","maxLength":8,"title":"Condition Mode","default":"all"},"conditions":{"items":{"$ref":"#/components/schemas/ConditionIn"},"type":"array","title":"Conditions"},"cooldown_seconds":{"type":"integer","maximum":2592000.0,"minimum":0.0,"title":"Cooldown Seconds","default":0},"cooldown_scope":{"type":"string","maxLength":20,"title":"Cooldown Scope","default":"user"},"stop_on_error":{"type":"boolean","title":"Stop On Error","default":false},"actions":{"items":{"$ref":"#/components/schemas/ActionIn"},"type":"array","title":"Actions"}},"type":"object","required":["name","trigger_type"],"title":"AutomationCreate"},"AutomationUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Description"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"trigger_type":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Trigger Type"},"trigger_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Trigger Config"},"condition_mode":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Condition Mode"},"conditions":{"anyOf":[{"items":{"$ref":"#/components/schemas/ConditionIn"},"type":"array"},{"type":"null"}],"title":"Conditions"},"cooldown_seconds":{"anyOf":[{"type":"integer","maximum":2592000.0,"minimum":0.0},{"type":"null"}],"title":"Cooldown Seconds"},"cooldown_scope":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Cooldown Scope"},"stop_on_error":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Stop On Error"},"actions":{"anyOf":[{"items":{"$ref":"#/components/schemas/ActionIn"},"type":"array"},{"type":"null"}],"title":"Actions"}},"type":"object","title":"AutomationUpdate"},"AvailableStatsData":{"properties":{"total_types":{"type":"integer","title":"Total Types"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories"},"stats_by_category":{"additionalProperties":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},"type":"object","title":"Stats By Category"},"all_stats":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"All Stats"}},"type":"object","required":["total_types","categories","stats_by_category","all_stats"],"title":"AvailableStatsData","description":"Daten für verfügbare Statistik-Typen"},"AvailableStatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"$ref":"#/components/schemas/AvailableStatsData"}},"type":"object","required":["data"],"title":"AvailableStatsResponse","description":"Response für verfügbare Statistik-Typen"},"BalanceEinstellungen":{"properties":{"balance_version":{"anyOf":[{"type":"integer","enum":[1,2]},{"type":"null"}],"title":"Balance Version"},"tagesziel":{"anyOf":[{"type":"integer","maximum":1000000000.0,"minimum":1.0},{"type":"null"}],"title":"Tagesziel"},"startguthaben_faktor":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Startguthaben Faktor"},"business_ertrag_deckel_faktor":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.0},{"type":"null"}],"title":"Business Ertrag Deckel Faktor"},"immobilien_ertrag_deckel_faktor":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.0},{"type":"null"}],"title":"Immobilien Ertrag Deckel Faktor"},"passiv_degression":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.3},{"type":"null"}],"title":"Passiv Degression"},"gambling_hausvorteil":{"anyOf":[{"type":"number","maximum":0.3,"minimum":0.0},{"type":"null"}],"title":"Gambling Hausvorteil"},"gambling_max_einsatz_anteil":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Gambling Max Einsatz Anteil"},"vermoegensabgabe_schwelle_faktor":{"anyOf":[{"type":"number","maximum":1000000.0,"minimum":1.0},{"type":"null"}],"title":"Vermoegensabgabe Schwelle Faktor"},"vermoegensabgabe_satz":{"anyOf":[{"type":"number","maximum":0.2,"minimum":0.0},{"type":"null"}],"title":"Vermoegensabgabe Satz"},"vermoegensabgabe_aktiv":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Vermoegensabgabe Aktiv"},"transfer_gebuehr":{"anyOf":[{"type":"number","maximum":0.5,"minimum":0.0},{"type":"null"}],"title":"Transfer Gebuehr"},"daily_serie_zuwachs":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Daily Serie Zuwachs"},"daily_serie_deckel":{"anyOf":[{"type":"number","maximum":50.0,"minimum":1.0},{"type":"null"}],"title":"Daily Serie Deckel"},"aufholhilfe_aktiv":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Aufholhilfe Aktiv"},"aufholhilfe_max":{"anyOf":[{"type":"number","maximum":10.0,"minimum":1.0},{"type":"null"}],"title":"Aufholhilfe Max"}},"type":"object","title":"BalanceEinstellungen","description":"Die Stellschrauben des abgeleiteten Regelwerks.\n\nAlle Grenzen hier sind nicht kosmetisch: jede einzelne schuetzt vor einem\nZustand, den die Produktivdaten bereits zeigen."},"BanRequest":{"properties":{"reason":{"type":"string","minLength":3,"title":"Reason","description":"Verpflichtender Grund für die Sperrung"}},"type":"object","required":["reason"],"title":"BanRequest"},"BauwerkKauf":{"properties":{},"type":"object","title":"BauwerkKauf","description":"`POST /clans/{id}/buildings/{key}/upgrade` - ein Body ohne Felder.\n\nEs gibt nichts zu schicken: welches Bauwerk gemeint ist, steht im Pfad,\nund die Stufe ist immer \"eine hoeher\" - der Preis haengt an ihr, also\ndarf ihn niemand mitschicken. Das Schema steht trotzdem hier, aus zwei\nGruenden: der Endpunkt bekommt in FastAPIs Doku eine Form statt eines\nleeren Kastens, und wenn der Kauf spaeter eine Bestaetigung braucht\n(Stufe 5 kostet 2.500 Kristalle - Vertrag 3.3), waechst das Feld hier\nund nicht in einem zweiten, neuen Schema."},"BehebenAnfrage":{"properties":{"id":{"type":"string","maxLength":120,"title":"Id","default":""}},"type":"object","title":"BehebenAnfrage","description":"Welcher Befund behoben werden soll - nur seine ID.\n\nDie Rechte, die gesetzt werden, schickt NICHT das Dashboard: sie folgen\naus dem Register (wofuer der Kanal eingetragen ist). Ein Rumpf mit einer\nfrei waehlbaren Rechteliste waere ein Weg, Notoq in einem beliebigen\nKanal beliebige Rechte geben zu lassen.\n\nVorgabewert statt Pflichtfeld - wie in api/routers/vorschlaege.py: ein\nfehlendes Pflichtfeld wird sonst eine 422 in der Sprache des Frameworks."},"Beitragsverteilung":{"properties":{"beitragende":{"type":"integer","title":"Beitragende","default":0},"gesamt":{"type":"integer","title":"Gesamt","default":0},"gini":{"type":"number","title":"Gini","default":0.0},"anteile":{"additionalProperties":{"type":"number"},"type":"object","title":"Anteile","default":{}},"lorenz":{"items":{"additionalProperties":{"type":"number"},"type":"object"},"type":"array","title":"Lorenz","default":[]},"haelfte_durch":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Haelfte Durch"},"median":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Median"},"kopf":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Kopf","default":[]}},"type":"object","title":"Beitragsverteilung"},"Beleg":{"properties":{"wert":{"type":"string","maxLength":64,"title":"Wert"},"version":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"Version"}},"type":"object","required":["wert","version"],"title":"Beleg"},"BelohnungAenderung":{"properties":{"rollen_id":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Rollen Id"},"kanal_id":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Kanal Id"},"gegenstand_id":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Gegenstand Id"},"abzeichen_id":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Abzeichen Id"},"automation_id":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Automation Id"},"tage":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tage"},"betrag":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Betrag"},"menge":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Menge"},"titel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Titel"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"level":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":1.0},{"type":"null"}],"title":"Level"},"art":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Art"},"bei_verlust":{"anyOf":[{"type":"string","pattern":"^(behalten|entziehen)$"},{"type":"null"}],"title":"Bei Verlust"},"aktiv":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Aktiv"},"reihenfolge":{"anyOf":[{"type":"integer","maximum":999.0,"minimum":0.0},{"type":"null"}],"title":"Reihenfolge"}},"type":"object","title":"BelohnungAenderung"},"BelohnungAnlage":{"properties":{"rollen_id":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Rollen Id"},"kanal_id":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Kanal Id"},"gegenstand_id":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Gegenstand Id"},"abzeichen_id":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Abzeichen Id"},"automation_id":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Automation Id"},"tage":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tage"},"betrag":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Betrag"},"menge":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Menge"},"titel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Titel"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"level":{"type":"integer","maximum":10000.0,"minimum":1.0,"title":"Level"},"art":{"type":"string","maxLength":40,"title":"Art"},"bei_verlust":{"type":"string","pattern":"^(behalten|entziehen)$","title":"Bei Verlust","default":"behalten"},"aktiv":{"type":"boolean","title":"Aktiv","default":true},"reihenfolge":{"type":"integer","maximum":999.0,"minimum":0.0,"title":"Reihenfolge","default":0}},"type":"object","required":["level","art"],"title":"BelohnungAnlage"},"BenachrichtigungsEinstellungen":{"properties":{"einladungen":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Einladungen"},"bewerbungen":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bewerbungen"},"entscheidungen":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Entscheidungen"},"rang":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Rang"},"erinnerung_raid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Erinnerung Raid"},"erinnerung_serie":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Erinnerung Serie"},"erinnerung_krieg":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Erinnerung Krieg"}},"type":"object","title":"BenachrichtigungsEinstellungen","description":"`PUT /users/me/clan/notifications` - nur die geschickten Schalter\naendern sich (`exclude_unset` wie ueberall hier)."},"BerufSetzung":{"properties":{"schluessel":{"anyOf":[{"type":"string","maxLength":30,"minLength":1},{"type":"null"}],"title":"Schluessel"},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","title":"BerufSetzung","description":"Einen Beruf zuweisen oder entziehen.\n\n`schluessel = None` heisst entziehen. Ein eigener DELETE-Endpunkt waere\nein zweiter Weg fuer dieselbe Entscheidung."},"BesitzBody":{"properties":{"konto_id":{"type":"string","maxLength":64,"title":"Konto Id"}},"type":"object","required":["konto_id"],"title":"BesitzBody"},"BesitzEntzug":{"properties":{"menge":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":1.0},{"type":"null"}],"title":"Menge"},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","title":"BesitzEntzug","description":"Aktie, Immobilie oder Gegenstaende entziehen."},"BewerbungNeu":{"properties":{"nachricht":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Nachricht"}},"type":"object","title":"BewerbungNeu","description":"`POST /clans/{id}/apply` - eine Bewerbung von der Website aus."},"BindingCreate":{"properties":{"user_id":{"type":"string","maxLength":30,"minLength":5,"title":"User Id"},"area_id":{"type":"integer","title":"Area Id"},"role_id":{"type":"string","maxLength":30,"minLength":5,"title":"Role Id"}},"type":"object","required":["user_id","area_id","role_id"],"title":"BindingCreate"},"Bindung":{"properties":{"kohorten":{"items":{"$ref":"#/components/schemas/Kohorte"},"type":"array","title":"Kohorten","default":[]},"wochen":{"type":"integer","title":"Wochen","default":8},"mittel_d7":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mittel D7"},"mittel_gesprochen":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mittel Gesprochen"}},"type":"object","title":"Bindung"},"BirthdayCreate":{"properties":{"birth_day":{"type":"integer","maximum":31.0,"minimum":1.0,"title":"Birth Day","description":"Birthday (day)"},"birth_month":{"type":"integer","maximum":12.0,"minimum":1.0,"title":"Birth Month","description":"Birth month"},"birth_year":{"anyOf":[{"type":"integer","maximum":2024.0,"minimum":1900.0},{"type":"null"}],"title":"Birth Year","description":"Birth year (optional)"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"Timezone (empty = server timezone)"},"is_public":{"type":"boolean","title":"Is Public","description":"Publicly visible?","default":true},"show_age":{"type":"boolean","title":"Show Age","description":"Show age?","default":true},"dm_notification":{"type":"boolean","title":"Dm Notification","description":"DM notification?","default":true}},"type":"object","required":["birth_day","birth_month"],"title":"BirthdayCreate"},"BirthdayItem":{"properties":{"user":{"$ref":"#/components/schemas/UserSnippet"},"birth_day":{"type":"integer","title":"Birth Day"},"birth_month":{"type":"integer","title":"Birth Month"},"age":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age"},"is_today":{"type":"boolean","title":"Is Today","default":false},"days_until":{"type":"integer","title":"Days Until","default":0}},"type":"object","required":["user","birth_day","birth_month"],"title":"BirthdayItem","description":"Ein Geburtstag in diesem Monat."},"BirthdayOverview":{"properties":{"birthdays_this_month":{"items":{"$ref":"#/components/schemas/BirthdayItem"},"type":"array","title":"Birthdays This Month","default":[]},"next_birthday":{"anyOf":[{"$ref":"#/components/schemas/BirthdayItem"},{"type":"null"}]},"total_registered":{"type":"integer","title":"Total Registered","default":0}},"type":"object","title":"BirthdayOverview","description":"Geburtstags-Übersicht für diesen Monat."},"BirthdaySettingsUpdate":{"properties":{"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled","description":"System enabled?"},"birthday_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Birthday Channel Id","description":"Birthday Channel ID"},"birthday_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Birthday Role Id","description":"Birthday Role ID"},"role_duration_hours":{"anyOf":[{"type":"integer","maximum":168.0,"minimum":1.0},{"type":"null"}],"title":"Role Duration Hours","description":"Hours the role stays"},"reminder_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reminder Enabled","description":"Reminder enabled?"},"reminder_days_before":{"anyOf":[{"type":"integer","maximum":7.0,"minimum":1.0},{"type":"null"}],"title":"Reminder Days Before","description":"Days before birthday"},"reminder_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reminder Channel Id","description":"Reminder Channel ID"},"server_timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Timezone","description":"Server Timezone"},"announcement_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Announcement Time","description":"Announcement time (HH:MM)"},"birthday_message":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Birthday Message","description":"Birthday Message"},"reminder_message":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Reminder Message","description":"Reminder Message"},"show_age_in_announcement":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Age In Announcement","description":"Show age in announcements?"},"only_public_birthdays":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Only Public Birthdays","description":"Only public birthdays?"},"ping_birthday_role":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ping Birthday Role","description":"Ping role?"},"permanent_list_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Permanent List Enabled","description":"Permanent list enabled?"},"permanent_list_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permanent List Channel Id","description":"Channel ID for permanent list"}},"type":"object","title":"BirthdaySettingsUpdate"},"BirthdayUpdateRequest":{"properties":{"birth_day":{"anyOf":[{"type":"integer","maximum":31.0,"minimum":1.0},{"type":"null"}],"title":"Birth Day"},"birth_month":{"anyOf":[{"type":"integer","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Birth Month"},"birth_year":{"anyOf":[{"type":"integer","maximum":2100.0,"minimum":1900.0},{"type":"null"}],"title":"Birth Year"},"is_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public"}},"type":"object","title":"BirthdayUpdateRequest"},"BlacklistAddRequest":{"properties":{"blacklist_type":{"type":"string","enum":["channel","role","user"],"title":"Blacklist Type","description":"Typ des Blacklist-Eintrags"},"target_id":{"type":"string","title":"Target Id","description":"Target ID (Channel, Role oder User)"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Grund für Blacklist"}},"type":"object","required":["blacklist_type","target_id"],"title":"BlacklistAddRequest"},"BlacklistCreate":{"properties":{"user_id":{"type":"string","title":"User Id","description":"Discord User ID"},"reason":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Reason"},"duration_hours":{"anyOf":[{"type":"integer","maximum":8760.0,"minimum":1.0},{"type":"null"}],"title":"Duration Hours","description":"Duration in hours (empty = permanent)"}},"type":"object","required":["user_id"],"title":"BlacklistCreate"},"BlacklistEntryResponse":{"properties":{"id":{"type":"integer","title":"Id"},"blacklist_type":{"type":"string","title":"Blacklist Type"},"target_id":{"type":"string","title":"Target Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"added_by_id":{"type":"string","title":"Added By Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","blacklist_type","target_id","reason","added_by_id","created_at"],"title":"BlacklistEntryResponse"},"BlueprintItem":{"properties":{"feature":{"type":"string","title":"Feature"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Id"}},"type":"object","required":["feature"],"title":"BlueprintItem"},"BoardCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"slug":{"anyOf":[{"type":"string","maxLength":3},{"type":"null"}],"title":"Slug"},"description":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Description"},"color_hex":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color Hex"}},"type":"object","required":["name"],"title":"BoardCreate"},"BoardPatch":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Description"},"color_hex":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color Hex"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"is_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Archived"},"mirror_channel_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Mirror Channel Id"},"clear_mirror":{"type":"boolean","title":"Clear Mirror","default":false}},"type":"object","title":"BoardPatch"},"Body_analyze_import_api_v1_servers__server_id__level_import_analyze_post":{"properties":{"source":{"type":"string","title":"Source","default":"upload"},"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"}},"type":"object","title":"Body_analyze_import_api_v1_servers__server_id__level_import_analyze_post"},"Body_authorize_submit_mcp_oauth_authorize_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"totp":{"type":"string","title":"Totp","default":""}},"type":"object","required":["email","password"],"title":"Body_authorize_submit_mcp_oauth_authorize_post"},"Body_authorize_submit_mcp_public_oauth_authorize_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"totp":{"type":"string","title":"Totp","default":""}},"type":"object","required":["email","password"],"title":"Body_authorize_submit_mcp_public_oauth_authorize_post"},"Body_bulk_update_items_api_v1_custom_shop_servers__server_id__items_bulk_update_post":{"properties":{"item_ids":{"items":{"type":"integer"},"type":"array","title":"Item Ids"},"is_available":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Available"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},"type":"object","required":["item_ids"],"title":"Body_bulk_update_items_api_v1_custom_shop_servers__server_id__items_bulk_update_post"},"Body_buy_api_v1_shop_servers__server_id__buy_post":{"properties":{"item_key":{"type":"string","title":"Item Key"},"quantity":{"type":"integer","maximum":99.0,"minimum":1.0,"title":"Quantity","default":1}},"type":"object","required":["item_key"],"title":"Body_buy_api_v1_shop_servers__server_id__buy_post"},"Body_create_conversation_api_v1_ai_assistant__server_id__conversations_post":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"}},"type":"object","title":"Body_create_conversation_api_v1_ai_assistant__server_id__conversations_post"},"Body_grant_item_api_v1_shop_servers__server_id__grant_post":{"properties":{"user_id":{"type":"string","title":"User Id"},"item_id":{"type":"integer","title":"Item Id"},"quantity":{"type":"integer","maximum":99.0,"minimum":1.0,"title":"Quantity","default":1}},"type":"object","required":["user_id","item_id"],"title":"Body_grant_item_api_v1_shop_servers__server_id__grant_post"},"Body_patch_conversation_api_v1_ai_assistant__server_id__conversation__conv_id__patch":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},"type":"object","title":"Body_patch_conversation_api_v1_ai_assistant__server_id__conversation__conv_id__patch"},"Body_refund_purchase_api_v1_shop_servers__server_id__purchases__purchase_id__refund_post":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"Body_refund_purchase_api_v1_shop_servers__server_id__purchases__purchase_id__refund_post"},"Body_reorder_categories_api_v1_shop_servers__server_id__categories_reorder_post":{"properties":{"order":{"items":{"type":"integer"},"type":"array","title":"Order"}},"type":"object","required":["order"],"title":"Body_reorder_categories_api_v1_shop_servers__server_id__categories_reorder_post"},"Body_reorder_items_api_v1_shop_servers__server_id__items_reorder_post":{"properties":{"order":{"items":{"type":"integer"},"type":"array","title":"Order"}},"type":"object","required":["order"],"title":"Body_reorder_items_api_v1_shop_servers__server_id__items_reorder_post"},"Body_restock_item_api_v1_shop_servers__server_id__items__item_id__restock_post":{"properties":{"quantity":{"type":"integer","minimum":1.0,"title":"Quantity"}},"type":"object","required":["quantity"],"title":"Body_restock_item_api_v1_shop_servers__server_id__items__item_id__restock_post"},"Body_revoke_endpoint_mcp_oauth_revoke_post":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"Body_revoke_endpoint_mcp_oauth_revoke_post"},"Body_revoke_endpoint_mcp_public_oauth_revoke_post":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"Body_revoke_endpoint_mcp_public_oauth_revoke_post"},"Body_schreibrecht_aendern_api_v1_servers__server_id__ai_access_patch":{"properties":{"allow_writes":{"type":"boolean","title":"Allow Writes"}},"type":"object","required":["allow_writes"],"title":"Body_schreibrecht_aendern_api_v1_servers__server_id__ai_access_patch"},"Body_token_endpoint_mcp_oauth_token_post":{"properties":{"grant_type":{"type":"string","title":"Grant Type"},"code":{"type":"string","title":"Code","default":""},"redirect_uri":{"type":"string","title":"Redirect Uri","default":""},"client_id":{"type":"string","title":"Client Id","default":""},"code_verifier":{"type":"string","title":"Code Verifier","default":""},"refresh_token":{"type":"string","title":"Refresh Token","default":""}},"type":"object","required":["grant_type"],"title":"Body_token_endpoint_mcp_oauth_token_post"},"Body_token_endpoint_mcp_public_oauth_token_post":{"properties":{"grant_type":{"type":"string","title":"Grant Type"},"code":{"type":"string","title":"Code","default":""},"redirect_uri":{"type":"string","title":"Redirect Uri","default":""},"client_id":{"type":"string","title":"Client Id","default":""},"code_verifier":{"type":"string","title":"Code Verifier","default":""},"refresh_token":{"type":"string","title":"Refresh Token","default":""}},"type":"object","required":["grant_type"],"title":"Body_token_endpoint_mcp_public_oauth_token_post"},"Body_update_settings_api_v1_servers__server_id__starboard_settings_patch":{"properties":{"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled"},"self_star_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Self Star Enabled"},"allow_nsfw":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Nsfw"},"max_message_age_days":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Max Message Age Days"},"show_jump_button":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Jump Button"},"show_star_count_in_name":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Star Count In Name"},"show_author_avatar":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Author Avatar"},"remove_on_delete":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Remove On Delete"},"hall_of_fame_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hall Of Fame Enabled"}},"type":"object","title":"Body_update_settings_api_v1_servers__server_id__starboard_settings_patch"},"Body_upload_attachment_api_v1_support_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_attachment_api_v1_support_upload_post"},"Body_upload_background_api_v1_servers__server_id__branding_background_post":{"properties":{"image":{"type":"string","format":"binary","title":"Image","description":"Background image"}},"type":"object","required":["image"],"title":"Body_upload_background_api_v1_servers__server_id__branding_background_post"},"Body_upload_banner_api_v1_servers__server_id__applications_banner_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_banner_api_v1_servers__server_id__applications_banner_post"},"Body_upload_banner_api_v1_servers__server_id__selfroles_config_banner_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_banner_api_v1_servers__server_id__selfroles_config_banner_post"},"Body_upload_birthday_banner_api_v1_servers__server_id__birthdays_banner_post":{"properties":{"banner":{"type":"string","format":"binary","title":"Banner","description":"Birthday Banner"}},"type":"object","required":["banner"],"title":"Body_upload_birthday_banner_api_v1_servers__server_id__birthdays_banner_post"},"Body_upload_boost_notification_image_api_v1_servers__server_id__boosting_notifications_image_post":{"properties":{"image_file":{"type":"string","format":"binary","title":"Image File","description":"Image file (max 8MB)"}},"type":"object","required":["image_file"],"title":"Body_upload_boost_notification_image_api_v1_servers__server_id__boosting_notifications_image_post"},"Body_upload_bot_guild_avatar_api_v1_servers__server_id__bot_profile_upload_avatar_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_bot_guild_avatar_api_v1_servers__server_id__bot_profile_upload_avatar_post"},"Body_upload_bot_guild_banner_api_v1_servers__server_id__bot_profile_upload_banner_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_bot_guild_banner_api_v1_servers__server_id__bot_profile_upload_banner_post"},"Body_upload_brand_asset_api_v1_servers__server_id__verification_brand_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_brand_asset_api_v1_servers__server_id__verification_brand_upload_post"},"Body_upload_card_background_api_v1_servers__server_id__welcome_card_background_post":{"properties":{"image":{"type":"string","format":"binary","title":"Image","description":"Background image"}},"type":"object","required":["image"],"title":"Body_upload_card_background_api_v1_servers__server_id__welcome_card_background_post"},"Body_upload_category_banner_api_v1_servers__server_id__selfroles_categories__category_id__banner_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_category_banner_api_v1_servers__server_id__selfroles_categories__category_id__banner_post"},"Body_upload_container_asset_api_v1_servers__server_id__container_assets_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_container_asset_api_v1_servers__server_id__container_assets_upload_post"},"Body_upload_coop_partner_banner_api_v1_servers__server_id__giveaway_coop_requests__request_id__banner_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_coop_partner_banner_api_v1_servers__server_id__giveaway_coop_requests__request_id__banner_post"},"Body_upload_embed_image_api_v1_servers__server_id__embeds__embed_id__upload_image_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_embed_image_api_v1_servers__server_id__embeds__embed_id__upload_image_post"},"Body_upload_giveaway_banner_api_v1_servers__server_id__giveaways__giveaway_id__banner_post":{"properties":{"file":{"type":"string","format":"binary","title":"File","description":"Banner image (PNG, JPG, JPEG, GIF)"}},"type":"object","required":["file"],"title":"Body_upload_giveaway_banner_api_v1_servers__server_id__giveaways__giveaway_id__banner_post"},"Body_upload_panel_banner_api_v1_servers__server_id__applications_panels__panel_id__banner_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_panel_banner_api_v1_servers__server_id__applications_panels__panel_id__banner_post"},"Body_upload_position_image_api_v1_servers__server_id__application_positions__position_id__image_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_position_image_api_v1_servers__server_id__application_positions__position_id__image_post"},"Body_upload_team_banner_api_v1_servers__server_id__teams_banner_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_team_banner_api_v1_servers__server_id__teams_banner_post"},"Body_upload_ticket_banner_api_v1_servers__server_id__tickets_banner_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_ticket_banner_api_v1_servers__server_id__tickets_banner_post"},"Body_upload_verification_image_api_v1_servers__server_id__verification_upload_image_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_verification_image_api_v1_servers__server_id__verification_upload_image_post"},"Body_validate_item_api_v1_shop_servers__server_id__items_validate_post":{"properties":{"effects":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Effects"}},"type":"object","title":"Body_validate_item_api_v1_shop_servers__server_id__items_validate_post"},"BoostGoalSettings":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"target":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":1.0},{"type":"null"}],"title":"Target"}},"type":"object","title":"BoostGoalSettings"},"BoostKauf":{"properties":{},"type":"object","title":"BoostKauf","description":"`POST /clans/{id}/treasury/{server_id}/boost` - ebenfalls leer.\n\nProzent und Dauer sind Spielregeln (`schatzkammer.BOOST_PROZENT`,\n`BOOST_STUNDEN`), keine Eingaben; der Preis kommt aus dem Tagesziel des\nServers. Ein Feld hier waere eine Einladung, eine dieser Zahlen von\naussen zu setzen."},"BoostLogSettingsUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"events":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Events"}},"type":"object","title":"BoostLogSettingsUpdate"},"BoostMessagePayload":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Label"},"trigger_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger Type","description":"boost_new | boost_extra | tier_up | any"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode","description":"container | text | card"},"content":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Content"},"container":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Container"},"weight":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Weight"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"sort_order":{"anyOf":[{"type":"integer","maximum":999.0,"minimum":0.0},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"BoostMessagePayload"},"BoostNotificationSettingsUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"message_content":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Message Content"},"embed_title":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Embed Title"},"embed_description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Embed Description"},"embed_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Color"},"embed_image_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Image Source"}},"type":"object","title":"BoostNotificationSettingsUpdate"},"BoosterColorRoleCreate":{"properties":{"role_id":{"type":"string","title":"Role Id"},"label":{"type":"string","maxLength":100,"minLength":1,"title":"Label"},"emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Emoji"}},"type":"object","required":["role_id","label"],"title":"BoosterColorRoleCreate"},"BoosterColorRoleUpdate":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Label"},"emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Emoji"}},"type":"object","title":"BoosterColorRoleUpdate"},"BoosterListSettings":{"properties":{"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"intro":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Intro"},"name_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Style"},"layout":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Layout"},"sort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"},"show_stats":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Stats"},"show_goal":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Goal"},"show_since":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Since"},"show_colors":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Colors"},"show_icon":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Icon"},"accent_color":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Accent Color"}},"type":"object","title":"BoosterListSettings","description":"Wie die Booster-Liste im Kanal aussieht.\n\n``None`` heisst ueberall \"nicht mitgeschickt, Wert stehen lassen\" - nur so\nkann das Dashboard eine einzelne Einstellung aendern, ohne den Rest der\nKarte mitzuschreiben."},"BoosterRoleSettings":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"base_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Role Id"},"award_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Award Role Id"}},"type":"object","title":"BoosterRoleSettings"},"BotGuildProfile":{"properties":{"guild_id":{"type":"string","title":"Guild Id"},"guild_name":{"type":"string","title":"Guild Name"},"guild_icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guild Icon Url"},"guild_banner_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guild Banner Url"},"user_id":{"type":"string","title":"User Id"},"nick":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nick"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"banner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner"},"banner_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner Url"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"joined_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Joined At"}},"type":"object","required":["guild_id","guild_name","user_id"],"title":"BotGuildProfile","description":"Bot Guild Profile Response"},"BotGuildProfileResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"$ref":"#/components/schemas/BotGuildProfile"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","data","message"],"title":"BotGuildProfileResponse"},"BotGuildProfileUpdate":{"properties":{"nick":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Nick","description":"Server-specific nickname"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar","description":"Data URI base64 encoded avatar image"},"banner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner","description":"Data URI base64 encoded banner image"},"bio":{"anyOf":[{"type":"string","maxLength":190},{"type":"null"}],"title":"Bio","description":"Guild member bio"}},"type":"object","title":"BotGuildProfileUpdate","description":"Request Body for Bot Guild Profile Update"},"BotNewsBanner":{"properties":{"banner_id":{"type":"string","title":"Banner Id"},"title":{"type":"string","title":"Title"},"message":{"type":"string","title":"Message"},"type":{"type":"string","title":"Type","description":"info, update, warning, celebration","default":"info"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["banner_id","title","message","created_at"],"title":"BotNewsBanner","description":"Ein News-Banner vom Bot."},"BotPermissionItem":{"properties":{"key":{"type":"string","title":"Key"},"granted":{"type":"boolean","title":"Granted"},"critical":{"type":"boolean","title":"Critical","default":false}},"type":"object","required":["key","granted"],"title":"BotPermissionItem","description":"One Discord permission the bot needs, and whether it actually has it."},"BotReadiness":{"properties":{"available":{"type":"boolean","title":"Available"},"is_admin":{"type":"boolean","title":"Is Admin","default":false},"permissions":{"items":{"$ref":"#/components/schemas/BotPermissionItem"},"type":"array","title":"Permissions","default":[]},"missing_count":{"type":"integer","title":"Missing Count","default":0},"top_role_position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Top Role Position"},"blocked_role_count":{"type":"integer","title":"Blocked Role Count","default":0}},"type":"object","required":["available"],"title":"BotReadiness","description":"Was der Bot auf diesem Server tatsaechlich DARF.\n\nDie Werte kommen aus `_bot_effective_permissions` / `_bot_top_role_position`\nin ServerSetting, die der DataCollectionCog aus `guild.me` schreibt - sie\nberuecksichtigen also alle Bot-Rollen und Admin. `available=False` heisst,\nder Bot hat den Server noch nicht gemeldet; dann darf die Oberflaeche\nNICHTS behaupten, weder gut noch schlecht."},"BotTeamMemberResponse":{"properties":{"user_id":{"type":"string","title":"User Id"},"role":{"type":"string","title":"Role"},"added_at":{"type":"string","title":"Added At"}},"type":"object","required":["user_id","role","added_at"],"title":"BotTeamMemberResponse"},"BrandingResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"BrandingResponse"},"BrandingUpdate":{"properties":{"custom_footer_text":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Custom Footer Text","description":"Custom footer text instead of 'Powered by Notoq' (null = use default)"},"hide_powered_by":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hide Powered By","description":"If true, no footer text is displayed at all"}},"type":"object","title":"BrandingUpdate","description":"Request Body for Footer/Branding Update (Premium only)"},"BreakGlassRequest":{"properties":{"minutes":{"type":"integer","title":"Minutes","default":30}},"type":"object","title":"BreakGlassRequest"},"BuendnisAenderung":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Name"},"emblem":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Emblem"},"farbe":{"anyOf":[{"type":"string","maxLength":9},{"type":"null"}],"title":"Farbe"}},"type":"object","title":"BuendnisAenderung","description":"`PUT /users/me/clan/buendnis` - nur, was mitkommt, wird geaendert."},"BuendnisEinladung":{"properties":{"tag":{"type":"string","maxLength":12,"minLength":1,"title":"Tag"}},"type":"object","required":["tag"],"title":"BuendnisEinladung","description":"`POST /users/me/clan/buendnis/einladen` - der Tag des Clans."},"BuendnisGruendung":{"properties":{"name":{"type":"string","maxLength":64,"minLength":1,"title":"Name"},"tag":{"type":"string","maxLength":12,"minLength":1,"title":"Tag"},"emblem":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Emblem"},"farbe":{"anyOf":[{"type":"string","maxLength":9},{"type":"null"}],"title":"Farbe"}},"type":"object","required":["name","tag"],"title":"BuendnisGruendung","description":"`POST /users/me/clan/buendnis` (Nachtlauf 3, C2).\n\nFreitext mit weiten Grenzen statt Mustern: Name, Tag, Emblem und Farbe\nprueft `clans.buendnisse` mit denselben Regeln wie beim Clan - und sagt\nin einem Satz, was nicht geht. Ein 422 aus dem Schema wuesste nur \"nein\"."},"BulkBody":{"properties":{"ids":{"items":{"type":"integer"},"type":"array","title":"Ids"},"action":{"type":"string","title":"Action"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},"type":"object","required":["ids","action"],"title":"BulkBody"},"BumpReminderSettingsUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Id"},"reward_xp":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reward Xp"},"reward_coins":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reward Coins"},"reward_gems":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reward Gems"},"reward_temp_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reward Temp Role Id"},"reward_temp_role_duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reward Temp Role Duration"}},"type":"object","title":"BumpReminderSettingsUpdate"},"CancelIntentIn":{"properties":{"reason":{"type":"string","title":"Reason","description":"Grund aus der festen Liste"},"detail":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Detail"},"server_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Id"},"scope":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Scope"}},"type":"object","required":["reason"],"title":"CancelIntentIn"},"CancelOutcomeIn":{"properties":{"reason":{"type":"string","title":"Reason"},"detail":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Detail"},"offer_shown":{"type":"string","title":"Offer Shown","default":"none"},"offer_accepted":{"type":"boolean","title":"Offer Accepted","default":false},"outcome":{"type":"string","title":"Outcome","description":"saved | cancelled","default":"cancelled"},"server_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Id"}},"type":"object","required":["reason"],"title":"CancelOutcomeIn"},"CannedBody":{"properties":{"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","default":"en-US"}},"type":"object","required":["title","content"],"title":"CannedBody"},"CarrierEntry":{"properties":{"user":{"$ref":"#/components/schemas/PeopleUser"},"messages":{"type":"integer","title":"Messages"},"prev_messages":{"type":"integer","title":"Prev Messages"},"delta_pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Delta Pct"},"rank":{"type":"integer","title":"Rank"}},"type":"object","required":["user","messages","prev_messages","rank"],"title":"CarrierEntry","description":"Wer den Server traegt."},"CategoryChannelUpdate":{"properties":{"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id","description":"Kanal-ID (null = zurücksetzen)"}},"type":"object","title":"CategoryChannelUpdate","description":"Schema für Kategorie-Kanal Update"},"CategoryCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Name der Kategorie"},"description":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Description","description":"Beschreibung"},"emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Emoji","description":"Emoji für die Kategorie"},"is_exclusive":{"type":"boolean","title":"Is Exclusive","description":"Nur eine Rolle möglich?","default":false},"is_booster_only":{"type":"boolean","title":"Is Booster Only","description":"Nur für Booster?","default":false},"required_role_ids":{"items":{"type":"string"},"type":"array","title":"Required Role Ids","description":"Discord-Rollen-IDs, die ein User als Voraussetzung braucht"},"required_role_mode":{"type":"string","enum":["any","all"],"title":"Required Role Mode","description":"'any' = eine Rolle genügt, 'all' = alle Rollen nötig","default":"any"},"max_roles":{"type":"integer","maximum":10.0,"minimum":0.0,"title":"Max Roles","description":"Max Rollen pro User (0 = unbegrenzt)","default":1},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id","description":"Kanal-ID für diese Kategorie"},"banner_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner Base64","description":"Banner als Base64-String"},"banner_enabled":{"type":"boolean","title":"Banner Enabled","description":"Banner aktiviert?","default":false},"embed_color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Embed Color","description":"Embed-Farbe (Hex)"},"custom_title":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Custom Title","description":"Custom Titel (leer = Standard)"},"custom_description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Custom Description","description":"Custom Beschreibung (leer = Standard)"}},"type":"object","required":["name"],"title":"CategoryCreate","description":"Schema zum Erstellen einer Kategorie"},"CategoryEmbedUpdate":{"properties":{"custom_title":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Custom Title","description":"Custom Titel (leer = Standard)"},"custom_description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Custom Description","description":"Custom Beschreibung (leer = Standard)"},"embed_color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Embed Color","description":"Embed-Farbe (Hex)"}},"type":"object","title":"CategoryEmbedUpdate","description":"Schema für Kategorie-Embed Anpassung"},"CategoryListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"items":{"$ref":"#/components/schemas/CategoryResponse"},"type":"array","title":"Data"},"total_categories":{"type":"integer","title":"Total Categories"},"limits":{"additionalProperties":true,"type":"object","title":"Limits"}},"type":"object","required":["data","total_categories","limits"],"title":"CategoryListResponse","description":"Schema für Kategorien-Liste"},"CategoryResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"emoji":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emoji"},"is_exclusive":{"type":"boolean","title":"Is Exclusive"},"is_booster_only":{"type":"boolean","title":"Is Booster Only"},"required_role_ids":{"items":{"type":"string"},"type":"array","title":"Required Role Ids","default":[]},"required_role_mode":{"type":"string","title":"Required Role Mode","default":"any"},"max_roles_per_user":{"type":"integer","title":"Max Roles Per User"},"position_order":{"type":"integer","title":"Position Order"},"is_active":{"type":"boolean","title":"Is Active"},"total_roles":{"type":"integer","title":"Total Roles"},"custom_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Title"},"custom_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Description"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"},"banner_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner Base64"},"banner_enabled":{"type":"boolean","title":"Banner Enabled"},"embed_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Color"},"locked":{"type":"boolean","title":"Locked","default":false}},"type":"object","required":["id","name","description","emoji","is_exclusive","is_booster_only","max_roles_per_user","position_order","is_active","total_roles","custom_title","custom_description","created_at","updated_at","channel_id","message_id","banner_base64","banner_enabled","embed_color"],"title":"CategoryResponse","description":"Schema für Kategorie-Response"},"CategoryUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Description"},"emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Emoji"},"is_exclusive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Exclusive"},"is_booster_only":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Booster Only"},"required_role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Required Role Ids"},"required_role_mode":{"anyOf":[{"type":"string","enum":["any","all"]},{"type":"null"}],"title":"Required Role Mode"},"max_roles":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":0.0},{"type":"null"}],"title":"Max Roles"},"custom_title":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Custom Title"},"custom_description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Custom Description"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"position_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position Order"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"banner_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner Base64","description":"Banner als Base64-String"},"banner_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Banner Enabled"},"embed_color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Embed Color"}},"type":"object","title":"CategoryUpdate","description":"Schema zum Aktualisieren einer Kategorie"},"ChangePasswordBody":{"properties":{"old_password":{"type":"string","title":"Old Password"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["old_password","new_password"],"title":"ChangePasswordBody"},"ChannelActivityEntry":{"properties":{"channel_id":{"type":"string","title":"Channel Id"},"channel_name":{"type":"string","title":"Channel Name"},"channel_type":{"type":"string","title":"Channel Type"},"message_count":{"type":"integer","title":"Message Count"},"unique_users":{"type":"integer","title":"Unique Users"},"engagement_rate":{"type":"number","title":"Engagement Rate","description":"Messages pro User"}},"type":"object","required":["channel_id","channel_name","channel_type","message_count","unique_users","engagement_rate"],"title":"ChannelActivityEntry","description":"Statistiken für einen Channel"},"ChannelActivityResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"timeframe":{"type":"string","title":"Timeframe"},"start_date":{"type":"string","format":"date-time","title":"Start Date"},"end_date":{"type":"string","format":"date-time","title":"End Date"},"total_channels":{"type":"integer","title":"Total Channels"},"data":{"items":{"$ref":"#/components/schemas/ChannelActivityEntry"},"type":"array","title":"Data"}},"type":"object","required":["success","timeframe","start_date","end_date","total_channels","data"],"title":"ChannelActivityResponse","description":"Response für Channel-Aktivität"},"ChannelEntry":{"properties":{"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"channel_name":{"type":"string","title":"Channel Name"},"channel_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Type"},"value":{"title":"Value"}},"type":"object","required":["channel_name"],"title":"ChannelEntry"},"ChannelSnippet":{"properties":{"channel_id":{"type":"string","title":"Channel Id"},"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"}},"type":"object","required":["channel_id","name","type"],"title":"ChannelSnippet","description":"Minimale Channel-Info für die Anzeige im Frontend (ID, Name, Typ)."},"ChannelStatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"period":{"type":"string","title":"Period"},"user_id":{"type":"string","title":"User Id"},"stats":{"additionalProperties":true,"type":"object","title":"Stats","example":{"top_text_channels":[],"top_voice_channels":[],"unique_text_channels":15,"unique_voice_channels":8}},"insights":{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array","title":"Insights"}},"type":"object","required":["period","user_id","stats","insights"],"title":"ChannelStatsResponse","description":"Response für Kanal-Statistiken."},"CharacterBody":{"properties":{"name":{"type":"string","maxLength":80,"title":"Name"},"tagline":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Tagline"},"description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Description"},"avatar_url":{"anyOf":[{"type":"string","maxLength":400},{"type":"null"}],"title":"Avatar Url"},"avatar_asset_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Avatar Asset Id"},"persona":{"anyOf":[{"type":"string","maxLength":8000},{"type":"null"}],"title":"Persona"},"greeting":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Greeting"},"scenario":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Scenario"},"example_dialogue":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Example Dialogue"},"knowledge":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Knowledge"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"temperature":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Temperature"},"model_preference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Preference"},"definition_visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Definition Visible"}},"type":"object","required":["name"],"title":"CharacterBody"},"ChatMessage":{"properties":{"role":{"type":"string","title":"Role","description":"'user' oder 'assistant'"},"content":{"type":"string","title":"Content"},"ts":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ts","description":"ISO-Timestamp"},"cards":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Cards","description":"Feature-Karten, die zur Assistant-Antwort gehören"},"tool_calls":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tool Calls","description":"Spur der Tool-Aufrufe der Assistant-Antwort"}},"type":"object","required":["role","content"],"title":"ChatMessage"},"ChatRequest":{"properties":{"message":{"type":"string","maxLength":4000,"minLength":1,"title":"Message"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode","description":"'full' = Full Assistant (Standard) | 'strict' = Strict Management Only"},"conversation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Conversation Id","description":"ID der Konversation (None = neue erstellen)"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","description":"Gemini-Modell-Slug (z.B. 'gemini-3.1-pro-preview')"},"reset":{"type":"boolean","title":"Reset","description":"Vorherige Historie verwerfen","default":false},"thinking_effort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thinking Effort","description":"Thinking effort level: 'standard' (default) | 'extended'"},"auto_phase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auto Phase","description":"Auto-handoff phase signal: 'role_permissions' | 'channel_permissions'"}},"type":"object","required":["message"],"title":"ChatRequest"},"ChatResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"reply":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"usage":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Usage"},"feature_cards":{"items":{"$ref":"#/components/schemas/FeatureCard"},"type":"array","title":"Feature Cards"},"conversation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Conversation Id"},"model_used":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Used"},"fallback_used":{"type":"boolean","title":"Fallback Used","default":false},"thinking_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thinking Text"},"tool_calls":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tool Calls"}},"type":"object","required":["success"],"title":"ChatResponse"},"ChecklistCreate":{"properties":{"label":{"type":"string","maxLength":200,"minLength":1,"title":"Label"}},"type":"object","required":["label"],"title":"ChecklistCreate"},"ChecklistPatch":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Label"},"done":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Done"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","title":"ChecklistPatch"},"ChecklisteSichtbar":{"properties":{"ausblenden":{"type":"boolean","title":"Ausblenden","default":true}},"type":"object","title":"ChecklisteSichtbar","description":"`POST /clans/{id}/checklist/hide` - aus- oder wieder einblenden."},"ClaimCreate":{"properties":{"slot_id":{"type":"integer","title":"Slot Id"},"date":{"type":"string","maxLength":10,"minLength":10,"title":"Date"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"}},"type":"object","required":["slot_id","date"],"title":"ClaimCreate"},"ClaimRewardRequest":{"properties":{"reward_type":{"type":"string","title":"Reward Type","default":"premium"}},"type":"object","title":"ClaimRewardRequest"},"ClanEinstellungen":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Description"},"join_policy":{"anyOf":[{"type":"string","enum":["open","apply","invite"]},{"type":"null"}],"title":"Join Policy"},"min_level":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Min Level"},"emblem":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Emblem"},"color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Color"},"invite_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Invite Public"}},"type":"object","title":"ClanEinstellungen","description":"`PATCH /clans/{id}` - was ein Clan an sich selbst aendern darf.\n\nDie Laengen sind die Spaltenbreiten aus clans/regeln.py; das Muster der\nFarbe ist ein Hex-Wert, ob er in der Palette steht, sagt der Dienst.\n`join_policy` als Literal, damit ein Tippfehler im Frontend als 422\nauffaellt und nicht als \"Regel unbekannt\" beim Nutzer landet.\n\n`description` darf leer kommen: das ist das Loeschen der Beschreibung."},"ClanGruendung":{"properties":{"server_id":{"type":"string","pattern":"^\\d{1,22}$","title":"Server Id"},"name":{"type":"string","maxLength":64,"minLength":1,"title":"Name"},"tag":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Tag"},"emblem":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Emblem"},"farbe":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Farbe"},"beschreibung":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Beschreibung"}},"type":"object","required":["server_id","name"],"title":"ClanGruendung","description":"`POST /users/me/clan/found` - gruenden von der Website aus (Nachtlauf 2,\n\"Gruendung in 30 Sekunden\").\n\nDer Server ist Pflicht: er wird Heimatserver, und seine Regeln entscheiden\n(Gruendung erlaubt, Mindestlevel). Der Tag darf fehlen - dann schlaegt der\nDienst einen freien vor (`clans/start.py`). Emblem und Farbe sind die\nSchnellwahl des Assistenten; Laengen sind Spaltenbreiten, ob ein Wert\ngilt, sagt der Dienst mit einem Satz (wie bei `WappenWahl`)."},"ClanServerEinstellungen":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"founding_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Founding Allowed"},"founding_min_level":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Founding Min Level"},"home_only":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Home Only"},"announce_channel_id":{"anyOf":[{"type":"string","pattern":"^\\d{15,22}$"},{"type":"null"}],"title":"Announce Channel Id"},"announce_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Announce Enabled"},"season_role_id":{"anyOf":[{"type":"string","pattern":"^\\d{15,22}$"},{"type":"null"}],"title":"Season Role Id"},"nick_sync":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Nick Sync"},"auto_channels":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Channels"},"auto_channel_category_id":{"anyOf":[{"type":"string","pattern":"^\\d{15,22}$"},{"type":"null"}],"title":"Auto Channel Category Id"},"board_channel_id":{"anyOf":[{"type":"string","pattern":"^\\d{15,22}$"},{"type":"null"}],"title":"Board Channel Id"},"roles_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Roles Enabled"}},"type":"object","title":"ClanServerEinstellungen","description":"Die Regler aus `clan_server_settings` - alle optional.\n\nOptional und `exclude_unset`, weil das Dashboard drei Reiter hat\n(Uebersicht, Regeln, Premium) und jeder nur seine Felder schickt. Ein\nPflichtfeld hiesse: der Regeln-Reiter muesste den Premium-Schalter\nkennen, um ihn unveraendert mitzuschicken - und wuerde ihn beim ersten\nVersehen zuruecksetzen.\n\n`nick_sync` und `auto_channels` sind die zwei Premium-Schalter (Spec\nAbschnitt 10). Ob der Server Premium hat, prueft der Router, nicht das\nSchema: ein Schema kennt keinen Server."},"CleanupResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"deleted_count":{"type":"integer","title":"Deleted Count"},"updated_count":{"type":"integer","title":"Updated Count"},"remaining_count":{"type":"integer","title":"Remaining Count"},"deleted_roles":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Deleted Roles"}},"type":"object","required":["deleted_count","updated_count","remaining_count","deleted_roles"],"title":"CleanupResponse","description":"Schema für Cleanup-Response"},"CodeBody":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"CodeBody"},"ColorUpdate":{"properties":{"accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Color","description":"Accent color (Hex, RGB, RGBA or color name)"},"embed_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Color","description":"Embed color (Hex, RGB, RGBA or color name)"}},"type":"object","title":"ColorUpdate"},"CommandOverridePayload":{"properties":{"command_id":{"type":"string","maxLength":120,"title":"Command Id","description":"Kartenname des Befehls"},"slash_enabled":{"type":"boolean","title":"Slash Enabled","default":true},"prefix_enabled":{"type":"boolean","title":"Prefix Enabled","default":true},"permission_mode":{"type":"string","title":"Permission Mode","description":"default | custom | everyone","default":"default"},"required_permissions":{"items":{"type":"string"},"type":"array","title":"Required Permissions"},"required_role_ids":{"items":{"type":"string"},"type":"array","title":"Required Role Ids"},"require_both":{"type":"boolean","title":"Require Both","default":false}},"type":"object","required":["command_id"],"title":"CommandOverridePayload"},"CommandOverridesUpdate":{"properties":{"overrides":{"items":{"$ref":"#/components/schemas/CommandOverridePayload"},"type":"array","title":"Overrides"},"reset":{"items":{"type":"string"},"type":"array","title":"Reset","description":"command_ids, die auf Standard zurueckfallen"}},"type":"object","title":"CommandOverridesUpdate"},"CommandStats":{"properties":{"total_commands":{"type":"integer","title":"Total Commands","default":0},"total_successful":{"type":"integer","title":"Total Successful","default":0},"total_failed":{"type":"integer","title":"Total Failed","default":0},"success_rate":{"type":"number","title":"Success Rate","default":0.0},"top_commands":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Commands","default":[]},"top_command_users":{"items":{"$ref":"#/components/schemas/api__schemas__server_stats__LeaderboardEntry"},"type":"array","title":"Top Command Users","default":[]}},"type":"object","title":"CommandStats"},"CommentCreate":{"properties":{"body":{"type":"string","maxLength":4000,"minLength":1,"title":"Body"}},"type":"object","required":["body"],"title":"CommentCreate"},"CommitRequest":{"properties":{"token":{"type":"string","title":"Token"},"apply_roles":{"type":"boolean","title":"Apply Roles","default":false}},"type":"object","required":["token"],"title":"CommitRequest"},"CommunityChannelBody":{"properties":{"channel_id":{"type":"string","maxLength":30,"title":"Channel Id"},"mode":{"type":"string","title":"Mode","default":"assist"},"name":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Name","default":"AI"},"persona":{"anyOf":[{"type":"string","maxLength":8000},{"type":"null"}],"title":"Persona"},"knowledge":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Knowledge"},"greeting":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Greeting"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"temperature":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Temperature"},"reply_without_mention":{"type":"boolean","title":"Reply Without Mention","default":true},"cooldown_seconds":{"anyOf":[{"type":"integer","maximum":3600.0,"minimum":0.0},{"type":"null"}],"title":"Cooldown Seconds"},"allowed_role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Role Ids"},"is_enabled":{"type":"boolean","title":"Is Enabled","default":true},"character_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Character Id","description":"Deployter Marktplatz-Charakter"}},"type":"object","required":["channel_id"],"title":"CommunityChannelBody"},"CommunitySettingsBody":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"respond_to_mention":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Respond To Mention"},"command_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Command Enabled"},"monthly_token_budget":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Monthly Token Budget"},"cooldown_seconds":{"anyOf":[{"type":"integer","maximum":3600.0,"minimum":0.0},{"type":"null"}],"title":"Cooldown Seconds"},"per_user_daily_limit":{"anyOf":[{"type":"integer","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Per User Daily Limit"},"allowed_role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Role Ids"},"blocked_channel_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Blocked Channel Ids"},"default_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Model"},"default_persona":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Default Persona"},"max_history":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Max History"}},"type":"object","title":"CommunitySettingsBody"},"CompleteRequest":{"properties":{"duration_seconds":{"anyOf":[{"type":"integer","maximum":86400.0,"minimum":0.0},{"type":"null"}],"title":"Duration Seconds"},"identity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Identity"},"discovery_source":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Discovery Source"}},"type":"object","title":"CompleteRequest"},"ConditionIn":{"properties":{"type":{"type":"string","maxLength":40,"title":"Type"},"config":{"additionalProperties":true,"type":"object","title":"Config"}},"type":"object","required":["type"],"title":"ConditionIn"},"ConfigResponse":{"properties":{"id":{"type":"integer","title":"Id"},"embed_title":{"type":"string","title":"Embed Title"},"embed_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Description"},"embed_color":{"type":"string","title":"Embed Color"},"use_color":{"type":"boolean","title":"Use Color"},"banner_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner Base64"},"banner_enabled":{"type":"boolean","title":"Banner Enabled"},"image_position":{"type":"string","title":"Image Position"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"},"additional_message_ids":{"items":{"type":"string"},"type":"array","title":"Additional Message Ids"},"is_enabled":{"type":"boolean","title":"Is Enabled"},"auto_cleanup":{"type":"boolean","title":"Auto Cleanup"},"show_user_count":{"type":"boolean","title":"Show User Count"},"require_confirmation":{"type":"boolean","title":"Require Confirmation"},"separate_embeds_enabled":{"type":"boolean","title":"Separate Embeds Enabled"},"interaction_type":{"type":"string","title":"Interaction Type"},"max_roles_per_user_global":{"type":"integer","title":"Max Roles Per User Global"},"cooldown_seconds":{"type":"integer","title":"Cooldown Seconds"},"log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Channel Id"},"log_enabled":{"type":"boolean","title":"Log Enabled"},"total_categories":{"type":"integer","title":"Total Categories"},"total_roles":{"type":"integer","title":"Total Roles"},"active_categories":{"type":"integer","title":"Active Categories"},"active_roles":{"type":"integer","title":"Active Roles"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_updated_by_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Updated By Id"}},"type":"object","required":["id","embed_title","embed_description","embed_color","use_color","banner_base64","banner_enabled","image_position","channel_id","message_id","additional_message_ids","is_enabled","auto_cleanup","show_user_count","require_confirmation","separate_embeds_enabled","interaction_type","max_roles_per_user_global","cooldown_seconds","log_channel_id","log_enabled","total_categories","total_roles","active_categories","active_roles","created_at","updated_at","last_updated_by_id"],"title":"ConfigResponse","description":"Schema für Config-Response"},"ConfigUpdateRequest":{"properties":{"embed_title":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Embed Title"},"embed_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Description"},"embed_color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Embed Color"},"review_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Channel Id"},"auto_role_assignment":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Role Assignment"},"require_team_review":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Require Team Review"},"default_questions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Default Questions"},"panel_mode":{"anyOf":[{"type":"string","pattern":"^(classic|custom)$"},{"type":"null"}],"title":"Panel Mode"},"panel_container":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Panel Container"},"website_mode_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Website Mode Enabled"},"discord_mode_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Discord Mode Enabled"},"website_welcome_message":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Website Welcome Message"},"website_closed_message":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Website Closed Message"},"cooldown_hours":{"anyOf":[{"type":"integer","maximum":8760.0,"minimum":0.0},{"type":"null"}],"title":"Cooldown Hours"}},"type":"object","title":"ConfigUpdateRequest"},"ContainerJsonBody":{"properties":{"container_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Container Json","description":"Components-V2 Container-JSON (null/leer entfernt den Container)"}},"type":"object","title":"ContainerJsonBody"},"ControlCenterResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"server_id":{"type":"string","title":"Server Id"},"server_name":{"type":"string","title":"Server Name"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"live_status":{"$ref":"#/components/schemas/LiveStatus"},"server_health":{"anyOf":[{"$ref":"#/components/schemas/ServerHealth"},{"type":"null"}]},"quick_stats":{"$ref":"#/components/schemas/QuickStats"},"trends":{"$ref":"#/components/schemas/TrendAnalysis"},"insights":{"items":{"$ref":"#/components/schemas/SmartInsight"},"type":"array","title":"Insights"},"anomalies":{"items":{"$ref":"#/components/schemas/AnomalyDetection"},"type":"array","title":"Anomalies"},"recent_activity":{"items":{"$ref":"#/components/schemas/ActivityTimelineItem"},"type":"array","title":"Recent Activity"}},"type":"object","required":["success","server_id","server_name","generated_at","live_status","quick_stats","trends","insights","anomalies","recent_activity"],"title":"ControlCenterResponse","description":"Main Control Center Response"},"ConversationListItem":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"mode":{"type":"string","title":"Mode","default":"full"},"message_count":{"type":"integer","title":"Message Count","default":0},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id"],"title":"ConversationListItem"},"ConversationListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"conversations":{"items":{"$ref":"#/components/schemas/ConversationListItem"},"type":"array","title":"Conversations"}},"type":"object","required":["success","conversations"],"title":"ConversationListResponse"},"ConversationResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"messages":{"items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array","title":"Messages"},"mode":{"type":"string","title":"Mode"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"conversation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Conversation Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},"type":"object","required":["success","messages","mode"],"title":"ConversationResponse"},"ConvertRequest":{"properties":{"with_images":{"type":"boolean","title":"With Images","description":"Emojis, Sticker und Bilder umhosten","default":true}},"type":"object","title":"ConvertRequest"},"CooldownScope":{"type":"string","enum":["user","channel","guild"],"title":"CooldownScope"},"CoopRequestAccept":{"properties":{"channel_id":{"type":"string","title":"Channel Id","description":"ID des Channels, in dem das Giveaway gesendet werden soll"},"ping_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ping Role Id","description":"ID der Rolle, die beim Senden gepingt wird (optional)"}},"type":"object","required":["channel_id"],"title":"CoopRequestAccept","description":"Body für Coop-Annahme: Kanal Pflicht, Ping-Rolle optional"},"CoopRequestChannelUpdate":{"properties":{"channel_id":{"type":"string","title":"Channel Id","description":"ID des ausgewählten Kanals"},"ping_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ping Role Id","description":"ID der Rolle, die beim Senden gepingt wird (optional)"}},"type":"object","required":["channel_id"],"title":"CoopRequestChannelUpdate"},"CoopRequestInfo":{"properties":{"id":{"type":"integer","title":"Id"},"giveaway_id":{"type":"integer","title":"Giveaway Id"},"giveaway_title":{"type":"string","title":"Giveaway Title"},"giveaway_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Giveaway Description"},"giveaway_prize":{"type":"string","title":"Giveaway Prize"},"giveaway_winner_count":{"type":"integer","title":"Giveaway Winner Count","default":1},"giveaway_end_time":{"type":"string","format":"date-time","title":"Giveaway End Time"},"giveaway_cooperation_mode":{"type":"string","title":"Giveaway Cooperation Mode"},"giveaway_cooperation_host_only":{"type":"boolean","title":"Giveaway Cooperation Host Only","default":false},"giveaway_requirements":{"anyOf":[{"$ref":"#/components/schemas/GiveawayRequirements"},{"type":"null"}]},"giveaway_is_active":{"type":"boolean","title":"Giveaway Is Active","default":false},"giveaway_is_ended":{"type":"boolean","title":"Giveaway Is Ended","default":false},"hosting_server_id":{"type":"string","title":"Hosting Server Id"},"hosting_server_name":{"type":"string","title":"Hosting Server Name"},"hosting_server_icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hosting Server Icon"},"all_partner_servers":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"All Partner Servers"},"status":{"type":"string","title":"Status"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"ping_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ping Role Id"},"requirements":{"anyOf":[{"$ref":"#/components/schemas/GiveawayRequirements"},{"type":"null"}]},"partner_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner Title"},"partner_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner Description"},"partner_prize":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner Prize"},"partner_winner_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Partner Winner Count"},"has_partner_banner":{"type":"boolean","title":"Has Partner Banner","default":false},"responded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Responded At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","giveaway_id","giveaway_title","giveaway_prize","giveaway_end_time","giveaway_cooperation_mode","hosting_server_id","hosting_server_name","hosting_server_icon","all_partner_servers","status","channel_id","requirements","responded_at","created_at"],"title":"CoopRequestInfo","description":"Vollständige Coop-Anfrage (für Partner-Sicht)"},"CoopRequestListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/CoopRequestInfo"},"type":"array","title":"Data"}},"type":"object","required":["success","data"],"title":"CoopRequestListResponse"},"CoopRequestRequirementsUpdate":{"properties":{"requirements":{"anyOf":[{"$ref":"#/components/schemas/GiveawayRequirements"},{"type":"null"}]}},"type":"object","title":"CoopRequestRequirementsUpdate"},"CoopRequestSettingsUpdate":{"properties":{"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"partner_title":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Partner Title"},"partner_description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Partner Description"},"partner_prize":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Partner Prize"},"partner_winner_count":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":1.0},{"type":"null"}],"title":"Partner Winner Count"},"requirements":{"anyOf":[{"$ref":"#/components/schemas/GiveawayRequirements"},{"type":"null"}]}},"type":"object","title":"CoopRequestSettingsUpdate","description":"Umfassendes Update-Schema für alle Partner-Einstellungen einer Coop-Anfrage"},"CoopRequestSummary":{"properties":{"id":{"type":"integer","title":"Id"},"partner_server_id":{"type":"string","title":"Partner Server Id"},"partner_server_name":{"type":"string","title":"Partner Server Name"},"partner_server_icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partner Server Icon"},"partner_server_member_count":{"type":"integer","title":"Partner Server Member Count","default":0},"status":{"type":"string","title":"Status"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"ping_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ping Role Id"},"responded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Responded At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","partner_server_id","partner_server_name","partner_server_icon","status","channel_id","responded_at","created_at"],"title":"CoopRequestSummary","description":"Kurz-Übersicht einer Coop-Anfrage (für Hoster-Sicht)"},"CoopRequestSummaryListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/CoopRequestSummary"},"type":"array","title":"Data"},"readiness":{"$ref":"#/components/schemas/CoopRequestsReadiness"}},"type":"object","required":["success","data"],"title":"CoopRequestSummaryListResponse"},"CoopRequestsReadiness":{"properties":{"total":{"type":"integer","title":"Total"},"pending":{"type":"integer","title":"Pending"},"accepted":{"type":"integer","title":"Accepted"},"declined":{"type":"integer","title":"Declined"},"removed":{"type":"integer","title":"Removed"},"accepted_without_channel":{"type":"integer","title":"Accepted Without Channel"},"all_ready":{"type":"boolean","title":"All Ready"}},"type":"object","required":["total","pending","accepted","declined","removed","accepted_without_channel","all_ready"],"title":"CoopRequestsReadiness","description":"Bereitschafts-Status aller Coop-Anfragen eines Giveaways"},"CounterCreate":{"properties":{"platform":{"type":"string","enum":["youtube","twitch","kick"],"title":"Platform"},"username_or_id":{"type":"string","title":"Username Or Id","description":"Channel handle/URL/ID/slug to resolve"},"metric":{"type":"string","title":"Metric","description":"Metric id (see counter-metrics)"},"discord_channel_id":{"type":"string","title":"Discord Channel Id","description":"Discord channel ID to rename"},"name_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Template","description":"Name template","default":"{emoji} {label}: {value}"}},"type":"object","required":["platform","username_or_id","metric","discord_channel_id"],"title":"CounterCreate"},"CounterUpdate":{"properties":{"metric":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric"},"discord_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discord Channel Id"},"name_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Template"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"CounterUpdate"},"CountingConfigResponse":{"properties":{"counting_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Counting Channel Id"},"current_count":{"type":"integer","title":"Current Count"},"last_counter_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Counter Id"},"last_counter_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Counter Username"},"last_valid_count_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Valid Count Time"},"highest_count":{"type":"integer","title":"Highest Count","default":0},"highest_count_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Highest Count User Id"},"highest_count_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Highest Count Username"},"highest_count_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Highest Count At"},"total_counts":{"type":"integer","title":"Total Counts","default":0}},"type":"object","required":["counting_channel_id","current_count","last_counter_id","last_valid_count_time"],"title":"CountingConfigResponse"},"CountingFullResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"config":{"$ref":"#/components/schemas/CountingConfigResponse"},"settings":{"$ref":"#/components/schemas/CountingSettingsResponse"},"defaults":{"additionalProperties":true,"type":"object","title":"Defaults"}},"type":"object","required":["success","config","settings","defaults"],"title":"CountingFullResponse"},"CountingSettingsResponse":{"properties":{"anti_grief_enabled":{"type":"boolean","title":"Anti Grief Enabled","default":true},"allow_normal_messages":{"type":"boolean","title":"Allow Normal Messages","default":false},"allow_expressions":{"type":"boolean","title":"Allow Expressions","default":true},"delete_wrong_messages":{"type":"boolean","title":"Delete Wrong Messages","default":true},"show_progress_milestones":{"type":"boolean","title":"Show Progress Milestones","default":true},"milestone_intervals":{"items":{"type":"integer"},"type":"array","title":"Milestone Intervals","default":[100,500,1000,5000,10000]},"max_fails_before_ban":{"type":"integer","title":"Max Fails Before Ban","default":3}},"type":"object","title":"CountingSettingsResponse"},"CountingSettingsUpdate":{"properties":{"counting_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Counting Channel Id","description":"Counting Channel ID"},"anti_grief_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Anti Grief Enabled"},"allow_normal_messages":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Normal Messages"},"allow_expressions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Expressions"},"delete_wrong_messages":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Delete Wrong Messages"},"show_progress_milestones":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Progress Milestones"},"max_fails_before_ban":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":1.0},{"type":"null"}],"title":"Max Fails Before Ban"}},"type":"object","title":"CountingSettingsUpdate"},"CountingStatsListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/CountingUserStatsResponse"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"}},"type":"object","required":["success","data","pagination"],"title":"CountingStatsListResponse"},"CountingUserStatsResponse":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"correct_counts":{"type":"integer","title":"Correct Counts"},"failed_counts":{"type":"integer","title":"Failed Counts"},"total_attempts":{"type":"integer","title":"Total Attempts"},"accuracy":{"type":"number","title":"Accuracy"},"highest_number":{"type":"integer","title":"Highest Number","default":0},"current_streak":{"type":"integer","title":"Current Streak","default":0},"best_streak":{"type":"integer","title":"Best Streak","default":0}},"type":"object","required":["user_id","username","avatar_url","correct_counts","failed_counts","total_attempts","accuracy"],"title":"CountingUserStatsResponse"},"CountingValueUpdate":{"properties":{"value":{"type":"integer","minimum":0.0,"title":"Value","description":"New counter value"}},"type":"object","required":["value"],"title":"CountingValueUpdate"},"CreateAbsenceRequest":{"properties":{"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"type":"string","format":"date","title":"End Date"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"absence_type":{"type":"string","maxLength":50,"title":"Absence Type","default":"vacation"},"sync_server_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":100},{"type":"null"}],"title":"Sync Server Ids"},"sync_excluded_server_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":200},{"type":"null"}],"title":"Sync Excluded Server Ids"}},"type":"object","required":["start_date","end_date"],"title":"CreateAbsenceRequest"},"CreateBlueprintRequest":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"mode":{"type":"string","title":"Mode","description":"template | clone","default":"template"},"summary":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Summary"},"category":{"type":"string","maxLength":50,"title":"Category","default":"community"}},"type":"object","required":["name"],"title":"CreateBlueprintRequest"},"CreateDiscountBody":{"properties":{"percent":{"type":"integer","title":"Percent"}},"type":"object","required":["percent"],"title":"CreateDiscountBody"},"CreateEventRequest":{"properties":{"title":{"type":"string","maxLength":200,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"start_time":{"type":"string","format":"date-time","title":"Start Time"},"end_time":{"type":"string","format":"date-time","title":"End Time"},"event_type":{"type":"string","maxLength":50,"title":"Event Type","default":"meeting"},"category":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Category"},"voice_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Channel Id"},"notification_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Channel Id"},"track_attendance":{"type":"boolean","title":"Track Attendance","default":true},"require_voice_attendance":{"type":"boolean","title":"Require Voice Attendance","default":false},"is_recurring":{"type":"boolean","title":"Is Recurring","default":false},"recurrence_rule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recurrence Rule"},"recurrence_end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Recurrence End Date"},"require_rsvp":{"type":"boolean","title":"Require Rsvp","default":true},"rsvp_deadline":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Rsvp Deadline"},"max_participants":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Participants"},"priority":{"type":"string","maxLength":20,"title":"Priority","default":"normal"},"color_hex":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color Hex"},"meeting_link":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Meeting Link"},"attachment_urls":{"items":{"type":"string"},"type":"array","title":"Attachment Urls","default":[]},"target_group_ids":{"items":{"type":"integer"},"type":"array","title":"Target Group Ids","default":[]},"target_user_ids":{"items":{"type":"string"},"type":"array","title":"Target User Ids","default":[]},"target_role_ids":{"items":{"type":"string"},"type":"array","title":"Target Role Ids","default":[]}},"type":"object","required":["title","start_time","end_time"],"title":"CreateEventRequest"},"CreateNoteRequest":{"properties":{"content":{"type":"string","maxLength":1000,"minLength":1,"title":"Content","description":"Inhalt der Notiz"},"category":{"$ref":"#/components/schemas/NoteCategory","default":"other"},"is_important":{"type":"boolean","title":"Is Important","default":false}},"type":"object","required":["content"],"title":"CreateNoteRequest","description":"Schema zum Erstellen einer Notiz."},"CreatePromotion":{"properties":{"user_id":{"type":"string","title":"User Id","description":"The Discord User ID of the team member"},"promotion_date":{"type":"string","format":"date-time","title":"Promotion Date","description":"The UTC date and time of the promotion"},"target_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Role Id","description":"The role ID to be assigned"},"note":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Note","description":"Optional note"}},"type":"object","required":["user_id","promotion_date"],"title":"CreatePromotion"},"CreateTemplateRequest":{"properties":{"template_name":{"type":"string","maxLength":100,"title":"Template Name"},"title":{"type":"string","maxLength":200,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"event_type":{"type":"string","maxLength":50,"title":"Event Type"},"category":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Category"},"default_duration_minutes":{"type":"integer","title":"Default Duration Minutes","default":60},"voice_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Channel Id"},"track_attendance":{"type":"boolean","title":"Track Attendance","default":true},"require_rsvp":{"type":"boolean","title":"Require Rsvp","default":true},"priority":{"type":"string","maxLength":20,"title":"Priority","default":"normal"},"color_hex":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color Hex"}},"type":"object","required":["template_name","title","event_type"],"title":"CreateTemplateRequest"},"CrossStats":{"properties":{"messages_per_voice_hour":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Messages Per Voice Hour"},"most_active_voice_texters":{"items":{"$ref":"#/components/schemas/api__schemas__server_stats__LeaderboardEntry"},"type":"array","title":"Most Active Voice Texters","default":[]},"engagement_score_leaderboard":{"items":{"$ref":"#/components/schemas/api__schemas__server_stats__LeaderboardEntry"},"type":"array","title":"Engagement Score Leaderboard","default":[]}},"type":"object","title":"CrossStats","description":"Cross-referenced / correlated stats for deeper insights."},"CustomAILimitsBody":{"properties":{"max_requests":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Max Requests","description":"Maximale Anfragen pro Monat"},"max_characters":{"anyOf":[{"type":"integer","minimum":1000.0},{"type":"null"}],"title":"Max Characters","description":"(Legacy) Maximale Zeichen pro Monat"},"max_tokens":{"anyOf":[{"type":"integer","minimum":1000.0},{"type":"null"}],"title":"Max Tokens","description":"Maximale Tokens pro Monat"}},"type":"object","title":"CustomAILimitsBody"},"CustomGeminiKeyBody":{"properties":{"api_key":{"type":"string","minLength":10,"title":"Api Key","description":"Benutzerdefinierter Gemini API Key"}},"type":"object","required":["api_key"],"title":"CustomGeminiKeyBody"},"CustomShopItemCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"emoji":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emoji"},"price_gems":{"type":"integer","exclusiveMinimum":0.0,"title":"Price Gems"},"role_id":{"type":"string","title":"Role Id"},"role_name":{"type":"string","title":"Role Name"},"is_permanent":{"type":"boolean","title":"Is Permanent"},"duration_seconds":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Duration Seconds"},"is_available":{"type":"boolean","title":"Is Available","default":true},"max_purchases_per_user":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Purchases Per User"},"stock_limit":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Stock Limit"},"required_level":{"type":"integer","minimum":1.0,"title":"Required Level","default":1},"category":{"type":"string","title":"Category","default":"roles"},"position_order":{"type":"integer","title":"Position Order","default":0}},"type":"object","required":["name","price_gems","role_id","role_name","is_permanent"],"title":"CustomShopItemCreate","description":"Schema for creating a new shop item"},"CustomShopItemResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"emoji":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emoji"},"price_gems":{"type":"integer","title":"Price Gems"},"role_id":{"type":"string","title":"Role Id"},"role_name":{"type":"string","title":"Role Name"},"is_permanent":{"type":"boolean","title":"Is Permanent"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"is_available":{"type":"boolean","title":"Is Available"},"max_purchases_per_user":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Purchases Per User"},"stock_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stock Limit"},"stock_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stock Remaining"},"required_level":{"type":"integer","title":"Required Level"},"category":{"type":"string","title":"Category"},"position_order":{"type":"integer","title":"Position Order"},"total_purchases":{"type":"integer","title":"Total Purchases"},"total_gems_spent":{"type":"integer","title":"Total Gems Spent"},"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","description","emoji","price_gems","role_id","role_name","is_permanent","duration_seconds","is_available","max_purchases_per_user","stock_limit","stock_remaining","required_level","category","position_order","total_purchases","total_gems_spent","created_at","updated_at"],"title":"CustomShopItemResponse","description":"Schema for shop item response"},"CustomShopItemUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"emoji":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emoji"},"price_gems":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Price Gems"},"is_permanent":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Permanent"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"is_available":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Available"},"max_purchases_per_user":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Purchases Per User"},"stock_limit":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Stock Limit"},"required_level":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Required Level"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"position_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position Order"}},"type":"object","title":"CustomShopItemUpdate","description":"Schema for updating a shop item"},"CustomShopPurchaseResponse":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"string","title":"User Id"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"item_name":{"type":"string","title":"Item Name"},"role_id":{"type":"string","title":"Role Id"},"role_name":{"type":"string","title":"Role Name"},"price_paid":{"type":"integer","title":"Price Paid"},"is_permanent":{"type":"boolean","title":"Is Permanent"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"status":{"type":"string","title":"Status"},"role_granted":{"type":"boolean","title":"Role Granted"},"purchased_at":{"type":"string","format":"date-time","title":"Purchased At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["id","user_id","item_name","role_id","role_name","price_paid","is_permanent","duration_seconds","status","role_granted","purchased_at","expires_at"],"title":"CustomShopPurchaseResponse","description":"Schema for purchase response"},"CustomStepsRequest":{"properties":{"enabled_steps":{"items":{"type":"string"},"type":"array","title":"Enabled Steps","description":"List of feature keys to enable for this server's onboarding"}},"type":"object","required":["enabled_steps"],"title":"CustomStepsRequest"},"DailyDataPoint":{"properties":{"date":{"type":"string","title":"Date"},"value":{"type":"number","title":"Value"}},"type":"object","required":["date","value"],"title":"DailyDataPoint","description":"Single daily data point for trend graphs"},"DailyDistribution":{"properties":{"weekday":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Weekday","description":"0=Monday, 6=Sunday"},"value":{"type":"integer","title":"Value"}},"type":"object","required":["weekday","value"],"title":"DailyDistribution"},"DeleteBody":{"properties":{"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"}},"type":"object","title":"DeleteBody"},"DesktopRedeemBody":{"properties":{"code":{"type":"string","title":"Code"},"code_verifier":{"type":"string","title":"Code Verifier"}},"type":"object","required":["code","code_verifier"],"title":"DesktopRedeemBody"},"DiscoveryRequest":{"properties":{"source":{"type":"string","maxLength":50,"title":"Source","description":"Discovery source (e.g. topgg, google)"},"detail":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Detail","description":"Feinheit zur Quelle, z.B. der beworbene Top.gg-Tag"}},"type":"object","required":["source"],"title":"DiscoveryRequest"},"DiscoveryResponse":{"properties":{"trending":{"items":{"$ref":"#/components/schemas/ServerListItem"},"type":"array","title":"Trending"},"top_active":{"items":{"$ref":"#/components/schemas/ServerListItem"},"type":"array","title":"Top Active"},"top_rated":{"items":{"$ref":"#/components/schemas/ServerListItem"},"type":"array","title":"Top Rated"},"new_comers":{"items":{"$ref":"#/components/schemas/ServerListItem"},"type":"array","title":"New Comers"}},"type":"object","required":["trending","top_active","top_rated","new_comers"],"title":"DiscoveryResponse"},"DismissStepRequest":{"properties":{"step_key":{"type":"string","title":"Step Key"}},"type":"object","required":["step_key"],"title":"DismissStepRequest"},"DmSettingsUpdate":{"properties":{"show_moderator":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Moderator"}},"type":"object","title":"DmSettingsUpdate"},"DownloadBody":{"properties":{"passwort":{"type":"string","maxLength":200,"title":"Passwort","default":""}},"type":"object","title":"DownloadBody"},"DraftIn":{"properties":{"payload":{"title":"Payload","description":"Die eingerichtete Konfiguration, unveraendert"}},"type":"object","required":["payload"],"title":"DraftIn"},"EconomyStats":{"properties":{"total_transactions":{"type":"integer","title":"Total Transactions","default":0},"total_volume":{"type":"integer","title":"Total Volume","default":0},"active_users":{"type":"integer","title":"Active Users","default":0},"top_balances":{"items":{"$ref":"#/components/schemas/api__schemas__server_stats__LeaderboardEntry"},"type":"array","title":"Top Balances","default":[]}},"type":"object","title":"EconomyStats"},"Einfrieren":{"properties":{"eingefroren":{"type":"boolean","title":"Eingefroren"},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","required":["eingefroren"],"title":"Einfrieren"},"EingriffRuecknahme":{"properties":{"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","title":"EingriffRuecknahme","description":"Einen Eingriff zurueckdrehen.\n\nNur ein Grund - WAS zurueckgedreht wird, steht im Protokoll und nicht im\nAntrag. Kaeme der Vorher-Wert vom Aufrufer, koennte er ihn frei waehlen,\nund das Rueckgaengig waere ein zweiter, unbeschraenkter Setzen-Weg an der\nGems-Regel vorbei."},"EinladungBody":{"properties":{"art":{"type":"string","maxLength":16,"title":"Art"},"rolle":{"type":"string","maxLength":16,"title":"Rolle"},"konto_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Konto Id"},"vorab":{"anyOf":[{"items":{"$ref":"#/components/schemas/Uebergabe"},"type":"array","maxItems":4},{"type":"null"}],"title":"Vorab"},"beleg":{"anyOf":[{"$ref":"#/components/schemas/Beleg"},{"type":"null"}]}},"type":"object","required":["art","rolle"],"title":"EinladungBody"},"EinladungNeu":{"properties":{"user_id":{"type":"string","pattern":"^\\d{1,22}$","title":"User Id"},"server_id":{"type":"string","pattern":"^\\d{1,22}$","title":"Server Id"},"nachricht":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Nachricht"}},"type":"object","required":["user_id","server_id"],"title":"EinladungNeu","description":"`POST /clans/{id}/invites` - jemanden von der Website aus einladen.\n\n`server_id` ist der gemeinsame Server, auf dem der Einladende die Person\ngefunden hat; die Knoepfe der DM tragen ihn, damit ein Annehmen dort\nzaehlt. Die Nachricht prueft der Dienst (Laenge, Links, Wortfilter) -\ndie Obergrenze hier ist nur der Deckel gegen einen Megabyte-Body."},"EinladungsAntwort":{"properties":{"server_id":{"anyOf":[{"type":"string","pattern":"^\\d{15,22}$"},{"type":"null"}],"title":"Server Id"}},"type":"object","title":"EinladungsAntwort","description":"Eine Einladung annehmen oder ablehnen.\n\n`server_id` ist der Server, auf dem der Beitritt gezaehlt wird (Praesenz,\nServer-Regeln). Von der Website aus gibt es keinen \"aktuellen Server\";\nfehlt er, nimmt der Router den Heimatserver des Clans."},"EinstellungenAenderung":{"properties":{"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled"},"timezone":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Timezone"},"coins_name":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Coins Name"},"coins_emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Coins Emoji"},"gems_name":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Gems Name"},"gems_emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Gems Emoji"},"tokens_name":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Tokens Name"},"tokens_emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Tokens Emoji"},"shop_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shop Channel Id"},"log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Channel Id"},"gift_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Gift Enabled"},"default_sell_ratio":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Default Sell Ratio"},"public_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Public Enabled"},"public_slug":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Public Slug"},"public_title":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Public Title"},"public_subtitle":{"anyOf":[{"type":"string","maxLength":180},{"type":"null"}],"title":"Public Subtitle"},"public_banner_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Public Banner Url"},"public_accent":{"anyOf":[{"type":"string","maxLength":9},{"type":"null"}],"title":"Public Accent"},"public_layout":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Layout"},"public_featured_item_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Public Featured Item Id"},"public_show_leaderboard":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Public Show Leaderboard"},"allow_web_purchase":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Web Purchase"}},"type":"object","title":"EinstellungenAenderung"},"EintragAendernBody":{"properties":{"basis_revision":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"Basis Revision"},"meta_enc":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Meta Enc"},"meta_version":{"anyOf":[{"type":"integer","maximum":9007199254740991.0,"minimum":0.0},{"type":"null"}],"title":"Meta Version"},"login_enc":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Login Enc"},"login_version":{"anyOf":[{"type":"integer","maximum":9007199254740991.0,"minimum":0.0},{"type":"null"}],"title":"Login Version"},"login_geaendert":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Login Geaendert"},"region":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Region"}},"type":"object","required":["basis_revision"],"title":"EintragAendernBody"},"EintragBody":{"properties":{"puuid":{"type":"string","maxLength":64,"title":"Puuid"},"region":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Region"},"meta_enc":{"type":"string","maxLength":2048,"title":"Meta Enc"},"meta_version":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"Meta Version"},"login_enc":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Login Enc"},"login_version":{"anyOf":[{"type":"integer","maximum":9007199254740991.0,"minimum":0.0},{"type":"null"}],"title":"Login Version"}},"type":"object","required":["puuid","meta_enc","meta_version"],"title":"EintragBody"},"EmailChangeConfirmBody":{"properties":{"change_token":{"type":"string","title":"Change Token"},"code":{"type":"string","title":"Code"}},"type":"object","required":["change_token","code"],"title":"EmailChangeConfirmBody"},"EmailChangeStartBody":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"EmailChangeStartBody"},"EmbedButtonCreate":{"properties":{"label":{"type":"string","maxLength":80,"title":"Label","description":"Button Text"},"style":{"anyOf":[{"type":"string"},{"type":"integer"}],"title":"Style","description":"1=primary, 2=secondary, 3=success, 4=danger, 5=link","default":1},"emoji":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Emoji"},"url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Url","description":"Nur für Link-Buttons (style=5)"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position","description":"Position im Row","default":0},"row":{"anyOf":[{"type":"integer","maximum":4.0,"minimum":0.0},{"type":"null"}],"title":"Row","description":"Row (0-4)","default":0},"action_type":{"type":"string","enum":["show_embed","link","role","custom","none","send_embed","toggle_role","add_role","remove_role","open_ticket"],"title":"Action Type","default":"none"},"action_embed_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Action Embed Id","description":"Embed ID für show_embed action"},"action_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Role Id","description":"Role ID für role action"},"action_role_mode":{"anyOf":[{"type":"string","enum":["add","remove","toggle"]},{"type":"null"}],"title":"Action Role Mode"},"action_ticket_panel_option_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Action Ticket Panel Option Id","description":"TicketPanelOption ID für open_ticket action"}},"type":"object","required":["label"],"title":"EmbedButtonCreate"},"EmbedButtonUpdate":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Label"},"style":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"title":"Style"},"emoji":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Emoji"},"url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Url"},"disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Disabled"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"row":{"anyOf":[{"type":"integer","maximum":4.0,"minimum":0.0},{"type":"null"}],"title":"Row"},"action_type":{"anyOf":[{"type":"string","enum":["show_embed","link","role","custom","none","send_embed","toggle_role","add_role","remove_role","open_ticket"]},{"type":"null"}],"title":"Action Type"},"action_embed_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Action Embed Id"},"action_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Role Id"},"action_role_mode":{"anyOf":[{"type":"string","enum":["add","remove","toggle"]},{"type":"null"}],"title":"Action Role Mode"},"action_ticket_panel_option_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Action Ticket Panel Option Id"}},"type":"object","title":"EmbedButtonUpdate"},"EmbedField":{"properties":{"name":{"type":"string","maxLength":256,"title":"Name","description":"Field name"},"value":{"type":"string","maxLength":1024,"title":"Value","description":"Field value"},"inline":{"type":"boolean","title":"Inline","description":"Inline display","default":false}},"type":"object","required":["name","value"],"title":"EmbedField","description":"Embed Field Schema"},"EmbedFieldCreate":{"properties":{"name":{"type":"string","maxLength":256,"title":"Name","description":"Field Name"},"value":{"type":"string","maxLength":1024,"title":"Value","description":"Field Value"},"inline":{"type":"boolean","title":"Inline","description":"Inline anzeigen?","default":false},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position","description":"Position (optional)"}},"type":"object","required":["name","value"],"title":"EmbedFieldCreate"},"EmbedFieldIO":{"properties":{"name":{"type":"string","maxLength":256,"title":"Name"},"value":{"type":"string","maxLength":1024,"title":"Value"},"inline":{"type":"boolean","title":"Inline","default":false}},"type":"object","required":["name","value"],"title":"EmbedFieldIO"},"EmbedFieldUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Name"},"value":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Value"},"inline":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Inline"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","title":"EmbedFieldUpdate"},"EmbedGroupCreate":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"embed_ids":{"items":{"type":"integer"},"type":"array","title":"Embed Ids","description":"Liste von Embed IDs in Reihenfolge"}},"type":"object","required":["name","embed_ids"],"title":"EmbedGroupCreate"},"EmbedGroupListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/EmbedGroupResponse"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"}},"type":"object","required":["success","data","pagination"],"title":"EmbedGroupListResponse"},"EmbedGroupResponse":{"properties":{"id":{"type":"integer","title":"Id"},"server_id":{"type":"string","title":"Server Id"},"created_by_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"embed_count":{"type":"integer","title":"Embed Count"},"sent_message_ids":{"items":{"type":"string"},"type":"array","title":"Sent Message Ids"},"sent_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sent Channel Id"},"sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sent At"},"times_sent":{"type":"integer","title":"Times Sent"},"last_sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Sent At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","server_id","created_by_id","name","description","embed_count","sent_message_ids","sent_channel_id","sent_at","times_sent","last_sent_at","created_at","updated_at"],"title":"EmbedGroupResponse"},"EmbedGroupUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"embed_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Embed Ids","description":"Neue Reihenfolge"}},"type":"object","title":"EmbedGroupUpdate"},"EmbedListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/EmbedTemplateResponse"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"},"limits":{"additionalProperties":true,"type":"object","title":"Limits"}},"type":"object","required":["success","data","pagination","limits"],"title":"EmbedListResponse"},"EmbedModeUpdate":{"properties":{"embed_mode":{"type":"string","enum":["combined","separate"],"title":"Embed Mode","description":"Embed-Modus"}},"type":"object","required":["embed_mode"],"title":"EmbedModeUpdate","description":"Schema für Embed-Modus-Update"},"EmbedSelectMenuCreate":{"properties":{"placeholder":{"anyOf":[{"type":"string","maxLength":150},{"type":"null"}],"title":"Placeholder","description":"Platzhaltertext"},"min_values":{"type":"integer","maximum":25.0,"minimum":0.0,"title":"Min Values","description":"Minimum Auswahl","default":1},"max_values":{"type":"integer","maximum":25.0,"minimum":1.0,"title":"Max Values","description":"Maximum Auswahl","default":1},"disabled":{"type":"boolean","title":"Disabled","default":false},"row":{"anyOf":[{"type":"integer","maximum":4.0,"minimum":0.0},{"type":"null"}],"title":"Row","description":"Row (0-4)","default":0},"action_type":{"type":"string","enum":["show_embed","link","role","custom","none","send_embed","toggle_role","add_role","remove_role","open_ticket"],"title":"Action Type","description":"Default action type für Optionen","default":"none"},"options":{"items":{"$ref":"#/components/schemas/EmbedSelectMenuOptionCreate"},"type":"array","title":"Options","description":"Optionen des Select Menus (max 25)"}},"type":"object","title":"EmbedSelectMenuCreate"},"EmbedSelectMenuOptionCreate":{"properties":{"label":{"type":"string","maxLength":100,"title":"Label","description":"Angezeigter Text der Option"},"value":{"type":"string","maxLength":100,"title":"Value","description":"Interner Wert (unique pro Menu)"},"description":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Description","description":"Optionale Beschreibung"},"emoji":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Emoji"},"is_default":{"type":"boolean","title":"Is Default","description":"Standardmäßig ausgewählt","default":false},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position","description":"Position/Sortierung","default":0},"action_type":{"type":"string","enum":["show_embed","link","role","custom","none","send_embed","toggle_role","add_role","remove_role","open_ticket"],"title":"Action Type","default":"none"},"action_embed_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Action Embed Id","description":"Embed ID für show_embed/send_embed action"},"action_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Role Id","description":"Role ID für role action"},"action_role_mode":{"anyOf":[{"type":"string","enum":["add","remove","toggle"]},{"type":"null"}],"title":"Action Role Mode"},"action_ticket_panel_option_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Action Ticket Panel Option Id","description":"TicketPanelOption ID für open_ticket action"}},"type":"object","required":["label","value"],"title":"EmbedSelectMenuOptionCreate"},"EmbedSelectMenuUpdate":{"properties":{"placeholder":{"anyOf":[{"type":"string","maxLength":150},{"type":"null"}],"title":"Placeholder"},"min_values":{"anyOf":[{"type":"integer","maximum":25.0,"minimum":0.0},{"type":"null"}],"title":"Min Values"},"max_values":{"anyOf":[{"type":"integer","maximum":25.0,"minimum":1.0},{"type":"null"}],"title":"Max Values"},"disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Disabled"},"row":{"anyOf":[{"type":"integer","maximum":4.0,"minimum":0.0},{"type":"null"}],"title":"Row"},"action_type":{"anyOf":[{"type":"string","enum":["show_embed","link","role","custom","none","send_embed","toggle_role","add_role","remove_role","open_ticket"]},{"type":"null"}],"title":"Action Type"},"options":{"anyOf":[{"items":{"$ref":"#/components/schemas/EmbedSelectMenuOptionCreate"},"type":"array"},{"type":"null"}],"title":"Options","description":"Wenn gesetzt, werden alle Optionen ersetzt"}},"type":"object","title":"EmbedSelectMenuUpdate"},"EmbedTemplateCreate":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name","description":"Interner Name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"message_type":{"type":"string","enum":["embed","text","image","embed_with_content","container"],"title":"Message Type","default":"embed"},"plain_text_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plain Text Content","description":"Text für text/embed_with_content"},"container_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Container Json","description":"Container-Definition (Components V2)"},"embed_title":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Embed Title"},"embed_description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Embed Description"},"embed_color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","title":"Embed Color","default":"#7220f5"},"embed_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Url"},"embed_author_name":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Embed Author Name"},"embed_author_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Author Url"},"embed_footer_text":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Footer Text"},"embed_timestamp":{"type":"boolean","title":"Embed Timestamp","default":false},"is_sticky":{"type":"boolean","title":"Is Sticky","description":"Embed als Sticky-Message im Channel haften lassen","default":false},"sticky_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sticky Channel Id","description":"Discord Channel ID für die Sticky-Message"}},"type":"object","required":["name"],"title":"EmbedTemplateCreate"},"EmbedTemplateResponse":{"properties":{"id":{"type":"integer","title":"Id"},"server_id":{"type":"string","title":"Server Id"},"created_by_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"message_type":{"type":"string","title":"Message Type"},"plain_text_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plain Text Content"},"container_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Container Json"},"embed_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Title"},"embed_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Description"},"embed_color":{"type":"string","title":"Embed Color"},"embed_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Url"},"embed_author_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Author Name"},"embed_author_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Author Url"},"has_author_icon":{"type":"boolean","title":"Has Author Icon"},"embed_footer_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Footer Text"},"has_footer_icon":{"type":"boolean","title":"Has Footer Icon"},"embed_timestamp":{"type":"boolean","title":"Embed Timestamp"},"has_thumbnail":{"type":"boolean","title":"Has Thumbnail"},"has_image":{"type":"boolean","title":"Has Image"},"sent_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sent Message Id"},"sent_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sent Channel Id"},"sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sent At"},"is_sticky":{"type":"boolean","title":"Is Sticky","default":false},"sticky_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sticky Channel Id"},"sticky_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sticky Message Id"},"sticky_last_reposted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sticky Last Reposted At"},"times_sent":{"type":"integer","title":"Times Sent"},"times_edited":{"type":"integer","title":"Times Edited"},"last_sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Sent At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"field_count":{"type":"integer","title":"Field Count","default":0},"button_count":{"type":"integer","title":"Button Count","default":0},"select_menu_count":{"type":"integer","title":"Select Menu Count","default":0}},"type":"object","required":["id","server_id","created_by_id","name","description","message_type","plain_text_content","embed_title","embed_description","embed_color","embed_url","embed_author_name","embed_author_url","has_author_icon","embed_footer_text","has_footer_icon","embed_timestamp","has_thumbnail","has_image","sent_message_id","sent_channel_id","sent_at","times_sent","times_edited","last_sent_at","created_at","updated_at"],"title":"EmbedTemplateResponse"},"EmbedTemplateUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"message_type":{"anyOf":[{"type":"string","enum":["embed","text","image","embed_with_content","container"]},{"type":"null"}],"title":"Message Type"},"plain_text_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plain Text Content"},"container_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Container Json","description":"Container-Definition (Components V2)"},"embed_title":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Embed Title"},"embed_description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Embed Description"},"embed_color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Embed Color"},"embed_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Url"},"fields":{"anyOf":[{"items":{"$ref":"#/components/schemas/EmbedFieldCreate"},"type":"array"},{"type":"null"}],"title":"Fields"},"embed_author_name":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Embed Author Name"},"embed_author_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Author Url"},"embed_footer_text":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Footer Text"},"embed_timestamp":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Embed Timestamp"},"is_sticky":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Sticky"},"sticky_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sticky Channel Id"}},"type":"object","title":"EmbedTemplateUpdate"},"EntfernenBody":{"properties":{"rotation":{"anyOf":[{"$ref":"#/components/schemas/Rotation"},{"type":"null"}]}},"type":"object","title":"EntfernenBody"},"EntryCreate":{"properties":{"label":{"type":"string","maxLength":120,"minLength":1,"title":"Label"},"system":{"type":"string","maxLength":40,"title":"System","default":"other"},"url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Url"},"owner_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Owner Id"},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"},"review_interval_days":{"type":"integer","maximum":3650.0,"minimum":0.0,"title":"Review Interval Days","default":90}},"type":"object","required":["label"],"title":"EntryCreate"},"EntryPatch":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Label"},"system":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"System"},"url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Url"},"owner_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Owner Id"},"clear_owner":{"type":"boolean","title":"Clear Owner","default":false},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"},"review_interval_days":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":0.0},{"type":"null"}],"title":"Review Interval Days"}},"type":"object","title":"EntryPatch"},"Entscheidung":{"properties":{"annehmen":{"type":"boolean","title":"Annehmen"}},"type":"object","required":["annehmen"],"title":"Entscheidung","description":"Eine Bewerbung annehmen oder ablehnen."},"Ereignis":{"properties":{"typ":{"type":"string","maxLength":16,"title":"Typ","description":"seite | wechsel | aktion | fehler"},"route":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Route"},"nach":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Nach"},"methode":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Methode"},"pfad":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Pfad"},"ok":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ok","description":"Endete die Anfrage ohne Fehler?"},"art":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Art","description":"js | api | grenze"},"meldung":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Meldung"},"ort":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Ort"},"status":{"anyOf":[{"type":"integer","maximum":999.0,"minimum":0.0},{"type":"null"}],"title":"Status"}},"type":"object","required":["typ"],"title":"Ereignis","description":"Ein einzelnes Ereignis aus dem Dashboard.\n\nEin Schema fuer vier Arten statt vier Schemata, weil sie gemeinsam\nankommen und die Felder sich weitgehend ueberschneiden. Was fuer die\njeweilige Art nicht gilt, bleibt leer; verbindlich ausgewertet wird\nohnehin erst unten, je Art.\n\nDie Laengengrenzen sind grosszuegiger als das, was durch die\nNormalisierung kommt. Sie sind kein zweiter Filter, sondern halten nur den\nFall ab, dass jemand ein Megabyte in ein Feld schreibt."},"EstimateRequest":{"properties":{"kind":{"type":"string","maxLength":40,"title":"Kind"},"conditions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Conditions"},"mode":{"type":"string","maxLength":5,"title":"Mode","default":"all"}},"type":"object","required":["kind"],"title":"EstimateRequest"},"ExcludedChannelCreate":{"properties":{"channel_id":{"type":"string","title":"Channel Id","description":"Discord Channel ID"}},"type":"object","required":["channel_id"],"title":"ExcludedChannelCreate"},"ExclusionCreate":{"properties":{"exclusion_type":{"type":"string","enum":["user","role"],"title":"Exclusion Type"},"target_id":{"type":"string","title":"Target Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["exclusion_type","target_id"],"title":"ExclusionCreate","description":"Create Schema for Exclusion"},"FadingEntry":{"properties":{"user":{"$ref":"#/components/schemas/PeopleUser"},"last_active_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Active At"},"days_silent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Silent"},"prev_messages":{"type":"integer","title":"Prev Messages"}},"type":"object","required":["user","prev_messages"],"title":"FadingEntry","description":"Wer aktiv war und leise geworden ist."},"FairnessEinstellungen":{"properties":{"fairness_mindestlaenge_an":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Fairness Mindestlaenge An"},"fairness_mindestlaenge_zeichen":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Fairness Mindestlaenge Zeichen"},"fairness_duplikat_an":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Fairness Duplikat An"},"fairness_duplikat_tiefe":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":1.0},{"type":"null"}],"title":"Fairness Duplikat Tiefe"},"fairness_nur_emoji_an":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Fairness Nur Emoji An"},"fairness_nur_link_an":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Fairness Nur Link An"},"fairness_voice_mindestens_andere":{"anyOf":[{"type":"integer","maximum":25.0,"minimum":0.0},{"type":"null"}],"title":"Fairness Voice Mindestens Andere"},"fairness_voice_bots_zaehlen":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Fairness Voice Bots Zaehlen"}},"type":"object","title":"FairnessEinstellungen","description":"Die acht Werte aus `level_fairness.VORGABEN`.\n\nJedes Feld optional: PATCH-Semantik auf einem PUT, weil das Dashboard die\nSeite in Abschnitten speichert. Was nicht mitkommt, bleibt stehen."},"FaktorAenderung":{"properties":{"bereich":{"anyOf":[{"type":"string","enum":["global","channel","category","role"]},{"type":"null"}],"title":"Bereich"},"ziel_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Ziel Id"},"faktor":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.0},{"type":"null"}],"title":"Faktor"},"name":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Name"},"start_am":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Am"},"ende_am":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ende Am"},"aktiv":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Aktiv"}},"type":"object","title":"FaktorAenderung","description":"Alle Felder optional: PATCH aendert, was dasteht, und sonst nichts.\n\n`bereich` und `ziel_id` sind absichtlich MIT dabei. Ein Faktor, der vom\nfalschen Kanal auf den richtigen umgezogen werden soll, waere sonst\nloeschen-und-neu-anlegen - und verlaere dabei sein Zeitfenster.\n\n─── Warum es kein `fenster_leeren` mehr gibt ───────────────────────────\n\nHier stand ein zusaetzlicher Schalter, weil `None` bei PATCH \"nicht\nmitgeschickt\" heisst und nicht zugleich \"loeschen\" heissen kann. Das\nFormular kennt ihn nicht: es haengt den Haken \"befristen\" ab und schickt\n`start_am: null, ende_am: null` - und das ist die natuerliche Aussage\ndafuer.\n\nDen Unterschied beantwortet Pydantic selbst: `model_fields_set` sagt,\nwelche Felder im Koerper WAREN. Ein ausdruecklich mitgeschicktes `null`\nleert das Fenster, ein fehlendes Feld laesst es stehen. Ein zweiter Weg\nzu derselben Wirkung waere Ballast - und der Weg, den das Formular nicht\nnimmt, waere der, der beim naechsten Umbau kaputtgeht, ohne dass es\nauffaellt."},"FaktorAnlage":{"properties":{"bereich":{"type":"string","enum":["global","channel","category","role"],"title":"Bereich"},"ziel_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Ziel Id"},"faktor":{"type":"number","maximum":10.0,"minimum":0.0,"title":"Faktor"},"name":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Name"},"start_am":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Am"},"ende_am":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ende Am"},"aktiv":{"type":"boolean","title":"Aktiv","default":true}},"type":"object","required":["bereich","faktor"],"title":"FaktorAnlage","description":"Was das Formular schickt.\n\n`start_am`/`ende_am` heissen so wie in der Antwort und im Formular\n(Begruendung an `_als_antwort`). Die Spalten heissen weiter\n`gilt_von`/`gilt_bis`; die Zuordnung passiert an genau einer Stelle - dem\n`XpMultiplier.create(...)` weiter unten."},"FavoriteEmojiData":{"properties":{"emoji":{"type":"string","title":"Emoji"},"count":{"type":"integer","title":"Count"},"is_custom":{"type":"boolean","title":"Is Custom"}},"type":"object","required":["emoji","count","is_custom"],"title":"FavoriteEmojiData"},"FeatureCard":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"title_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title Key"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"href":{"type":"string","title":"Href"},"area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"premium":{"type":"boolean","title":"Premium","default":false},"new":{"type":"boolean","title":"New","default":false}},"type":"object","required":["id","title","href"],"title":"FeatureCard"},"FeatureRequest":{"properties":{"featured":{"type":"boolean","title":"Featured","default":true}},"type":"object","title":"FeatureRequest"},"FeedCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"channel_id":{"type":"string","title":"Channel Id"},"sources":{"items":{"$ref":"#/components/schemas/SourceIn"},"type":"array","maxItems":25,"title":"Sources"},"interval_minutes":{"type":"integer","maximum":1440.0,"minimum":5.0,"title":"Interval Minutes","default":10},"posts_per_run":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Posts Per Run","default":1},"post_style":{"type":"string","enum":["single","gallery"],"title":"Post Style","default":"single"},"dedup_days":{"type":"integer","maximum":365.0,"minimum":0.0,"title":"Dedup Days","default":7},"ping_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ping Role Id"}},"type":"object","required":["name","channel_id"],"title":"FeedCreate"},"FeedListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"feeds":{"items":{"$ref":"#/components/schemas/FeedOut"},"type":"array","title":"Feeds"},"total":{"type":"integer","title":"Total"},"limits":{"additionalProperties":true,"type":"object","title":"Limits"}},"type":"object","required":["success","feeds","total","limits"],"title":"FeedListResponse"},"FeedOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"channel_id":{"type":"string","title":"Channel Id"},"is_active":{"type":"boolean","title":"Is Active"},"interval_minutes":{"type":"integer","title":"Interval Minutes"},"posts_per_run":{"type":"integer","title":"Posts Per Run"},"post_style":{"type":"string","title":"Post Style"},"dedup_days":{"type":"integer","title":"Dedup Days"},"quiet_start_hour":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quiet Start Hour"},"quiet_end_hour":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quiet End Hour"},"timezone_offset_minutes":{"type":"integer","title":"Timezone Offset Minutes"},"ping_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ping Role Id"},"show_source":{"type":"boolean","title":"Show Source"},"show_open_button":{"type":"boolean","title":"Show Open Button"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"},"square_tolerance":{"type":"integer","title":"Square Tolerance"},"min_width":{"type":"integer","title":"Min Width"},"include_keywords":{"items":{"type":"string"},"type":"array","title":"Include Keywords"},"exclude_keywords":{"items":{"type":"string"},"type":"array","title":"Exclude Keywords"},"safe_mode":{"type":"boolean","title":"Safe Mode"},"pool_target":{"type":"integer","title":"Pool Target"},"pool_low_water":{"type":"integer","title":"Pool Low Water"},"last_post_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Post At"},"last_refill_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Refill At"},"total_posted":{"type":"integer","title":"Total Posted"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"consecutive_errors":{"type":"integer","title":"Consecutive Errors"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"sources":{"items":{"$ref":"#/components/schemas/SourceOut"},"type":"array","title":"Sources","default":[]},"pool_queued":{"type":"integer","title":"Pool Queued","default":0},"pool_skipped":{"type":"integer","title":"Pool Skipped","default":0},"next_post_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Post At"},"preview":{"items":{"$ref":"#/components/schemas/PoolItemOut"},"type":"array","title":"Preview","default":[]}},"type":"object","required":["id","name","channel_id","is_active","interval_minutes","posts_per_run","post_style","dedup_days","quiet_start_hour","quiet_end_hour","timezone_offset_minutes","ping_role_id","show_source","show_open_button","caption","square_tolerance","min_width","include_keywords","exclude_keywords","safe_mode","pool_target","pool_low_water","last_post_at","last_refill_at","total_posted","last_error","consecutive_errors","created_at"],"title":"FeedOut"},"FeedUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"interval_minutes":{"anyOf":[{"type":"integer","maximum":1440.0,"minimum":5.0},{"type":"null"}],"title":"Interval Minutes"},"posts_per_run":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":1.0},{"type":"null"}],"title":"Posts Per Run"},"post_style":{"anyOf":[{"type":"string","enum":["single","gallery"]},{"type":"null"}],"title":"Post Style"},"dedup_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":0.0},{"type":"null"}],"title":"Dedup Days"},"quiet_start_hour":{"anyOf":[{"type":"integer","maximum":23.0,"minimum":0.0},{"type":"null"}],"title":"Quiet Start Hour"},"quiet_end_hour":{"anyOf":[{"type":"integer","maximum":23.0,"minimum":0.0},{"type":"null"}],"title":"Quiet End Hour"},"timezone_offset_minutes":{"anyOf":[{"type":"integer","maximum":840.0,"minimum":-840.0},{"type":"null"}],"title":"Timezone Offset Minutes"},"ping_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ping Role Id"},"show_source":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Source"},"show_open_button":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Open Button"},"caption":{"anyOf":[{"type":"string","maxLength":280},{"type":"null"}],"title":"Caption"},"square_tolerance":{"anyOf":[{"type":"integer","maximum":200.0,"minimum":0.0},{"type":"null"}],"title":"Square Tolerance"},"min_width":{"anyOf":[{"type":"integer","maximum":4096.0,"minimum":0.0},{"type":"null"}],"title":"Min Width"},"include_keywords":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Include Keywords"},"exclude_keywords":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exclude Keywords"},"safe_mode":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Safe Mode"},"pool_target":{"anyOf":[{"type":"integer","maximum":400.0,"minimum":5.0},{"type":"null"}],"title":"Pool Target"},"pool_low_water":{"anyOf":[{"type":"integer","maximum":200.0,"minimum":1.0},{"type":"null"}],"title":"Pool Low Water"}},"type":"object","title":"FeedUpdate"},"ForceAddRequest":{"properties":{"message_id":{"type":"string","title":"Message Id","description":"Nachricht ID"},"channel_id":{"type":"string","title":"Channel Id","description":"Channel ID"}},"type":"object","required":["message_id","channel_id"],"title":"ForceAddRequest"},"ForgotBody":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"ForgotBody"},"Fortsetzung":{"properties":{"ab_id":{"type":"integer","minimum":0.0,"title":"Ab Id","default":0}},"type":"object","title":"Fortsetzung","description":"Die Fortsetzung des Resets nach einer abgeschnittenen Charge."},"FreeGamesUpdate":{"properties":{"channel_id":{"type":"string","title":"Channel Id","description":"Target channel for the announcements"},"platforms":{"items":{"type":"string"},"type":"array","title":"Platforms"},"ping_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ping Role Id"},"country":{"type":"string","title":"Country","description":"Two letter country code for store prices","default":"US"},"include_upcoming":{"type":"boolean","title":"Include Upcoming","description":"Also announce upcoming giveaways","default":false},"check_interval_minutes":{"type":"integer","maximum":1440.0,"minimum":15.0,"title":"Check Interval Minutes","default":60},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["channel_id"],"title":"FreeGamesUpdate"},"FreigabeEingabe":{"properties":{"allow_writes":{"type":"boolean","title":"Allow Writes","description":"Darf die KI Aenderungen vorschlagen?","default":false},"consent_version":{"type":"string","title":"Consent Version","description":"Fassung des zugestimmten Hinweistextes"}},"type":"object","required":["consent_version"],"title":"FreigabeEingabe"},"FuehrungAenderung":{"properties":{"inaktiv_tage":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":0.0},{"type":"null"}],"title":"Inaktiv Tage"},"nachfolge":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Nachfolge"},"stellvertreter_id":{"anyOf":[{"type":"string","pattern":"^\\d{1,22}$"},{"type":"null"}],"title":"Stellvertreter Id"}},"type":"object","title":"FuehrungAenderung","description":"`PUT /clans/{id}/leadership` - die Anfuehrer-Werkzeuge (Nachtlauf 3,\nC5, clans/fuehrung.py). Nur die geschickten Felder aendern sich;\n`stellvertreter_id: null` nimmt den Stellvertreter zurueck. Welche Tage\ngelten, sagt der Dienst mit einem Satz (`fuehrung.inaktiv_tage`)."},"GamingStatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"period":{"type":"string","title":"Period"},"user_id":{"type":"string","title":"User Id"},"stats":{"additionalProperties":true,"type":"object","title":"Stats","example":{"activities_by_type":[],"listening_count":234,"streaming_count":5,"top_games":[],"total_gaming_activities":89,"total_gaming_hours":45.5,"unique_games":12,"watching_count":12}},"insights":{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array","title":"Insights"}},"type":"object","required":["period","user_id","stats","insights"],"title":"GamingStatsResponse","description":"Response für Gaming-Statistiken."},"GateSettingsUpdate":{"properties":{"admin_bypass":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Admin Bypass"},"notify_disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Disabled"},"notify_denied":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Denied"}},"type":"object","title":"GateSettingsUpdate"},"GegenstandVergabe":{"properties":{"item_id":{"type":"integer","minimum":1.0,"title":"Item Id"},"menge":{"type":"integer","maximum":1000000.0,"minimum":1.0,"title":"Menge","default":1},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","required":["item_id"],"title":"GegenstandVergabe","description":"Gegenstaende ins Inventar legen oder daraus nehmen."},"GeschaeftAenderung":{"properties":{"stufe":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":1.0},{"type":"null"}],"title":"Stufe"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","title":"GeschaeftAenderung","description":"Stufe oder Betriebszustand aendern.\n\n`is_active=False` stoppt den Ertrag, ohne den Betrieb zu loeschen - das\nist der Weg fuer \"waehrend die Beschwerde geprueft wird\". Ueber diesen\nEndpunkt laesst er sich auch wieder einschalten; im Bot selbst gibt es\ndafuer keinen Weg."},"GeschaeftEntzug":{"properties":{"teilhaber_bestaetigt":{"type":"boolean","title":"Teilhaber Bestaetigt","default":false},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","title":"GeschaeftEntzug","description":"Ein Geschaeft entziehen.\n\n`teilhaber_bestaetigt` ist die zweite Hand: mit dem Geschaeft\nverschwinden die Anteilszeilen, und die Teilhaber haben ihre Einlage\nbezahlt. Erstattet wird nicht - das erschuefe Coins aus dem Nichts -,\nalso muss wenigstens niemand versehentlich hineinlaufen."},"GeschaeftVergabe":{"properties":{"business_type":{"type":"string","maxLength":50,"minLength":1,"title":"Business Type"},"stufe":{"type":"integer","maximum":60.0,"minimum":1.0,"title":"Stufe","default":1},"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","required":["business_type"],"title":"GeschaeftVergabe","description":"Ein Geschaeft vergeben.\n\nKein `daily_income` und kein `upgrade_cost`: beide werden aus der Stufe\ngerechnet. Kaemen sie von aussen, stuende bald ein Restaurant auf Stufe 1\nda, das zahlt wie eines auf Stufe 40."},"Gesundheit":{"properties":{"punkte":{"type":"integer","title":"Punkte","default":0},"stufe":{"type":"string","title":"Stufe","default":"kritisch"},"saeulen":{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"object","title":"Saeulen","default":{}},"schwaechste":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schwaechste"},"staerkste":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Staerkste"},"trend":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Trend"}},"type":"object","title":"Gesundheit"},"GhostPingChannelAdd":{"properties":{"channel_id":{"type":"string","title":"Channel Id","description":"Discord Channel ID für Ghost-Ping"}},"type":"object","required":["channel_id"],"title":"GhostPingChannelAdd"},"GhostPingConfigResponse":{"properties":{"is_enabled":{"type":"boolean","title":"Is Enabled","description":"Is Anti-Ghost-Ping enabled?"},"notification_mode":{"type":"string","title":"Notification Mode","description":"dm, channel, or both"},"log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Channel Id","description":"Channel ID for logs"},"log_channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Channel Name","description":"Channel name for logs"},"total_ghost_pings_detected":{"type":"integer","title":"Total Ghost Pings Detected","description":"Total detected ghost pings"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Configuration created at"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"Last updated"}},"type":"object","required":["is_enabled","notification_mode","total_ghost_pings_detected","created_at","updated_at"],"title":"GhostPingConfigResponse","description":"Response Model for Ghost Ping Config"},"GhostPingConfigUpdate":{"properties":{"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled","description":"Enable/disable system"},"notification_mode":{"anyOf":[{"type":"string","enum":["dm","channel","both"]},{"type":"null"}],"title":"Notification Mode","description":"Notification mode"},"log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Channel Id","description":"Log channel ID (null to remove)"}},"type":"object","title":"GhostPingConfigUpdate","description":"Request Model for Config Updates"},"GhostPingLogEntry":{"properties":{"id":{"type":"integer","title":"Id"},"message_id":{"type":"string","title":"Message Id"},"channel_id":{"type":"string","title":"Channel Id"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"author_id":{"type":"string","title":"Author Id"},"author_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Username"},"mentioned_users":{"items":{"type":"string"},"type":"array","title":"Mentioned Users"},"message_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Content"},"time_alive_seconds":{"type":"number","title":"Time Alive Seconds"},"message_deleted_at":{"type":"string","format":"date-time","title":"Message Deleted At"},"notifications_sent":{"type":"integer","title":"Notifications Sent"}},"type":"object","required":["id","message_id","channel_id","channel_name","author_id","author_username","mentioned_users","message_content","time_alive_seconds","message_deleted_at","notifications_sent"],"title":"GhostPingLogEntry","description":"Single Ghost Ping Log Entry"},"GhostPingLogsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"total_logs":{"type":"integer","title":"Total Logs"},"data":{"items":{"$ref":"#/components/schemas/GhostPingLogEntry"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"}},"type":"object","required":["success","total_logs","data","pagination"],"title":"GhostPingLogsResponse","description":"Response for Ghost Ping Logs"},"GhostPingStatsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"total_ghost_pings":{"type":"integer","title":"Total Ghost Pings"},"last_7_days":{"type":"integer","title":"Last 7 Days"},"last_30_days":{"type":"integer","title":"Last 30 Days"},"top_ghost_pingers":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Ghost Pingers"},"timeline":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Timeline"}},"type":"object","required":["success","total_ghost_pings","last_7_days","last_30_days","top_ghost_pingers","timeline"],"title":"GhostPingStatsResponse","description":"Response for Ghost Ping Statistics"},"GiveawayCooperation":{"properties":{"partner_server_ids":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Partner Server Ids","description":"IDs der Partner-Server"},"modes":{"items":{"type":"string"},"type":"array","title":"Modes","description":"Modi: requirement | synced | beide gleichzeitig möglich","default":["requirement"]},"require_all":{"type":"boolean","title":"Require All","description":"Ob ALLE Partner-Server erforderlich sind","default":false},"host_only":{"type":"boolean","title":"Host Only","description":"Ob NUR der Host-Server erforderlich ist (überschreibt require_all)","default":false}},"type":"object","required":["partner_server_ids"],"title":"GiveawayCooperation","description":"Kooperations-Daten für Multi-Server Giveaways"},"GiveawayCooperationDetail":{"properties":{"partner_server_ids":{"items":{"type":"string"},"type":"array","title":"Partner Server Ids"},"modes":{"items":{"type":"string"},"type":"array","title":"Modes"},"require_all":{"type":"boolean","title":"Require All"},"host_only":{"type":"boolean","title":"Host Only","default":false},"partner_servers":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Partner Servers"}},"type":"object","required":["partner_server_ids","modes","require_all"],"title":"GiveawayCooperationDetail","description":"Kooperations-Details mit Server-Metadaten (für Response)"},"GiveawayCreate":{"properties":{"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title","description":"Titel des Giveaways"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Beschreibung"},"prize":{"type":"string","maxLength":500,"minLength":1,"title":"Prize","description":"Gewinn/Preis"},"winner_count":{"type":"integer","maximum":20.0,"minimum":1.0,"title":"Winner Count","description":"Anzahl Gewinner","default":1},"duration_minutes":{"type":"integer","maximum":43200.0,"minimum":1.0,"title":"Duration Minutes","description":"Dauer in Minuten (max 30 Tage)"},"channel_id":{"type":"string","title":"Channel Id","description":"Discord Channel ID"},"requirements":{"anyOf":[{"$ref":"#/components/schemas/GiveawayRequirements"},{"type":"null"}]},"cooperation":{"anyOf":[{"$ref":"#/components/schemas/GiveawayCooperation"},{"type":"null"}]}},"type":"object","required":["title","prize","duration_minutes","channel_id"],"title":"GiveawayCreate","description":"Schema für Giveaway-Erstellung"},"GiveawayDetail":{"properties":{"id":{"type":"integer","title":"Id"},"server_id":{"type":"string","title":"Server Id"},"server_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Name"},"server_icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Icon"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"prize":{"type":"string","title":"Prize"},"winner_count":{"type":"integer","title":"Winner Count"},"channel_id":{"type":"string","title":"Channel Id"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"},"is_active":{"type":"boolean","title":"Is Active"},"is_ended":{"type":"boolean","title":"Is Ended"},"creator_id":{"type":"string","title":"Creator Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"end_time":{"type":"string","format":"date-time","title":"End Time"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At"},"requirements":{"$ref":"#/components/schemas/GiveawayRequirements"},"cooperation":{"anyOf":[{"$ref":"#/components/schemas/GiveawayCooperationDetail"},{"type":"null"}]},"stats":{"$ref":"#/components/schemas/api__schemas__giveaway__GiveawayStats"},"winner_block":{"anyOf":[{"$ref":"#/components/schemas/GiveawayWinnerBlock"},{"type":"null"}]}},"type":"object","required":["id","server_id","title","description","prize","winner_count","channel_id","message_id","is_active","is_ended","creator_id","created_at","end_time","ended_at","requirements","stats"],"title":"GiveawayDetail","description":"Detaillierte Giveaway-Informationen"},"GiveawayDetailItem":{"properties":{"giveaway_id":{"type":"integer","title":"Giveaway Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"prize":{"type":"string","title":"Prize"},"channel_id":{"type":"string","title":"Channel Id"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"is_active":{"type":"boolean","title":"Is Active"},"is_ended":{"type":"boolean","title":"Is Ended"},"winner_count":{"type":"integer","title":"Winner Count"},"end_time":{"type":"string","format":"date-time","title":"End Time"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At"},"creator_id":{"type":"string","title":"Creator Id"},"participant_count":{"type":"integer","title":"Participant Count","default":0},"participants":{"items":{"$ref":"#/components/schemas/api__routers__server_profile__GiveawayParticipant"},"type":"array","title":"Participants","default":[]},"winners":{"items":{"$ref":"#/components/schemas/api__routers__server_profile__GiveawayWinnerInfo"},"type":"array","title":"Winners","default":[]},"requirements":{"additionalProperties":true,"type":"object","title":"Requirements"},"time_remaining_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Time Remaining Seconds"}},"type":"object","required":["giveaway_id","title","prize","channel_id","is_active","is_ended","winner_count","end_time","created_at","creator_id"],"title":"GiveawayDetailItem","description":"Detailliertes Giveaway — mit Klick-Details für Teilnehmer/Gewinner."},"GiveawayListItem":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"prize":{"type":"string","title":"Prize"},"winner_count":{"type":"integer","title":"Winner Count"},"is_active":{"type":"boolean","title":"Is Active"},"is_ended":{"type":"boolean","title":"Is Ended"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"},"total_entries":{"type":"integer","title":"Total Entries"},"end_time":{"type":"string","format":"date-time","title":"End Time"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"cooperation":{"anyOf":[{"$ref":"#/components/schemas/GiveawayCooperationDetail"},{"type":"null"}]}},"type":"object","required":["id","title","prize","winner_count","is_active","is_ended","total_entries","end_time","created_at"],"title":"GiveawayListItem","description":"Giveaway in Listen-Ansicht"},"GiveawayListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/GiveawayListItem"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"}},"type":"object","required":["success","data","pagination"],"title":"GiveawayListResponse","description":"Liste von Giveaways Response"},"GiveawayOverviewResponse":{"properties":{"active_giveaways":{"items":{"$ref":"#/components/schemas/GiveawayDetailItem"},"type":"array","title":"Active Giveaways","default":[]},"recently_ended":{"items":{"$ref":"#/components/schemas/GiveawayDetailItem"},"type":"array","title":"Recently Ended","default":[]}},"type":"object","title":"GiveawayOverviewResponse","description":"Giveaway-Übersicht."},"GiveawayParticipantsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/api__schemas__giveaway__GiveawayParticipant"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"}},"type":"object","required":["success","data","pagination"],"title":"GiveawayParticipantsResponse","description":"Teilnehmer-Liste Response"},"GiveawayRequirements":{"properties":{"required_role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Required Role Ids"},"forbidden_role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Forbidden Role Ids"},"min_account_age_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Account Age Days"},"min_server_join_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Server Join Days"},"min_messages":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Messages"},"min_messages_timeframe_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Messages Timeframe Days"},"min_invites":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Invites"},"min_invites_timeframe_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Invites Timeframe Days"},"min_voice_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Voice Hours"},"min_voice_timeframe_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Voice Timeframe Days"},"min_level":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Level"},"min_total_xp":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Total Xp"},"min_reactions_given":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Reactions Given"},"min_reactions_timeframe_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Reactions Timeframe Days"},"min_commands_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Commands Used"},"min_commands_timeframe_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Commands Timeframe Days"},"exclude_recent_winners":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":1.0},{"type":"null"}],"title":"Exclude Recent Winners","description":"The most recent N distinct winners of this server cannot enter (null = off)"}},"type":"object","title":"GiveawayRequirements","description":"Requirements für Giveaway-Teilnahme"},"GiveawayResendRequest":{"properties":{"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id","description":"Zielkanal für das erneute Senden (optional, sonst aktueller Kanal)"}},"type":"object","title":"GiveawayResendRequest","description":"Body für das erneute Senden eines Giveaways (optional in anderen Kanal)"},"GiveawayResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/GiveawayDetail"},{"type":"null"}]}},"type":"object","required":["success","message"],"title":"GiveawayResponse","description":"Standard API Response"},"GiveawayUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"prize":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Prize"},"winner_count":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":1.0},{"type":"null"}],"title":"Winner Count"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"duration_minutes":{"anyOf":[{"type":"integer","maximum":43200.0,"minimum":1.0},{"type":"null"}],"title":"Duration Minutes","description":"Neue Gesamtdauer in Minuten (ab jetzt gerechnet)"},"requirements":{"anyOf":[{"$ref":"#/components/schemas/GiveawayRequirements"},{"type":"null"}]},"cooperation":{"anyOf":[{"$ref":"#/components/schemas/GiveawayCooperation"},{"type":"null"}]}},"type":"object","title":"GiveawayUpdate","description":"Schema für Giveaway-Bearbeitung"},"GiveawayWinnerBlock":{"properties":{"count":{"type":"integer","title":"Count","description":"Configured number of recent winners to exclude"},"frozen":{"type":"boolean","title":"Frozen"},"users":{"items":{"$ref":"#/components/schemas/RecentWinner"},"type":"array","title":"Users"}},"type":"object","required":["count","frozen","users"],"title":"GiveawayWinnerBlock","description":"Wer bei diesem Giveaway als frueherer Gewinner gesperrt ist"},"GiveawayWinnersResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/api__schemas__giveaway__GiveawayWinnerInfo"},"type":"array","title":"Data"}},"type":"object","required":["success","data"],"title":"GiveawayWinnersResponse","description":"Gewinner-Liste Response"},"GlobalBanInfo":{"properties":{"is_banned":{"type":"boolean","title":"Is Banned","default":false},"ban_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ban Reason"},"banned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Banned At"},"banned_by_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banned By Id"}},"type":"object","title":"GlobalBanInfo","description":"Informationen zu globalem Ban."},"GlobalOverviewStats":{"properties":{"messages":{"$ref":"#/components/schemas/StatWithPercentage"},"voice":{"$ref":"#/components/schemas/StatWithPercentage"},"reactions":{"$ref":"#/components/schemas/StatWithPercentage"},"commands":{"$ref":"#/components/schemas/StatWithPercentage"}},"type":"object","required":["messages","voice","reactions","commands"],"title":"GlobalOverviewStats","description":"Schema für die globalen Overview-Statistiken."},"GlobalProfileResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"first_seen_global":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen Global"},"customization":{"$ref":"#/components/schemas/ProfileCustomizationSchema"},"is_pro":{"type":"boolean","title":"Is Pro","description":"Indicates whether the user has an active Pro/Supreme plan.","default":false},"links":{"items":{"$ref":"#/components/schemas/UserProfileLinkSchema"},"type":"array","title":"Links","description":"Custom profile links","default":[]},"stats":{"items":{"$ref":"#/components/schemas/ProfileStatsCategory"},"type":"array","title":"Stats"}},"type":"object","required":["user_id","username","avatar_url","first_seen_global","customization","stats"],"title":"GlobalProfileResponse","description":"Response for the global profile."},"GrantBody":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"GrantBody"},"GrantReferralRewardRequest":{"properties":{"reward_type":{"type":"string","title":"Reward Type","description":"premium oder supreme","default":"premium"},"duration_days":{"type":"integer","minimum":1.0,"title":"Duration Days","default":14}},"type":"object","title":"GrantReferralRewardRequest"},"GrantSubscriptionRequest":{"properties":{"sub_type":{"type":"string","title":"Sub Type","description":"premium, professional, pro, ai"},"duration_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Days","description":"Tage (null = lifetime)"},"premium_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Premium Type","description":"standard oder all_servers (nur für premium)"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["sub_type"],"title":"GrantSubscriptionRequest"},"GroupCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"color_hex":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color Hex"},"role_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Role Id"},"is_default":{"type":"boolean","title":"Is Default","default":false},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"permissions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Permissions"}},"type":"object","required":["name"],"title":"GroupCreate"},"GroupPatch":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"color_hex":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color Hex"},"role_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Role Id"},"is_default":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Default"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"sync_direction":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Sync Direction"},"sync_remove_extra":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sync Remove Extra"},"clear_role":{"type":"boolean","title":"Clear Role","default":false}},"type":"object","title":"GroupPatch"},"GruppeAnlegen":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Anzeigename des Verbunds"}},"type":"object","required":["name"],"title":"GruppeAnlegen"},"GruppeBody":{"properties":{"id":{"type":"string","maxLength":64,"title":"Id"},"name":{"type":"string","maxLength":200,"title":"Name"},"schluessel":{"$ref":"#/components/schemas/SchluesselPaar"}},"type":"object","required":["id","name","schluessel"],"title":"GruppeBody"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HallOfFameSetupRequest":{"properties":{"channel_id":{"type":"string","title":"Channel Id","description":"Channel ID für Hall of Fame"},"threshold":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Threshold","description":"Mindestanzahl Sterne","default":20},"emoji":{"type":"string","title":"Emoji","description":"Hall of Fame Emoji","default":"🌟"}},"type":"object","required":["channel_id"],"title":"HallOfFameSetupRequest"},"HandoffRedeemBody":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"HandoffRedeemBody"},"HealthHistoryPoint":{"properties":{"date":{"type":"string","title":"Date"},"health_score":{"type":"number","title":"Health Score"},"msg_count":{"type":"integer","title":"Msg Count"},"unique_active_users":{"type":"integer","title":"Unique Active Users"},"voice_hours":{"type":"number","title":"Voice Hours"},"net_members":{"type":"integer","title":"Net Members"},"mod_actions":{"type":"integer","title":"Mod Actions"}},"type":"object","required":["date","health_score","msg_count","unique_active_users","voice_hours","net_members","mod_actions"],"title":"HealthHistoryPoint","description":"Ein täglicher Datenpunkt für den Server-Pulse-Chart"},"HealthHistoryResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"server_id":{"type":"string","title":"Server Id"},"days":{"type":"integer","title":"Days"},"history":{"items":{"$ref":"#/components/schemas/HealthHistoryPoint"},"type":"array","title":"History"},"has_data":{"type":"boolean","title":"Has Data"}},"type":"object","required":["success","server_id","days","history","has_data"],"title":"HealthHistoryResponse","description":"30-Tage Health-History Response"},"HealthIssue":{"properties":{"category":{"type":"string","title":"Category"},"severity":{"type":"string","title":"Severity"},"message":{"type":"string","title":"Message"}},"type":"object","required":["category","severity","message"],"title":"HealthIssue","description":"Server Health Issue"},"HeatmapDataPoint":{"properties":{"weekday":{"type":"string","title":"Weekday","description":"Wochentag"},"hour":{"type":"integer","maximum":23.0,"minimum":0.0,"title":"Hour","description":"Stunde (0-23)"},"value":{"type":"number","title":"Value","description":"Aktivitätswert"}},"type":"object","required":["weekday","hour","value"],"title":"HeatmapDataPoint","description":"Ein Datenpunkt in der Heatmap"},"HilfeBody":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"geholfen":{"type":"boolean","title":"Geholfen","default":false}},"type":"object","title":"HilfeBody"},"Hinweis":{"properties":{"schluessel":{"type":"string","title":"Schluessel"},"ton":{"type":"string","enum":["gut","warnung","neutral"],"title":"Ton","default":"neutral"},"rang":{"type":"integer","title":"Rang","default":9},"werte":{"additionalProperties":true,"type":"object","title":"Werte","default":{}}},"type":"object","required":["schluessel"],"title":"Hinweis","description":"Ein Schluessel plus seine Werte - der Satz entsteht erst im Frontend."},"HolderAdd":{"properties":{"user_id":{"type":"string","maxLength":30,"title":"User Id"},"note":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Note"}},"type":"object","required":["user_id"],"title":"HolderAdd"},"HourlyDistribution":{"properties":{"hour":{"type":"integer","maximum":23.0,"minimum":0.0,"title":"Hour"},"value":{"type":"integer","title":"Value"}},"type":"object","required":["hour","value"],"title":"HourlyDistribution"},"IconBody":{"properties":{"data":{"type":"string","title":"Data","description":"Data-URI oder rohes Base64 (PNG/JPG/WEBP, ≤2MB)"}},"type":"object","required":["data"],"title":"IconBody"},"IdentityRequest":{"properties":{"identity":{"type":"string","title":"Identity"}},"type":"object","required":["identity"],"title":"IdentityRequest"},"ImageUploadResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"image_type":{"type":"string","title":"Image Type"},"uploaded":{"type":"boolean","title":"Uploaded"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","image_type","uploaded","message"],"title":"ImageUploadResponse"},"ImmobilieVergabe":{"properties":{"immobilie_id":{"type":"integer","minimum":1.0,"title":"Immobilie Id"},"stufe":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Stufe","default":1},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","required":["immobilie_id"],"title":"ImmobilieVergabe","description":"Eine Immobilie aus dem Katalog DIESES Servers uebereignen."},"ImportCommitRequest":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/ImportMessageSelection"},"type":"array","title":"Messages"},"group_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Name"}},"type":"object","title":"ImportCommitRequest"},"ImportMessageSelection":{"properties":{"channel_id":{"type":"string","title":"Channel Id"},"message_id":{"type":"string","title":"Message Id"},"format":{"type":"string","pattern":"^(embed|container)$","title":"Format","default":"container"},"split_multi_embed":{"type":"boolean","title":"Split Multi Embed","default":false}},"type":"object","required":["channel_id","message_id"],"title":"ImportMessageSelection"},"ImportRequest":{"properties":{"role_ids":{"items":{"type":"string"},"type":"array","title":"Role Ids"},"dry_run":{"type":"boolean","title":"Dry Run","default":true},"permissions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Permissions"},"take_members":{"type":"boolean","title":"Take Members","default":true}},"type":"object","title":"ImportRequest"},"InteractionTypeUpdate":{"properties":{"interaction_type":{"type":"string","enum":["select","button","reaction"],"title":"Interaction Type","description":"Art der Interaktion"}},"type":"object","required":["interaction_type"],"title":"InteractionTypeUpdate","description":"Schema für Interaktionstyp-Update"},"IntervalType":{"type":"string","enum":["interval","daily","weekly","monthly","yearly"],"title":"IntervalType","description":"Timing types for AutoMessages"},"InviteLeaderboardEntry":{"properties":{"rank":{"type":"integer","title":"Rank"},"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"invite_count":{"type":"integer","title":"Invite Count"}},"type":"object","required":["rank","user_id","username","avatar_url","invite_count"],"title":"InviteLeaderboardEntry"},"InviteLeaderboardResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/InviteLeaderboardEntry"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["success","data","total"],"title":"InviteLeaderboardResponse"},"InviteSettingsUpdate":{"properties":{"tracking_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Tracking Enabled"},"log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Channel Id"}},"type":"object","title":"InviteSettingsUpdate"},"InviteStats":{"properties":{"total_invite_uses":{"type":"integer","title":"Total Invite Uses","default":0},"unique_inviters":{"type":"integer","title":"Unique Inviters","default":0},"top_inviters":{"items":{"$ref":"#/components/schemas/api__schemas__server_stats__LeaderboardEntry"},"type":"array","title":"Top Inviters","default":[]},"top_invite_codes":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Invite Codes","default":[]}},"type":"object","title":"InviteStats"},"JoinRoleAdd":{"properties":{"role_id":{"type":"string","title":"Role Id","description":"Discord Role ID"}},"type":"object","required":["role_id"],"title":"JoinRoleAdd"},"Kanalgesundheit":{"properties":{"kanaele":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Kanaele","default":[]},"zustaende":{"additionalProperties":{"type":"integer"},"type":"object","title":"Zustaende","default":{}},"gesamt_kanaele":{"type":"integer","title":"Gesamt Kanaele","default":0},"kanaele_fuer_80_prozent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Kanaele Fuer 80 Prozent"}},"type":"object","title":"Kanalgesundheit"},"KartenEntwurf":{"properties":{"entwurf":{"additionalProperties":true,"type":"object","title":"Entwurf"}},"type":"object","title":"KartenEntwurf","description":"Der Anfragekoerper von PUT.\n\n`entwurf` ist ein rohes Verzeichnis und kein Untermodell: die Pruefung\nsteht in `_entwurf_pruefen`, weil sie beim Lesen genauso gebraucht wird.\nZwei Pruefungen waeren zwei Meinungen darueber, was ein gueltiger Entwurf\nist - und die Karte muesste sich an die strengere halten, ohne sie zu\nkennen."},"KategorieEingabe":{"properties":{"key":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Key"},"name":{"type":"string","maxLength":60,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Emoji"},"position":{"type":"integer","title":"Position","default":0},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name"],"title":"KategorieEingabe"},"Kdf":{"properties":{"name":{"type":"string","maxLength":16,"title":"Name"},"n":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"N"},"r":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"R"},"p":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"P"},"salt":{"type":"string","maxLength":64,"title":"Salt"}},"type":"object","required":["name","n","r","p","salt"],"title":"Kdf"},"Kennzahlen":{"properties":{"aktuell":{"additionalProperties":true,"type":"object","title":"Aktuell","default":{}},"vorher":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Vorher"},"delta":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Delta"},"tage":{"type":"integer","title":"Tage","default":1},"vorzeitraum":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Vorzeitraum"}},"type":"object","title":"Kennzahlen","description":"Kopfzahlen des Zeitraums, mit dem gleich langen Zeitraum davor."},"KettenAnfrage":{"properties":{"kanal_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Kanal Id"},"kategorie_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Kategorie Id"},"rollen_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Rollen Id"},"booster":{"type":"boolean","title":"Booster","default":false},"basis_xp":{"type":"integer","maximum":100000.0,"minimum":0.0,"title":"Basis Xp","default":5}},"type":"object","title":"KettenAnfrage","description":"Der Beispielfall, fuer den die Kette aufgeloest werden soll.\n\n─── Warum `rollen_id` einzahl ist ──────────────────────────────────────\n\n`berechnen` nimmt eine LISTE von Rollen, und das ist im Bot richtig: ein\nMitglied traegt mehrere, und alle passenden Faktoren zaehlen. Die Probe\nim Dashboard hat dagegen genau EIN Rollenfeld\n(`MultiplikatorenReiter.jsx`: `RollenAuswahl` mit einem Wert), und sie\nschickt `rollen_id`.\n\nDeshalb steht hier der Name des Formulars und nicht der der Rechenregel.\nAus dem einen Wert wird unten die einelementige Liste, die `berechnen`\nerwartet - ein Feld, das eine Liste verlangt, waehrend das Formular eine\nZeichenkette schickt, ist ein 422 und eine Kettenvorschau, die nie\nerscheint."},"KisteOeffnen":{"properties":{"server_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Server Id"}},"type":"object","title":"KisteOeffnen","description":"`POST /users/me/clan/chests/{id}/open` - auf welchem Server.\n\nDie Kiste zahlt Coins auf das Konto EINES Servers aus (`raids.\nkiste_oeffnen`). Ohne Angabe nimmt der Dienst den Vorschlag aus\n`GET /users/me/clan/chests` (`standard_server_id`, clans/kisten.py) -\ndieselbe Regel an beiden Stellen, damit \"Oeffnen\" ohne Auswahl genau\ndort landet, wo die Liste es angekuendigt hat."},"Kohorte":{"properties":{"woche":{"type":"string","title":"Woche"},"groesse":{"type":"integer","title":"Groesse"},"geblieben":{"type":"integer","title":"Geblieben"},"quote_geblieben":{"type":"number","title":"Quote Geblieben"},"je_gesprochen":{"type":"integer","title":"Je Gesprochen"},"quote_gesprochen":{"type":"number","title":"Quote Gesprochen"},"d7":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"D7"},"d30":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"D30"},"alter_tage":{"type":"integer","title":"Alter Tage","default":0}},"type":"object","required":["woche","groesse","geblieben","quote_geblieben","je_gesprochen","quote_gesprochen"],"title":"Kohorte"},"KonnektorAendern":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"secret":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Secret"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"}},"type":"object","title":"KonnektorAendern"},"KonnektorAnlegen":{"properties":{"kind":{"type":"string","title":"Kind","description":"kofi | tebex | patreon | github | notion"},"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"secret":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Secret","description":"Geheimnis des Dienstes, nur bei form=inbound"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"}},"type":"object","required":["kind","name"],"title":"KonnektorAnlegen"},"KontoAnpassung":{"properties":{"waehrung":{"type":"string","enum":["coins","gems","tokens","bank_balance"],"title":"Waehrung","default":"coins"},"aktion":{"type":"string","enum":["hinzufuegen","abziehen","setzen"],"title":"Aktion"},"betrag":{"type":"integer","maximum":1000000000000.0,"minimum":0.0,"title":"Betrag"},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"},"bestaetigung":{"anyOf":[{"type":"string","const":"gems_vergeben"},{"type":"null"}],"title":"Bestaetigung"}},"type":"object","required":["aktion","betrag"],"title":"KontoAnpassung","description":"Ein Eingriff in ein Konto - der Ersatz fuer `/admincoins`.\n\n`/admincoins` ist mit 2.799 Aufrufen in 30 Tagen der meistgenutzte Befehl\ndes GESAMTEN Bots. Nicht weil Admins gern Kontostaende tippen, sondern\nweil es keine Oberflaeche gab; der Befehl deckelt zudem bei 1.000.000 je\nAufruf, was die Zahl zusaetzlich hochtreibt."},"KuendigenIn":{"properties":{"reason":{"type":"string","maxLength":32,"title":"Reason"},"detail":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Detail"},"offer_shown":{"type":"string","maxLength":24,"title":"Offer Shown","default":"none"}},"type":"object","required":["reason"],"title":"KuendigenIn"},"KurveFortsetzung":{"properties":{"ab_id":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Ab Id"}},"type":"object","title":"KurveFortsetzung","description":"Die Umrechnung nach einer abgeschnittenen Charge weiterfuehren."},"KurveWechsel":{"properties":{"kurve":{"type":"string","enum":["sanft","standard","steil","stetig"],"title":"Kurve"},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","required":["kurve"],"title":"KurveWechsel","description":"Den Kurvenwechsel anstossen."},"LanguageUpdate":{"properties":{"language":{"type":"string","title":"Language","description":"Language code (e.g., 'en-US', 'de')"}},"type":"object","required":["language"],"title":"LanguageUpdate"},"LeaderboardResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"category":{"type":"string","title":"Category","description":"Leaderboard-Kategorie"},"total_entries":{"type":"integer","title":"Total Entries"},"data":{"items":{"$ref":"#/components/schemas/api__schemas__users__LeaderboardEntry"},"type":"array","title":"Data"}},"type":"object","required":["success","category","total_entries","data"],"title":"LeaderboardResponse","description":"Leaderboard Response"},"Lebenszyklus":{"properties":{"gruppen":{"additionalProperties":{"type":"integer"},"type":"object","title":"Gruppen","default":{}},"nachrichten_je_gruppe":{"additionalProperties":{"type":"integer"},"type":"object","title":"Nachrichten Je Gruppe","default":{}},"gesamt":{"type":"integer","title":"Gesamt","default":0},"anteile":{"additionalProperties":{"type":"number"},"type":"object","title":"Anteile","default":{}},"stamm_traegt":{"type":"number","title":"Stamm Traegt","default":0.0},"gefaehrdete":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Gefaehrdete","default":[]}},"type":"object","title":"Lebenszyklus"},"LevelChannelSettings":{"properties":{"levelup_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Levelup Channel Id","description":"Text channel ID for level-up notifications"},"levelup_channel_behavior":{"anyOf":[{"type":"string","enum":["current","none"]},{"type":"null"}],"title":"Levelup Channel Behavior","description":"Fallback behavior when no channel is set"}},"type":"object","title":"LevelChannelSettings"},"LevelRoleRewardCreate":{"properties":{"role_id":{"type":"string","title":"Role Id","description":"Discord Role ID"},"level_required":{"type":"integer","maximum":10000.0,"minimum":1.0,"title":"Level Required","description":"Required level for the role"}},"type":"object","required":["role_id","level_required"],"title":"LevelRoleRewardCreate"},"LevelRoleSettings":{"properties":{"no_xp_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"No Xp Role Id","description":"Role ID excluded from XP"},"level_role_stack":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Level Role Stack","description":"If true, members keep every earned level role (stacking). If false (default), only the highest level role is kept."}},"type":"object","title":"LevelRoleSettings"},"LevelSettingsUpdate":{"properties":{"xp":{"anyOf":[{"$ref":"#/components/schemas/LevelXPSettings"},{"type":"null"}]},"voice":{"anyOf":[{"$ref":"#/components/schemas/LevelVoiceSettings"},{"type":"null"}]},"channel":{"anyOf":[{"$ref":"#/components/schemas/LevelChannelSettings"},{"type":"null"}]},"roles":{"anyOf":[{"$ref":"#/components/schemas/LevelRoleSettings"},{"type":"null"}]}},"type":"object","title":"LevelSettingsUpdate"},"LevelStats":{"properties":{"total_leveled_users":{"type":"integer","title":"Total Leveled Users","default":0},"avg_level":{"type":"number","title":"Avg Level","default":0.0},"max_level":{"type":"integer","title":"Max Level","default":0},"total_xp":{"type":"integer","title":"Total Xp","default":0},"leaderboard":{"items":{"$ref":"#/components/schemas/api__schemas__server_stats__LeaderboardEntry"},"type":"array","title":"Leaderboard","default":[]}},"type":"object","title":"LevelStats"},"LevelUpNotificationSettingsUpdate":{"properties":{"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"message_content":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Message Content"},"embed_title":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Embed Title"},"embed_description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Embed Description"},"embed_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Color"},"embed_image_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Image Source"},"custom_image_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Image Base64"},"custom_image_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Image Filename"}},"type":"object","title":"LevelUpNotificationSettingsUpdate","description":"Schema for updates"},"LevelVoiceSettings":{"properties":{"xp_per_interval_voice":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Xp Per Interval Voice","description":"XP per voice interval"},"voice_xp_ignore_afk":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Voice Xp Ignore Afk"},"voice_xp_require_unmuted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Voice Xp Require Unmuted"},"voice_xp_require_undeafened":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Voice Xp Require Undeafened"}},"type":"object","title":"LevelVoiceSettings"},"LevelXPSettings":{"properties":{"xp_per_message_base":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Xp Per Message Base","description":"Base XP per message"},"xp_multiplier":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.0},{"type":"null"}],"title":"Xp Multiplier","description":"Global XP multiplier"},"xp_cooldown_seconds_message":{"anyOf":[{"type":"integer","maximum":3600.0,"minimum":0.0},{"type":"null"}],"title":"Xp Cooldown Seconds Message","description":"Cooldown for message XP"},"booster_multiplier":{"anyOf":[{"type":"number","maximum":10.0,"minimum":1.0},{"type":"null"}],"title":"Booster Multiplier","description":"Multiplier for server boosters (1.0 = off)"}},"type":"object","title":"LevelXPSettings"},"LimitsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"is_premium":{"type":"boolean","title":"Is Premium"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"},"limits_per_platform":{"additionalProperties":true,"type":"object","title":"Limits Per Platform"},"current_usage":{"additionalProperties":true,"type":"object","title":"Current Usage"}},"type":"object","required":["success","is_premium","limits_per_platform","current_usage"],"title":"LimitsResponse"},"LinkNeu":{"properties":{"stunden":{"type":"integer","maximum":8760.0,"minimum":1.0,"title":"Stunden","default":168},"max_uses":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":1.0},{"type":"null"}],"title":"Max Uses"}},"type":"object","title":"LinkNeu","description":"`POST /clans/{id}/links` - ein Beitrittslink. Welche Werte gehen,\nsagen `links.LAUFZEITEN_STUNDEN` und `links.NUTZUNGEN`; `max_uses` leer\nheisst ohne Grenze."},"LinkWhitelistCreate":{"properties":{"domain":{"type":"string","maxLength":255,"title":"Domain"},"whitelist_type":{"type":"string","enum":["domain","full_url","regex"],"title":"Whitelist Type","default":"domain"},"description":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Description"},"allowed_channels":{"items":{"type":"string"},"type":"array","title":"Allowed Channels","default":[]}},"type":"object","required":["domain"],"title":"LinkWhitelistCreate"},"LiveDashboardResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server_id":{"type":"string","title":"Server Id"},"server_name":{"type":"string","title":"Server Name"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"member_count":{"type":"integer","title":"Member Count","default":0},"online_count":{"type":"integer","title":"Online Count","default":0},"messages_today":{"type":"integer","title":"Messages Today","default":0},"messages_this_week":{"type":"integer","title":"Messages This Week","default":0},"voice_users_now":{"type":"integer","title":"Voice Users Now","default":0},"active_tickets":{"type":"integer","title":"Active Tickets","default":0},"active_giveaways":{"type":"integer","title":"Active Giveaways","default":0},"pending_applications":{"type":"integer","title":"Pending Applications","default":0},"voice_activity":{"$ref":"#/components/schemas/LiveVoiceOverview"},"member_movement":{"$ref":"#/components/schemas/MemberMovementOverview"},"moderation":{"$ref":"#/components/schemas/ModerationOverview"},"birthdays":{"$ref":"#/components/schemas/BirthdayOverview"},"auto_role_winners":{"$ref":"#/components/schemas/AutoRoleOverview"},"active_channels":{"items":{"$ref":"#/components/schemas/ActiveChannelInfo"},"type":"array","title":"Active Channels","default":[]},"recent_reviews":{"items":{"$ref":"#/components/schemas/ReviewItem"},"type":"array","title":"Recent Reviews","default":[]}},"type":"object","required":["server_id","server_name"],"title":"LiveDashboardResponse","description":"Hauptantwort für das Live-Activity Dashboard — Alles auf einen Blick."},"LiveStatus":{"properties":{"bot_online":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bot Online"},"bot_latency_ms":{"type":"integer","title":"Bot Latency Ms"},"shard_status":{"type":"string","title":"Shard Status"},"last_heartbeat":{"type":"string","format":"date-time","title":"Last Heartbeat"}},"type":"object","required":["bot_latency_ms","shard_status","last_heartbeat"],"title":"LiveStatus","description":"Live Bot/Discord Status"},"LiveVoiceOverview":{"properties":{"total_users_in_voice":{"type":"integer","title":"Total Users In Voice","default":0},"active_channels":{"items":{"$ref":"#/components/schemas/VoiceChannelActivity"},"type":"array","title":"Active Channels","default":[]}},"type":"object","title":"LiveVoiceOverview","description":"Gesamte Voice-Aktivität des Servers."},"LockdownRequest":{"properties":{"duration_minutes":{"type":"integer","maximum":1440.0,"minimum":1.0,"title":"Duration Minutes"},"lock_channels":{"type":"boolean","title":"Lock Channels","default":true},"lock_voice":{"type":"boolean","title":"Lock Voice","default":true},"lock_joins":{"type":"boolean","title":"Lock Joins","default":true},"lock_invites":{"type":"boolean","title":"Lock Invites","default":true},"reason":{"type":"string","title":"Reason","default":"Manual Lockdown"}},"type":"object","required":["duration_minutes"],"title":"LockdownRequest"},"LogChannelSettings":{"properties":{"channel_id":{"type":"string","title":"Channel Id"},"is_enabled":{"type":"boolean","title":"Is Enabled","default":true},"log_bans":{"type":"boolean","title":"Log Bans","default":true},"log_unbans":{"type":"boolean","title":"Log Unbans","default":true},"log_kicks":{"type":"boolean","title":"Log Kicks","default":true},"log_timeouts":{"type":"boolean","title":"Log Timeouts","default":true},"log_timeout_removes":{"type":"boolean","title":"Log Timeout Removes","default":true},"log_warns":{"type":"boolean","title":"Log Warns","default":true},"include_images":{"type":"boolean","title":"Include Images","default":true},"max_image_size_mb":{"type":"integer","maximum":25.0,"minimum":1.0,"title":"Max Image Size Mb","default":8},"ping_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ping Role Id"},"ping_on_ban":{"type":"boolean","title":"Ping On Ban","default":false},"ping_on_kick":{"type":"boolean","title":"Ping On Kick","default":false}},"type":"object","required":["channel_id"],"title":"LogChannelSettings"},"LogChannelSettingsUpdate":{"properties":{"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled"},"log_bans":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Log Bans"},"log_unbans":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Log Unbans"},"log_kicks":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Log Kicks"},"log_timeouts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Log Timeouts"},"log_timeout_removes":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Log Timeout Removes"},"log_warns":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Log Warns"},"include_images":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Images"},"max_image_size_mb":{"anyOf":[{"type":"integer","maximum":25.0,"minimum":1.0},{"type":"null"}],"title":"Max Image Size Mb"},"ping_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ping Role Id"},"ping_on_ban":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ping On Ban"},"ping_on_kick":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ping On Kick"}},"type":"object","title":"LogChannelSettingsUpdate"},"LogConfigCreate":{"properties":{"log_type":{"type":"string","title":"Log Type","description":"Log type"},"channel_id":{"type":"string","title":"Channel Id","description":"Discord Channel ID"},"is_enabled":{"type":"boolean","title":"Is Enabled","description":"Is the log type enabled?","default":true}},"type":"object","required":["log_type","channel_id"],"title":"LogConfigCreate"},"LogConfigUpdate":{"properties":{"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id","description":"Discord Channel ID"},"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled","description":"Is the log type enabled?"}},"type":"object","title":"LogConfigUpdate"},"LogEntry":{"properties":{"id":{"type":"integer","title":"Id"},"action":{"type":"string","title":"Action"},"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Id"},"role_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Name"},"category_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Name"},"additional_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Additional Data"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["id","action","user_id","username","role_id","role_name","category_name","additional_data","timestamp"],"title":"LogEntry","description":"Schema für Log-Eintrag"},"LogEntryResponse":{"properties":{"id":{"type":"integer","title":"Id"},"channel_id":{"type":"string","title":"Channel Id"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"user_id":{"type":"string","title":"User Id"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"message_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Content"},"attachments":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Attachments"},"deleted_at":{"type":"string","format":"date-time","title":"Deleted At"}},"type":"object","required":["id","channel_id","user_id","deleted_at"],"title":"LogEntryResponse","description":"Response fuer einen Log-Eintrag"},"LogIgnoredChannelCreate":{"properties":{"channel_id":{"type":"string","title":"Channel Id","description":"The ID of the channel to be ignored"},"log_type":{"type":"string","title":"Log Type","description":"Which log type? 'all' for all or specific (e.g. 'message_logs')","default":"all"}},"type":"object","required":["channel_id"],"title":"LogIgnoredChannelCreate"},"LogListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"items":{"$ref":"#/components/schemas/LogEntry"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"}},"type":"object","required":["data","pagination"],"title":"LogListResponse","description":"Schema für Logs-Liste"},"LoginBody":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},"type":"object","required":["email","password"],"title":"LoginBody"},"LogsListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"total_logs":{"type":"integer","title":"Total Logs"},"data":{"items":{"$ref":"#/components/schemas/LogEntryResponse"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"}},"type":"object","required":["success","total_logs","data","pagination"],"title":"LogsListResponse","description":"Paginierte Log-Liste"},"ManualAttendanceRequest":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"ManualAttendanceRequest"},"MarkerCreate":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title","description":"Wie der Zeitraum heisst"},"starts_at":{"type":"string","format":"date-time","title":"Starts At","description":"Beginn, ISO mit Zone"},"ends_at":{"type":"string","format":"date-time","title":"Ends At","description":"Ende, ISO mit Zone"},"category":{"type":"string","title":"Category","description":"Siehe /activity-markers/categories","default":"other"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Was dort passiert ist"},"input_timezone":{"type":"string","maxLength":64,"title":"Input Timezone","description":"IANA-Zone der Eingabe","default":"UTC"},"channel_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Channel Ids","description":"Nur diese Kanaele zaehlen"},"linked_event_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Linked Event Id","description":"Zugehoeriges Discord-Event"},"color_hex":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color Hex","description":"Eigene Farbe im Zeitstrahl"}},"type":"object","required":["title","starts_at","ends_at"],"title":"MarkerCreate","description":"Ein neuer Zeitraum.\n\n`starts_at`/`ends_at` kommen als ISO-Zeitstempel MIT Zone. Ohne Zone\nwaeren sie zweideutig, und die haeufigste Auslegung (\"dann ist es wohl\nUTC\") ist auf einem Dashboard, das in Mitteleuropa bedient wird, im\nSommer zwei Stunden falsch. Die Oberflaeche schickt deshalb, was\n`toISOString()` liefert.\n\n`input_timezone` ist die Zone, in der die Eingabe ENTSTAND - nicht die,\nin der sie gespeichert wird. Siehe die Begruendung am Modell."},"MarkerUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Title"},"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"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"input_timezone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Input Timezone"},"channel_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Channel Ids"},"linked_event_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Linked Event Id"},"color_hex":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color Hex"}},"type":"object","title":"MarkerUpdate","description":"Aenderung. Alles optional - was nicht kommt, bleibt.\n\nAusnahme ist `description`: dort ist ein ausdruecklich uebergebenes null\ndas Leeren. Ohne diese Ausnahme gaebe es keinen Weg, eine Beschreibung\nwieder loszuwerden."},"MarktSchalter":{"properties":{"ist_aktiv":{"type":"boolean","title":"Ist Aktiv"},"bestaetigung":{"anyOf":[{"type":"string","const":"abschalten"},{"type":"null"}],"title":"Bestaetigung"}},"type":"object","required":["ist_aktiv"],"title":"MarktSchalter","description":"Den Spielermarkt eines Servers ein- oder ausschalten.\n\nGemessen: 279 Shop-Kaeufe in 30 Tagen auf 1.579 bestueckten Servern, und\n311 Inventarzeilen plattformweit. Der Markt ist die Antwort darauf - ein\nLaden, den kein Admin bestuecken muss.\n\nNur der Abschalter, keine Preisregler: Gebuehr und Deckel folgen aus dem\nRegelwerk (`economy_balance_settings`). Eine zweite Stellschraube dafuer\nwaere eine zweite Wahrheit, und die Frage \"warum ist die Gebuehr hier\nanders\" haette dann keine Antwort mehr."},"MassenReset":{"properties":{"umfang":{"type":"string","enum":["alle","nur_inaktive","auswahl"],"title":"Umfang"},"bestaetigung":{"type":"string","const":"zuruecksetzen","title":"Bestaetigung"},"user_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":500},{"type":"null"}],"title":"User Ids"},"inaktiv_seit_tagen":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":1.0},{"type":"null"}],"title":"Inaktiv Seit Tagen"},"prestige_behalten":{"type":"boolean","title":"Prestige Behalten","default":true}},"type":"object","required":["umfang","bestaetigung"],"title":"MassenReset","description":"Zuruecksetzen mehrerer Konten - der scharfe Eingriff.\n\nNur fuer Besitzer, und mit Wortlaut-Bestaetigung: das hier loescht\nSpielfortschritt, und zwar den von anderen Leuten."},"MatchMode":{"type":"string","enum":["exact","contains","starts_with","ends_with","regex"],"title":"MatchMode"},"MatrixCell":{"properties":{"group_id":{"type":"integer","title":"Group Id"},"permission":{"type":"string","title":"Permission"},"granted":{"type":"boolean","title":"Granted"}},"type":"object","required":["group_id","permission","granted"],"title":"MatrixCell"},"MatrixSave":{"properties":{"cells":{"items":{"$ref":"#/components/schemas/MatrixCell"},"type":"array","title":"Cells"}},"type":"object","required":["cells"],"title":"MatrixSave"},"MemberAdd":{"properties":{"user_ids":{"items":{"type":"string"},"type":"array","minItems":1,"title":"User Ids"}},"type":"object","required":["user_ids"],"title":"MemberAdd"},"MemberFlowStats":{"properties":{"total_joins":{"type":"integer","title":"Total Joins","default":0},"total_leaves":{"type":"integer","title":"Total Leaves","default":0},"net_growth":{"type":"integer","title":"Net Growth","default":0},"avg_joins_per_day":{"type":"number","title":"Avg Joins Per Day","default":0.0},"avg_leaves_per_day":{"type":"number","title":"Avg Leaves Per Day","default":0.0},"retention_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Retention Rate"},"join_timeline":{"items":{"$ref":"#/components/schemas/TimelinePoint"},"type":"array","title":"Join Timeline","default":[]},"leave_timeline":{"items":{"$ref":"#/components/schemas/TimelinePoint"},"type":"array","title":"Leave Timeline","default":[]},"busiest_join_weekday":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Busiest Join Weekday"}},"type":"object","title":"MemberFlowStats"},"MemberGrowthResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"timeframe":{"type":"string","title":"Timeframe"},"group_by":{"type":"string","title":"Group By"},"start_date":{"type":"string","format":"date-time","title":"Start Date"},"end_date":{"type":"string","format":"date-time","title":"End Date"},"current_members":{"type":"integer","title":"Current Members"},"total_joins":{"type":"integer","title":"Total Joins"},"total_leaves":{"type":"integer","title":"Total Leaves"},"net_growth":{"type":"integer","title":"Net Growth"},"joins_timeline":{"items":{"$ref":"#/components/schemas/TimeSeriesDataPoint"},"type":"array","title":"Joins Timeline"},"leaves_timeline":{"items":{"$ref":"#/components/schemas/TimeSeriesDataPoint"},"type":"array","title":"Leaves Timeline"},"net_growth_timeline":{"items":{"$ref":"#/components/schemas/TimeSeriesDataPoint"},"type":"array","title":"Net Growth Timeline"},"total_members_timeline":{"items":{"$ref":"#/components/schemas/TimeSeriesDataPoint"},"type":"array","title":"Total Members Timeline"}},"type":"object","required":["success","timeframe","group_by","start_date","end_date","current_members","total_joins","total_leaves","net_growth","joins_timeline","leaves_timeline","net_growth_timeline","total_members_timeline"],"title":"MemberGrowthResponse","description":"Response für Member-Wachstum"},"MemberMovementDetail":{"properties":{"id":{"type":"integer","title":"Id"},"action_type":{"type":"string","title":"Action Type"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["id","action_type","timestamp"],"title":"MemberMovementDetail","description":"Server-Bewegung (Join/Leave)."},"MemberMovementItem":{"properties":{"user":{"$ref":"#/components/schemas/UserSnippet"},"action_type":{"type":"string","title":"Action Type"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["user","action_type","timestamp"],"title":"MemberMovementItem","description":"Ein Join oder Leave."},"MemberMovementOverview":{"properties":{"joins_today":{"type":"integer","title":"Joins Today","default":0},"leaves_today":{"type":"integer","title":"Leaves Today","default":0},"joins_this_week":{"type":"integer","title":"Joins This Week","default":0},"leaves_this_week":{"type":"integer","title":"Leaves This Week","default":0},"net_growth_today":{"type":"integer","title":"Net Growth Today","default":0},"net_growth_this_week":{"type":"integer","title":"Net Growth This Week","default":0},"recent_movements":{"items":{"$ref":"#/components/schemas/MemberMovementItem"},"type":"array","title":"Recent Movements","default":[]}},"type":"object","title":"MemberMovementOverview","description":"Joins & Leaves Übersicht."},"MemberSearchResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"items":{"$ref":"#/components/schemas/ServerMemberSearchResult"},"type":"array","title":"Data"}},"type":"object","required":["data"],"title":"MemberSearchResponse","description":"API Response für die Member-Suche."},"MessageBody":{"properties":{"content":{"type":"string","title":"Content"},"attachments":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Attachments"}},"type":"object","required":["content"],"title":"MessageBody"},"MessageStats":{"properties":{"total_messages":{"type":"integer","title":"Total Messages","default":0},"total_words":{"type":"integer","title":"Total Words","default":0},"total_characters":{"type":"integer","title":"Total Characters","default":0},"total_attachments":{"type":"integer","title":"Total Attachments","default":0},"total_stickers":{"type":"integer","title":"Total Stickers","default":0},"total_custom_emojis":{"type":"integer","title":"Total Custom Emojis","default":0},"total_unicode_emojis":{"type":"integer","title":"Total Unicode Emojis","default":0},"total_mentions":{"type":"integer","title":"Total Mentions","default":0},"total_edited":{"type":"integer","title":"Total Edited","default":0},"total_deleted":{"type":"integer","title":"Total Deleted","default":0},"avg_message_length":{"type":"number","title":"Avg Message Length","default":0.0},"avg_words_per_message":{"type":"number","title":"Avg Words Per Message","default":0.0},"avg_messages_per_day":{"type":"number","title":"Avg Messages Per Day","default":0.0},"busiest_hour":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Busiest Hour"},"busiest_weekday":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Busiest Weekday"},"hourly_distribution":{"items":{"$ref":"#/components/schemas/HourlyDistribution"},"type":"array","title":"Hourly Distribution","default":[]},"daily_distribution":{"items":{"$ref":"#/components/schemas/DailyDistribution"},"type":"array","title":"Daily Distribution","default":[]},"timeline":{"items":{"$ref":"#/components/schemas/TimelinePoint"},"type":"array","title":"Timeline","default":[]},"channel_breakdown":{"items":{"$ref":"#/components/schemas/ChannelEntry"},"type":"array","title":"Channel Breakdown","default":[]},"leaderboard":{"items":{"$ref":"#/components/schemas/api__schemas__server_stats__LeaderboardEntry"},"type":"array","title":"Leaderboard","default":[]}},"type":"object","title":"MessageStats"},"MessageStatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"period":{"type":"string","title":"Period"},"user_id":{"type":"string","title":"User Id"},"server_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Id"},"stats":{"additionalProperties":true,"type":"object","title":"Stats","example":{"average_per_day":50.8,"channel_breakdown":[],"daily_distribution":{},"hourly_distribution":{},"server_breakdown":[],"timeline":[],"total_messages":1523,"trend":{"change":203,"direction":"up","percentage":15.3}}},"insights":{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array","title":"Insights"}},"type":"object","required":["period","user_id","stats","insights"],"title":"MessageStatsResponse","description":"Response für Nachrichten-Statistiken."},"MitgliedAenderung":{"properties":{"stufe_setzen":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Stufe Setzen"},"stufe_aendern":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stufe Aendern","description":"Positiv oder negativ"},"xp_setzen":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Xp Setzen"},"xp_aendern":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Xp Aendern","description":"Positiv oder negativ"},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","title":"MitgliedAenderung","description":"Eine Aenderung an EINEM Profil.\n\n─── Warum vier Felder statt eines `wert` mit `art` ─────────────────────\n\nWeil sie sich kombinieren lassen muessen. \"Setze auf Stufe 30 und XP auf\n0\" ist ein Vorgang und nicht zwei; als zwei Aufrufe waere der Zustand\ndazwischen sichtbar - jemand stuende einen Augenblick auf Stufe 30 mit\ndem alten XP-Rest, und der kann ueber der neuen Schwelle liegen.\n\nGenau EINE der beiden Stufen-Angaben ist erlaubt, dasselbe bei XP.\n\"Setze auf 30 und addiere 5\" hat keine richtige Antwort.\n\n─── Warum `stufe_*` und nicht `level_*` ────────────────────────────────\n\nWeil die Schublade \"Stufe setzen auf\" beschriftet ist und genau\n`stufe_setzen` schickt. Ein Modell mit `level_setzen` bekommt davon\nnichts - Pydantic verwirft unbekannte Felder still, alle vier Angaben\nwaeren leer, und der Endpunkt antwortete mit \"keine Daten uebermittelt\"\nauf einen vollstaendig gefuellten Vorgang."},"MitgliedRollenSync":{"properties":{"nur_pruefen":{"type":"boolean","title":"Nur Pruefen","default":false},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","title":"MitgliedRollenSync","description":"Ein Abgleich fuer EINE Person.\n\n─── Warum hier keine Bestaetigung verlangt wird ────────────────────────\n\nWeil das Bestaetigungswort gegen die Wirkung schuetzt, die man nicht mehr\neinsammeln kann: eine Sammelaktion schreibt die Rangliste eines Servers\num, ein Serverlauf faerbt bis zu 250 Mitglieder um. Hier geht es um eine\nPerson und eine Handvoll Rollen, die Wirkung steht im selben Augenblick\nin der Antwort, und der Anlass ist fast immer eine Beschwerde (\"meine\nRolle fehlt\"). Ein Wort, das man dafuer abtippen muss, wuerde nur\nbeigebracht bekommen, dass man Bestaetigungen abtippt."},"ModTimelineDataPoint":{"properties":{"date":{"type":"string","title":"Date"},"bans":{"type":"integer","title":"Bans","default":0},"kicks":{"type":"integer","title":"Kicks","default":0},"timeouts":{"type":"integer","title":"Timeouts","default":0},"total":{"type":"integer","title":"Total","default":0}},"type":"object","required":["date"],"title":"ModTimelineDataPoint"},"ModTimelineResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"timeframe":{"type":"string","title":"Timeframe"},"interval":{"type":"string","title":"Interval"},"data":{"items":{"$ref":"#/components/schemas/ModTimelineDataPoint"},"type":"array","title":"Data"}},"type":"object","required":["timeframe","interval","data"],"title":"ModTimelineResponse"},"ModerateBody":{"properties":{"action":{"type":"string","title":"Action","description":"approve|block"},"note":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Note"}},"type":"object","required":["action"],"title":"ModerateBody"},"ModeratedUserListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"timeframe":{"type":"string","title":"Timeframe"},"data":{"items":{"$ref":"#/components/schemas/ModeratedUserStat"},"type":"array","title":"Data"}},"type":"object","required":["timeframe","data"],"title":"ModeratedUserListResponse"},"ModeratedUserStat":{"properties":{"user":{"$ref":"#/components/schemas/UserInfoBasic"},"action_count":{"type":"integer","title":"Action Count"}},"type":"object","required":["user","action_count"],"title":"ModeratedUserStat"},"ModerationActionDetail":{"properties":{"id":{"type":"integer","title":"Id"},"action_type":{"type":"string","title":"Action Type"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"target_user_id":{"type":"string","title":"Target User Id"},"target_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Username"},"target_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Display Name"},"target_avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Avatar Url"},"moderator_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moderator User Id"},"moderator_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moderator Username"},"moderator_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moderator Display Name"},"log_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Message Id"},"log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Channel Id"},"context_info":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Context Info"},"attached_images":{"items":{"$ref":"#/components/schemas/ModerationImageDetail"},"type":"array","title":"Attached Images","default":[]}},"type":"object","required":["id","action_type","timestamp","target_user_id"],"title":"ModerationActionDetail","description":"Detaillierte Moderationsaktion."},"ModerationActionItem":{"properties":{"action_id":{"type":"integer","title":"Action Id"},"action_type":{"type":"string","title":"Action Type"},"target_user":{"$ref":"#/components/schemas/UserSnippet"},"moderator":{"anyOf":[{"$ref":"#/components/schemas/UserSnippet"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["action_id","action_type","target_user","timestamp"],"title":"ModerationActionItem","description":"Eine Moderations-Aktion."},"ModerationActionRequest":{"properties":{"action_type":{"type":"string","title":"Action Type","description":"ban, kick, timeout or unban"},"target_id":{"type":"string","title":"Target Id","description":"Discord user ID to action"},"reason":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Reason"},"duration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duration","description":"Timeout duration, e.g. '1d12h' (required for timeout)"},"delete_message_days":{"type":"integer","maximum":7.0,"minimum":0.0,"title":"Delete Message Days","description":"Ban only: delete this many days of messages","default":0}},"type":"object","required":["action_type","target_id"],"title":"ModerationActionRequest"},"ModerationActionsListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"items":{"$ref":"#/components/schemas/ModerationActionDetail"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"},"action_counts":{"additionalProperties":true,"type":"object","title":"Action Counts"}},"type":"object","required":["data","pagination","action_counts"],"title":"ModerationActionsListResponse","description":"API Response für Moderationsaktionen-Liste."},"ModerationImageDetail":{"properties":{"id":{"type":"integer","title":"Id"},"image_url":{"type":"string","title":"Image Url"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"},"file_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size"},"log_channel_id":{"type":"string","title":"Log Channel Id"},"log_message_id":{"type":"string","title":"Log Message Id"},"uploaded_at":{"type":"string","format":"date-time","title":"Uploaded At"}},"type":"object","required":["id","image_url","log_channel_id","log_message_id","uploaded_at"],"title":"ModerationImageDetail","description":"Detail eines angehängten Bildes zu einer Moderationsaktion."},"ModerationImport":{"properties":{"source":{"type":"string","pattern":"^(dyno|carlbot)$","title":"Source"},"channel_id":{"type":"string","maxLength":21,"minLength":15,"pattern":"^\\d+$","title":"Channel Id"},"before":{"anyOf":[{"type":"string","maxLength":21,"pattern":"^\\d+$"},{"type":"null"}],"title":"Before"},"token":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Token"}},"type":"object","required":["source","channel_id"],"title":"ModerationImport"},"ModerationOverview":{"properties":{"actions_today":{"type":"integer","title":"Actions Today","default":0},"actions_this_week":{"type":"integer","title":"Actions This Week","default":0},"active_warnings_count":{"type":"integer","title":"Active Warnings Count","default":0},"recent_actions":{"items":{"$ref":"#/components/schemas/ModerationActionItem"},"type":"array","title":"Recent Actions","default":[]},"recent_warnings":{"items":{"$ref":"#/components/schemas/WarningItem"},"type":"array","title":"Recent Warnings","default":[]}},"type":"object","title":"ModerationOverview","description":"Moderations-Übersicht."},"ModerationProfileResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"$ref":"#/components/schemas/UserFullModerationProfile"}},"type":"object","required":["data"],"title":"ModerationProfileResponse","description":"API Response für vollständiges Profil."},"ModerationScan":{"properties":{"source":{"type":"string","pattern":"^(dyno|carlbot)$","title":"Source"},"channel_id":{"type":"string","maxLength":21,"minLength":15,"pattern":"^\\d+$","title":"Channel Id"},"before":{"anyOf":[{"type":"string","maxLength":21,"pattern":"^\\d+$"},{"type":"null"}],"title":"Before"}},"type":"object","required":["source","channel_id"],"title":"ModerationScan"},"ModerationStatistics":{"properties":{"total_warnings":{"type":"integer","title":"Total Warnings","default":0},"active_warnings":{"type":"integer","title":"Active Warnings","default":0},"removed_warnings":{"type":"integer","title":"Removed Warnings","default":0},"total_bans":{"type":"integer","title":"Total Bans","default":0},"total_unbans":{"type":"integer","title":"Total Unbans","default":0},"total_kicks":{"type":"integer","title":"Total Kicks","default":0},"total_timeouts":{"type":"integer","title":"Total Timeouts","default":0},"total_timeout_removes":{"type":"integer","title":"Total Timeout Removes","default":0},"total_notes":{"type":"integer","title":"Total Notes","default":0},"important_notes":{"type":"integer","title":"Important Notes","default":0},"total_joins":{"type":"integer","title":"Total Joins","default":0},"total_leaves":{"type":"integer","title":"Total Leaves","default":0},"warnings_last_30_days":{"type":"integer","title":"Warnings Last 30 Days","default":0},"actions_last_30_days":{"type":"integer","title":"Actions Last 30 Days","default":0},"first_warning_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Warning At"},"last_warning_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Warning At"},"first_action_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Action At"},"last_action_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Action At"}},"type":"object","title":"ModerationStatistics","description":"Aggregierte Moderations-Statistiken."},"ModerationStats":{"properties":{"total_actions":{"type":"integer","title":"Total Actions","default":0},"total_bans":{"type":"integer","title":"Total Bans","default":0},"total_kicks":{"type":"integer","title":"Total Kicks","default":0},"total_timeouts":{"type":"integer","title":"Total Timeouts","default":0},"total_unbans":{"type":"integer","title":"Total Unbans","default":0},"top_moderators":{"items":{"$ref":"#/components/schemas/api__schemas__server_stats__LeaderboardEntry"},"type":"array","title":"Top Moderators","default":[]},"action_timeline":{"items":{"$ref":"#/components/schemas/TimelinePoint"},"type":"array","title":"Action Timeline","default":[]}},"type":"object","title":"ModerationStats"},"ModerationSummaryListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"items":{"$ref":"#/components/schemas/UserModerationSummary"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"}},"type":"object","required":["data","pagination"],"title":"ModerationSummaryListResponse","description":"API Response für Listen-Ansicht."},"ModerationTimelineEntry":{"properties":{"id":{"type":"integer","title":"Id"},"type":{"type":"string","title":"Type"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"moderator_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moderator Id"},"moderator_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moderator Username"},"is_important":{"type":"boolean","title":"Is Important","default":false},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["id","type","timestamp","title"],"title":"ModerationTimelineEntry","description":"Einzelner Eintrag in der Moderations-Timeline."},"ModerationTimelineResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"items":{"$ref":"#/components/schemas/ModerationTimelineEntry"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"}},"type":"object","required":["data","pagination"],"title":"ModerationTimelineResponse","description":"API Response für Timeline."},"MonatsberichtIn":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"MonatsberichtIn"},"MyBackgroundUpdate":{"properties":{"mybackground_base64":{"type":"string","title":"Mybackground Base64","description":"Base64-encoded image for stats (max 5MB)"}},"type":"object","required":["mybackground_base64"],"title":"MyBackgroundUpdate"},"MyProfileUpdate":{"properties":{"featured_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Featured Ids"},"title":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Title"},"bio":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Bio"},"accent_color":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Accent Color"},"is_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public"},"banner_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner Base64"}},"type":"object","title":"MyProfileUpdate"},"NameBody":{"properties":{"name":{"type":"string","maxLength":200,"title":"Name"}},"type":"object","required":["name"],"title":"NameBody"},"NewConversationBody":{"properties":{"message":{"type":"string","title":"Message"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","default":"widget"},"attachments":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Attachments"},"server_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Id"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"client_context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Client Context"}},"type":"object","required":["message"],"title":"NewConversationBody"},"NewcomerEntry":{"properties":{"user":{"$ref":"#/components/schemas/PeopleUser"},"joined_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Joined At"},"has_posted":{"type":"boolean","title":"Has Posted","default":false}},"type":"object","required":["user"],"title":"NewcomerEntry","description":"Wer neu dazugekommen ist. has_posted trennt Ankunft von Beitritt."},"NewsCreate":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title"},"body":{"type":"string","maxLength":4000,"minLength":1,"title":"Body"},"priority":{"type":"string","maxLength":10,"title":"Priority","default":"normal"},"requires_ack":{"type":"boolean","title":"Requires Ack","default":false},"group_ids":{"items":{"type":"integer"},"type":"array","title":"Group Ids"},"publish_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publish At"},"discord_channel_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Discord Channel Id"}},"type":"object","required":["title","body"],"title":"NewsCreate"},"NewsPatch":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Title"},"body":{"anyOf":[{"type":"string","maxLength":4000,"minLength":1},{"type":"null"}],"title":"Body"},"priority":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Priority"},"requires_ack":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Requires Ack"},"group_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Group Ids"},"publish_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publish At"},"clear_publish_at":{"type":"boolean","title":"Clear Publish At","default":false},"discord_channel_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Discord Channel Id"}},"type":"object","title":"NewsPatch"},"NoteCategory":{"type":"string","enum":["behavior","warning","positive","other","all"],"title":"NoteCategory"},"NoteCreate":{"properties":{"user_id":{"type":"string","maxLength":30,"title":"User Id"},"body":{"type":"string","maxLength":4000,"minLength":1,"title":"Body"},"visibility":{"type":"string","maxLength":10,"title":"Visibility","default":"leads"}},"type":"object","required":["user_id","body"],"title":"NoteCreate"},"NoteCreateRequest":{"properties":{"content":{"type":"string","maxLength":2000,"minLength":1,"title":"Content"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"is_pinned":{"type":"boolean","title":"Is Pinned","default":false}},"type":"object","required":["content"],"title":"NoteCreateRequest"},"NotificationItem":{"properties":{"type":{"type":"string","title":"Type"},"severity":{"type":"string","title":"Severity"},"key":{"type":"string","title":"Key"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggestion"},"settings_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Settings Path"},"discord_side":{"type":"boolean","title":"Discord Side","default":false}},"type":"object","required":["type","severity","key","title","description"],"title":"NotificationItem","description":"A single setup/configuration notification for the server admin"},"NotificationsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"total":{"type":"integer","title":"Total"},"notifications":{"items":{"$ref":"#/components/schemas/NotificationItem"},"type":"array","title":"Notifications"},"bot":{"anyOf":[{"$ref":"#/components/schemas/BotReadiness"},{"type":"null"}]}},"type":"object","required":["success","total","notifications"],"title":"NotificationsResponse","description":"Notifications Response"},"NotifyPrefsBody":{"properties":{"dm_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dm Enabled"},"dm_on_ai":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dm On Ai"},"sound_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sound Enabled"}},"type":"object","title":"NotifyPrefsBody"},"NotoqBrandingUpdate":{"properties":{"hide_notoq_branding":{"type":"boolean","title":"Hide Notoq Branding","description":"If true, Notoq link buttons (invite, vote) are hidden"}},"type":"object","required":["hide_notoq_branding"],"title":"NotoqBrandingUpdate","description":"Request Body for Notoq Branding Update (Premium only)"},"NutzungBody":{"properties":{"art":{"type":"string","maxLength":16,"title":"Art"}},"type":"object","required":["art"],"title":"NutzungBody"},"OeffentlichEinstellung":{"properties":{"an":{"type":"boolean","title":"An"}},"type":"object","required":["an"],"title":"OeffentlichEinstellung"},"OptionQuestionSchema":{"properties":{"label":{"type":"string","maxLength":45,"title":"Label"},"placeholder":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Placeholder"},"style":{"type":"string","enum":["short","paragraph"],"title":"Style","default":"short"},"required":{"type":"boolean","title":"Required","default":true},"max_length":{"type":"integer","maximum":4000.0,"title":"Max Length","default":1024}},"type":"object","required":["label"],"title":"OptionQuestionSchema"},"OverviewResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"period":{"type":"string","title":"Period"},"user_id":{"type":"string","title":"User Id"},"server_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Id"},"server_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Name"},"overview":{"anyOf":[{"$ref":"#/components/schemas/GlobalOverviewStats"},{"$ref":"#/components/schemas/ServerOverviewStats"}],"title":"Overview"},"insights":{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array","title":"Insights"}},"type":"object","required":["period","user_id","overview","insights"],"title":"OverviewResponse","description":"Allgemeine Response für die Overview-Endpunkte."},"PanelCreateRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"use_all_positions":{"type":"boolean","title":"Use All Positions","default":true},"position_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array","maxItems":25},{"type":"null"}],"title":"Position Ids"},"is_active":{"type":"boolean","title":"Is Active","default":true},"select_placeholder":{"anyOf":[{"type":"string","maxLength":150},{"type":"null"}],"title":"Select Placeholder"},"embed_title":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Embed Title"},"embed_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Description"},"embed_color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Embed Color"},"panel_mode":{"anyOf":[{"type":"string","pattern":"^(classic|custom)$"},{"type":"null"}],"title":"Panel Mode"},"panel_container":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Panel Container"}},"type":"object","required":["name"],"title":"PanelCreateRequest"},"PanelOptionSchema":{"properties":{"label":{"type":"string","maxLength":80,"title":"Label"},"value":{"type":"string","maxLength":100,"title":"Value"},"description":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Description"},"emoji":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emoji"},"button_style":{"type":"string","enum":["primary","secondary","success","danger","gray"],"title":"Button Style","default":"primary"},"target_category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Category Id"},"thread_parent_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thread Parent Channel Id"},"ticket_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticket Content"},"allowed_roles":{"items":{"type":"string"},"type":"array","title":"Allowed Roles","default":[]},"required_roles":{"items":{"type":"string"},"type":"array","title":"Required Roles","default":[]},"admin_only":{"type":"boolean","title":"Admin Only","default":false},"ping_roles":{"items":{"type":"string"},"type":"array","title":"Ping Roles","default":[]},"naming_scheme":{"type":"string","maxLength":100,"title":"Naming Scheme","default":"ticket-{user_name}"},"reason_required":{"type":"boolean","title":"Reason Required","default":true},"ai_support_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai Support Enabled"},"ai_triage_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai Triage Enabled"},"questions":{"items":{"$ref":"#/components/schemas/OptionQuestionSchema"},"type":"array","title":"Questions","default":[]}},"type":"object","required":["label","value"],"title":"PanelOptionSchema"},"PanelPositionsRequest":{"properties":{"position_ids":{"items":{"type":"integer"},"type":"array","maxItems":25,"title":"Position Ids","description":"Positions-IDs in gewünschter Panel-Reihenfolge"}},"type":"object","required":["position_ids"],"title":"PanelPositionsRequest"},"PanelReorderRequest":{"properties":{"order":{"items":{"type":"integer"},"type":"array","title":"Order","description":"Panel-IDs in gewünschter neuer Reihenfolge"}},"type":"object","required":["order"],"title":"PanelReorderRequest"},"PanelSendRequest":{"properties":{"channel_id":{"type":"string","title":"Channel Id","description":"Discord Channel ID"}},"type":"object","required":["channel_id"],"title":"PanelSendRequest"},"PanelSendToChannelRequest":{"properties":{"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id","description":"Zielkanal (leer = der am Panel hinterlegte)"}},"type":"object","title":"PanelSendToChannelRequest"},"PanelUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"use_all_positions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use All Positions"},"position_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array","maxItems":25},{"type":"null"}],"title":"Position Ids"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"select_placeholder":{"anyOf":[{"type":"string","maxLength":150},{"type":"null"}],"title":"Select Placeholder"},"embed_title":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Embed Title"},"embed_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Description"},"embed_color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Embed Color"},"panel_mode":{"anyOf":[{"type":"string","pattern":"^(classic|custom)$"},{"type":"null"}],"title":"Panel Mode"},"panel_container":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Panel Container"}},"type":"object","title":"PanelUpdateRequest"},"PartnerLimitBody":{"properties":{"account_id":{"type":"string","title":"Account Id"},"monthly_limit":{"type":"integer","title":"Monthly Limit"}},"type":"object","required":["account_id","monthly_limit"],"title":"PartnerLimitBody"},"PassGesehen":{"properties":{"bis":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Bis"}},"type":"object","required":["bis"],"title":"PassGesehen","description":"`POST /users/me/clan/pass/gesehen` - bis zu dieser Stufe hat der\nNutzer seine Belohnungen gesehen (das \"Neu\" verschwindet)."},"PassSchmuck":{"properties":{"art":{"type":"string","enum":["zier","stein"],"title":"Art"},"key":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Key"}},"type":"object","required":["art"],"title":"PassSchmuck","description":"`PUT /users/me/clan/pass/schmuck` - eine Zier oder einen Stein aus dem\nSaisonpfad anlegen, oder mit `key: null` ablegen (Nachtlauf 3, C7).\n\n`art` als Literal, `key` als Freitext: ob die Belohnung dem Nutzer\ngehoert, sagt `clan_pass.anlegen` mit einem Satz statt eines 422."},"PatchBlueprintRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"summary":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Summary"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Category"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"monetization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Monetization"}},"type":"object","title":"PatchBlueprintRequest"},"PausierenIn":{"properties":{"resume_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resume At"},"months":{"anyOf":[{"type":"integer","maximum":6.0,"minimum":1.0},{"type":"null"}],"title":"Months"},"reason":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Reason"}},"type":"object","title":"PausierenIn"},"PenaltyCreate":{"properties":{"user_id":{"type":"string","maxLength":30,"title":"User Id"},"points":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Points","default":0},"reason":{"type":"string","maxLength":2000,"minLength":1,"title":"Reason"},"category":{"type":"string","maxLength":50,"title":"Category","default":"other"},"expires_in_days":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":1.0},{"type":"null"}],"title":"Expires In Days"}},"type":"object","required":["user_id","reason"],"title":"PenaltyCreate"},"PenaltyVoid":{"properties":{"void_reason":{"type":"string","maxLength":1000,"minLength":1,"title":"Void Reason"}},"type":"object","required":["void_reason"],"title":"PenaltyVoid"},"PeopleResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"server_id":{"type":"string","title":"Server Id"},"days":{"type":"integer","title":"Days"},"carriers":{"items":{"$ref":"#/components/schemas/CarrierEntry"},"type":"array","title":"Carriers"},"newcomers":{"items":{"$ref":"#/components/schemas/NewcomerEntry"},"type":"array","title":"Newcomers"},"fading":{"items":{"$ref":"#/components/schemas/FadingEntry"},"type":"array","title":"Fading"},"totals":{"$ref":"#/components/schemas/PeopleTotals"}},"type":"object","required":["success","server_id","days","carriers","newcomers","fading","totals"],"title":"PeopleResponse","description":"Menschen-Panel: Traeger, Neuzugaenge, Verstummte."},"PeopleTotals":{"properties":{"active_current":{"type":"integer","title":"Active Current"},"active_previous":{"type":"integer","title":"Active Previous"},"returning":{"type":"integer","title":"Returning"},"retention_pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retention Pct"},"newcomers_7d":{"type":"integer","title":"Newcomers 7D"},"fading_count":{"type":"integer","title":"Fading Count"}},"type":"object","required":["active_current","active_previous","returning","newcomers_7d","fading_count"],"title":"PeopleTotals","description":"Summenzeile. retention_pct ist der Anteil der Vorperiode, der wiederkam."},"PeopleUser":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"}},"type":"object","required":["user_id","username"],"title":"PeopleUser","description":"Ein Mitglied, so wie es im Panel erscheint."},"PermanentListRequest":{"properties":{"channel_id":{"type":"string","title":"Channel Id","description":"Channel ID for permanent list"}},"type":"object","required":["channel_id"],"title":"PermanentListRequest"},"PersoenlichBody":{"properties":{"id":{"type":"string","maxLength":64,"title":"Id"},"schluessel":{"$ref":"#/components/schemas/SchluesselPaar"}},"type":"object","required":["id","schluessel"],"title":"PersoenlichBody"},"PlanCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"timezone":{"type":"string","maxLength":64,"title":"Timezone","default":"UTC"},"slot_length_minutes":{"type":"integer","maximum":240.0,"minimum":15.0,"title":"Slot Length Minutes","default":60},"discord_channel_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Discord Channel Id"}},"type":"object","required":["name"],"title":"PlanCreate"},"PlanPatch":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"timezone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Timezone"},"slot_length_minutes":{"anyOf":[{"type":"integer","maximum":240.0,"minimum":15.0},{"type":"null"}],"title":"Slot Length Minutes"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"discord_channel_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Discord Channel Id"}},"type":"object","title":"PlanPatch"},"PlanRequest":{"properties":{"blueprint_id":{"type":"integer","title":"Blueprint Id"},"mode":{"type":"string","title":"Mode","description":"merge | overwrite | replace","default":"merge"},"version_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version Id"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale","description":"en-US | de | es | fr | it | nl | pl | prt | ru | tr"},"selection":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Selection"}},"type":"object","required":["blueprint_id"],"title":"PlanRequest"},"PlanWechselIn":{"properties":{"price_id":{"type":"string","maxLength":100,"title":"Price Id"},"reason":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Reason"}},"type":"object","required":["price_id"],"title":"PlanWechselIn"},"PointsRoleEntry":{"properties":{"points":{"type":"integer","minimum":1.0,"title":"Points"},"role_id":{"type":"string","title":"Role Id"}},"type":"object","required":["points","role_id"],"title":"PointsRoleEntry"},"PointsRolesBody":{"properties":{"rewards":{"items":{"$ref":"#/components/schemas/PointsRoleEntry"},"type":"array","title":"Rewards"}},"type":"object","title":"PointsRolesBody"},"PoolItemOut":{"properties":{"id":{"type":"integer","title":"Id"},"image_url":{"type":"string","title":"Image Url"},"link_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"dominant_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dominant Color"},"state":{"type":"string","title":"State"},"skip_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skip Reason"},"discovered_at":{"type":"string","format":"date-time","title":"Discovered At"},"posted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Posted At"}},"type":"object","required":["id","image_url","link_url","title","width","height","dominant_color","state","skip_reason","discovered_at","posted_at"],"title":"PoolItemOut"},"PopularTagSchema":{"properties":{"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"is_official":{"type":"boolean","title":"Is Official"},"usage_count":{"type":"integer","title":"Usage Count"}},"type":"object","required":["name","slug","is_official","usage_count"],"title":"PopularTagSchema"},"PositionCreateRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"description":{"type":"string","maxLength":255,"minLength":1,"title":"Description"},"emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Emoji"},"is_active":{"type":"boolean","title":"Is Active","default":true},"auto_assign_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auto Assign Role Id"},"use_custom_questions":{"type":"boolean","title":"Use Custom Questions","default":false}},"type":"object","required":["name","description"],"title":"PositionCreateRequest"},"PositionInfo":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"emoji":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emoji"}},"type":"object","required":["id","name"],"title":"PositionInfo"},"PositionReorderRequest":{"properties":{"order":{"items":{"type":"integer"},"type":"array","title":"Order","description":"Positions-IDs in gewünschter neuer Reihenfolge"}},"type":"object","required":["order"],"title":"PositionReorderRequest","description":"Die Positionen eines Servers in gewünschter neuer Reihenfolge.\n\nDie Reihenfolge ist hier NICHT nur Kosmetik, und deshalb gibt es diesen\nEndpunkt überhaupt: `position_order` entscheidet zusätzlich\n\n  * welche 25 Positionen das Discord-Panel zeigt (Select-Menü-Limit), und\n  * welche Positionen unter dem Tariflimit aktiv bleiben\n    (`resolve_active_locked` nimmt die ersten N nach (position_order, id)).\n\nBisher wurde `position_order` einzig beim Anlegen aus dem Zähler gesetzt und\nwar danach über keine Schnittstelle mehr änderbar. Wer 51 Positionen hatte,\nkonnte damit weder bestimmen, welche im Panel stehen, noch welche ein\nTarifwechsel stehen lässt — die Reihenfolge des Anlegens entschied es\nendgültig."},"PositionUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Description"},"emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Emoji"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"auto_assign_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auto Assign Role Id"},"use_custom_questions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Custom Questions"}},"type":"object","title":"PositionUpdateRequest"},"PostureBaselineUpdate":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Categories"}},"type":"object","required":["enabled"],"title":"PostureBaselineUpdate"},"PostureConfigUpdate":{"properties":{"monitoring_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Monitoring Enabled"},"auto_revert_categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Auto Revert Categories"},"digest_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Digest Enabled"},"drift_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drift Channel Id"},"digest_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Digest Channel Id"}},"type":"object","title":"PostureConfigUpdate"},"PraesenzBody":{"properties":{"puuid":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Puuid"}},"type":"object","title":"PraesenzBody"},"PrefixUpdate":{"properties":{"custom_command_prefix":{"anyOf":[{"type":"string","maxLength":5,"minLength":1},{"type":"null"}],"title":"Custom Command Prefix","description":"Custom command prefix (1-5 characters, null = reset to default '.')"}},"type":"object","title":"PrefixUpdate","description":"Request Body for Custom Command Prefix Update (Premium only)"},"PreflightRequest":{"properties":{"turnstile_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Turnstile Token"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"}},"type":"object","title":"PreflightRequest"},"PreviewRequest":{"properties":{"kind":{"type":"string","maxLength":40,"title":"Kind"},"text":{"type":"string","maxLength":4000,"title":"Text"}},"type":"object","required":["kind","text"],"title":"PreviewRequest"},"ProBackgroundUpdate":{"properties":{"background_base64":{"type":"string","title":"Background Base64","description":"Base64-encoded image (max 5MB)"}},"type":"object","required":["background_base64"],"title":"ProBackgroundUpdate"},"ProCustomizationResponse":{"properties":{"image_blur":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":0.0},{"type":"null"}],"title":"Image Blur","description":"Blur (0-20)"},"image_darken":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Image Darken","description":"Darken (0.0 - 1.0)"},"image_normalize":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Image Normalize","description":"Normalize brightness"},"custom_accent_color":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Custom Accent Color","description":"Custom accent color (e.g. #FF0000 or rgb(255,0,0))"},"xp_bonus_multiplier":{"anyOf":[{"type":"number","maximum":3.0,"minimum":1.0},{"type":"null"}],"title":"Xp Bonus Multiplier","description":"XP Bonus (1.0 - 3.0)"},"economy_bonus_multiplier":{"anyOf":[{"type":"number","maximum":3.0,"minimum":1.0},{"type":"null"}],"title":"Economy Bonus Multiplier","description":"Economy Bonus (1.0 - 3.0)"},"mybackground_blur":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":0.0},{"type":"null"}],"title":"Mybackground Blur","description":"Blur /mybackground (0-10)"},"mybackground_darken":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Mybackground Darken","description":"Darken /mybackground (0.0 - 1.0)"},"user_id":{"type":"string","title":"User Id"},"has_global_background":{"type":"boolean","title":"Has Global Background","description":"True if a Base64 image is set","default":false},"has_mybackground":{"type":"boolean","title":"Has Mybackground","description":"True if a Base64 /mybackground is set","default":false},"global_background_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Global Background Base64"},"mybackground_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mybackground Base64"}},"type":"object","required":["user_id"],"title":"ProCustomizationResponse"},"ProCustomizationUpdate":{"properties":{"image_blur":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":0.0},{"type":"null"}],"title":"Image Blur","description":"Blur (0-20)"},"image_darken":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Image Darken","description":"Darken (0.0 - 1.0)"},"image_normalize":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Image Normalize","description":"Normalize brightness"},"custom_accent_color":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Custom Accent Color","description":"Custom accent color (e.g. #FF0000 or rgb(255,0,0))"},"xp_bonus_multiplier":{"anyOf":[{"type":"number","maximum":3.0,"minimum":1.0},{"type":"null"}],"title":"Xp Bonus Multiplier","description":"XP Bonus (1.0 - 3.0)"},"economy_bonus_multiplier":{"anyOf":[{"type":"number","maximum":3.0,"minimum":1.0},{"type":"null"}],"title":"Economy Bonus Multiplier","description":"Economy Bonus (1.0 - 3.0)"},"mybackground_blur":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":0.0},{"type":"null"}],"title":"Mybackground Blur","description":"Blur /mybackground (0-10)"},"mybackground_darken":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Mybackground Darken","description":"Darken /mybackground (0.0 - 1.0)"}},"type":"object","title":"ProCustomizationUpdate"},"ProfilAendernBody":{"properties":{"version":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"Version"},"kdf":{"anyOf":[{"$ref":"#/components/schemas/Kdf"},{"type":"null"}]},"uk_pw":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Uk Pw"},"uk_rk":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Uk Rk"}},"type":"object","required":["version"],"title":"ProfilAendernBody"},"ProfilBody":{"properties":{"kdf":{"$ref":"#/components/schemas/Kdf"},"uk_pw":{"type":"string","maxLength":256,"title":"Uk Pw"},"uk_rk":{"type":"string","maxLength":256,"title":"Uk Rk"},"public_key":{"type":"string","maxLength":256,"title":"Public Key"},"sk_enc":{"type":"string","maxLength":256,"title":"Sk Enc"}},"type":"object","required":["kdf","uk_pw","uk_rk","public_key","sk_enc"],"title":"ProfilBody"},"ProfileCustomizationSchema":{"properties":{"custom_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Text","description":"An 'About me' text or slogan."},"effect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effect","description":"Global effect (e.g. 'snow', 'rain', 'default').","default":"default"},"font":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Font","description":"Preferred font.","default":"default"},"heading_color_primary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Heading Color Primary","description":"Primary color for headings (Hex, RGB).","default":"#FFFFFF"},"heading_color_secondary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Heading Color Secondary","description":"Secondary color for a gradient."},"background_image_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Background Image Base64","description":"Global background image as Base64 string."},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"Last update"}},"type":"object","title":"ProfileCustomizationSchema","description":"Schema for retrieving and updating profile customizations."},"ProfileRankSchema":{"properties":{"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank","description":"The user's rank."},"total_participants":{"type":"integer","title":"Total Participants","description":"Total number of participants in the category.","default":0},"gap_to_next":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Gap To Next","description":"Difference to next higher rank."},"gap_unit":{"type":"string","title":"Gap Unit","description":"Unit of difference (e.g. 'Messages', 'Minutes').","default":"Points"}},"type":"object","title":"ProfileRankSchema","description":"Schema for a rank entry."},"ProfileStatSchema":{"properties":{"name":{"type":"string","title":"Name","description":"Name of the statistic (e.g. 'Total Messages')."},"value":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"string"}],"title":"Value","description":"The value of the statistic."},"display_value":{"type":"string","title":"Display Value","description":"Formatted value (e.g. '1,200 Messages')."}},"type":"object","required":["name","value","display_value"],"title":"ProfileStatSchema","description":"Schema for a single statistic."},"ProfileStatsCategory":{"properties":{"category_name":{"type":"string","title":"Category Name"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon","default":"📊"},"stats":{"items":{"$ref":"#/components/schemas/ProfileStatSchema"},"type":"array","title":"Stats"},"rank":{"anyOf":[{"$ref":"#/components/schemas/ProfileRankSchema"},{"type":"null"}]}},"type":"object","required":["category_name","stats"],"title":"ProfileStatsCategory","description":"A category of statistics (e.g. 'Messages')."},"Prognose":{"properties":{"moeglich":{"type":"boolean","title":"Moeglich","default":false},"grund":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grund"},"punkte":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Punkte","default":[]},"steigung_pro_tag":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Steigung Pro Tag"},"steigung_pro_woche":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Steigung Pro Woche"},"streuung":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Streuung"},"richtung":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Richtung"},"guete":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Guete"}},"type":"object","title":"Prognose"},"PublicPurchaseReview":{"properties":{"id":{"type":"integer","title":"Id"},"rating":{"type":"integer","title":"Rating"},"review_text":{"type":"string","title":"Review Text"},"service_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"reviewer":{"anyOf":[{"$ref":"#/components/schemas/api__routers__partner_reviews__ReviewerInfo"},{"type":"null"}]}},"type":"object","required":["id","rating","review_text","service_name","created_at","reviewer"],"title":"PublicPurchaseReview"},"PublicReview":{"properties":{"id":{"type":"integer","title":"Id"},"review_type":{"type":"string","title":"Review Type"},"rating":{"type":"integer","title":"Rating"},"review_text":{"type":"string","title":"Review Text"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"service_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Name"},"order_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order Reference"},"is_anonymous":{"type":"boolean","title":"Is Anonymous"},"helpful_count":{"type":"integer","title":"Helpful Count"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"reviewer":{"$ref":"#/components/schemas/ReviewerData"}},"type":"object","required":["id","review_type","rating","review_text","title","service_name","order_reference","is_anonymous","helpful_count","created_at","updated_at","reviewer"],"title":"PublicReview"},"PublicServerDetails":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Url"},"member_count":{"type":"integer","title":"Member Count"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"banner_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner Base64"},"banner_effect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner Effect"},"primary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Color"},"invite_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Url"}},"type":"object","required":["id","name","icon_url","member_count"],"title":"PublicServerDetails"},"PublishRequest":{"properties":{"visibility":{"type":"string","title":"Visibility","description":"public | unlisted","default":"public"},"category":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Category"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"summary":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Summary"},"monetization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Monetization"}},"type":"object","title":"PublishRequest"},"PunishmentRuleCreate":{"properties":{"min_violations":{"type":"integer","maximum":10000.0,"minimum":1.0,"title":"Min Violations","description":"Ab dieser Verstoßzahl greift die Regel (höchste zutreffende Regel gewinnt)"},"action":{"type":"string","enum":["warn","mute","kick","ban"],"title":"Action","description":"warn=Verwarnung, mute=Timeout, kick=Kick/Timeout, ban=Ban/Timeout"},"duration_minutes":{"anyOf":[{"type":"integer","maximum":43200.0,"minimum":1.0},{"type":"null"}],"title":"Duration Minutes","description":"Dauer in Minuten (für mute erforderlich; bei kick/ban → Timeout statt echtem Kick/Ban)"}},"type":"object","required":["min_violations","action"],"title":"PunishmentRuleCreate","description":"Einzelne Bestrafungs-Regel für den Server."},"PunishmentRulesUpdate":{"properties":{"rules":{"items":{"$ref":"#/components/schemas/PunishmentRuleCreate"},"type":"array","maxItems":50,"minItems":0,"title":"Rules"}},"type":"object","required":["rules"],"title":"PunishmentRulesUpdate","description":"Ersetzt alle Punishment-Regeln auf einmal."},"PurchaseConfigUpdate":{"properties":{"purchase_ticket_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Purchase Ticket Enabled"},"questions_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Questions Enabled"},"widerrufsbelehrung_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Widerrufsbelehrung Enabled"},"customer_data_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Customer Data Required"},"payment_selection_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Payment Selection Enabled"},"final_summary_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Final Summary Enabled"}},"type":"object","title":"PurchaseConfigUpdate","description":"Update für Purchase Ticket Konfiguration"},"PurchaseReviewStats":{"properties":{"total_reviews":{"type":"integer","title":"Total Reviews"},"average_rating":{"type":"number","title":"Average Rating"},"rating_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Rating Distribution"}},"type":"object","required":["total_reviews","average_rating","rating_distribution"],"title":"PurchaseReviewStats"},"PurchaseReviewsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"reviews":{"items":{"$ref":"#/components/schemas/PublicPurchaseReview"},"type":"array","title":"Reviews"},"stats":{"$ref":"#/components/schemas/PurchaseReviewStats"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"has_next_page":{"type":"boolean","title":"Has Next Page"}},"type":"object","required":["success","reviews","stats","total","page","page_size","has_next_page"],"title":"PurchaseReviewsResponse"},"QuestionReorderRequest":{"properties":{"position_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position Id"},"order":{"items":{"type":"integer"},"type":"array","title":"Order","description":"Fragen-IDs in gewünschter neuer Reihenfolge"}},"type":"object","required":["order"],"title":"QuestionReorderRequest"},"QuestionType":{"type":"string","enum":["short","paragraph","select","boolean"],"title":"QuestionType"},"QuickSetupRequest":{"properties":{"feature":{"type":"string","title":"Feature"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Id"},"use_defaults":{"type":"boolean","title":"Use Defaults","default":true}},"type":"object","required":["feature"],"title":"QuickSetupRequest"},"QuickStats":{"properties":{"total_members":{"type":"integer","title":"Total Members"},"online_members":{"type":"integer","title":"Online Members"},"active_users_24h":{"type":"integer","title":"Active Users 24H"},"messages_24h":{"type":"integer","title":"Messages 24H"},"messages_7d":{"type":"integer","title":"Messages 7D","default":0},"messages_prev_7d":{"type":"integer","title":"Messages Prev 7D","default":0},"commands_24h":{"type":"integer","title":"Commands 24H"},"new_members_24h":{"type":"integer","title":"New Members 24H"},"total_channels":{"type":"integer","title":"Total Channels"},"total_views":{"type":"integer","title":"Total Views","default":0}},"type":"object","required":["total_members","online_members","active_users_24h","messages_24h","commands_24h","new_members_24h","total_channels"],"title":"QuickStats","description":"Quick Statistics Overview"},"RSSFeedCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Feed-Name"},"url":{"type":"string","title":"Url","description":"RSS Feed URL"},"channel_id":{"type":"string","title":"Channel Id","description":"Discord Kanal-ID"},"check_interval_minutes":{"type":"integer","maximum":1440.0,"minimum":5.0,"title":"Check Interval Minutes","description":"Check-Intervall in Minuten","default":15},"max_posts_per_check":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Max Posts Per Check","description":"Max Posts pro Check","default":3},"ping_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ping Role Id"},"include_keywords":{"items":{"type":"string"},"type":"array","title":"Include Keywords","default":[]},"exclude_keywords":{"items":{"type":"string"},"type":"array","title":"Exclude Keywords","default":[]}},"type":"object","required":["name","url","channel_id"],"title":"RSSFeedCreate"},"RSSFeedListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"feeds":{"items":{"$ref":"#/components/schemas/RSSFeedResponse"},"type":"array","title":"Feeds"},"total":{"type":"integer","title":"Total"},"limits":{"additionalProperties":true,"type":"object","title":"Limits"}},"type":"object","required":["success","feeds","total","limits"],"title":"RSSFeedListResponse"},"RSSFeedResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"channel_id":{"type":"string","title":"Channel Id"},"source_type":{"type":"string","title":"Source Type","default":"rss"},"source_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Source Config"},"is_active":{"type":"boolean","title":"Is Active"},"check_interval_minutes":{"type":"integer","title":"Check Interval Minutes"},"max_posts_per_check":{"type":"integer","title":"Max Posts Per Check"},"show_author":{"type":"boolean","title":"Show Author"},"show_date":{"type":"boolean","title":"Show Date"},"show_thumbnail":{"type":"boolean","title":"Show Thumbnail"},"ping_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ping Role Id"},"include_keywords":{"items":{"type":"string"},"type":"array","title":"Include Keywords"},"exclude_keywords":{"items":{"type":"string"},"type":"array","title":"Exclude Keywords"},"min_title_length":{"type":"integer","title":"Min Title Length"},"max_title_length":{"type":"integer","title":"Max Title Length"},"last_check":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Check"},"last_post_sent":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Post Sent"},"total_posts_sent":{"type":"integer","title":"Total Posts Sent"},"consecutive_errors":{"type":"integer","title":"Consecutive Errors"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","url","channel_id","is_active","check_interval_minutes","max_posts_per_check","show_author","show_date","show_thumbnail","ping_role_id","include_keywords","exclude_keywords","min_title_length","max_title_length","last_check","last_post_sent","total_posts_sent","consecutive_errors","last_error","created_at"],"title":"RSSFeedResponse"},"RSSFeedSettingsUpdate":{"properties":{"default_check_interval":{"anyOf":[{"type":"integer","maximum":1440.0,"minimum":5.0},{"type":"null"}],"title":"Default Check Interval"},"default_max_posts":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":1.0},{"type":"null"}],"title":"Default Max Posts"},"default_embed_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Embed Color"},"auto_disable_after_errors":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":1.0},{"type":"null"}],"title":"Auto Disable After Errors"}},"type":"object","title":"RSSFeedSettingsUpdate"},"RSSFeedUpdate":{"properties":{"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"check_interval_minutes":{"anyOf":[{"type":"integer","maximum":1440.0,"minimum":5.0},{"type":"null"}],"title":"Check Interval Minutes"},"max_posts_per_check":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":1.0},{"type":"null"}],"title":"Max Posts Per Check"},"ping_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ping Role Id"},"custom_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Title"},"custom_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Description"},"show_author":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Author"},"show_date":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Date"},"show_thumbnail":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Thumbnail"},"include_keywords":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Include Keywords"},"exclude_keywords":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exclude Keywords"},"min_title_length":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Min Title Length"},"max_title_length":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Max Title Length"}},"type":"object","title":"RSSFeedUpdate"},"RSVPRequest":{"properties":{"status":{"type":"string","title":"Status"},"response_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Note"}},"type":"object","required":["status"],"title":"RSVPRequest"},"RabattIn":{"properties":{"reason":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Reason"}},"type":"object","title":"RabattIn"},"RangWahl":{"properties":{"rang":{"type":"string","maxLength":12,"minLength":1,"title":"Rang"}},"type":"object","required":["rang"],"title":"RangWahl","description":"`POST /clans/{id}/members/{user_id}/rank` - der Zielrang.\n\nFreitext und kein Literal: \"leader\" und \"recruit\" sind keine vergebbaren\nRaenge, aber der Dienst hat fuer beide eine Absage, die weiterhilft\n(\"Anfuehrer wird man nur durch die Uebergabe\"). Ein 422 aus dem Schema\nhaette sie verschluckt."},"RankInfo":{"properties":{"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank","description":"Der Rang des Users"},"total_participants":{"type":"integer","title":"Total Participants","description":"Gesamtanzahl der Teilnehmer im Leaderboard"},"gap_to_next":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Gap To Next","description":"Anzahl Einheiten zum nächsthöheren Rang"},"gap_unit":{"type":"string","title":"Gap Unit","description":"Einheit des Gaps (z.B. 'messages')"}},"type":"object","required":["total_participants","gap_unit"],"title":"RankInfo","description":"Detaillierte Rang-Informationen."},"RateBody":{"properties":{"score":{"type":"integer","title":"Score"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"}},"type":"object","required":["score"],"title":"RateBody"},"RateRequest":{"properties":{"rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Rating"},"comment":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Comment"}},"type":"object","required":["rating"],"title":"RateRequest"},"RatingDistribution":{"properties":{"score":{"type":"integer","title":"Score"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["score","count"],"title":"RatingDistribution"},"RatingDistributionResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"timeframe":{"type":"string","title":"Timeframe"},"data":{"items":{"$ref":"#/components/schemas/RatingDistribution"},"type":"array","title":"Data"}},"type":"object","required":["timeframe","data"],"title":"RatingDistributionResponse"},"RatingTimelineDataPoint":{"properties":{"date":{"type":"string","title":"Date"},"average_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Rating"},"rating_count":{"type":"integer","title":"Rating Count"}},"type":"object","required":["date","average_rating","rating_count"],"title":"RatingTimelineDataPoint"},"RatingTimelineResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"timeframe":{"type":"string","title":"Timeframe"},"interval":{"type":"string","title":"Interval"},"data":{"items":{"$ref":"#/components/schemas/RatingTimelineDataPoint"},"type":"array","title":"Data"}},"type":"object","required":["timeframe","interval","data"],"title":"RatingTimelineResponse"},"ReactionStats":{"properties":{"total_reactions":{"type":"integer","title":"Total Reactions","default":0},"total_custom_emojis":{"type":"integer","title":"Total Custom Emojis","default":0},"total_unicode_emojis":{"type":"integer","title":"Total Unicode Emojis","default":0},"unique_emojis_used":{"type":"integer","title":"Unique Emojis Used","default":0},"avg_reactions_per_day":{"type":"number","title":"Avg Reactions Per Day","default":0.0},"top_emojis":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Emojis","default":[]},"timeline":{"items":{"$ref":"#/components/schemas/TimelinePoint"},"type":"array","title":"Timeline","default":[]},"leaderboard":{"items":{"$ref":"#/components/schemas/api__schemas__server_stats__LeaderboardEntry"},"type":"array","title":"Leaderboard","default":[]}},"type":"object","title":"ReactionStats"},"ReactionStatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"period":{"type":"string","title":"Period"},"user_id":{"type":"string","title":"User Id"},"stats":{"additionalProperties":true,"type":"object","title":"Stats","example":{"average_per_day":7.8,"server_breakdown":[],"top_emojis":[],"total_reactions_given":234,"trend":{},"unique_emojis":45}},"insights":{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array","title":"Insights"}},"type":"object","required":["period","user_id","stats","insights"],"title":"ReactionStatsResponse","description":"Response für Reaktions-Statistiken."},"ReasonTemplateCreate":{"properties":{"action_type":{"type":"string","title":"Action Type","description":"ban, kick or timeout"},"reason_text":{"type":"string","maxLength":500,"title":"Reason Text"},"short_name":{"type":"string","maxLength":100,"title":"Short Name"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position","description":"Position in the list","default":0}},"type":"object","required":["action_type","reason_text","short_name"],"title":"ReasonTemplateCreate"},"ReasonTemplateUpdate":{"properties":{"reason_text":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Reason Text"},"short_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Short Name"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","title":"ReasonTemplateUpdate"},"RecapIn":{"properties":{"channel_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Channel Id","description":"Discord-Kanal-ID, oder null zum Abschalten"}},"type":"object","required":["channel_id"],"title":"RecapIn"},"RecentWinner":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"giveaway_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Giveaway Id"},"giveaway_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Giveaway Title"},"won_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Won At"}},"type":"object","required":["user_id","username"],"title":"RecentWinner","description":"Ein frueherer Gewinner, der gerade nicht mitmachen darf"},"RecentWinnersResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/RecentWinner"},"type":"array","title":"Data"},"max_count":{"type":"integer","title":"Max Count","default":50}},"type":"object","required":["success","data"],"title":"RecentWinnersResponse"},"RecentlyViewedResponse":{"properties":{"server_id":{"type":"string","title":"Server Id"},"name":{"type":"string","title":"Name"},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Url"},"member_count":{"type":"integer","title":"Member Count"},"viewed_at":{"type":"string","title":"Viewed At"}},"type":"object","required":["server_id","name","icon_url","member_count","viewed_at"],"title":"RecentlyViewedResponse"},"RechteAenderung":{"properties":{"rechte":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rechte"},"zuruecksetzen":{"type":"boolean","title":"Zuruecksetzen","default":false}},"type":"object","title":"RechteAenderung","description":"`PUT /clans/{id}/rights` - Teilaenderung der Matrix oder Zuruecksetzen.\n\n`rechte` als freies Woerterbuch: welche Raenge, Schalter und Grenzen es\ngibt, steht in `clans/rechte.py`, und ein zweites Verzeichnis hier waere\ndas, was beim naechsten neuen Schalter vergessen wird. Der Dienst prueft\nstreng und nennt das erste falsche Feld."},"ReferralReasonRequest":{"properties":{"reason":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Reason"}},"type":"object","title":"ReferralReasonRequest"},"RefreshBody":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"},"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}},"type":"object","required":["refresh_token"],"title":"RefreshBody"},"RegelEingabe":{"properties":{"trigger":{"type":"string","maxLength":40,"title":"Trigger"},"filters":{"additionalProperties":true,"type":"object","title":"Filters"},"actions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Actions"},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["trigger"],"title":"RegelEingabe"},"RegelnSetzen":{"properties":{"rules":{"items":{"$ref":"#/components/schemas/RegelEingabe"},"type":"array","title":"Rules"}},"type":"object","title":"RegelnSetzen","description":"Die Regeln eines Konnektors am Stueck.\n\nErsetzen statt einzeln pflegen, und das ist Absicht: die Oberflaeche ist\neine sortierbare Liste. Einzelne PATCHes muessten die Reihenfolge in\ngetrennten Aufrufen nachziehen, und ein abgebrochener Speichervorgang\nliesse eine halb sortierte Liste zurueck."},"RegelwerkUmstellung":{"properties":{"bestaetigung":{"type":"string","enum":["umstellen","zurueck"],"title":"Bestaetigung"}},"type":"object","required":["bestaetigung"],"title":"RegelwerkUmstellung","description":"Der ausdrueckliche Wechsel des Regelwerks.\n\nEigener Endpunkt statt eines Feldes in `BalanceEinstellungen`, weil eine\nUmstellung etwas anderes ist als eine Feinjustierung: sie aendert, wie\nsich der Server fuer jeden Spieler anfuehlt. Das soll man nicht\nversehentlich mit einem Formular-Absenden ausloesen."},"RegisterBody":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},"type":"object","required":["email","password"],"title":"RegisterBody"},"RegisterCompleteBody":{"properties":{"signup_token":{"type":"string","title":"Signup Token"},"code":{"type":"string","title":"Code"},"password":{"type":"string","title":"Password"}},"type":"object","required":["signup_token","code","password"],"title":"RegisterCompleteBody"},"ReplyCreate":{"properties":{"body":{"type":"string","maxLength":5000,"minLength":1,"title":"Body"},"is_internal":{"type":"boolean","title":"Is Internal","default":false}},"type":"object","required":["body"],"title":"ReplyCreate"},"ReportBody":{"properties":{"reason":{"type":"string","maxLength":300,"title":"Reason"}},"type":"object","required":["reason"],"title":"ReportBody"},"ReportRequest":{"properties":{"reason":{"type":"string","maxLength":50,"minLength":2,"title":"Reason"},"detail":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Detail"}},"type":"object","required":["reason"],"title":"ReportRequest"},"ResetBody":{"properties":{"reset_token":{"type":"string","title":"Reset Token"},"code":{"type":"string","title":"Code"},"password":{"type":"string","title":"Password"}},"type":"object","required":["reset_token","code","password"],"title":"ResetBody"},"ResolveRequest":{"properties":{"value":{"type":"string","maxLength":500,"minLength":1,"title":"Value"},"kind":{"anyOf":[{"type":"string","enum":["search","profile","board"]},{"type":"null"}],"title":"Kind"},"square_tolerance":{"type":"integer","maximum":200.0,"minimum":0.0,"title":"Square Tolerance","default":25},"min_width":{"type":"integer","maximum":4096.0,"minimum":0.0,"title":"Min Width","default":200},"include_keywords":{"items":{"type":"string"},"type":"array","maxItems":40,"title":"Include Keywords"},"exclude_keywords":{"items":{"type":"string"},"type":"array","maxItems":40,"title":"Exclude Keywords"},"safe_mode":{"type":"boolean","title":"Safe Mode","default":true}},"type":"object","required":["value"],"title":"ResolveRequest","description":"Eine Eingabe pruefen - mit den Filtern DES FEEDS, nicht mit Vorgaben.\n\nDie Vorgaben hier sind die Modellvorgaben (`square_tolerance = 25`,\n`min_width = 200`, `safe_mode = True`); sie gelten beim Anlegen eines\nFeeds, wo es noch keine anderen gibt. Ein bestehender Feed schickt seine\neigenen mit.\n\nOhne die Wortlisten stand ueber der Vorschau \"18 von 25 brauchbar\" fuer\neinen Feed, dessen Pflichtwort danach zwei davon uebrig liess. Die ganze\nFlaeche lebt davon, ECHTE Pins zu zeigen, bevor etwas gespeichert wird -\neine Zahl, die eine andere Filterkette meint als der Bot, macht daraus\neine Behauptung."},"RestockRequest":{"properties":{"quantity":{"type":"integer","minimum":1.0,"title":"Quantity"}},"type":"object","required":["quantity"],"title":"RestockRequest"},"RestrictedChannelCreateRequest":{"properties":{"channel_id":{"type":"string","title":"Channel Id","description":"Discord Channel ID"},"allowed_types":{"items":{"type":"string","enum":["images","videos","audio","files","links","text","stickers","embeds","commands"]},"type":"array","minItems":1,"title":"Allowed Types","description":"Erlaubte Inhaltstypen"},"delete_message":{"type":"boolean","title":"Delete Message","description":"Nachricht loeschen?","default":true},"send_notification":{"type":"boolean","title":"Send Notification","description":"Benachrichtigung senden?","default":true},"notification_auto_delete":{"type":"integer","maximum":300.0,"minimum":0.0,"title":"Notification Auto Delete","description":"Auto-Delete der Benachrichtigung in Sekunden (0 = nicht loeschen)","default":10},"log_deletions":{"type":"boolean","title":"Log Deletions","description":"Loeschungen loggen?","default":true},"log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Channel Id","description":"Channel ID fuer Logs"}},"type":"object","required":["channel_id","allowed_types"],"title":"RestrictedChannelCreateRequest","description":"Request zum Erstellen einer Kanal-Einschraenkung"},"RestrictedChannelResponse":{"properties":{"id":{"type":"integer","title":"Id"},"channel_id":{"type":"string","title":"Channel Id"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"allowed_types":{"items":{"type":"string"},"type":"array","title":"Allowed Types"},"is_enabled":{"type":"boolean","title":"Is Enabled"},"delete_message":{"type":"boolean","title":"Delete Message"},"send_notification":{"type":"boolean","title":"Send Notification"},"notification_auto_delete":{"type":"integer","title":"Notification Auto Delete"},"log_deletions":{"type":"boolean","title":"Log Deletions"},"log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Channel Id"},"log_channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Channel Name"},"total_deletions":{"type":"integer","title":"Total Deletions"},"last_deletion_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Deletion At"},"locked":{"type":"boolean","title":"Locked","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","channel_id","allowed_types","is_enabled","delete_message","send_notification","notification_auto_delete","log_deletions","total_deletions","created_at","updated_at"],"title":"RestrictedChannelResponse","description":"Response fuer eine Kanal-Einschraenkung"},"RestrictedChannelUpdateRequest":{"properties":{"allowed_types":{"anyOf":[{"items":{"type":"string","enum":["images","videos","audio","files","links","text","stickers","embeds","commands"]},"type":"array","minItems":1},{"type":"null"}],"title":"Allowed Types","description":"Erlaubte Inhaltstypen"},"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled","description":"Aktiviert/Deaktiviert"},"delete_message":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Delete Message","description":"Nachricht loeschen?"},"send_notification":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Send Notification","description":"Benachrichtigung senden?"},"notification_auto_delete":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":0.0},{"type":"null"}],"title":"Notification Auto Delete","description":"Auto-Delete in Sekunden"},"log_deletions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Log Deletions","description":"Loeschungen loggen?"},"log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Channel Id","description":"Channel ID fuer Logs (null = entfernen)"}},"type":"object","title":"RestrictedChannelUpdateRequest","description":"Request zum Aktualisieren einer Kanal-Einschraenkung"},"Review":{"properties":{"id":{"type":"integer","title":"Id"},"server_id":{"type":"string","title":"Server Id"},"reviewer_user_id":{"type":"string","title":"Reviewer User Id"},"rating":{"type":"integer","title":"Rating"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"is_public":{"type":"boolean","title":"Is Public"},"status":{"type":"string","title":"Status"},"moderation_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moderation Note"},"reviewer_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviewer Display Name"},"reviewer_avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviewer Avatar Url"},"server_name_snapshot":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Name Snapshot"},"server_icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Icon Url"},"upvotes":{"type":"integer","title":"Upvotes","default":0},"downvotes":{"type":"integer","title":"Downvotes","default":0},"user_vote":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"User Vote"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"replies":{"items":{"$ref":"#/components/schemas/ReviewReply"},"type":"array","title":"Replies","default":[]}},"type":"object","required":["id","server_id","reviewer_user_id","rating","title","comment","is_public","status","moderation_note","reviewer_display_name","reviewer_avatar_url","server_name_snapshot","server_icon_url","created_at","updated_at"],"title":"Review"},"ReviewCreate":{"properties":{"rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Rating","description":"Bewertung von 1 bis 5"},"title":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Title"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"is_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public","default":true}},"type":"object","required":["rating"],"title":"ReviewCreate"},"ReviewCreateRequest":{"properties":{"server_id":{"type":"string","title":"Server Id"},"user_id":{"type":"string","title":"User Id"},"rating":{"type":"integer","title":"Rating"},"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"},"is_anonymous":{"type":"boolean","title":"Is Anonymous","default":false}},"type":"object","required":["server_id","user_id","rating","title","content"],"title":"ReviewCreateRequest"},"ReviewItem":{"properties":{"review_id":{"type":"integer","title":"Review Id"},"reviewer":{"anyOf":[{"$ref":"#/components/schemas/UserSnippet"},{"type":"null"}]},"rating":{"type":"integer","title":"Rating"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"review_text":{"type":"string","title":"Review Text"},"review_type":{"type":"string","title":"Review Type"},"is_anonymous":{"type":"boolean","title":"Is Anonymous","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"helpful_count":{"type":"integer","title":"Helpful Count","default":0}},"type":"object","required":["review_id","rating","review_text","review_type","created_at"],"title":"ReviewItem","description":"Eine Bewertung."},"ReviewListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"total":{"type":"integer","title":"Total"},"average_rating":{"type":"number","title":"Average Rating"},"data":{"items":{"$ref":"#/components/schemas/Review"},"type":"array","title":"Data"}},"type":"object","required":["total","average_rating","data"],"title":"ReviewListResponse"},"ReviewOverview":{"properties":{"average_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Rating"},"total_reviews":{"type":"integer","title":"Total Reviews","default":0},"rating_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Rating Distribution"},"recent_reviews":{"items":{"$ref":"#/components/schemas/ReviewItem"},"type":"array","title":"Recent Reviews","default":[]}},"type":"object","title":"ReviewOverview","description":"Bewertungs-Übersicht."},"ReviewReply":{"properties":{"id":{"type":"integer","title":"Id"},"review_id":{"type":"integer","title":"Review Id"},"replier_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replier User Id"},"replier_avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replier Avatar Url"},"replier_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replier Name"},"message":{"type":"string","title":"Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","review_id","replier_user_id","message","created_at","updated_at"],"title":"ReviewReply"},"ReviewReplyCreate":{"properties":{"message":{"type":"string","maxLength":2000,"minLength":1,"title":"Message"}},"type":"object","required":["message"],"title":"ReviewReplyCreate"},"ReviewRoleAddRequest":{"properties":{"role_id":{"type":"string","minLength":1,"title":"Role Id"}},"type":"object","required":["role_id"],"title":"ReviewRoleAddRequest"},"ReviewSettingsUpdate":{"properties":{"purchase_review_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Purchase Review Enabled"},"general_review_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"General Review Enabled"},"anonymous_reviews_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Anonymous Reviews Allowed"},"min_review_length":{"anyOf":[{"type":"integer","maximum":500.0,"minimum":1.0},{"type":"null"}],"title":"Min Review Length"},"max_review_length":{"anyOf":[{"type":"integer","maximum":4000.0,"minimum":500.0},{"type":"null"}],"title":"Max Review Length"},"auto_thank_reviews":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Thank Reviews"},"review_cooldown_hours":{"anyOf":[{"type":"integer","maximum":168.0,"minimum":0.0},{"type":"null"}],"title":"Review Cooldown Hours"},"show_reviewer_avatar":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Reviewer Avatar"},"show_review_date":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Review Date"},"purchase_review_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Purchase Review Channel Id"},"general_review_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"General Review Channel Id"},"general_review_embed_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"General Review Embed Channel Id"},"purchase_review_notification_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Purchase Review Notification Role Id"},"custom_footer_text":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Custom Footer Text"},"review_banner_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Banner Base64"},"use_branding_color":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Branding Color"}},"type":"object","title":"ReviewSettingsUpdate"},"ReviewUpdate":{"properties":{"rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Rating"},"title":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Title"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"is_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public"}},"type":"object","title":"ReviewUpdate"},"ReviewUpdateRequest":{"properties":{"user_id":{"type":"string","title":"User Id"},"rating":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rating"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"is_anonymous":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Anonymous"}},"type":"object","required":["user_id"],"title":"ReviewUpdateRequest"},"ReviewerData":{"properties":{"id":{"type":"string","title":"Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"}},"type":"object","required":["id","username","avatar_url"],"title":"ReviewerData"},"RewardPreferenceRequest":{"properties":{"reward_type":{"type":"string","title":"Reward Type","default":"premium"}},"type":"object","title":"RewardPreferenceRequest"},"Rhythmus":{"properties":{"metrik":{"type":"string","title":"Metrik","default":"messages"},"raster":{"items":{"items":{"type":"integer"},"type":"array"},"type":"array","title":"Raster","default":[]},"gesamt":{"type":"integer","title":"Gesamt","default":0},"spitze":{"additionalProperties":true,"type":"object","title":"Spitze","default":{}},"ruhigste_wachstunde":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ruhigste Wachstunde"},"stundensummen":{"items":{"type":"integer"},"type":"array","title":"Stundensummen","default":[]},"tagessummen":{"items":{"type":"integer"},"type":"array","title":"Tagessummen","default":[]},"bester_tag":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bester Tag"},"schwaechster_tag":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Schwaechster Tag"}},"type":"object","title":"Rhythmus"},"RoleBody":{"properties":{"role":{"type":"string","title":"Role"}},"type":"object","required":["role"],"title":"RoleBody"},"RoleCreate":{"properties":{"role_id":{"type":"string","title":"Role Id","description":"Discord Role ID"},"category_id":{"type":"integer","title":"Category Id","description":"Kategorie ID"},"description":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Description","description":"Beschreibung"},"emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Emoji","description":"Emoji"}},"type":"object","required":["role_id","category_id"],"title":"RoleCreate","description":"Schema zum Hinzufügen einer Rolle"},"RoleLinkCreate":{"properties":{"account_id":{"type":"integer","title":"Account Id","description":"ID of a monitored account (twitch/kick)"},"member_id":{"type":"string","title":"Member Id","description":"Discord user ID that receives the role when live"},"role_id":{"type":"string","title":"Role Id","description":"Discord role ID"}},"type":"object","required":["account_id","member_id","role_id"],"title":"RoleLinkCreate"},"RoleLinkUpdate":{"properties":{"member_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Id"},"role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Id"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"RoleLinkUpdate"},"RoleListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"items":{"$ref":"#/components/schemas/RoleResponse"},"type":"array","title":"Data"},"total_roles":{"type":"integer","title":"Total Roles"}},"type":"object","required":["data","total_roles"],"title":"RoleListResponse","description":"Schema für Rollen-Liste"},"RoleMenuCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"unique":{"type":"boolean","title":"Unique","default":false},"channel_id":{"anyOf":[{"type":"string","maxLength":21,"pattern":"^\\d+$"},{"type":"null"}],"title":"Channel Id"},"source":{"anyOf":[{"type":"string","pattern":"^(dyno|carlbot|other)$"},{"type":"null"}],"title":"Source"},"source_channel_id":{"anyOf":[{"type":"string","maxLength":21,"pattern":"^\\d+$"},{"type":"null"}],"title":"Source Channel Id"},"source_message_id":{"anyOf":[{"type":"string","maxLength":21,"pattern":"^\\d+$"},{"type":"null"}],"title":"Source Message Id"},"rows":{"items":{"$ref":"#/components/schemas/RoleMenuRow"},"type":"array","maxItems":24,"minItems":1,"title":"Rows"}},"type":"object","required":["name","rows"],"title":"RoleMenuCreate"},"RoleMenuRead":{"properties":{"link":{"type":"string","maxLength":300,"minLength":20,"title":"Link"}},"type":"object","required":["link"],"title":"RoleMenuRead"},"RoleMenuRow":{"properties":{"role_id":{"type":"string","maxLength":21,"minLength":15,"pattern":"^\\d+$","title":"Role Id"},"emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Emoji"},"description":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Description"}},"type":"object","required":["role_id"],"title":"RoleMenuRow"},"RoleResponse":{"properties":{"id":{"type":"integer","title":"Id"},"role_id":{"type":"string","title":"Role Id"},"role_name":{"type":"string","title":"Role Name"},"category_id":{"type":"integer","title":"Category Id"},"category_name":{"type":"string","title":"Category Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"emoji":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emoji"},"is_active":{"type":"boolean","title":"Is Active"},"position_order":{"type":"integer","title":"Position Order"},"current_users":{"type":"integer","title":"Current Users"},"total_assignments":{"type":"integer","title":"Total Assignments"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_used":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used"}},"type":"object","required":["id","role_id","role_name","category_id","category_name","description","emoji","is_active","position_order","current_users","total_assignments","created_at","updated_at","last_used"],"title":"RoleResponse","description":"Schema für Rolle-Response"},"RoleUpdate":{"properties":{"description":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Description"},"emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Emoji"},"category_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Id","description":"Kategorie wechseln"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"position_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position Order"}},"type":"object","title":"RoleUpdate","description":"Schema zum Aktualisieren einer Rolle"},"RolleBody":{"properties":{"rolle":{"type":"string","maxLength":16,"title":"Rolle"},"schluessel":{"anyOf":[{"$ref":"#/components/schemas/Uebergabe"},{"items":{"$ref":"#/components/schemas/Uebergabe"},"type":"array"},{"type":"null"}],"title":"Schluessel"},"rotation":{"anyOf":[{"$ref":"#/components/schemas/Rotation"},{"type":"null"}]}},"type":"object","required":["rolle"],"title":"RolleBody"},"RollenSyncAuftrag":{"properties":{"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","title":"RollenSyncAuftrag"},"RollenSyncReparatur":{"properties":{"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"},"bestaetigung":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bestaetigung"}},"type":"object","title":"RollenSyncReparatur"},"RolloutAnlegen":{"properties":{"blueprint_id":{"type":"integer","title":"Blueprint Id","description":"Blueprint, der ausgerollt wird"},"version_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version Id","description":"Version; leer = aktuelle"},"targets":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Targets","description":"Server-IDs im Verbund"},"mode":{"type":"string","title":"Mode","description":"merge | overwrite | replace","default":"merge"},"selection":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Selection","description":"Auswahl wie beim Einzelanwenden"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale","description":"Sprache des Aufbaus"}},"type":"object","required":["blueprint_id","targets"],"title":"RolloutAnlegen"},"RolloutAnwenden":{"properties":{"targets":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Targets","description":"Teilmenge; leer = alle bereiten"},"force":{"type":"boolean","title":"Force","description":"Warnungen der Vorschau uebergehen","default":false}},"type":"object","title":"RolloutAnwenden"},"Rotation":{"properties":{"basis":{"$ref":"#/components/schemas/RotationsBasis"},"meta_version":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"Meta Version"},"login_version":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"Login Version"},"schluessel":{"items":{"$ref":"#/components/schemas/RotationsUebergabe"},"type":"array","maxItems":40,"title":"Schluessel"},"eintraege":{"items":{"$ref":"#/components/schemas/RotationsEintrag"},"type":"array","maxItems":100,"title":"Eintraege"}},"type":"object","required":["basis","meta_version","login_version","schluessel","eintraege"],"title":"Rotation"},"RotationBody":{"properties":{"rotation":{"$ref":"#/components/schemas/Rotation"}},"type":"object","required":["rotation"],"title":"RotationBody"},"RotationsBasis":{"properties":{"revision":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"Revision"},"meta_version":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"Meta Version"},"login_version":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"Login Version"}},"type":"object","required":["revision","meta_version","login_version"],"title":"RotationsBasis"},"RotationsEintrag":{"properties":{"id":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"Id"},"meta_enc":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Meta Enc"},"login_enc":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Login Enc"}},"type":"object","required":["id"],"title":"RotationsEintrag"},"RotationsUebergabe":{"properties":{"konto_id":{"type":"string","maxLength":64,"title":"Konto Id"},"art":{"type":"string","maxLength":8,"title":"Art"},"version":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"Version"},"grant":{"type":"string","maxLength":512,"title":"Grant"}},"type":"object","required":["konto_id","art","version","grant"],"title":"RotationsUebergabe"},"RueckmeldungsAnfrage":{"properties":{"quelle":{"type":"string","maxLength":64,"title":"Quelle","default":""},"ereignis":{"type":"string","maxLength":16,"title":"Ereignis","default":""}},"type":"object","title":"RueckmeldungsAnfrage","description":"Was mit einem Vorschlag passiert ist.\n\nVorgabewerte statt Pflichtfeldern - dieselbe Ueberlegung wie in\napi/routers/spotlight.py: ein Pflichtfeld ohne Vorgabe bringt FastAPI\ndazu, mit 422 in der Sprache des Frameworks zu antworten, und die\nOberflaeche kennt nur ihre eigenen Schluessel."},"Ruecknahme":{"properties":{"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","title":"Ruecknahme"},"RuecknahmeAnfrage":{"properties":{"protokoll_id":{"type":"integer","title":"Protokoll Id","default":0}},"type":"object","title":"RuecknahmeAnfrage"},"Rueckwirkend":{"properties":{"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","title":"Rueckwirkend","description":"Der Anfragekoerper des rueckwirkenden Anwendens.\n\n`grund` landet im Protokoll. Er ist optional, weil eine erzwungene\nBegruendung erfahrungsgemaess \"test\" heisst - und ein Pruefbuch voller\n\"test\" ist schlechter als eines mit leeren Feldern, weil es aussieht, als\nstuende etwas drin."},"RuleUpsert":{"properties":{"threshold":{"type":"integer","maximum":1000.0,"minimum":1.0,"title":"Threshold"},"label":{"type":"string","maxLength":100,"minLength":1,"title":"Label"},"hint":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Hint"},"color_hex":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color Hex"}},"type":"object","required":["threshold","label"],"title":"RuleUpsert"},"SaisonAnlage":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"},"dauer_tage":{"type":"integer","maximum":365.0,"minimum":7.0,"title":"Dauer Tage"},"reset_anteil":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Reset Anteil","default":0},"platz_belohnungen":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Platz Belohnungen"},"ankuendigung_kanal_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Ankuendigung Kanal Id"}},"type":"object","required":["name","dauer_tage"],"title":"SaisonAnlage","description":"Der Anfragekoerper von POST.\n\n─── Warum eine DAUER und nicht zwei Zeitstempel ────────────────────────\n\nWeil das Dashboard genau eine Zahl abfragt (\"Dauer: 90 Tage\") und der\nBeginn die Anlage selbst ist. `beginnt_am`/`endet_am` als Pflichtfelder\nwaren zwei Werte, die der einzige Aufrufer nicht hat - und ein\nPflichtfeld, das niemand schickt, ist ein 422er auf dem einzigen Weg,\nder zu diesem Endpunkt fuehrt.\n\nIn der ZEILE stehen weiter zwei Zeitstempel (`beginnt_am` = jetzt,\n`endet_am` = jetzt + `dauer_tage`): daran haengt der stuendliche\nBot-Lauf, der eine geplante Saison startet und eine laufende beendet.\nDie Folge ist ausdruecklich gewollt und steht auch so in\n`saison_anlegen`: spaetestens zur naechsten volle Stunde beginnt sie von\nselbst, und `/starten` heisst \"nicht erst dann\"."},"SaisonBeenden":{"properties":{"bestaetigung":{"type":"string","const":"beenden","title":"Bestaetigung"}},"type":"object","required":["bestaetigung"],"title":"SaisonBeenden","description":"Eine laufende Saison sofort abschliessen, statt auf ihr Ende zu warten."},"SaisonStart":{"properties":{"tage":{"type":"integer","maximum":365.0,"minimum":7.0,"title":"Tage","default":90},"name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name"},"setzt_zurueck":{"type":"boolean","title":"Setzt Zurueck","default":true},"laeuft_weiter":{"type":"boolean","title":"Laeuft Weiter","default":true},"bestaetigung":{"type":"string","const":"starten","title":"Bestaetigung"}},"type":"object","required":["bestaetigung"],"title":"SaisonStart","description":"Eine Saison beginnen.\n\nGegen den gemessenen Zustand, dass ein einzelner Spieler 63 % des\ngesamten Geldes haelt: bei einem Tagesertrag von 10.000 Coins braeuchte\nein Neuling 383.763.991 Tage, um ihn einzuholen. Eine Saison macht diesen\nAbstand endlich."},"SaisonTitelText":{"properties":{"schluessel":{"type":"string","maxLength":30,"minLength":1,"title":"Schluessel"},"text":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Text"}},"type":"object","required":["schluessel"],"title":"SaisonTitelText","description":"Ein eigener Titeltext fuer eine Saison-Stufe.\n\nDer Schluessel wird NICHT als Literal aufgezaehlt: die Stufen stehen in\n`economy/saison_pass.py`, und eine zweite Liste hier waere die, die\nirgendwann nicht mehr stimmt.\n\nLeerer Text heisst LEEREN, und Leeren braucht ausdruecklich kein Premium -\nwer sein Abo kuendigt, muss seine Einstellung wieder entfernen koennen."},"SammelFilter":{"properties":{"suche":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suche"},"stufeVon":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Stufevon"},"stufeBis":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Stufebis"},"inaktivTage":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":1.0},{"type":"null"}],"title":"Inaktivtage"},"nurEingefroren":{"type":"boolean","title":"Nureingefroren","default":false},"rolleId":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Rolleid"}},"type":"object","title":"SammelFilter","description":"Die Menge, die eine Sammelaktion trifft.\n\n─── Warum die Feldnamen hier aus dem Browser kommen ────────────────────\n\nWeil der Reiter genau seinen Filterzustand schickt - unveraendert, als\nverschachteltes `filter`. Das ist kein Zufall, sondern der Kern der\nSache: die Sammelaktion soll DIESELBE Menge treffen, die die Liste\ndaneben zeigt, und der einzige Weg, das sicherzustellen, ist derselbe\nFilter, nicht ein zweiter, der ihn nachbildet.\n\nDeshalb stehen hier `stufeVon` und `nurEingefroren` als Namen. Sie sind\nnicht schoen; sie sind der Zustand des Formulars. Ohne sie kaeme der\nKoerper an und der Filter waere LEER - und eine Sammelaktion mit leerem\nFilter trifft jedes Profil des Servers. Genau davor warnt der Reiter in\nseinem obersten Satz, und genau das waere passiert.\n\nLeere Zeichenketten kommen mit, weil ein leeres Zahlenfeld im Browser\n`\"\"` ist und nicht `null`. `\"\"` heisst \"nicht gesetzt\" - `0` waere eine\nAussage, und \"Stufe ab 0\" ist keine."},"SchalterAendern":{"properties":{"trust_accepts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Trust Accepts","description":"Verifizierung von woanders anerkennen"},"trust_contributes":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Trust Contributes","description":"Verifizierung hier gilt woanders"},"blocklist_enforced":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Blocklist Enforced","description":"Gemeinsame Sperrliste wirkt hier"}},"type":"object","title":"SchalterAendern","description":"Die drei Richtungsschalter eines Verbundmitglieds.\n\nAlle drei sind OPTIONAL und None heisst \"nicht anfassen\". Ein PATCH mit\nStandardwerten `False` wuerde beim Umlegen eines Schalters die anderen zwei\nausschalten - und weil sie darueber entscheiden, wer in einen Server kommt,\nwaere das die unangenehmste Art von Nebenwirkung."},"SchluesselBody":{"properties":{"schluessel":{"items":{"$ref":"#/components/schemas/Uebergabe"},"type":"array","maxItems":4,"title":"Schluessel"}},"type":"object","required":["schluessel"],"title":"SchluesselBody"},"SchluesselPaar":{"properties":{"meta":{"type":"string","maxLength":512,"title":"Meta"},"login":{"type":"string","maxLength":512,"title":"Login"}},"type":"object","required":["meta","login"],"title":"SchluesselPaar"},"SeasonSettingsUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"announce_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Announce Enabled"},"announce_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Announce Channel Id"},"role_1_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role 1 Id"},"role_2_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role 2 Id"},"role_3_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role 3 Id"}},"type":"object","title":"SeasonSettingsUpdate","description":"Season-Konfiguration eines Servers.\n\nLiegt in einer eigenen Tabelle, deshalb ein eigenes Schema und ein eigener\nEndpunkt statt zusätzlicher Felder an ``SettingsUpdate``."},"SecuritySettingsUpdate":{"properties":{"system_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"System Enabled"},"anti_nuke_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Anti Nuke Enabled"},"max_channel_deletes":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Max Channel Deletes"},"max_channel_creates":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Max Channel Creates"},"max_role_deletes":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Max Role Deletes"},"max_role_creates":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Max Role Creates"},"max_bans":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Max Bans"},"max_kicks":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Max Kicks"},"nuke_timeframe_minutes":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":1.0},{"type":"null"}],"title":"Nuke Timeframe Minutes"},"anti_spam_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Anti Spam Enabled"},"max_messages_per_minute":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Max Messages Per Minute"},"max_duplicate_messages":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":1.0},{"type":"null"}],"title":"Max Duplicate Messages"},"max_mentions_per_message":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":1.0},{"type":"null"}],"title":"Max Mentions Per Message"},"max_emojis_per_message":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Max Emojis Per Message"},"max_caps_percentage":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Max Caps Percentage"},"min_message_length_for_caps":{"anyOf":[{"type":"integer","maximum":500.0,"minimum":1.0},{"type":"null"}],"title":"Min Message Length For Caps"},"max_attachments_per_message":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":1.0},{"type":"null"}],"title":"Max Attachments Per Message"},"anti_link_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Anti Link Enabled"},"delete_discord_invites":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Delete Discord Invites"},"delete_external_links":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Delete External Links"},"delete_media_links":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Delete Media Links"},"allow_trusted_domains":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Trusted Domains"},"anti_raid_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Anti Raid Enabled"},"max_joins_per_minute":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Max Joins Per Minute"},"raid_account_age_hours":{"anyOf":[{"type":"integer","maximum":8760.0,"minimum":1.0},{"type":"null"}],"title":"Raid Account Age Hours"},"auto_lockdown_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Lockdown Enabled"},"lockdown_duration_minutes":{"anyOf":[{"type":"integer","maximum":1440.0,"minimum":1.0},{"type":"null"}],"title":"Lockdown Duration Minutes"},"bot_protection_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bot Protection Enabled"},"bot_protection_action":{"anyOf":[{"type":"string","pattern":"^(kick_bot|kick_user|kick_both|warn)$"},{"type":"null"}],"title":"Bot Protection Action"},"auto_verify_bots":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Verify Bots"},"min_account_age_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Min Account Age Enabled"},"min_account_age_hours":{"anyOf":[{"type":"integer","maximum":8760.0,"minimum":1.0},{"type":"null"}],"title":"Min Account Age Hours"},"min_account_age_action":{"anyOf":[{"type":"string","pattern":"^(kick|ban)$"},{"type":"null"}],"title":"Min Account Age Action"},"anti_phishing_ai_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Anti Phishing Ai Enabled"},"anti_phishing_actions":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Anti Phishing Actions"},"ai_message_filter_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai Message Filter Enabled"},"ai_filter_delete_after":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":0.0},{"type":"null"}],"title":"Ai Filter Delete After"},"lockdown_voice_channels":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Lockdown Voice Channels"},"lockdown_block_joins":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Lockdown Block Joins"},"lockdown_disable_invites":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Lockdown Disable Invites"},"lockdown_kick_new_members":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Lockdown Kick New Members"},"lockdown_verification_level":{"anyOf":[{"type":"integer","maximum":4.0,"minimum":0.0},{"type":"null"}],"title":"Lockdown Verification Level"},"lockdown_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lockdown Role Id"},"auto_lockdown_channels":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Lockdown Channels"},"auto_lockdown_voice":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Lockdown Voice"},"auto_lockdown_joins":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Lockdown Joins"},"auto_lockdown_invites":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Lockdown Invites"},"security_log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Security Log Channel Id"},"violation_log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Violation Log Channel Id"},"alert_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alert Role Id"},"punishment_rules":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Punishment Rules"},"violation_dm_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Violation Dm Enabled"}},"type":"object","title":"SecuritySettingsUpdate"},"SecurityStatsDetail":{"properties":{"trust_score":{"type":"number","title":"Trust Score"},"risk_level":{"type":"string","title":"Risk Level"},"total_violations":{"type":"integer","title":"Total Violations"},"spam_violations":{"type":"integer","title":"Spam Violations"},"link_violations":{"type":"integer","title":"Link Violations"},"nuke_violations":{"type":"integer","title":"Nuke Violations"},"raid_violations":{"type":"integer","title":"Raid Violations"},"last_violation":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Violation"}},"type":"object","required":["trust_score","risk_level","total_violations","spam_violations","link_violations","nuke_violations","raid_violations"],"title":"SecurityStatsDetail","description":"Zusammenfassung der Sicherheits-Statistiken."},"SecurityViolationDetail":{"properties":{"id":{"type":"integer","title":"Id"},"violation_type":{"type":"string","title":"Violation Type"},"severity":{"type":"string","title":"Severity"},"description":{"type":"string","title":"Description"},"evidence":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Evidence"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"},"action_taken":{"type":"string","title":"Action Taken"},"action_duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Action Duration"},"action_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Reason"},"is_resolved":{"type":"boolean","title":"Is Resolved"},"resolved_by_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved By Id"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"auto_detected":{"type":"boolean","title":"Auto Detected"}},"type":"object","required":["id","violation_type","severity","description","action_taken","is_resolved","timestamp","auto_detected"],"title":"SecurityViolationDetail","description":"Detail eines Sicherheitsverstoßes."},"SecurityViolationsListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"items":{"$ref":"#/components/schemas/SecurityViolationDetail"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"}},"type":"object","required":["data","pagination"],"title":"SecurityViolationsListResponse","description":"API Response für Security Violations Liste."},"SelectionMode":{"type":"string","enum":["random","weighted","round_robin","ai"],"title":"SelectionMode"},"SelfroleStatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"overview":{"additionalProperties":{"type":"integer"},"type":"object","title":"Overview"},"category_stats":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Category Stats"},"top_roles":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Roles"},"recent_activity":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Recent Activity"}},"type":"object","required":["overview","category_stats","top_roles","recent_activity"],"title":"SelfroleStatsResponse","description":"Schema für Statistiken"},"SendEmbedRequest":{"properties":{"channel_id":{"type":"string","title":"Channel Id","description":"Ziel-Channel ID"}},"type":"object","required":["channel_id"],"title":"SendEmbedRequest"},"SendMultiContentRequest":{"properties":{"channel_id":{"type":"string","title":"Channel Id","description":"Ziel-Channel ID"},"embed_ids":{"items":{"type":"integer"},"type":"array","maxItems":25,"minItems":1,"title":"Embed Ids","description":"Liste von Embed IDs in Sendereihenfolge"}},"type":"object","required":["channel_id","embed_ids"],"title":"SendMultiContentRequest","description":"Request zum Senden von Multi-Content (mehrere Embeds/Bilder/Text nacheinander)"},"SendPanelRequest":{"properties":{"channel_id":{"type":"string","title":"Channel Id"},"panel_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Panel Id"}},"type":"object","required":["channel_id"],"title":"SendPanelRequest","description":"Request zum Senden eines Ticket-Panels"},"SendResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"type":"string","title":"Message"},"channel_id":{"type":"string","title":"Channel Id"},"category_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Category Id"}},"type":"object","required":["message","channel_id"],"title":"SendResponse","description":"Schema für Send-Response"},"SendTeamListRequest":{"properties":{"channel_id":{"type":"string","title":"Channel Id","description":"Target channel ID"},"update_only":{"type":"boolean","title":"Update Only","description":"Only update instead of sending new","default":false}},"type":"object","required":["channel_id"],"title":"SendTeamListRequest","description":"Request to send team list"},"SendVerifyRequest":{"properties":{"channel_id":{"type":"string","title":"Channel Id","description":"Discord Channel ID as string"},"update_only":{"type":"boolean","title":"Update Only","description":"If true: only update existing message","default":false}},"type":"object","required":["channel_id"],"title":"SendVerifyRequest"},"SerienSetzung":{"properties":{"daily_streak":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":0.0},{"type":"null"}],"title":"Daily Streak"},"work_streak":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":0.0},{"type":"null"}],"title":"Work Streak"},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","title":"SerienSetzung","description":"Serien setzen.\n\nDie Obergrenze steht in `economy/spielstand.py` (SERIE_MAX) und wird dort\ngeprueft; hier deckelt nur die Eingabe. Zwei Zahlen an zwei Stellen waeren\nzwei Wahrheiten, und die kleinere gaelte."},"ServerAnnouncementsResponse":{"properties":{"bot_news":{"items":{"$ref":"#/components/schemas/BotNewsBanner"},"type":"array","title":"Bot News","default":[]},"server_stats_summary":{"additionalProperties":true,"type":"object","title":"Server Stats Summary"}},"type":"object","title":"ServerAnnouncementsResponse","description":"Bot News + Server Quick-Stats."},"ServerBackgroundUpdate":{"properties":{"background_base64":{"type":"string","title":"Background Base64","description":"Base64-encoded image (max 5MB)"}},"type":"object","required":["background_base64"],"title":"ServerBackgroundUpdate"},"ServerBanRequest":{"properties":{"admin_user_id":{"type":"string","title":"Admin User Id"},"reason":{"type":"string","title":"Reason"},"ban":{"type":"boolean","title":"Ban","default":true}},"type":"object","required":["admin_user_id","reason"],"title":"ServerBanRequest"},"ServerCustomizationSchema":{"properties":{"custom_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Text","description":"Server description or slogan."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Kurze Serverbeschreibung."},"effect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effect","description":"Effect (e.g. 'snow', 'confetti', 'default').","default":"default"},"font":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Font","description":"Preferred font.","default":"default"},"heading_color_primary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Heading Color Primary","description":"Primary color (Hex).","default":"#FFFFFF"},"heading_color_secondary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Heading Color Secondary","description":"Secondary color for gradient."},"background_image_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Background Image Base64","description":"Background image as Base64."},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"Last update"},"is_public":{"type":"boolean","title":"Is Public","description":"Ob der Server öffentlich gelistet ist (Invite/Liste).","default":true}},"type":"object","title":"ServerCustomizationSchema","description":"Schema for retrieving and updating server profile customizations."},"ServerCustomizationUpdate":{"properties":{"image_blur":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":0.0},{"type":"null"}],"title":"Image Blur","description":"Blur (0-20)"},"image_darken":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Image Darken","description":"Darken (0.0 - 1.0)"}},"type":"object","title":"ServerCustomizationUpdate"},"ServerDesign":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"background_image_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Background Image Base64"},"primary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Color"},"secondary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secondary Color"},"font":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Font"},"effect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effect"}},"type":"object","required":["description","background_image_base64","primary_color","secondary_color","font","effect"],"title":"ServerDesign","description":"Design-Daten für das Frontend-Profil"},"ServerDetailedStatsResponse":{"properties":{"total_messages":{"type":"integer","title":"Total Messages"},"total_words":{"type":"integer","title":"Total Words"},"total_voice_hours":{"type":"number","title":"Total Voice Hours"},"total_economy_currency":{"type":"integer","title":"Total Economy Currency"},"counting_current_score":{"type":"integer","title":"Counting Current Score"},"counting_total_counts":{"type":"integer","title":"Counting Total Counts"},"total_roles":{"type":"integer","title":"Total Roles"},"total_giveaways":{"type":"integer","title":"Total Giveaways"},"favorite_emoji":{"anyOf":[{"$ref":"#/components/schemas/FavoriteEmojiData"},{"type":"null"}]}},"type":"object","required":["total_messages","total_words","total_voice_hours","total_economy_currency","counting_current_score","counting_total_counts","total_roles","total_giveaways","favorite_emoji"],"title":"ServerDetailedStatsResponse"},"ServerHealth":{"properties":{"score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Score"},"status":{"type":"string","enum":["excellent","good","fair","poor"],"title":"Status"},"issues":{"items":{"$ref":"#/components/schemas/HealthIssue"},"type":"array","title":"Issues"},"checked_at":{"type":"string","format":"date-time","title":"Checked At"}},"type":"object","required":["score","status","issues","checked_at"],"title":"ServerHealth","description":"Server Health Score"},"ServerHinzufuegen":{"properties":{"server_id":{"type":"string","title":"Server Id","description":"Discord Server ID, die in den Verbund soll"}},"type":"object","required":["server_id"],"title":"ServerHinzufuegen"},"ServerInfo":{"properties":{"server_id":{"type":"string","title":"Server Id"},"server_name":{"type":"string","title":"Server Name"},"server_icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Icon"},"joined_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Joined At"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"}},"type":"object","required":["server_id","server_name"],"title":"ServerInfo","description":"Server-Informationen."},"ServerListItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"member_count":{"type":"integer","title":"Member Count"},"score":{"type":"number","title":"Score"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"is_premium":{"type":"boolean","title":"Is Premium"},"created_at":{"type":"string","title":"Created At"},"invite_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Link"},"review_average":{"type":"number","title":"Review Average","default":0.0}},"type":"object","required":["id","name","icon_url","description","member_count","score","tags","is_premium","created_at","invite_link"],"title":"ServerListItem"},"ServerListResponse":{"properties":{"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"},"data":{"items":{"$ref":"#/components/schemas/ServerListItem"},"type":"array","title":"Data"}},"type":"object","required":["total","page","limit","data"],"title":"ServerListResponse"},"ServerMemberSearchResult":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"discriminator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discriminator"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"is_bot":{"type":"boolean","title":"Is Bot","default":false},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"joined_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Joined At"},"role_ids":{"items":{"type":"string"},"type":"array","title":"Role Ids","default":[]},"active_warnings":{"type":"integer","title":"Active Warnings","default":0}},"type":"object","required":["user_id","username"],"title":"ServerMemberSearchResult","description":"Suchergebnis für einen Server-Member."},"ServerMeta":{"properties":{"server_id":{"type":"string","title":"Server Id"},"server_name":{"type":"string","title":"Server Name"},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Url"}},"type":"object","required":["server_id","server_name"],"title":"ServerMeta"},"ServerMetaResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"}},"type":"object","required":["success","data"],"title":"ServerMetaResponse"},"ServerNewsChannelsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"server_id":{"type":"string","title":"Server Id"},"channels_by_type":{"additionalProperties":true,"type":"object","title":"Channels By Type"}},"type":"object","required":["success","server_id","channels_by_type"],"title":"ServerNewsChannelsResponse","description":"Kanäle des News-Servers, gruppiert nach Typ (kompatibel zum Channel-Picker)"},"ServerNewsCreate":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title"},"content":{"type":"string","maxLength":10000,"minLength":1,"title":"Content"},"status":{"type":"string","enum":["info","update","warning","critical","event","maintenance"],"title":"Status","default":"info"},"highlight_color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","title":"Highlight Color","default":"#3b82f6"},"image_url":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Image Url"},"version":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Version"},"cta_label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Cta Label"},"cta_url":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Cta Url"},"is_pinned":{"type":"boolean","title":"Is Pinned","default":false},"is_published":{"type":"boolean","title":"Is Published","default":true},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"discord_channel_id":{"anyOf":[{"type":"string","pattern":"^\\d{5,30}$"},{"type":"null"}],"title":"Discord Channel Id"}},"type":"object","required":["title","content"],"title":"ServerNewsCreate","description":"Schema zum Erstellen einer News"},"ServerNewsListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"total":{"type":"integer","title":"Total"},"has_more":{"type":"boolean","title":"Has More","default":false},"news":{"items":{"$ref":"#/components/schemas/ServerNewsResponse"},"type":"array","title":"News"}},"type":"object","required":["success","total","news"],"title":"ServerNewsListResponse","description":"Liste aller News (paginiert)"},"ServerNewsResponse":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"},"status":{"type":"string","title":"Status"},"highlight_color":{"type":"string","title":"Highlight Color"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"cta_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Label"},"cta_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Url"},"is_pinned":{"type":"boolean","title":"Is Pinned"},"is_published":{"type":"boolean","title":"Is Published"},"author_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Id"},"author_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Username"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"discord_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discord Channel Id"},"discord_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discord Message 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","title","content","status","highlight_color","is_pinned","is_published","created_at","updated_at"],"title":"ServerNewsResponse","description":"Einzelne News-Antwort"},"ServerNewsUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Title"},"content":{"anyOf":[{"type":"string","maxLength":10000,"minLength":1},{"type":"null"}],"title":"Content"},"status":{"anyOf":[{"type":"string","enum":["info","update","warning","critical","event","maintenance"]},{"type":"null"}],"title":"Status"},"highlight_color":{"anyOf":[{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},{"type":"null"}],"title":"Highlight Color"},"image_url":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Image Url"},"version":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Version"},"cta_label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Cta Label"},"cta_url":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Cta Url"},"is_pinned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Pinned"},"is_published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Published"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"discord_channel_id":{"anyOf":[{"type":"string","pattern":"^\\d{5,30}$"},{"type":"null"}],"title":"Discord Channel Id"}},"type":"object","title":"ServerNewsUpdate","description":"Schema zum Bearbeiten einer News"},"ServerOverviewResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"server_id":{"type":"string","title":"Server Id"},"server_name":{"type":"string","title":"Server Name"},"members":{"additionalProperties":true,"type":"object","title":"Members"},"messages":{"additionalProperties":true,"type":"object","title":"Messages"},"voice":{"additionalProperties":true,"type":"object","title":"Voice"},"channels":{"additionalProperties":true,"type":"object","title":"Channels"},"top_users":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Users"}},"type":"object","required":["success","server_id","server_name","members","messages","voice","channels","top_users"],"title":"ServerOverviewResponse","description":"Gesamt-Übersicht für Dashboard"},"ServerOverviewStats":{"properties":{"joined_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Joined At"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"messages":{"$ref":"#/components/schemas/StatWithPercentage"},"voice":{"$ref":"#/components/schemas/StatWithPercentage"},"reactions":{"$ref":"#/components/schemas/StatWithPercentage"},"commands":{"$ref":"#/components/schemas/StatWithPercentage"},"current_level":{"type":"integer","title":"Current Level"},"current_xp":{"type":"integer","title":"Current Xp"}},"type":"object","required":["joined_at","nickname","messages","voice","reactions","commands","current_level","current_xp"],"title":"ServerOverviewStats","description":"Schema für die Server-Overview-Statistiken."},"ServerOwnerInfo":{"properties":{"id":{"type":"string","title":"Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"}},"type":"object","required":["id","username","avatar_url"],"title":"ServerOwnerInfo"},"ServerReviewsResponse":{"properties":{"total_reviews":{"type":"integer","title":"Total Reviews"},"average_rating":{"type":"number","title":"Average Rating"},"data":{"items":{"$ref":"#/components/schemas/PublicReview"},"type":"array","title":"Data"}},"type":"object","required":["total_reviews","average_rating","data"],"title":"ServerReviewsResponse"},"ServerStatsCommands":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server":{"$ref":"#/components/schemas/ServerMeta"},"time_range":{"$ref":"#/components/schemas/TimeRange"},"commands":{"$ref":"#/components/schemas/CommandStats"}},"type":"object","required":["server","time_range","commands"],"title":"ServerStatsCommands"},"ServerStatsLeaderboard":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server":{"$ref":"#/components/schemas/ServerMeta"},"time_range":{"$ref":"#/components/schemas/TimeRange"},"category":{"type":"string","title":"Category"},"entries":{"items":{"$ref":"#/components/schemas/api__schemas__server_stats__LeaderboardEntry"},"type":"array","title":"Entries","default":[]},"total_entries":{"type":"integer","title":"Total Entries","default":0}},"type":"object","required":["server","time_range","category"],"title":"ServerStatsLeaderboard"},"ServerStatsLevels":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server":{"$ref":"#/components/schemas/ServerMeta"},"time_range":{"$ref":"#/components/schemas/TimeRange"},"levels":{"$ref":"#/components/schemas/LevelStats"}},"type":"object","required":["server","time_range","levels"],"title":"ServerStatsLevels"},"ServerStatsMemberFlow":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server":{"$ref":"#/components/schemas/ServerMeta"},"time_range":{"$ref":"#/components/schemas/TimeRange"},"member_flow":{"$ref":"#/components/schemas/MemberFlowStats"}},"type":"object","required":["server","time_range","member_flow"],"title":"ServerStatsMemberFlow"},"ServerStatsMessages":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server":{"$ref":"#/components/schemas/ServerMeta"},"time_range":{"$ref":"#/components/schemas/TimeRange"},"messages":{"$ref":"#/components/schemas/MessageStats"}},"type":"object","required":["server","time_range","messages"],"title":"ServerStatsMessages"},"ServerStatsModeration":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server":{"$ref":"#/components/schemas/ServerMeta"},"time_range":{"$ref":"#/components/schemas/TimeRange"},"moderation":{"$ref":"#/components/schemas/ModerationStats"}},"type":"object","required":["server","time_range","moderation"],"title":"ServerStatsModeration"},"ServerStatsOverview":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server":{"$ref":"#/components/schemas/ServerMeta"},"time_range":{"$ref":"#/components/schemas/TimeRange"},"messages":{"$ref":"#/components/schemas/MessageStats"},"voice":{"$ref":"#/components/schemas/VoiceStats"},"reactions":{"$ref":"#/components/schemas/ReactionStats"},"member_flow":{"$ref":"#/components/schemas/MemberFlowStats"},"invites":{"$ref":"#/components/schemas/InviteStats"},"moderation":{"$ref":"#/components/schemas/ModerationStats"},"commands":{"$ref":"#/components/schemas/CommandStats"},"levels":{"$ref":"#/components/schemas/LevelStats"},"tickets":{"$ref":"#/components/schemas/TicketStats"},"giveaways":{"$ref":"#/components/schemas/api__schemas__server_stats__GiveawayStats"},"economy":{"$ref":"#/components/schemas/EconomyStats"},"cross_stats":{"$ref":"#/components/schemas/CrossStats"}},"type":"object","required":["server","time_range","messages","voice","reactions","member_flow","invites","moderation","commands","levels","tickets","giveaways","economy","cross_stats"],"title":"ServerStatsOverview"},"ServerStatsReactions":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server":{"$ref":"#/components/schemas/ServerMeta"},"time_range":{"$ref":"#/components/schemas/TimeRange"},"reactions":{"$ref":"#/components/schemas/ReactionStats"}},"type":"object","required":["server","time_range","reactions"],"title":"ServerStatsReactions"},"ServerStatsVoice":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server":{"$ref":"#/components/schemas/ServerMeta"},"time_range":{"$ref":"#/components/schemas/TimeRange"},"voice":{"$ref":"#/components/schemas/VoiceStats"}},"type":"object","required":["server","time_range","voice"],"title":"ServerStatsVoice"},"ServerTagSettings":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Id"}},"type":"object","title":"ServerTagSettings"},"ServerTagsResponse":{"properties":{"server_id":{"type":"string","title":"Server Id"},"count":{"type":"integer","title":"Count"},"tags":{"items":{"$ref":"#/components/schemas/TagSchema"},"type":"array","title":"Tags"}},"type":"object","required":["server_id","count","tags"],"title":"ServerTagsResponse"},"ServerTagsUpdateSchema":{"properties":{"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Liste von Tag-Namen (Maximal 5)."}},"type":"object","required":["tags"],"title":"ServerTagsUpdateSchema","description":"Schema zum Aktualisieren der Server-Tags."},"ServerWahl":{"properties":{"server_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Server Id"}},"type":"object","title":"ServerWahl","description":"Ein Spielzug im Web, der einen Server braucht (Clan-Ausbau Oktober\n2026, api/routers/clans_alltag.py): der Raid- oder Kriegsangriff (der\nSchaden haengt am Level auf DIESEM Server) und ein Boost aus dem Rucksack\n(er wirkt auf DIESEM Server). Ohne Angabe waehlt der Dienst selbst -\nbeim Angriff den Server mit dem hoechsten Level, auf dem Clans laufen."},"SetActiveServerRequest":{"properties":{"sub_type":{"type":"string","title":"Sub Type","description":"premium oder ai"},"server_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Id","description":"Server-ID, oder null zum Entfernen"}},"type":"object","required":["sub_type"],"title":"SetActiveServerRequest"},"SetPasswordBody":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"SetPasswordBody"},"SetServerLanguageRequest":{"properties":{"language":{"type":"string","title":"Language","description":"Language code, e.g. 'de' or 'en-US'"}},"type":"object","required":["language"],"title":"SetServerLanguageRequest"},"SetTrialRequest":{"properties":{"sub_type":{"type":"string","title":"Sub Type","description":"premium, pro, ai"},"used":{"type":"boolean","title":"Used","description":"False = Trial freischalten (reset), True = Trial blocken (als verbraucht markieren)","default":false}},"type":"object","required":["sub_type"],"title":"SetTrialRequest"},"SettingsBody":{"properties":{"accepting_new":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Accepting New"},"notification_server_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Server Id"},"notification_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Channel Id"},"notification_ping_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Ping Role Id"},"discord_relay_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Discord Relay Enabled"},"auto_translate":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Translate"},"ai_first_response":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai First Response"},"ai_auto_summary":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai Auto Summary"},"ai_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Model"},"ai_persona":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Persona"},"welcome_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Welcome Message"},"offline_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Offline Message"},"autopilot_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Autopilot Enabled"},"autopilot_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Autopilot Name"},"autopilot_max_chars":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Autopilot Max Chars"},"autopilot_categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Autopilot Categories"},"autopilot_delay_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Autopilot Delay Minutes"},"autopilot_daily_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Autopilot Daily Limit"}},"type":"object","title":"SettingsBody"},"SettingsUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"announce_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Announce Channel Id"},"announce_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Announce Mode"},"announce_message":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Announce Message"},"dm_on_unlock":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dm On Unlock"},"ping_user":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ping User"},"leaderboard_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Leaderboard Enabled"},"track_bots":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Track Bots"},"disabled_categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Disabled Categories"},"disabled_metrics":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Disabled Metrics"},"points_multiplier":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.1},{"type":"null"}],"title":"Points Multiplier"},"rewards_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Rewards Enabled"},"min_account_age_days":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":0.0},{"type":"null"}],"title":"Min Account Age Days"},"card_accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Accent Color"},"card_blur":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":0.0},{"type":"null"}],"title":"Card Blur"},"card_darken":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Card Darken"},"card_title":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Card Title"},"card_background_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Background Base64"},"hide_branding":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hide Branding"},"rarity_frames":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Rarity Frames"}},"type":"object","title":"SettingsUpdate"},"ShopEintragEingabe":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"emoji":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Emoji"},"item_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Item Type"},"rarity":{"anyOf":[{"type":"string","enum":["common","rare","epic","legendary"]},{"type":"null"}],"title":"Rarity"},"price":{"anyOf":[{"type":"integer","maximum":1000000000000.0,"minimum":0.0},{"type":"null"}],"title":"Price"},"currency_type":{"anyOf":[{"type":"string","enum":["coins","gems","tokens"]},{"type":"null"}],"title":"Currency Type"},"stock_quantity":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":-1.0},{"type":"null"}],"title":"Stock Quantity"},"purchase_limit_per_user":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":-1.0},{"type":"null"}],"title":"Purchase Limit Per User"},"is_available":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Available"},"is_tradeable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Tradeable"},"is_sellable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Sellable"}},"type":"object","title":"ShopEintragEingabe","description":"Ein Eintrag im Wirtschafts-Shop.\n\nDer Shop ist die schwaechste Senke im ganzen System: gemessen 54 Kaeufe\nin 30 Tagen bei 3,58 Milliarden Umsatz - drei Kaeufe je Tag auf der\ngesamten Plattform. Dass niemand ihn bestuecken konnte, ist der\nnaheliegendste Grund."},"ShopStatsResponse":{"properties":{"total_items":{"type":"integer","title":"Total Items"},"active_items":{"type":"integer","title":"Active Items"},"total_purchases":{"type":"integer","title":"Total Purchases"},"total_gems_spent":{"type":"integer","title":"Total Gems Spent"},"top_items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Items"},"recent_purchases":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Recent Purchases"}},"type":"object","required":["total_items","active_items","total_purchases","total_gems_spent","top_items","recent_purchases"],"title":"ShopStatsResponse","description":"Schema for shop statistics"},"SignatureRequest":{"properties":{"note":{"type":"string","maxLength":400,"minLength":10,"title":"Note"}},"type":"object","required":["note"],"title":"SignatureRequest"},"Simulation":{"properties":{"nachrichten_pro_tag":{"type":"integer","maximum":100000.0,"minimum":0.0,"title":"Nachrichten Pro Tag","default":30},"voice_minuten_pro_tag":{"type":"integer","maximum":1440.0,"minimum":0.0,"title":"Voice Minuten Pro Tag","default":0},"kurve":{"anyOf":[{"type":"string","enum":["sanft","standard","steil","stetig"]},{"type":"null"}],"title":"Kurve"},"xp_pro_nachricht":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Xp Pro Nachricht"},"xp_pro_voice_intervall":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Xp Pro Voice Intervall"},"faktor":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.0},{"type":"null"}],"title":"Faktor"}},"type":"object","title":"Simulation","description":"Die Eingaben des Simulators.\n\nAlle Felder optional: fehlt eines, nimmt der Endpunkt den Wert, den\ndieser Server tatsaechlich eingestellt hat. Der Simulator soll die Frage\n\"wie lange dauert Stufe 50 BEI UNS\" beantworten koennen, ohne dass\njemand vorher vier Zahlen von der Nachbarseite abschreibt."},"SlotCreate":{"properties":{"weekday":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Weekday"},"start_minute":{"type":"integer","exclusiveMaximum":1440.0,"minimum":0.0,"title":"Start Minute"},"end_minute":{"type":"integer","exclusiveMaximum":1440.0,"minimum":0.0,"title":"End Minute"},"needed_count":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Needed Count","default":1},"group_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Group Id"},"label":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Label"}},"type":"object","required":["weekday","start_minute","end_minute"],"title":"SlotCreate"},"SlotPatch":{"properties":{"weekday":{"anyOf":[{"type":"integer","maximum":6.0,"minimum":0.0},{"type":"null"}],"title":"Weekday"},"start_minute":{"anyOf":[{"type":"integer","exclusiveMaximum":1440.0,"minimum":0.0},{"type":"null"}],"title":"Start Minute"},"end_minute":{"anyOf":[{"type":"integer","exclusiveMaximum":1440.0,"minimum":0.0},{"type":"null"}],"title":"End Minute"},"needed_count":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":1.0},{"type":"null"}],"title":"Needed Count"},"group_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Group Id"},"clear_group":{"type":"boolean","title":"Clear Group","default":false},"label":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Label"}},"type":"object","title":"SlotPatch"},"SmartInsight":{"properties":{"category":{"type":"string","title":"Category"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"actionable":{"type":"boolean","title":"Actionable"},"suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggestion"}},"type":"object","required":["category","title","description","actionable"],"title":"SmartInsight","description":"Smart Insight"},"SnoozeBody":{"properties":{"minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Minutes"}},"type":"object","title":"SnoozeBody"},"SocialConnectionListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"connections":{"items":{"$ref":"#/components/schemas/SocialConnectionResponse"},"type":"array","title":"Connections"},"connectable_platforms":{"items":{"type":"string"},"type":"array","title":"Connectable Platforms"}},"type":"object","required":["success","connections","connectable_platforms"],"title":"SocialConnectionListResponse"},"SocialConnectionResponse":{"properties":{"id":{"type":"integer","title":"Id"},"platform":{"type":"string","title":"Platform"},"external_user_id":{"type":"string","title":"External User Id"},"external_username":{"type":"string","title":"External Username"},"scopes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scopes"},"connected_by_id":{"type":"string","title":"Connected By Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"stats":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Stats"}},"type":"object","required":["id","platform","external_user_id","external_username","connected_by_id","created_at"],"title":"SocialConnectionResponse"},"SocialMediaAccountCreate":{"properties":{"platform":{"type":"string","enum":["youtube","twitch","kick"],"title":"Platform","description":"Platform"},"username_or_id":{"type":"string","title":"Username Or Id","description":"Channel ID or Username"},"notification_channel_id":{"type":"string","title":"Notification Channel Id","description":"Discord Channel ID for notifications"},"mention_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mention Role Id","description":"Optional: Role ID to ping"},"custom_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Message","description":"Optional custom message"},"show_description":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Description","description":"Show video description?","default":true}},"type":"object","required":["platform","username_or_id","notification_channel_id"],"title":"SocialMediaAccountCreate"},"SocialMediaAccountListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"total":{"type":"integer","title":"Total"},"accounts":{"items":{"$ref":"#/components/schemas/SocialMediaAccountResponse"},"type":"array","title":"Accounts"},"limits":{"additionalProperties":true,"type":"object","title":"Limits"}},"type":"object","required":["success","total","accounts","limits"],"title":"SocialMediaAccountListResponse"},"SocialMediaAccountResponse":{"properties":{"id":{"type":"integer","title":"Id"},"server_id":{"type":"string","title":"Server Id"},"platform":{"type":"string","title":"Platform"},"username_or_id":{"type":"string","title":"Username Or Id"},"display_name":{"type":"string","title":"Display Name"},"notification_channel_id":{"type":"string","title":"Notification Channel Id"},"mention_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mention Role Id"},"custom_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Message"},"show_description":{"type":"boolean","title":"Show Description"},"is_active":{"type":"boolean","title":"Is Active"},"is_live":{"type":"boolean","title":"Is Live"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_checked":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked"},"error_count":{"type":"integer","title":"Error Count"}},"type":"object","required":["id","server_id","platform","username_or_id","display_name","notification_channel_id","mention_role_id","custom_message","show_description","is_active","is_live","created_at","last_checked","error_count"],"title":"SocialMediaAccountResponse"},"SocialMediaAccountUpdate":{"properties":{"notification_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Channel Id","description":"New channel ID"},"mention_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mention Role Id","description":"New role ID"},"custom_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Message","description":"New custom message"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Activate/deactivate account"},"show_description":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Description","description":"Show video description on/off"}},"type":"object","title":"SocialMediaAccountUpdate"},"SoldAuszahlung":{"properties":{"betrag":{"type":"integer","minimum":1.0,"title":"Betrag","description":"Gesamtsumme aus der Kammer"}},"type":"object","required":["betrag"],"title":"SoldAuszahlung","description":"`POST /clans/{id}/treasury/{server_id}/pay` - der Sold.\n\n`betrag` ist die GESAMTsumme, die die Kammer verlaesst; wie viele\nEmpfaenger es gibt und was jeder bekommt, rechnet\n`schatzkammer.sold_auszahlen` (gleichmaessig, Rest bleibt liegen).\n\nNur `ge=1`, keine Obergrenze: der wirkliche Deckel ist\n`economy.betraege.MAX_BETRAG` und der steht im Modul, das auch bucht.\nStuende er hier ein zweites Mal, gaebe es zwei Zahlen fuer dieselbe\nGrenze - und die eine hier wuerde beim ersten Wechsel vergessen. Ein zu\ngrosser Betrag kommt deshalb als 400 mit `schatzkammer.betrag` zurueck\nund nicht als 422 ohne Erklaerung."},"SortOrder":{"type":"string","enum":["asc","desc"],"title":"SortOrder"},"SourceIn":{"properties":{"kind":{"anyOf":[{"type":"string","enum":["search","profile","board"]},{"type":"null"}],"title":"Kind"},"value":{"type":"string","maxLength":500,"minLength":1,"title":"Value"},"label":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Label"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["value"],"title":"SourceIn"},"SourceOut":{"properties":{"id":{"type":"integer","title":"Id"},"kind":{"type":"string","title":"Kind"},"value":{"type":"string","title":"Value"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"is_active":{"type":"boolean","title":"Is Active"},"last_fetch_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Fetch At"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"consecutive_errors":{"type":"integer","title":"Consecutive Errors"},"total_fetched":{"type":"integer","title":"Total Fetched"}},"type":"object","required":["id","kind","value","label","is_active","last_fetch_at","last_error","consecutive_errors","total_fetched"],"title":"SourceOut"},"SperreAendern":{"properties":{"action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action","description":"deny | kick | ban"},"reason":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Reason"},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"Neuer Ablauf"},"clear_expiry":{"type":"boolean","title":"Clear Expiry","description":"Ablauf entfernen (unbefristet machen)","default":false}},"type":"object","title":"SperreAendern","description":"Wie SperreAnlegen, aber ohne `user_id` und mit None = nicht anfassen.\n\n`expires_at` ist der Sonderfall: dort ist None ein gueltiger WERT\n(\"unbefristet machen\") und kein \"nicht anfassen\". Deshalb traegt das\nUmsetzen ein eigenes Feld, statt aus None zu raten - eine Verlaengerung, die\nversehentlich zur Entfristung wird, ist ein Fehler, den niemand bemerkt."},"SperreAnlegen":{"properties":{"user_id":{"type":"string","title":"User Id","description":"Discord User ID"},"action":{"type":"string","title":"Action","description":"deny | kick | ban","default":"deny"},"reason":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Reason"},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"Ablauf; leer = unbefristet"}},"type":"object","required":["user_id"],"title":"SperreAnlegen"},"StandardResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"}},"type":"object","required":["success","message"],"title":"StandardResponse","description":"Standard Success Response"},"StandardSuccessResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"StandardSuccessResponse","description":"Standard success response."},"StapelIn":{"properties":{"server_id":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Server Id"},"ereignisse":{"items":{"$ref":"#/components/schemas/Ereignis"},"type":"array","title":"Ereignisse"}},"type":"object","title":"StapelIn","description":"Was das Frontend in einem Rutsch meldet.\n\n─── Warum ein Stapel und nicht ein Aufruf je Ereignis ─────────────────\n\nWeil ein Nutzer, der durch das Dashboard klickt, in einer Minute leicht\ndreissig Ereignisse erzeugt - Seitenwechsel, gespeicherte Formulare,\ngescheiterte Abrufe. Dreissig Anfragen dafuer waeren mehr Verkehr als das\nDashboard selbst verursacht, und jede davon traegt Header, TLS-Aufschlag\nund einen Rate-Limit-Zugriff auf Redis."},"StarboardConfigResponse":{"properties":{"is_enabled":{"type":"boolean","title":"Is Enabled"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"threshold":{"type":"integer","title":"Threshold"},"delete_threshold":{"type":"integer","title":"Delete Threshold"},"star_emoji":{"type":"string","title":"Star Emoji"},"self_star_enabled":{"type":"boolean","title":"Self Star Enabled"},"allow_nsfw":{"type":"boolean","title":"Allow Nsfw"},"max_message_age_days":{"type":"integer","title":"Max Message Age Days"},"show_jump_button":{"type":"boolean","title":"Show Jump Button"},"show_star_count_in_name":{"type":"boolean","title":"Show Star Count In Name"},"show_author_avatar":{"type":"boolean","title":"Show Author Avatar"},"remove_on_delete":{"type":"boolean","title":"Remove On Delete"},"hall_of_fame_enabled":{"type":"boolean","title":"Hall Of Fame Enabled"},"hall_of_fame_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hall Of Fame Channel Id"},"hall_of_fame_threshold":{"type":"integer","title":"Hall Of Fame Threshold"},"hall_of_fame_emoji":{"type":"string","title":"Hall Of Fame Emoji"},"total_starred_messages":{"type":"integer","title":"Total Starred Messages"},"color_bronze":{"type":"string","title":"Color Bronze"},"color_silver":{"type":"string","title":"Color Silver"},"color_gold":{"type":"string","title":"Color Gold"}},"type":"object","required":["is_enabled","channel_id","threshold","delete_threshold","star_emoji","self_star_enabled","allow_nsfw","max_message_age_days","show_jump_button","show_star_count_in_name","show_author_avatar","remove_on_delete","hall_of_fame_enabled","hall_of_fame_channel_id","hall_of_fame_threshold","hall_of_fame_emoji","total_starred_messages","color_bronze","color_silver","color_gold"],"title":"StarboardConfigResponse"},"StarboardEntryResponse":{"properties":{"message_id":{"type":"string","title":"Message Id"},"channel_id":{"type":"string","title":"Channel Id"},"author_id":{"type":"string","title":"Author Id"},"star_count":{"type":"integer","title":"Star Count"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"is_on_starboard":{"type":"boolean","title":"Is On Starboard"},"is_on_hall_of_fame":{"type":"boolean","title":"Is On Hall Of Fame"},"first_starred_at":{"type":"string","format":"date-time","title":"First Starred At"},"jump_url":{"type":"string","title":"Jump Url"}},"type":"object","required":["message_id","channel_id","author_id","star_count","content","is_on_starboard","is_on_hall_of_fame","first_starred_at","jump_url"],"title":"StarboardEntryResponse"},"StarboardSetupRequest":{"properties":{"channel_id":{"type":"string","title":"Channel Id","description":"Channel ID für das Starboard"},"threshold":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Threshold","description":"Mindestanzahl Sterne","default":5},"emoji":{"type":"string","title":"Emoji","description":"Star-Emoji","default":"⭐"}},"type":"object","required":["channel_id"],"title":"StarboardSetupRequest"},"StatWithPercentage":{"properties":{"user_total":{"type":"number","title":"User Total","description":"Wert des Users (Anzahl oder Stunden)"},"total":{"type":"number","title":"Total","description":"Gesamtwert (global oder serverweit)"},"percentage":{"type":"number","title":"Percentage","description":"Prozentualer Anteil des Users (0-100)"},"rank_info":{"$ref":"#/components/schemas/RankInfo","description":"Rang-Informationen für diesen Stat"}},"type":"object","required":["user_total","total","percentage","rank_info"],"title":"StatWithPercentage","description":"Ein Statistik-Wert mit globalem/serverweitem prozentualem Anteil."},"StateCreate":{"properties":{"name":{"type":"string","maxLength":60,"minLength":1,"title":"Name"},"color_hex":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color Hex"},"is_final":{"type":"boolean","title":"Is Final","default":false},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","required":["name"],"title":"StateCreate"},"StatePatch":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":60,"minLength":1},{"type":"null"}],"title":"Name"},"color_hex":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color Hex"},"is_final":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Final"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","title":"StatePatch"},"StatsAccessRoleResponse":{"properties":{"id":{"type":"integer","title":"Id"},"role_id":{"type":"string","title":"Role Id"},"role_name":{"type":"string","title":"Role Name"},"added_by_user_id":{"type":"string","title":"Added By User Id"},"added_at":{"type":"string","format":"date-time","title":"Added At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"is_active":{"type":"boolean","title":"Is Active"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["id","role_id","role_name","added_by_user_id","added_at","is_active"],"title":"StatsAccessRoleResponse","description":"Response Schema für Stats-Access-Rollen"},"StatsBindung":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server":{"$ref":"#/components/schemas/ServerMeta"},"time_range":{"$ref":"#/components/schemas/TimeRange"},"bindung":{"$ref":"#/components/schemas/Bindung"},"zyklus":{"$ref":"#/components/schemas/Lebenszyklus"}},"type":"object","required":["server","time_range","bindung","zyklus"],"title":"StatsBindung"},"StatsKanalgesundheit":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server":{"$ref":"#/components/schemas/ServerMeta"},"time_range":{"$ref":"#/components/schemas/TimeRange"},"kanaele":{"$ref":"#/components/schemas/Kanalgesundheit"}},"type":"object","required":["server","time_range","kanaele"],"title":"StatsKanalgesundheit"},"StatsPuls":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server":{"$ref":"#/components/schemas/ServerMeta"},"time_range":{"$ref":"#/components/schemas/TimeRange"},"premium":{"type":"boolean","title":"Premium","default":false},"gekuerzt":{"type":"boolean","title":"Gekuerzt","default":false},"kennzahlen":{"$ref":"#/components/schemas/Kennzahlen"},"reihe":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Reihe","default":[]},"gesundheit":{"anyOf":[{"$ref":"#/components/schemas/Gesundheit"},{"type":"null"}]},"verteilung":{"anyOf":[{"$ref":"#/components/schemas/Beitragsverteilung"},{"type":"null"}]},"takt":{"anyOf":[{"$ref":"#/components/schemas/Rhythmus"},{"type":"null"}]},"kanaele":{"anyOf":[{"$ref":"#/components/schemas/Kanalgesundheit"},{"type":"null"}]},"bindung":{"anyOf":[{"$ref":"#/components/schemas/Bindung"},{"type":"null"}]},"zyklus":{"anyOf":[{"$ref":"#/components/schemas/Lebenszyklus"},{"type":"null"}]},"prognose":{"anyOf":[{"$ref":"#/components/schemas/Prognose"},{"type":"null"}]},"auffaellig":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Auffaellig","default":[]},"hinweise":{"items":{"$ref":"#/components/schemas/Hinweis"},"type":"array","title":"Hinweise","default":[]}},"type":"object","required":["server","time_range","kennzahlen"],"title":"StatsPuls","description":"Die Antwort der neuen Uebersicht - eine Anfrage, ein Bildschirm.\n\n``premium`` sagt der Oberflaeche, welche Felder ueberhaupt gefuellt\nwurden. Ohne Premium bleiben ``bindung``, ``zyklus``, ``prognose`` und\n``auffaellig`` leer - nicht weil sie fehlschlagen, sondern weil sie gar\nnicht erst berechnet werden. Das spart auf der haeufigsten Anfrage des\nDashboards rund zwei Drittel der Datenbankarbeit."},"StatsPulsTiefe":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"time_range":{"$ref":"#/components/schemas/TimeRange"},"premium":{"type":"boolean","title":"Premium","default":true},"gesundheit":{"anyOf":[{"$ref":"#/components/schemas/Gesundheit"},{"type":"null"}]},"verteilung":{"anyOf":[{"$ref":"#/components/schemas/Beitragsverteilung"},{"type":"null"}]},"takt":{"anyOf":[{"$ref":"#/components/schemas/Rhythmus"},{"type":"null"}]},"kanaele":{"anyOf":[{"$ref":"#/components/schemas/Kanalgesundheit"},{"type":"null"}]},"bindung":{"anyOf":[{"$ref":"#/components/schemas/Bindung"},{"type":"null"}]},"zyklus":{"anyOf":[{"$ref":"#/components/schemas/Lebenszyklus"},{"type":"null"}]},"prognose":{"anyOf":[{"$ref":"#/components/schemas/Prognose"},{"type":"null"}]},"auffaellig":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Auffaellig","default":[]},"hinweise":{"items":{"$ref":"#/components/schemas/Hinweis"},"type":"array","title":"Hinweise","default":[]}},"type":"object","required":["time_range"],"title":"StatsPulsTiefe","description":"Die teure Haelfte der Uebersicht, als eigene Antwort.\n\n─── Warum getrennt ────────────────────────────────────────────────────\n\nVorher stand alles in ``/stats/pulse``. Das hiess: die acht Fachseiten,\ndie von dieser Antwort nur die VIER KOPFZAHLEN brauchen, warteten\ntrotzdem auf Kohorten (bis zu 62 Tage), Lebenszyklus (56 Tage) und\nBeitragsverteilung - und, schlimmer, auf den Rollup-Aufbau fuer siebzig\nTage, den die Kopfzahlen gar nicht anfassen. Auf einem grossen Server war\ndas der Unterschied zwischen einer halben Sekunde und mehreren.\n\nJetzt holt jede Seite nur, was sie zeigt. Die Uebersicht fragt beides\ngleichzeitig ab: der Kopf steht sofort, die Auswertungen darunter fuellen\nsich nach. Beide Haelften haben ihren eigenen Cache-Eintrag, und die\nguenstige laeuft nicht mehr hinter der teuren her."},"StatsRhythmus":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server":{"$ref":"#/components/schemas/ServerMeta"},"time_range":{"$ref":"#/components/schemas/TimeRange"},"nachrichten":{"$ref":"#/components/schemas/Rhythmus"},"voice":{"$ref":"#/components/schemas/Rhythmus"}},"type":"object","required":["server","time_range","nachrichten","voice"],"title":"StatsRhythmus"},"StatsVerteilung":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server":{"$ref":"#/components/schemas/ServerMeta"},"time_range":{"$ref":"#/components/schemas/TimeRange"},"verteilung":{"$ref":"#/components/schemas/Beitragsverteilung"},"kopf":{"items":{"$ref":"#/components/schemas/api__schemas__server_stats__LeaderboardEntry"},"type":"array","title":"Kopf","default":[]}},"type":"object","required":["server","time_range","verteilung"],"title":"StatsVerteilung"},"StatsVorhersage":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server":{"$ref":"#/components/schemas/ServerMeta"},"time_range":{"$ref":"#/components/schemas/TimeRange"},"reihe":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Reihe","default":[]},"prognose_nachrichten":{"$ref":"#/components/schemas/Prognose"},"prognose_mitglieder":{"$ref":"#/components/schemas/Prognose"},"auffaellig":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Auffaellig","default":[]}},"type":"object","required":["server","time_range","prognose_nachrichten","prognose_mitglieder"],"title":"StatsVorhersage"},"StatusBody":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"StatusBody"},"StatusPatch":{"properties":{"status":{"type":"string","maxLength":10,"title":"Status"},"close_reason":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Close Reason"},"assignee_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Assignee Id"},"clear_assignee":{"type":"boolean","title":"Clear Assignee","default":false}},"type":"object","required":["status"],"title":"StatusPatch"},"StatusResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"ai_enabled":{"type":"boolean","title":"Ai Enabled"},"provider_ready":{"type":"boolean","title":"Provider Ready"},"provider":{"type":"string","title":"Provider"},"model":{"type":"string","title":"Model"},"can_use":{"type":"boolean","title":"Can Use"},"tier":{"type":"integer","title":"Tier","default":0},"custom_key_set":{"type":"boolean","title":"Custom Key Set","default":false},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"usage":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Usage"},"is_owner":{"type":"boolean","title":"Is Owner","default":false},"available_providers":{"items":{"type":"string"},"type":"array","title":"Available Providers"}},"type":"object","required":["success","ai_enabled","provider_ready","provider","model","can_use"],"title":"StatusResponse"},"StatusUpdateRequest":{"properties":{"onboarding_overlay_completed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Onboarding Overlay Completed"},"restore_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Restore Step"},"reset_onboarding":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reset Onboarding"},"onboarding_disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Onboarding Disabled"}},"type":"object","title":"StatusUpdateRequest"},"SubmitAnswer":{"properties":{"question_id":{"type":"integer","title":"Question Id"},"answer":{"type":"string","maxLength":4000,"title":"Answer","default":""}},"type":"object","required":["question_id"],"title":"SubmitAnswer"},"SuccessResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"SuccessResponse"},"SummarizeRequest":{"properties":{"channel_id":{"type":"string","title":"Channel Id","description":"Discord-Channel-ID, der zusammengefasst werden soll"},"lookback":{"type":"integer","maximum":100.0,"minimum":5.0,"title":"Lookback","description":"Anzahl letzter Nachrichten, die analysiert werden","default":50},"focus":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Focus","description":"Optionaler Fokus (z.B. 'Trending Topics')"}},"type":"object","required":["channel_id"],"title":"SummarizeRequest"},"SummarizeResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"messages_analyzed":{"type":"integer","title":"Messages Analyzed","default":0},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success"],"title":"SummarizeResponse"},"SwapTo":{"properties":{"user_id":{"type":"string","maxLength":30,"title":"User Id"}},"type":"object","required":["user_id"],"title":"SwapTo"},"SweepAnstossen":{"properties":{"confirm":{"type":"boolean","title":"Confirm","description":"Ohne dies nur zaehlen, nichts tun","default":false},"scope":{"type":"string","title":"Scope","description":"trust | block | both","default":"both"},"servers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Servers","description":"Teilmenge; leer = alle aktiven"}},"type":"object","title":"SweepAnstossen","description":"Den Bestand nachziehen.\n\n`confirm` ist der ganze Punkt: ohne ihn zaehlt der Lauf nur, was passieren\nWUERDE. Ein Knopf, der ohne Rueckfrage vierhundert Rollen vergibt oder zehn\nServer durchbannt, ist keine Bedienung, sondern ein Unfall mit Vorlauf."},"SyncRun":{"properties":{"dry_run":{"type":"boolean","title":"Dry Run","default":true},"group_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Group Ids"}},"type":"object","title":"SyncRun"},"TagCreate":{"properties":{"name":{"type":"string","maxLength":40,"minLength":1,"title":"Name"},"color_hex":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color Hex"}},"type":"object","required":["name"],"title":"TagCreate"},"TagSchema":{"properties":{"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"is_official":{"type":"boolean","title":"Is Official"}},"type":"object","required":["name","slug","is_official"],"title":"TagSchema"},"TaskCreate":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"state_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"State Id"},"priority":{"type":"string","maxLength":10,"title":"Priority","default":"normal"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"due_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Date"},"assignee_ids":{"items":{"type":"string"},"type":"array","title":"Assignee Ids"},"tag_ids":{"items":{"type":"integer"},"type":"array","title":"Tag Ids"},"tag_names":{"items":{"type":"string"},"type":"array","title":"Tag Names"},"source_ticket_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Ticket Id"},"linked_event_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Linked Event Id"}},"type":"object","required":["title"],"title":"TaskCreate"},"TaskMove":{"properties":{"state_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"State Id"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"board_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Board Id"}},"type":"object","title":"TaskMove"},"TaskPatch":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"priority":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Priority"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"due_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Date"},"clear_start":{"type":"boolean","title":"Clear Start","default":false},"clear_due":{"type":"boolean","title":"Clear Due","default":false},"assignee_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Assignee Ids"},"tag_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Tag Ids"},"watching":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Watching"}},"type":"object","title":"TaskPatch"},"TeamActivityHeatmapDataPoint":{"properties":{"day_of_week":{"type":"integer","title":"Day Of Week"},"hour_of_day":{"type":"integer","title":"Hour Of Day"},"message_count":{"type":"integer","title":"Message Count"}},"type":"object","required":["day_of_week","hour_of_day","message_count"],"title":"TeamActivityHeatmapDataPoint"},"TeamActivityHeatmapResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"timeframe":{"type":"string","title":"Timeframe"},"data":{"items":{"$ref":"#/components/schemas/TeamActivityHeatmapDataPoint"},"type":"array","title":"Data"}},"type":"object","required":["timeframe","data"],"title":"TeamActivityHeatmapResponse"},"TeamActivityListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"timeframe":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timeframe"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Date"},"data":{"items":{"$ref":"#/components/schemas/TeamMemberActivityStat"},"type":"array","title":"Data"}},"type":"object","required":["success","data"],"title":"TeamActivityListResponse"},"TeamActivityTimelineDataPoint":{"properties":{"date":{"type":"string","title":"Date"},"message_count":{"type":"integer","title":"Message Count"},"voice_minutes":{"type":"integer","title":"Voice Minutes"}},"type":"object","required":["date","message_count","voice_minutes"],"title":"TeamActivityTimelineDataPoint"},"TeamActivityTimelineResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"timeframe":{"type":"string","title":"Timeframe"},"interval":{"type":"string","title":"Interval"},"data":{"items":{"$ref":"#/components/schemas/TeamActivityTimelineDataPoint"},"type":"array","title":"Data"}},"type":"object","required":["timeframe","interval","data"],"title":"TeamActivityTimelineResponse"},"TeamConfigResponse":{"properties":{"main_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Main Role Id"},"additional_role_ids":{"items":{"type":"string"},"type":"array","title":"Additional Role Ids"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"},"has_banner":{"type":"boolean","title":"Has Banner"},"total_members":{"type":"integer","title":"Total Members"},"total_roles":{"type":"integer","title":"Total Roles"},"active_timers":{"type":"integer","title":"Active Timers"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"limits":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Limits"}},"type":"object","required":["main_role_id","additional_role_ids","channel_id","message_id","has_banner","total_members","total_roles","active_timers","created_at","updated_at"],"title":"TeamConfigResponse","description":"Complete team configuration"},"TeamGameActivityResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"timeframe":{"type":"string","title":"Timeframe"},"data":{"items":{"$ref":"#/components/schemas/TeamGameActivityStat"},"type":"array","title":"Data"}},"type":"object","required":["timeframe","data"],"title":"TeamGameActivityResponse"},"TeamGameActivityStat":{"properties":{"activity_name":{"type":"string","title":"Activity Name"},"total_minutes":{"type":"integer","title":"Total Minutes"},"unique_members":{"type":"integer","title":"Unique Members"}},"type":"object","required":["activity_name","total_minutes","unique_members"],"title":"TeamGameActivityStat"},"TeamGroup":{"properties":{"role_id":{"type":"string","title":"Role Id"},"role_name":{"type":"string","title":"Role Name"},"role_color":{"type":"string","title":"Role Color"},"role_position":{"type":"integer","title":"Role Position"},"members":{"items":{"$ref":"#/components/schemas/TeamMemberPublic"},"type":"array","title":"Members"}},"type":"object","required":["role_id","role_name","role_color","role_position","members"],"title":"TeamGroup"},"TeamListResponse":{"properties":{"server_id":{"type":"string","title":"Server Id"},"total_members":{"type":"integer","title":"Total Members"},"groups":{"items":{"$ref":"#/components/schemas/TeamGroup"},"type":"array","title":"Groups"}},"type":"object","required":["server_id","total_members","groups"],"title":"TeamListResponse"},"TeamMemberActivityStat":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"activity_score":{"type":"number","title":"Activity Score","description":"Relative activity score (0-100)"},"metrics":{"$ref":"#/components/schemas/TeamMemberMetrics"}},"type":"object","required":["user_id","username","avatar_url","activity_score","metrics"],"title":"TeamMemberActivityStat"},"TeamMemberDetailResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"}},"type":"object","required":["success","data"],"title":"TeamMemberDetailResponse"},"TeamMemberMetrics":{"properties":{"messages":{"type":"integer","title":"Messages","default":0},"voice_minutes":{"type":"integer","title":"Voice Minutes","default":0},"mod_actions":{"type":"integer","title":"Mod Actions","default":0},"commands":{"type":"integer","title":"Commands","default":0},"reactions":{"type":"integer","title":"Reactions","default":0},"tickets_handled":{"type":"integer","title":"Tickets Handled","default":0}},"type":"object","title":"TeamMemberMetrics"},"TeamMemberPublic":{"properties":{"id":{"type":"string","title":"Id"},"username":{"type":"string","title":"Username"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"top_role_color":{"type":"string","title":"Top Role Color"}},"type":"object","required":["id","username","display_name","avatar_url","top_role_color"],"title":"TeamMemberPublic"},"TeamModeratorListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"timeframe":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timeframe"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Date"},"data":{"items":{"$ref":"#/components/schemas/TeamModeratorStat"},"type":"array","title":"Data"}},"type":"object","required":["success","data"],"title":"TeamModeratorListResponse"},"TeamModeratorStat":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"bans":{"type":"integer","title":"Bans","default":0},"kicks":{"type":"integer","title":"Kicks","default":0},"timeouts":{"type":"integer","title":"Timeouts","default":0},"total_actions":{"type":"integer","title":"Total Actions","default":0}},"type":"object","required":["user_id","username","avatar_url"],"title":"TeamModeratorStat"},"TeamNoteDetail":{"properties":{"id":{"type":"integer","title":"Id"},"content":{"type":"string","title":"Content"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"is_important":{"type":"boolean","title":"Is Important","default":false},"author_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Id"},"author_username":{"type":"string","title":"Author Username"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","content","author_username","created_at","updated_at"],"title":"TeamNoteDetail","description":"Detaillierte Team-Notiz."},"TeamNoteRequest":{"properties":{"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"},"status":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Status"}},"type":"object","title":"TeamNoteRequest"},"TeamNotesListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"items":{"$ref":"#/components/schemas/TeamNoteDetail"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"}},"type":"object","required":["data","pagination"],"title":"TeamNotesListResponse","description":"API Response für Team-Notizen-Liste."},"TeamOverviewStats":{"properties":{"total_team_members":{"type":"integer","title":"Total Team Members"},"total_mod_actions":{"type":"integer","title":"Total Mod Actions"},"total_tickets_closed":{"type":"integer","title":"Total Tickets Closed"},"average_ticket_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Ticket Rating"},"total_team_messages":{"type":"integer","title":"Total Team Messages"},"total_team_voice_minutes":{"type":"integer","title":"Total Team Voice Minutes"}},"type":"object","required":["total_team_members","total_mod_actions","total_tickets_closed","average_ticket_rating","total_team_messages","total_team_voice_minutes"],"title":"TeamOverviewStats"},"TeamOverviewStatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"timeframe":{"type":"string","title":"Timeframe"},"data":{"$ref":"#/components/schemas/TeamOverviewStats"}},"type":"object","required":["timeframe","data"],"title":"TeamOverviewStatsResponse"},"TeamPreviewResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"groups":{"items":{"$ref":"#/components/schemas/VorschauGruppe"},"type":"array","title":"Groups"},"total_members":{"type":"integer","title":"Total Members"},"mode":{"type":"string","enum":["explicit","auto"],"title":"Mode"},"scheduled_promotions":{"type":"integer","title":"Scheduled Promotions"},"complete":{"type":"boolean","title":"Complete"}},"type":"object","required":["success","groups","total_members","mode","scheduled_promotions","complete"],"title":"TeamPreviewResponse"},"TeamPromotion":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"string","title":"User Id"},"promotion_date":{"type":"string","format":"date-time","title":"Promotion Date"},"created_by_id":{"type":"string","title":"Created By Id"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"target_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Role Id"}},"type":"object","required":["id","user_id","promotion_date","created_by_id","note","target_role_id"],"title":"TeamPromotion"},"TeamPromotionHistoryResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"items":{"$ref":"#/components/schemas/TeamPromotion"},"type":"array","title":"Data"}},"type":"object","required":["data"],"title":"TeamPromotionHistoryResponse"},"TeamPromotionListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/TeamPromotion"},"type":"array","title":"Data"}},"type":"object","required":["success","data"],"title":"TeamPromotionListResponse"},"TeamPromotionResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"$ref":"#/components/schemas/TeamPromotion"}},"type":"object","required":["data"],"title":"TeamPromotionResponse"},"TeamRoleConfig":{"properties":{"main_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Main Role Id","description":"Main team role ID"},"additional_role_ids":{"items":{"type":"string"},"type":"array","title":"Additional Role Ids","description":"List of other team role IDs"}},"type":"object","title":"TeamRoleConfig"},"TeamRoleConfigResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"$ref":"#/components/schemas/TeamRoleConfig"}},"type":"object","required":["success","data"],"title":"TeamRoleConfigResponse"},"TeamRoleListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/TeamRoleResponse"},"type":"array","title":"Data"}},"type":"object","required":["success","data"],"title":"TeamRoleListResponse"},"TeamRoleResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"position":{"type":"integer","title":"Position"}},"type":"object","required":["id","name","color_value","position"],"title":"TeamRoleResponse"},"TeamRoleUpdate":{"properties":{"role_id":{"type":"string","title":"Role Id","description":"Discord Role ID"}},"type":"object","required":["role_id"],"title":"TeamRoleUpdate","description":"Update for team roles"},"TeamSetupStatus":{"properties":{"is_setup":{"type":"boolean","title":"Is Setup"},"missing_keys":{"items":{"type":"string"},"type":"array","title":"Missing Keys"}},"type":"object","required":["is_setup","missing_keys"],"title":"TeamSetupStatus"},"TeamStatsResponse":{"properties":{"total_members":{"type":"integer","title":"Total Members"},"total_roles":{"type":"integer","title":"Total Roles"},"role_breakdown":{"additionalProperties":true,"type":"object","title":"Role Breakdown"},"active_timers":{"type":"integer","title":"Active Timers"},"processed_timers_24h":{"type":"integer","title":"Processed Timers 24H"},"has_configured_list":{"type":"boolean","title":"Has Configured List"}},"type":"object","required":["total_members","total_roles","role_breakdown","active_timers","processed_timers_24h","has_configured_list"],"title":"TeamStatsResponse","description":"Team statistics"},"TeamSupporterListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"timeframe":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timeframe"},"start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Date"},"data":{"items":{"$ref":"#/components/schemas/TeamSupporterStat"},"type":"array","title":"Data"}},"type":"object","required":["success","data"],"title":"TeamSupporterListResponse"},"TeamSupporterStat":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"tickets_claimed":{"type":"integer","title":"Tickets Claimed","default":0},"tickets_closed":{"type":"integer","title":"Tickets Closed","default":0},"total_tickets_handled":{"type":"integer","title":"Total Tickets Handled","default":0},"total_ratings":{"type":"integer","title":"Total Ratings","default":0},"average_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Rating"}},"type":"object","required":["user_id","username","avatar_url"],"title":"TeamSupporterStat"},"TempVoiceLimitsInfo":{"properties":{"feature":{"type":"string","title":"Feature","default":"tempvoice_master_channels"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"is_premium":{"type":"boolean","title":"Is Premium","default":false},"configured_free":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Configured Free"},"configured_premium":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Configured Premium"},"used":{"type":"integer","title":"Used","default":0},"locked_ids":{"items":{"type":"integer"},"type":"array","title":"Locked Ids","default":[]},"can_create":{"type":"boolean","title":"Can Create","default":true}},"type":"object","title":"TempVoiceLimitsInfo","description":"Metering info for the master-channel limit (single source of truth = feature_limits)."},"TempVoiceMasterChannelInfo":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"locked":{"type":"boolean","title":"Locked","default":false}},"type":"object","required":["id","name"],"title":"TempVoiceMasterChannelInfo","description":"Information about a single master channel."},"TempVoiceMasterChannelRequest":{"properties":{"channel_id":{"type":"string","title":"Channel Id"}},"type":"object","required":["channel_id"],"title":"TempVoiceMasterChannelRequest","description":"Request body to ADD a master channel."},"TempVoiceSendInterfaceRequest":{"properties":{"channel_id":{"type":"string","title":"Channel Id"}},"type":"object","required":["channel_id"],"title":"TempVoiceSendInterfaceRequest","description":"Request body to send the interface."},"TempVoiceSettingsResponse":{"properties":{"master_channels":{"items":{"$ref":"#/components/schemas/TempVoiceMasterChannelInfo"},"type":"array","title":"Master Channels","default":[]},"limits":{"anyOf":[{"$ref":"#/components/schemas/TempVoiceLimitsInfo"},{"type":"null"}]}},"type":"object","title":"TempVoiceSettingsResponse","description":"Current TempVoice settings."},"TemplateCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title"},"body":{"type":"string","maxLength":4000,"minLength":1,"title":"Body"},"priority":{"type":"string","maxLength":10,"title":"Priority","default":"normal"},"requires_ack":{"type":"boolean","title":"Requires Ack","default":false}},"type":"object","required":["name","title","body"],"title":"TemplateCreate"},"TestChatBody":{"properties":{"character":{"$ref":"#/components/schemas/TestChatCharacter"},"messages":{"items":{"$ref":"#/components/schemas/TestChatMessage"},"type":"array","title":"Messages"}},"type":"object","required":["character"],"title":"TestChatBody"},"TestChatCharacter":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Name"},"persona":{"anyOf":[{"type":"string","maxLength":8000},{"type":"null"}],"title":"Persona"},"greeting":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Greeting"},"scenario":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Scenario"},"example_dialogue":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Example Dialogue"},"knowledge":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Knowledge"},"temperature":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Temperature"},"model_preference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Preference"}},"type":"object","title":"TestChatCharacter"},"TestChatMessage":{"properties":{"role":{"type":"string","title":"Role","description":"user|assistant"},"content":{"type":"string","maxLength":4000,"title":"Content"}},"type":"object","required":["role","content"],"title":"TestChatMessage"},"ThreatIntelConfigUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"reputation_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reputation Action"},"min_flagged_servers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Flagged Servers"},"fingerprint_alerts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Fingerprint Alerts"},"log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Channel Id"},"ping_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ping Role Id"}},"type":"object","title":"ThreatIntelConfigUpdate"},"ThresholdUpdateRequest":{"properties":{"threshold":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Threshold","description":"Neuer Schwellenwert"},"delete_threshold":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Delete Threshold","description":"Neuer Lösch-Schwellenwert"}},"type":"object","required":["threshold"],"title":"ThresholdUpdateRequest"},"TicketActionRequest":{"properties":{"action":{"type":"string","enum":["claim","unclaim","close","reopen","delete"],"title":"Action","description":"claim | unclaim | close | reopen | delete"},"reason":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Reason","description":"Nur fuer close: der Schliessgrund."}},"type":"object","required":["action"],"title":"TicketActionRequest","description":"Eine Aktion an einem Ticket aus dem Dashboard.\n\n`action` ist eine Zeichenkette und kein Literal: eine unbekannte Aktion\nsoll wie jede andere Absage als Satz in der Sprache des Nutzers\nzurueckkommen (400 invalid_action) und nicht als Fehlerliste von Pydantic -\ndas Dashboard zeigt `detail` so, wie es kommt. Die erlaubten Werte stehen\ntrotzdem im Schema, fuer jeden, der es liest."},"TicketBlacklistEntry":{"properties":{"user":{"$ref":"#/components/schemas/UserInfoBasic"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"blacklisted_at":{"type":"string","format":"date-time","title":"Blacklisted At"},"blacklisted_by":{"anyOf":[{"$ref":"#/components/schemas/UserInfoBasic"},{"type":"null"}]}},"type":"object","required":["user","blacklisted_at"],"title":"TicketBlacklistEntry"},"TicketBlacklistResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"items":{"$ref":"#/components/schemas/TicketBlacklistEntry"},"type":"array","title":"Data"}},"type":"object","required":["data"],"title":"TicketBlacklistResponse"},"TicketKPIs":{"properties":{"total_tickets_opened":{"type":"integer","title":"Total Tickets Opened"},"total_tickets_closed":{"type":"integer","title":"Total Tickets Closed"},"total_tickets_claimed":{"type":"integer","title":"Total Tickets Claimed"},"average_time_to_claim_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Time To Claim Seconds"},"average_time_to_close_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Time To Close Seconds"},"first_response_time_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"First Response Time Seconds"}},"type":"object","required":["total_tickets_opened","total_tickets_closed","total_tickets_claimed","average_time_to_claim_seconds","average_time_to_close_seconds","first_response_time_seconds"],"title":"TicketKPIs"},"TicketKPIsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"timeframe":{"type":"string","title":"Timeframe"},"data":{"$ref":"#/components/schemas/TicketKPIs"}},"type":"object","required":["timeframe","data"],"title":"TicketKPIsResponse"},"TicketNoteCreate":{"properties":{"content":{"type":"string","minLength":1,"title":"Content","description":"Inhalt der Notiz"}},"type":"object","required":["content"],"title":"TicketNoteCreate","description":"Schema zum Erstellen/Bearbeiten einer Notiz"},"TicketOverviewItem":{"properties":{"ticket_id":{"type":"integer","title":"Ticket Id"},"status":{"type":"string","title":"Status"},"priority":{"type":"integer","title":"Priority"},"reason":{"type":"string","title":"Reason"},"creator":{"$ref":"#/components/schemas/UserSnippet"},"claimed_by":{"anyOf":[{"$ref":"#/components/schemas/UserSnippet"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","title":"Created At"},"claimed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Claimed At"},"closed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Closed At"},"time_to_claim_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Time To Claim Seconds"},"is_admin_only":{"type":"boolean","title":"Is Admin Only","default":false},"rating":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rating"}},"type":"object","required":["ticket_id","status","priority","reason","creator","created_at"],"title":"TicketOverviewItem","description":"Ein Ticket in der Übersicht."},"TicketPanelCreate":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name"},"embed_title":{"type":"string","maxLength":256,"title":"Embed Title","default":"create Ticket"},"embed_description":{"type":"string","maxLength":4000,"title":"Embed Description"},"embed_color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","title":"Embed Color","default":"#5865F2"},"embed_image_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Image Base64"},"interaction_type":{"type":"string","enum":["button","select"],"title":"Interaction Type","default":"button"},"button_label":{"type":"string","title":"Button Label","default":"open Ticket"},"select_placeholder":{"type":"string","title":"Select Placeholder","default":"Choose a category..."},"options":{"items":{"$ref":"#/components/schemas/PanelOptionSchema"},"type":"array","title":"Options","default":[]},"ticket_message_content":{"type":"string","title":"Ticket Message Content","default":"Welcome to your Ticket!"}},"type":"object","required":["name","embed_description"],"title":"TicketPanelCreate"},"TicketSettingsUpdate":{"properties":{"team_role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Team Role Ids"},"open_category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Open Category Id"},"claimed_category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claimed Category Id"},"closed_category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Closed Category Id"},"log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Channel Id"},"review_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Channel Id"},"widerrufsbelehrung_log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Widerrufsbelehrung Log Channel Id"},"customer_data_access_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Data Access User Id"},"widerrufsbelehrung_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Widerrufsbelehrung Text"},"purchase_questions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Purchase Questions"},"max_tickets_per_user":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Tickets Per User"},"require_close_reason":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Require Close Reason"},"dm_notifications_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dm Notifications Enabled"},"close_permission_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Close Permission Mode"},"close_role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Close Role Ids"},"channel_mode":{"anyOf":[{"type":"string","enum":["channel","thread"]},{"type":"null"}],"title":"Channel Mode"},"thread_parent_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thread Parent Channel Id"},"thread_auto_archive_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Thread Auto Archive Minutes"},"thread_team_access":{"anyOf":[{"type":"string","enum":["members","manage_threads","off"]},{"type":"null"}],"title":"Thread Team Access"},"thread_archive_on_close":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Thread Archive On Close"},"transfer_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Transfer Enabled"},"auto_close_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Close Enabled"},"auto_close_inactive_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Close Inactive Minutes"},"auto_close_grace_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Close Grace Minutes"},"auto_close_mode":{"anyOf":[{"type":"string","enum":["waiting_on_user","any"]},{"type":"null"}],"title":"Auto Close Mode"},"auto_close_excluded_option_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Auto Close Excluded Option Ids"},"auto_close_warning_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auto Close Warning Text"}},"type":"object","title":"TicketSettingsUpdate","description":"Update für Ticket-Einstellungen"},"TicketStats":{"properties":{"total_tickets":{"type":"integer","title":"Total Tickets","default":0},"total_open":{"type":"integer","title":"Total Open","default":0},"total_claimed":{"type":"integer","title":"Total Claimed","default":0},"total_closed":{"type":"integer","title":"Total Closed","default":0},"avg_resolution_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Resolution Seconds"},"top_creators":{"items":{"$ref":"#/components/schemas/api__schemas__server_stats__LeaderboardEntry"},"type":"array","title":"Top Creators","default":[]},"top_closers":{"items":{"$ref":"#/components/schemas/api__schemas__server_stats__LeaderboardEntry"},"type":"array","title":"Top Closers","default":[]}},"type":"object","title":"TicketStats"},"TicketStatsOverview":{"properties":{"total_open":{"type":"integer","title":"Total Open","default":0},"total_claimed":{"type":"integer","title":"Total Claimed","default":0},"total_closed_today":{"type":"integer","title":"Total Closed Today","default":0},"total_closed_this_week":{"type":"integer","title":"Total Closed This Week","default":0},"avg_time_to_claim_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Time To Claim Seconds"},"avg_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Rating"},"recent_tickets":{"items":{"$ref":"#/components/schemas/TicketOverviewItem"},"type":"array","title":"Recent Tickets","default":[]}},"type":"object","title":"TicketStatsOverview","description":"Ticket-Statistiken für das Dashboard."},"TicketTimelineDataPoint":{"properties":{"date":{"type":"string","title":"Date"},"opened":{"type":"integer","title":"Opened","default":0},"closed":{"type":"integer","title":"Closed","default":0},"claimed":{"type":"integer","title":"Claimed","default":0}},"type":"object","required":["date"],"title":"TicketTimelineDataPoint"},"TicketTimelineResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"timeframe":{"type":"string","title":"Timeframe"},"interval":{"type":"string","title":"Interval"},"data":{"items":{"$ref":"#/components/schemas/TicketTimelineDataPoint"},"type":"array","title":"Data"}},"type":"object","required":["timeframe","interval","data"],"title":"TicketTimelineResponse"},"TicketTransferRequest":{"properties":{"option_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Option Id"},"reason":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Reason"}},"type":"object","required":["option_id"],"title":"TicketTransferRequest","description":"Ein Ticket aus dem Dashboard in eine andere Ticketart verschieben."},"TicketTransferTarget":{"properties":{"id":{"type":"integer","title":"Id"},"label":{"type":"string","title":"Label"},"emoji":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emoji"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"panel_id":{"type":"integer","title":"Panel Id"},"panel_name":{"type":"string","title":"Panel Name","default":""}},"type":"object","required":["id","label","panel_id"],"title":"TicketTransferTarget","description":"Eine Ticketart, in die verschoben werden kann."},"TicketTransferTargets":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"movable":{"type":"boolean","title":"Movable"},"current_option_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Option Id"},"targets":{"items":{"$ref":"#/components/schemas/TicketTransferTarget"},"type":"array","title":"Targets","default":[]}},"type":"object","required":["enabled","movable"],"title":"TicketTransferTargets"},"TicketTransferTargetsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"$ref":"#/components/schemas/TicketTransferTargets"}},"type":"object","required":["data"],"title":"TicketTransferTargetsResponse","description":"Typisiert und nicht `dict`: der Waechter in\ntests/test_public_mcp_zugriff.py liest Antwortschemata, um Endpunkte zu\nfinden, die Mitgliedertext herausgeben. Ohne Schema waere er hier blind -\nund der Endpunkt liegt unter /tickets, direkt neben full-details."},"TimeRange":{"properties":{"start":{"type":"string","title":"Start","description":"UTC start ISO-8601"},"end":{"type":"string","title":"End","description":"UTC end ISO-8601"},"label":{"type":"string","title":"Label","description":"Human-readable label for the range"}},"type":"object","required":["start","end","label"],"title":"TimeRange"},"TimeSeriesDataPoint":{"properties":{"label":{"type":"string","title":"Label","description":"Zeitperiode (formatiert)"},"value":{"type":"number","title":"Value","description":"Wert für diese Periode"}},"type":"object","required":["label","value"],"title":"TimeSeriesDataPoint","description":"Ein einzelner Datenpunkt in einer Zeitreihe"},"TimeSeriesResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"metric":{"type":"string","title":"Metric","description":"Name der Metrik"},"timeframe":{"type":"string","title":"Timeframe","description":"Zeitraum"},"group_by":{"type":"string","title":"Group By","description":"Gruppierung"},"start_date":{"type":"string","format":"date-time","title":"Start Date"},"end_date":{"type":"string","format":"date-time","title":"End Date"},"total":{"type":"number","title":"Total","description":"Gesamtwert über alle Perioden"},"average":{"type":"number","title":"Average","description":"Durchschnitt pro Periode"},"data":{"items":{"$ref":"#/components/schemas/TimeSeriesDataPoint"},"type":"array","title":"Data"}},"type":"object","required":["success","metric","timeframe","group_by","start_date","end_date","total","average","data"],"title":"TimeSeriesResponse","description":"Response für Zeitreihen-Daten"},"TimelinePoint":{"properties":{"date":{"type":"string","title":"Date"},"value":{"type":"integer","title":"Value"}},"type":"object","required":["date","value"],"title":"TimelinePoint"},"TimerCreate":{"properties":{"user_id":{"type":"string","title":"User Id","description":"Discord User ID"},"days":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Days","description":"Days until promotion"},"target_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Role Id","description":"Target role after timer"},"note":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Note","description":"Note"}},"type":"object","required":["user_id","days"],"title":"TimerCreate","description":"Creates a promotion timer"},"TimerListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"timers":{"items":{"$ref":"#/components/schemas/TimerResponse"},"type":"array","title":"Timers"},"total":{"type":"integer","title":"Total"},"active":{"type":"integer","title":"Active"},"processed":{"type":"integer","title":"Processed"}},"type":"object","required":["success","timers","total","active","processed"],"title":"TimerListResponse","description":"List of all timers"},"TimerResponse":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"promotion_date":{"type":"string","format":"date-time","title":"Promotion Date"},"target_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Role Id"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"is_processed":{"type":"boolean","title":"Is Processed"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"created_by_id":{"type":"string","title":"Created By Id"}},"type":"object","required":["id","user_id","username","avatar_url","promotion_date","target_role_id","note","is_processed","created_at","created_by_id"],"title":"TimerResponse","description":"Timer information"},"TitelWahl":{"properties":{"titel":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Titel"}},"type":"object","title":"TitelWahl","description":"`PUT /users/me/clan/titel` - der eigene Titel (Nachtlauf 3, C1).\n\n`None` oder leer heisst: keinen zeigen. Freitext statt Literal: ob es\nden Titel gibt UND ob er verdient ist, sagt `clans.titel.setzen` mit\neinem Satz, der weiterhilft - ein 422 aus dem Schema wuesste nur \"nein\"."},"TodayActivityResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server_id":{"type":"string","title":"Server Id"},"server_name":{"type":"string","title":"Server Name"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"summary":{"$ref":"#/components/schemas/TodaySummary"},"birthdays_today":{"items":{"$ref":"#/components/schemas/TodayBirthdayUser"},"type":"array","title":"Birthdays Today","default":[]},"upcoming_events":{"items":{"$ref":"#/components/schemas/TodayUpcomingEvent"},"type":"array","title":"Upcoming Events","default":[]},"message_activity":{"$ref":"#/components/schemas/TodayMessageActivity"},"voice_now":{"items":{"$ref":"#/components/schemas/TodayVoiceUser"},"type":"array","title":"Voice Now","default":[]},"moderation_timeline":{"items":{"$ref":"#/components/schemas/TodayModerationEvent"},"type":"array","title":"Moderation Timeline","default":[]},"member_joins":{"items":{"$ref":"#/components/schemas/MemberMovementItem"},"type":"array","title":"Member Joins","default":[]},"member_leaves":{"items":{"$ref":"#/components/schemas/MemberMovementItem"},"type":"array","title":"Member Leaves","default":[]},"giveaways":{"items":{"$ref":"#/components/schemas/TodayGiveawayInfo"},"type":"array","title":"Giveaways","default":[]},"tickets":{"$ref":"#/components/schemas/TodayTicketInfo"},"log_events":{"items":{"$ref":"#/components/schemas/TodayLogEvent"},"type":"array","title":"Log Events","default":[]}},"type":"object","required":["server_id","server_name"],"title":"TodayActivityResponse","description":"Alles was HEUTE auf dem Server passiert und noch passieren wird."},"TodayBirthdayUser":{"properties":{"user":{"$ref":"#/components/schemas/UserSnippet"},"age":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age"},"birth_day":{"type":"integer","title":"Birth Day"},"birth_month":{"type":"integer","title":"Birth Month"}},"type":"object","required":["user","birth_day","birth_month"],"title":"TodayBirthdayUser","description":"User mit Geburtstag heute."},"TodayGiveawayInfo":{"properties":{"giveaway_id":{"type":"integer","title":"Giveaway Id"},"title":{"type":"string","title":"Title"},"prize":{"type":"string","title":"Prize"},"channel_id":{"type":"string","title":"Channel Id"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"is_active":{"type":"boolean","title":"Is Active"},"is_ended":{"type":"boolean","title":"Is Ended"},"end_time":{"type":"string","format":"date-time","title":"End Time"},"ends_today":{"type":"boolean","title":"Ends Today","default":false},"time_remaining_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Time Remaining Seconds"},"total_participants":{"type":"integer","title":"Total Participants","default":0},"new_entries_today":{"type":"integer","title":"New Entries Today","default":0},"winners":{"items":{"$ref":"#/components/schemas/api__routers__server_profile__GiveawayWinnerInfo"},"type":"array","title":"Winners","default":[]}},"type":"object","required":["giveaway_id","title","prize","channel_id","is_active","is_ended","end_time"],"title":"TodayGiveawayInfo","description":"Giveaway-Status für heute."},"TodayLogEvent":{"properties":{"log_id":{"type":"integer","title":"Log Id"},"log_type":{"type":"string","title":"Log Type"},"action":{"type":"string","title":"Action"},"target_user":{"anyOf":[{"$ref":"#/components/schemas/UserSnippet"},{"type":"null"}]},"executor":{"anyOf":[{"$ref":"#/components/schemas/UserSnippet"},{"type":"null"}]},"channel":{"anyOf":[{"$ref":"#/components/schemas/ChannelSnippet"},{"type":"null"}]},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"}},"type":"object","required":["log_id","log_type","action","timestamp"],"title":"TodayLogEvent","description":"Ein Log-Event aus dem Log-System (Channel/Rolle/Thread erstellt/gelöscht etc.)."},"TodayMessageActivity":{"properties":{"total_messages":{"type":"integer","title":"Total Messages","default":0},"top_channels":{"items":{"$ref":"#/components/schemas/TodayTopChannel"},"type":"array","title":"Top Channels","default":[]},"top_users":{"items":{"$ref":"#/components/schemas/TodayTopUser"},"type":"array","title":"Top Users","default":[]}},"type":"object","title":"TodayMessageActivity","description":"Nachrichten-Aktivität heute."},"TodayModerationEvent":{"properties":{"event_id":{"type":"integer","title":"Event Id"},"event_type":{"type":"string","title":"Event Type","description":"ban, unban, kick, timeout, mute, unmute, warning"},"target_user":{"$ref":"#/components/schemas/UserSnippet"},"moderator":{"anyOf":[{"$ref":"#/components/schemas/UserSnippet"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"case_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Case Id"}},"type":"object","required":["event_id","event_type","target_user","timestamp"],"title":"TodayModerationEvent","description":"Eine Moderations-Aktion heute (Ban, Kick, Mute, Timeout, Warn)."},"TodaySummary":{"properties":{"messages_today":{"type":"integer","title":"Messages Today","default":0},"voice_users_now":{"type":"integer","title":"Voice Users Now","default":0},"joins_today":{"type":"integer","title":"Joins Today","default":0},"leaves_today":{"type":"integer","title":"Leaves Today","default":0},"net_growth_today":{"type":"integer","title":"Net Growth Today","default":0},"mod_actions_today":{"type":"integer","title":"Mod Actions Today","default":0},"warnings_issued_today":{"type":"integer","title":"Warnings Issued Today","default":0},"tickets_opened_today":{"type":"integer","title":"Tickets Opened Today","default":0},"tickets_closed_today":{"type":"integer","title":"Tickets Closed Today","default":0},"active_giveaways":{"type":"integer","title":"Active Giveaways","default":0},"giveaways_ending_today":{"type":"integer","title":"Giveaways Ending Today","default":0},"birthdays_today":{"type":"integer","title":"Birthdays Today","default":0},"temp_voice_channels_active":{"type":"integer","title":"Temp Voice Channels Active","default":0},"commands_used_today":{"type":"integer","title":"Commands Used Today","default":0}},"type":"object","title":"TodaySummary","description":"Schnelle Zusammenfassung des heutigen Tages."},"TodayTicketInfo":{"properties":{"opened":{"type":"integer","title":"Opened","default":0},"claimed":{"type":"integer","title":"Claimed","default":0},"closed":{"type":"integer","title":"Closed","default":0},"recent_tickets":{"items":{"$ref":"#/components/schemas/TicketOverviewItem"},"type":"array","title":"Recent Tickets","default":[]}},"type":"object","title":"TodayTicketInfo","description":"Ticket-Aktivität heute."},"TodayTopChannel":{"properties":{"channel":{"$ref":"#/components/schemas/ChannelSnippet"},"message_count":{"type":"integer","title":"Message Count","default":0},"unique_users":{"type":"integer","title":"Unique Users","default":0}},"type":"object","required":["channel"],"title":"TodayTopChannel","description":"Ein aktiver Channel heute."},"TodayTopUser":{"properties":{"user":{"$ref":"#/components/schemas/UserSnippet"},"message_count":{"type":"integer","title":"Message Count","default":0}},"type":"object","required":["user"],"title":"TodayTopUser","description":"Ein aktiver User heute."},"TodayUpcomingEvent":{"properties":{"event_type":{"type":"string","title":"Event Type","description":"giveaway_end, meeting, birthday_announcement"},"title":{"type":"string","title":"Title"},"scheduled_at":{"type":"string","format":"date-time","title":"Scheduled At"},"time_remaining_seconds":{"type":"integer","title":"Time Remaining Seconds","default":0},"details":{"additionalProperties":true,"type":"object","title":"Details"}},"type":"object","required":["event_type","title","scheduled_at"],"title":"TodayUpcomingEvent","description":"Etwas das HEUTE noch passieren wird."},"TodayVoiceUser":{"properties":{"user":{"$ref":"#/components/schemas/UserSnippet"},"channel":{"$ref":"#/components/schemas/ChannelSnippet"},"since":{"type":"string","format":"date-time","title":"Since"},"duration_seconds":{"type":"integer","title":"Duration Seconds","default":0}},"type":"object","required":["user","channel","since"],"title":"TodayVoiceUser","description":"User gerade im Voice."},"ToggleBody":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"ToggleBody"},"TokenBody":{"properties":{"token":{"type":"string","maxLength":128,"title":"Token"}},"type":"object","required":["token"],"title":"TokenBody"},"TopActiveUsersResponse":{"properties":{"top_chatters_today":{"items":{"$ref":"#/components/schemas/ActiveUserInfo"},"type":"array","title":"Top Chatters Today","default":[]},"top_voice_today":{"items":{"$ref":"#/components/schemas/ActiveUserInfo"},"type":"array","title":"Top Voice Today","default":[]},"currently_in_voice":{"type":"integer","title":"Currently In Voice","default":0}},"type":"object","title":"TopActiveUsersResponse","description":"Top aktive User des Servers."},"TrackVisitRequest":{"properties":{"step_key":{"type":"string","title":"Step Key"},"settings_path":{"type":"string","title":"Settings Path"}},"type":"object","required":["step_key","settings_path"],"title":"TrackVisitRequest"},"TranslationRequest":{"properties":{"text":{"anyOf":[{"type":"string","maxLength":1200},{"items":{"type":"string","maxLength":1200},"type":"array","maxItems":1650}],"title":"Text"},"target_lang":{"type":"string","maxLength":16,"title":"Target Lang"}},"type":"object","required":["text","target_lang"],"title":"TranslationRequest"},"TrendAnalysis":{"properties":{"messages":{"$ref":"#/components/schemas/TrendMetric"},"voice":{"$ref":"#/components/schemas/TrendMetric"},"members":{"$ref":"#/components/schemas/TrendMetric"}},"type":"object","required":["messages","voice","members"],"title":"TrendAnalysis","description":"Trend Analysis Data — 7-day daily breakdown"},"TrendMetric":{"properties":{"daily":{"items":{"$ref":"#/components/schemas/DailyDataPoint"},"type":"array","title":"Daily"},"total":{"type":"number","title":"Total"}},"type":"object","required":["daily","total"],"title":"TrendMetric","description":"Trend Metric with daily breakdown for graph rendering"},"TriageSettingsPayload":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"rename_enabled":{"type":"boolean","title":"Rename Enabled","default":false},"prefix_style":{"type":"string","title":"Prefix Style","default":"emoji"},"priority_prefixes":{"additionalProperties":true,"type":"object","title":"Priority Prefixes","default":{}},"priority_rubric":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority Rubric"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","default":[]},"sort_urgent_to_top":{"type":"boolean","title":"Sort Urgent To Top","default":false},"urgent_ping_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Urgent Ping Role Id"},"routing_enabled":{"type":"boolean","title":"Routing Enabled","default":false},"routing_map":{"additionalProperties":true,"type":"object","title":"Routing Map","default":{}},"queue_board_enabled":{"type":"boolean","title":"Queue Board Enabled","default":false},"queue_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Queue Channel Id"}},"type":"object","title":"TriageSettingsPayload","description":"Einstellungen fuer die AI-Ticket-Triage (GET-Response und PUT-Body, alles default AUS)"},"TypedCount":{"properties":{"type":{"type":"string","title":"Type"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["type","count"],"title":"TypedCount"},"TypedCountResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"timeframe":{"type":"string","title":"Timeframe"},"data":{"items":{"$ref":"#/components/schemas/TypedCount"},"type":"array","title":"Data"}},"type":"object","required":["timeframe","data"],"title":"TypedCountResponse"},"TypingBody":{"properties":{"conversation_id":{"type":"integer","title":"Conversation Id"}},"type":"object","required":["conversation_id"],"title":"TypingBody"},"Uebergabe":{"properties":{"art":{"type":"string","maxLength":8,"title":"Art"},"version":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"Version"},"grant":{"type":"string","maxLength":512,"title":"Grant"}},"type":"object","required":["art","version","grant"],"title":"Uebergabe"},"UndoRequest":{"properties":{"restore_point_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Restore Point Id"}},"type":"object","title":"UndoRequest"},"UpdateAISettingsRequest":{"properties":{"moderation_model":{"type":"string","title":"Moderation Model","description":"Server-weites Moderations-/Ticket-Modell-Slug"}},"type":"object","required":["moderation_model"],"title":"UpdateAISettingsRequest"},"UpdateAbsenceRequest":{"properties":{"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"absence_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Absence Type"}},"type":"object","title":"UpdateAbsenceRequest","description":"Eine Abmeldung nachtraeglich aendern.\n\nAlle Felder sind wahlfrei: wer nur den Zeitraum verschiebt, schickt nur den\nZeitraum. `exclude_unset` im Endpunkt sorgt dafuer, dass ein nicht\ngeschicktes Feld nicht auf `None` gesetzt wird."},"UpdateCalendarSettingsRequest":{"properties":{"reminder_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reminder Channel Id"},"mention_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mention Role Id"},"remind_15min_before":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Remind 15Min Before"},"remind_30min_before":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Remind 30Min Before"},"remind_1h_before":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Remind 1H Before"},"remind_3h_before":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Remind 3H Before"},"remind_24h_before":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Remind 24H Before"},"remind_1week_before":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Remind 1Week Before"},"reminder_message_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reminder Message Template"},"meeting_reminder_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Reminder Channel Id"},"deadline_reminder_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deadline Reminder Channel Id"},"require_absence_approval":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Require Absence Approval"},"absence_notification_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Absence Notification Channel Id"},"auto_create_protocol":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Create Protocol"},"protocol_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protocol Channel Id"},"min_attendance_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Attendance Minutes"}},"type":"object","title":"UpdateCalendarSettingsRequest"},"UpdateEventRequest":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time"},"event_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Event Type"},"category":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Category"},"voice_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Channel Id"},"notification_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Channel Id"},"track_attendance":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Track Attendance"},"require_voice_attendance":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Require Voice Attendance"},"priority":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Priority"},"color_hex":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color Hex"},"meeting_link":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Meeting Link"},"attachment_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Attachment Urls"},"target_group_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Target Group Ids"},"target_user_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Target User Ids"},"target_role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Target Role Ids"}},"type":"object","title":"UpdateEventRequest"},"UpdateNoteRequest":{"properties":{"content":{"anyOf":[{"type":"string","maxLength":1000,"minLength":1},{"type":"null"}],"title":"Content"},"category":{"anyOf":[{"$ref":"#/components/schemas/NoteCategory"},{"type":"null"}]},"is_important":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Important"}},"type":"object","title":"UpdateNoteRequest","description":"Schema zum Bearbeiten einer Notiz."},"UpdateUserSettingsRequest":{"properties":{"dm_notifications_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dm Notifications Enabled"},"dm_remind_15min":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dm Remind 15Min"},"dm_remind_30min":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dm Remind 30Min"},"dm_remind_1h":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dm Remind 1H"},"dm_remind_3h":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dm Remind 3H"},"dm_remind_24h":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dm Remind 24H"},"notify_new_events":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify New Events"},"notify_event_changes":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Event Changes"},"notify_event_cancellations":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Event Cancellations"},"notify_meetings":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Meetings"},"notify_deadlines":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Deadlines"},"notify_trainings":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Trainings"}},"type":"object","title":"UpdateUserSettingsRequest"},"UpgradeLegacyBody":{"properties":{"legacy_token":{"type":"string","title":"Legacy Token"}},"type":"object","required":["legacy_token"],"title":"UpgradeLegacyBody"},"UpsellEventIn":{"properties":{"variant":{"type":"string","title":"Variant","description":"premium | supreme | referral | feature_gate | trial_ending | ai | users | coins | dashboard_hub"},"event_type":{"type":"string","title":"Event Type","description":"viewed | clicked | checkout_opened | purchase_completed | dismissed"},"location":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Location","default":"dashboard_banner"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta"}},"type":"object","required":["variant","event_type"],"title":"UpsellEventIn"},"UseCaseRequest":{"properties":{"use_case":{"type":"string","title":"Use Case"}},"type":"object","required":["use_case"],"title":"UseCaseRequest"},"UserDetailResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"}},"type":"object","required":["success","data"],"title":"UserDetailResponse","description":"Detaillierte User-Statistiken"},"UserEntry":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"}},"type":"object","required":["user_id","username"],"title":"UserEntry"},"UserFullModerationProfile":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"is_bot":{"type":"boolean","title":"Is Bot","default":false},"server_member_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Server Member Id"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"joined_server_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Joined Server At"},"role_ids":{"items":{"type":"string"},"type":"array","title":"Role Ids","default":[]},"global_ban":{"$ref":"#/components/schemas/GlobalBanInfo"},"statistics":{"$ref":"#/components/schemas/ModerationStatistics"},"warnings":{"items":{"$ref":"#/components/schemas/WarningDetail"},"type":"array","title":"Warnings","default":[]},"moderation_actions":{"items":{"$ref":"#/components/schemas/ModerationActionDetail"},"type":"array","title":"Moderation Actions","default":[]},"team_notes":{"items":{"$ref":"#/components/schemas/TeamNoteDetail"},"type":"array","title":"Team Notes","default":[]},"member_movements":{"items":{"$ref":"#/components/schemas/MemberMovementDetail"},"type":"array","title":"Member Movements","default":[]},"security_stats":{"anyOf":[{"$ref":"#/components/schemas/SecurityStatsDetail"},{"type":"null"}]},"security_violations":{"items":{"$ref":"#/components/schemas/SecurityViolationDetail"},"type":"array","title":"Security Violations","default":[]}},"type":"object","required":["user_id","username","global_ban","statistics"],"title":"UserFullModerationProfile","description":"Vollständiges Moderations-Profil eines Users."},"UserInfoBasic":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"}},"type":"object","required":["user_id","username"],"title":"UserInfoBasic"},"UserListResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/UserStats"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination","description":"Pagination metadata","examples":[{"current_page":1,"has_next":true,"has_prev":false,"items_per_page":50,"total_items":234,"total_pages":5}]}},"type":"object","required":["success","data","pagination"],"title":"UserListResponse","description":"Response für User-Liste mit Pagination"},"UserModerationSummary":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"active_warnings":{"type":"integer","title":"Active Warnings","default":0},"total_warnings":{"type":"integer","title":"Total Warnings","default":0},"total_bans":{"type":"integer","title":"Total Bans","default":0},"total_kicks":{"type":"integer","title":"Total Kicks","default":0},"total_timeouts":{"type":"integer","title":"Total Timeouts","default":0},"total_notes":{"type":"integer","title":"Total Notes","default":0},"last_action_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Action At"},"is_globally_banned":{"type":"boolean","title":"Is Globally Banned","default":false}},"type":"object","required":["user_id","username"],"title":"UserModerationSummary","description":"Kurze Zusammenfassung für Listen-Ansichten."},"UserProfileLinkCreateSchema":{"properties":{"label":{"type":"string","maxLength":50,"minLength":1,"title":"Label","description":"Displayed text for the link"},"url":{"type":"string","maxLength":512,"minLength":1,"title":"Url","description":"The full URL"},"icon_key":{"type":"string","maxLength":30,"title":"Icon Key","description":"Key for the logo","default":"website"},"position":{"type":"integer","minimum":0.0,"title":"Position","description":"Sort order","default":0}},"type":"object","required":["label","url"],"title":"UserProfileLinkCreateSchema","description":"Schema for creating a new profile link."},"UserProfileLinkSchema":{"properties":{"label":{"type":"string","maxLength":50,"minLength":1,"title":"Label","description":"Displayed text for the link"},"url":{"type":"string","maxLength":512,"minLength":1,"title":"Url","description":"The full URL"},"icon_key":{"type":"string","maxLength":30,"title":"Icon Key","description":"Key for the logo","default":"website"},"position":{"type":"integer","minimum":0.0,"title":"Position","description":"Sort order","default":0},"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["label","url","id","created_at"],"title":"UserProfileLinkSchema","description":"Schema for a returned profile link (incl. ID)."},"UserProfileLinkUpdateSchema":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":50,"minLength":1},{"type":"null"}],"title":"Label"},"url":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"Url"},"icon_key":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Icon Key"},"position":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Position"}},"type":"object","title":"UserProfileLinkUpdateSchema","description":"Schema for updating a profile link (all fields optional)."},"UserProfileUpdateRequest":{"properties":{"language":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Language"},"referral_reward_preference":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Referral Reward Preference"}},"type":"object","title":"UserProfileUpdateRequest"},"UserServersResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"user_id":{"type":"string","title":"User Id"},"total_servers":{"type":"integer","title":"Total Servers"},"servers":{"items":{"$ref":"#/components/schemas/ServerInfo"},"type":"array","title":"Servers"}},"type":"object","required":["user_id","total_servers","servers"],"title":"UserServersResponse","description":"Response für Server-Liste."},"UserSnippet":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"}},"type":"object","required":["user_id","username"],"title":"UserSnippet","description":"Minimale User-Info für die Anzeige im Frontend (ID, Name, Avatar)."},"UserStats":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"joined_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Joined At"},"total_messages":{"type":"integer","title":"Total Messages","default":0},"total_voice_minutes":{"type":"integer","title":"Total Voice Minutes","default":0},"level":{"type":"integer","title":"Level","default":0},"experience":{"type":"integer","title":"Experience","default":0}},"type":"object","required":["user_id","username"],"title":"UserStats","description":"Basis-Statistiken für einen User"},"UserStatsResponse":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"total_stars_received":{"type":"integer","title":"Total Stars Received"},"messages_starred":{"type":"integer","title":"Messages Starred"},"hall_of_fame_count":{"type":"integer","title":"Hall Of Fame Count"},"stars_given":{"type":"integer","title":"Stars Given"},"most_starred_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Most Starred Message Id"},"most_starred_message_count":{"type":"integer","title":"Most Starred Message Count"},"first_star_received":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Star Received"},"last_star_received":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Star Received"}},"type":"object","required":["user_id","username","avatar_url","total_stars_received","messages_starred","hall_of_fame_count","stars_given","most_starred_message_id","most_starred_message_count","first_star_received","last_star_received"],"title":"UserStatsResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ValorantKontenBody":{"properties":{"konten":{"items":{},"type":"array","maxItems":10,"minItems":1,"title":"Konten"}},"type":"object","required":["konten"],"title":"ValorantKontenBody"},"ValorantMatchesBody":{"properties":{"puuid":{"title":"Puuid"},"region":{"title":"Region"},"anzahl":{"title":"Anzahl"},"von":{"title":"Von"},"bis":{"title":"Bis"}},"type":"object","title":"ValorantMatchesBody"},"ValorantSitzungBody":{"properties":{"puuid":{"title":"Puuid"},"region":{"title":"Region"},"von":{"title":"Von"},"bis":{"title":"Bis"}},"type":"object","title":"ValorantSitzungBody"},"VerfallEinstellungen":{"properties":{"verfall_an":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Verfall An"},"verfall_prozent_pro_woche":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":1.0},{"type":"null"}],"title":"Verfall Prozent Pro Woche"},"verfall_schonfrist_tage":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":0.0},{"type":"null"}],"title":"Verfall Schonfrist Tage"},"verfall_min_level":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":1.0},{"type":"null"}],"title":"Verfall Min Level"}},"type":"object","title":"VerfallEinstellungen","description":"Die vier Werte aus `level_verfall.VORGABEN`.\n\n`verfall_prozent_pro_woche` beginnt bei 1 und nicht bei 0: `Regeln.\ngueltig()` verwirft eine 0 ohnehin, und ein Prozentsatz, der den Lauf\nstillschweigend anhaelt, sieht aus wie ein eingeschalteter Verfall, der\nnicht wirkt. Wer nichts verfallen lassen will, macht `verfall_an` aus."},"VerificationFullResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"settings":{"$ref":"#/components/schemas/VerificationSettingsResponse"},"stats":{"$ref":"#/components/schemas/VerificationStatsResponse"}},"type":"object","required":["success","settings","stats"],"title":"VerificationFullResponse","description":"Complete response with all data"},"VerificationLogEntry":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"verification_type":{"type":"string","title":"Verification Type"},"verified_at":{"type":"string","format":"date-time","title":"Verified At"}},"type":"object","required":["id","user_id","username","avatar_url","verification_type","verified_at"],"title":"VerificationLogEntry","description":"Single log entry"},"VerificationLogsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/VerificationLogEntry"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"}},"type":"object","required":["success","data","pagination"],"title":"VerificationLogsResponse","description":"Paginated log list"},"VerificationSettingsResponse":{"properties":{"verification_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verification Role Id"},"verification_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verification Channel Id"},"verification_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verification Message Id"},"verification_action":{"type":"string","title":"Verification Action"},"verification_mode":{"type":"string","title":"Verification Mode"},"verification_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verification Code"},"roles_to_add":{"items":{"type":"string"},"type":"array","title":"Roles To Add","default":[]},"roles_to_remove":{"items":{"type":"string"},"type":"array","title":"Roles To Remove","default":[]},"show_verified_count":{"type":"boolean","title":"Show Verified Count","default":false},"auto_kick_enabled":{"type":"boolean","title":"Auto Kick Enabled","default":false},"auto_kick_minutes":{"type":"integer","title":"Auto Kick Minutes","default":60},"website_min_account_age_days":{"type":"integer","title":"Website Min Account Age Days","default":0},"website_vpn_detection":{"type":"boolean","title":"Website Vpn Detection","default":false},"website_alt_detection":{"type":"boolean","title":"Website Alt Detection","default":false},"website_blocklist_enabled":{"type":"boolean","title":"Website Blocklist Enabled","default":false},"website_blocked_ips":{"items":{"type":"string"},"type":"array","title":"Website Blocked Ips","default":[]},"website_blocked_user_ids":{"items":{"type":"string"},"type":"array","title":"Website Blocked User Ids","default":[]},"website_custom_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Custom Message"},"website_captcha_enabled":{"type":"boolean","title":"Website Captcha Enabled","default":false},"website_password_enabled":{"type":"boolean","title":"Website Password Enabled","default":false},"website_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Password"},"website_deauth_kick_enabled":{"type":"boolean","title":"Website Deauth Kick Enabled","default":false},"website_branding_enabled":{"type":"boolean","title":"Website Branding Enabled","default":false},"website_brand_primary_color":{"type":"string","title":"Website Brand Primary Color","default":"#8B5CF6"},"website_brand_accent_color":{"type":"string","title":"Website Brand Accent Color","default":"#6D28D9"},"website_brand_font":{"type":"string","title":"Website Brand Font","default":"inter"},"has_brand_background":{"type":"boolean","title":"Has Brand Background","default":false},"has_brand_audio":{"type":"boolean","title":"Has Brand Audio","default":false},"is_premium":{"type":"boolean","title":"Is Premium","default":false},"embed_title":{"type":"string","title":"Embed Title"},"embed_description":{"type":"string","title":"Embed Description"},"embed_color":{"type":"string","title":"Embed Color"},"embed_author_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Author Text"},"embed_footer_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Footer Text"},"has_embed_image":{"type":"boolean","title":"Has Embed Image"},"has_embed_thumbnail":{"type":"boolean","title":"Has Embed Thumbnail"},"has_author_icon":{"type":"boolean","title":"Has Author Icon"},"has_footer_icon":{"type":"boolean","title":"Has Footer Icon"},"total_verifications":{"type":"integer","title":"Total Verifications"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["verification_role_id","verification_channel_id","verification_message_id","verification_action","verification_mode","verification_code","embed_title","embed_description","embed_color","embed_author_text","embed_footer_text","has_embed_image","has_embed_thumbnail","has_author_icon","has_footer_icon","total_verifications","created_at","updated_at"],"title":"VerificationSettingsResponse","description":"Response schema for verification settings"},"VerificationSettingsUpdate":{"properties":{"verification_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verification Role Id","description":"Verification role ID (legacy)"},"verification_action":{"anyOf":[{"type":"string","enum":["add","remove"]},{"type":"null"}],"title":"Verification Action"},"verification_mode":{"anyOf":[{"type":"string","enum":["button","code","website"]},{"type":"null"}],"title":"Verification Mode"},"roles_to_add":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Roles To Add","description":"List of role IDs to add on verify (max 10)"},"roles_to_remove":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Roles To Remove","description":"List of role IDs to remove on verify (max 10)"},"show_verified_count":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Verified Count","description":"Show verified member count on button"},"auto_kick_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Kick Enabled","description":"Kick unverified members after timeout"},"auto_kick_minutes":{"anyOf":[{"type":"integer","maximum":1440.0,"minimum":1.0},{"type":"null"}],"title":"Auto Kick Minutes","description":"Minutes until kick (1-1440)"},"embed_title":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Embed Title"},"embed_description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Embed Description"},"embed_color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Embed Color","description":"Hex color code"},"embed_author_text":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Embed Author Text"},"embed_footer_text":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Embed Footer Text"},"website_min_account_age_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":0.0},{"type":"null"}],"title":"Website Min Account Age Days","description":"Min account age in days"},"website_vpn_detection":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Website Vpn Detection","description":"Block VPN/proxy"},"website_alt_detection":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Website Alt Detection","description":"Detect alt accounts"},"website_blocklist_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Website Blocklist Enabled","description":"Enable blocklist"},"website_blocked_ips":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Website Blocked Ips","description":"Blocked IP addresses"},"website_blocked_user_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Website Blocked User Ids","description":"Blocked Discord user IDs"},"website_custom_message":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Website Custom Message","description":"Custom message on verify page"},"website_captcha_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Website Captcha Enabled","description":"Require captcha before OAuth"},"website_password_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Website Password Enabled","description":"Require password before OAuth"},"website_password":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Website Password","description":"Password string"},"website_deauth_kick_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Website Deauth Kick Enabled","description":"Kick deauthorized members (Premium)"},"website_branding_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Website Branding Enabled","description":"Enable custom branding (Premium)"},"website_brand_primary_color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Website Brand Primary Color","description":"Primary brand color"},"website_brand_accent_color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Website Brand Accent Color","description":"Accent brand color"},"website_brand_font":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Website Brand Font","description":"Font family key"}},"type":"object","title":"VerificationSettingsUpdate","description":"Schema for settings updates"},"VerificationStatsResponse":{"properties":{"total_verifications":{"type":"integer","title":"Total Verifications"},"verifications_last_24h":{"type":"integer","title":"Verifications Last 24H"},"verifications_last_7d":{"type":"integer","title":"Verifications Last 7D"},"verifications_last_30d":{"type":"integer","title":"Verifications Last 30D"},"button_verifications":{"type":"integer","title":"Button Verifications"},"code_verifications":{"type":"integer","title":"Code Verifications"},"current_mode":{"type":"string","title":"Current Mode"},"current_action":{"type":"string","title":"Current Action"},"verification_role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verification Role Id"},"verification_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verification Code"},"website_verifications":{"type":"integer","title":"Website Verifications","default":0}},"type":"object","required":["total_verifications","verifications_last_24h","verifications_last_7d","verifications_last_30d","button_verifications","code_verifications","current_mode","current_action","verification_role_id","verification_code"],"title":"VerificationStatsResponse","description":"Verification system statistics"},"VerschiebenBody":{"properties":{"ziel":{"type":"string","maxLength":64,"title":"Ziel"},"basis_revision":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"Basis Revision"},"meta_enc":{"type":"string","maxLength":2048,"title":"Meta Enc"},"meta_version":{"type":"integer","maximum":9007199254740991.0,"minimum":0.0,"title":"Meta Version"},"login_enc":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Login Enc"},"login_version":{"anyOf":[{"type":"integer","maximum":9007199254740991.0,"minimum":0.0},{"type":"null"}],"title":"Login Version"}},"type":"object","required":["ziel","basis_revision","meta_enc","meta_version"],"title":"VerschiebenBody"},"ViewBody":{"properties":{"name":{"type":"string","title":"Name"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignee"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"sort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"},"is_default":{"type":"boolean","title":"Is Default","default":false}},"type":"object","required":["name"],"title":"ViewBody"},"VoiceChannelActivity":{"properties":{"channel":{"$ref":"#/components/schemas/ChannelSnippet"},"user_count":{"type":"integer","title":"User Count","default":0},"users":{"items":{"$ref":"#/components/schemas/VoiceUserInfo"},"type":"array","title":"Users","default":[]}},"type":"object","required":["channel"],"title":"VoiceChannelActivity","description":"Aktivität in einem einzelnen Voice-Channel."},"VoiceStats":{"properties":{"total_sessions":{"type":"integer","title":"Total Sessions","default":0},"total_duration_seconds":{"type":"integer","title":"Total Duration Seconds","default":0},"total_duration_hours":{"type":"number","title":"Total Duration Hours","default":0.0},"avg_session_duration_seconds":{"type":"number","title":"Avg Session Duration Seconds","default":0.0},"avg_daily_hours":{"type":"number","title":"Avg Daily Hours","default":0.0},"longest_session_seconds":{"type":"integer","title":"Longest Session Seconds","default":0},"total_streaming_sessions":{"type":"integer","title":"Total Streaming Sessions","default":0},"total_video_sessions":{"type":"integer","title":"Total Video Sessions","default":0},"busiest_hour":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Busiest Hour"},"busiest_weekday":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Busiest Weekday"},"hourly_distribution":{"items":{"$ref":"#/components/schemas/HourlyDistribution"},"type":"array","title":"Hourly Distribution","default":[]},"daily_distribution":{"items":{"$ref":"#/components/schemas/DailyDistribution"},"type":"array","title":"Daily Distribution","default":[]},"timeline":{"items":{"$ref":"#/components/schemas/TimelinePoint"},"type":"array","title":"Timeline","default":[]},"channel_breakdown":{"items":{"$ref":"#/components/schemas/ChannelEntry"},"type":"array","title":"Channel Breakdown","default":[]},"leaderboard":{"items":{"$ref":"#/components/schemas/api__schemas__server_stats__LeaderboardEntry"},"type":"array","title":"Leaderboard","default":[]}},"type":"object","title":"VoiceStats"},"VoiceStatsChannelCreate":{"properties":{"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id","description":"Discord Voice Channel ID (optional - wird automatisch erstellt wenn leer)"},"stats_type":{"type":"string","title":"Stats Type","description":"Typ der Statistik (z.B. 'total_members', 'online_members')"},"name_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Template","description":"Template für den Kanalnamen mit {value} Platzhalter (nutzt Standard falls leer)"},"update_interval_minutes":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":1.0},{"type":"null"}],"title":"Update Interval Minutes","description":"Update-Intervall in Minuten (1-60)","default":5}},"type":"object","required":["stats_type"],"title":"VoiceStatsChannelCreate","description":"Schema für das Erstellen eines Voice Stats Channels"},"VoiceStatsChannelData":{"properties":{"id":{"type":"integer","title":"Id","description":"Datenbank-ID des Stats Channels"},"channel_id":{"type":"string","title":"Channel Id","description":"Discord Voice Channel ID"},"stats_type":{"type":"string","title":"Stats Type","description":"Typ der Statistik"},"stats_name":{"type":"string","title":"Stats Name","description":"Anzeigename der Statistik"},"stats_description":{"type":"string","title":"Stats Description","description":"Beschreibung der Statistik"},"category":{"type":"string","title":"Category","description":"Kategorie der Statistik"},"name_template":{"type":"string","title":"Name Template","description":"Template für den Kanalnamen"},"is_active":{"type":"boolean","title":"Is Active","description":"Ist der Channel aktiv?"},"update_interval_minutes":{"type":"integer","title":"Update Interval Minutes","description":"Update-Intervall in Minuten"},"last_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Value","description":"Letzter angezeigter Wert"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated","description":"Zeitpunkt des letzten Updates"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Erstellungszeitpunkt"}},"type":"object","required":["id","channel_id","stats_type","stats_name","stats_description","category","name_template","is_active","update_interval_minutes","created_at"],"title":"VoiceStatsChannelData","description":"Detaillierte Daten eines Voice Stats Channels"},"VoiceStatsChannelListData":{"properties":{"server_id":{"type":"string","title":"Server Id"},"server_name":{"type":"string","title":"Server Name"},"total_channels":{"type":"integer","title":"Total Channels"},"active_channels":{"type":"integer","title":"Active Channels"},"channels_by_category":{"additionalProperties":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"type":"object","title":"Channels By Category"},"all_channels":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"All Channels"}},"type":"object","required":["server_id","server_name","total_channels","active_channels","channels_by_category","all_channels"],"title":"VoiceStatsChannelListData","description":"Daten für Voice Stats Channel Liste"},"VoiceStatsChannelListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"$ref":"#/components/schemas/VoiceStatsChannelListData"}},"type":"object","required":["data"],"title":"VoiceStatsChannelListResponse","description":"Response für Liste aller Voice Stats Channels"},"VoiceStatsChannelResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"$ref":"#/components/schemas/VoiceStatsChannelData"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["data"],"title":"VoiceStatsChannelResponse","description":"Response für einzelnen Voice Stats Channel"},"VoiceStatsChannelUpdate":{"properties":{"name_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Template","description":"Neues Template für den Kanalnamen"},"update_interval_minutes":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":1.0},{"type":"null"}],"title":"Update Interval Minutes","description":"Neues Update-Intervall in Minuten (1-60)"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Aktiviert/Deaktiviert den Stats Channel"}},"type":"object","title":"VoiceStatsChannelUpdate","description":"Schema für das Aktualisieren eines Voice Stats Channels"},"VoiceStatsForceUpdateData":{"properties":{"updated_channels":{"type":"integer","title":"Updated Channels"},"message":{"type":"string","title":"Message"}},"type":"object","required":["updated_channels","message"],"title":"VoiceStatsForceUpdateData","description":"Daten für Force Update Response"},"VoiceStatsForceUpdateResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"$ref":"#/components/schemas/VoiceStatsForceUpdateData"}},"type":"object","required":["data"],"title":"VoiceStatsForceUpdateResponse","description":"Response für Force Update"},"VoiceStatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"period":{"type":"string","title":"Period"},"user_id":{"type":"string","title":"User Id"},"server_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Id"},"stats":{"additionalProperties":true,"type":"object","title":"Stats","example":{"average_hours_per_day":2.25,"average_session_minutes":90.0,"channel_breakdown":[],"daily_distribution":{},"hourly_distribution":{},"longest_session_minutes":245.5,"server_breakdown":[],"timeline":[],"total_hours":67.5,"total_sessions":45,"trend":{}}},"insights":{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array","title":"Insights"}},"type":"object","required":["period","user_id","stats","insights"],"title":"VoiceStatsResponse","description":"Response für Voice-Statistiken."},"VoiceUserInfo":{"properties":{"user":{"$ref":"#/components/schemas/UserSnippet"},"channel":{"$ref":"#/components/schemas/ChannelSnippet"},"joined_at":{"type":"string","format":"date-time","title":"Joined At"},"duration_seconds":{"type":"integer","title":"Duration Seconds","description":"Wie lange schon im VC (Sekunden)","default":0},"is_streaming":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Streaming","default":false},"is_video_on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Video On","default":false},"is_muted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Muted","default":false},"is_deafened":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Deafened","default":false}},"type":"object","required":["user","channel","joined_at"],"title":"VoiceUserInfo","description":"Ein User der gerade in einem Voice-Channel ist."},"VorlageAnwenden":{"properties":{"vorlage":{"type":"string","maxLength":30,"minLength":1,"title":"Vorlage"}},"type":"object","required":["vorlage"],"title":"VorlageAnwenden","description":"Eine Einrichtungs-Vorlage waehlen.\n\nDer Admin beantwortet EINE Frage statt zwanzig Regler zu stellen. Die\nWerte je Vorlage stehen in `economy/vorlagen.py` - sie sind Aussagen\nueber das Regelwerk und keine Daten eines Servers.\n\nDer Schluessel wird ausdruecklich NICHT als Literal aufgezaehlt: die\nListe steht an einer Stelle, und eine zweite hier waere die, die\nirgendwann nicht mehr stimmt. Geprueft wird im Endpunkt gegen\n`vorlagen.SCHLUESSEL`."},"VorschauGruppe":{"properties":{"role_id":{"type":"string","title":"Role Id"},"name":{"type":"string","title":"Name"},"color_value":{"type":"integer","title":"Color Value","default":0},"position":{"type":"integer","title":"Position","default":0},"members":{"items":{"$ref":"#/components/schemas/VorschauMitglied"},"type":"array","title":"Members"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["role_id","name","members","total"],"title":"VorschauGruppe","description":"Ein Rollenabschnitt der Liste."},"VorschauMitglied":{"properties":{"user_id":{"type":"string","title":"User Id"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"}},"type":"object","required":["user_id","display_name"],"title":"VorschauMitglied","description":"Ein Name, so wie er in der Liste steht."},"VoteRequest":{"properties":{"is_helpful":{"type":"boolean","title":"Is Helpful","description":"True für Daumen hoch, False für Daumen runter"}},"type":"object","required":["is_helpful"],"title":"VoteRequest"},"WappenWahl":{"properties":{"emblem":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Emblem"},"farbe":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Farbe"},"form":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Form"},"rahmen":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Rahmen"},"muster":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Muster"},"metall":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Metall"},"tinktur":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Tinktur"},"banner_form":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Banner Form"},"banner_muster":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Banner Muster"},"zier":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Zier"}},"type":"object","title":"WappenWahl","description":"`PUT /clans/{id}/wappen` - was die Werkstatt speichert.\n\nAlles optional, geschickt wird, was sich aendert (`exclude_unset`). Emblem\nund Farbe stehen mit drin, obwohl sie an `clans` haengen: die Werkstatt\nzeigt alle sechs Teile in EINER Vorschau, und ein Speichern, das die\nHaelfte in einen zweiten Aufruf schickt, kann zur Haelfte scheitern.\n\nDie Laengen sind Spaltenbreiten, KEINE Katalogpruefung: ob ein Schluessel\nexistiert und ob er auf der Stufe der Schmiede frei ist, sagt der Dienst\n(clans/wappen.py) - mit einem Satz, der den Teil nennt, statt eines 422."},"WarnActionModel":{"properties":{"type":{"type":"string","title":"Type","description":"add_role, remove_role, timeout, kick or ban"},"role_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Id","description":"Role ID (add_role/remove_role)"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds","description":"Timeout duration in seconds"},"delete_message_days":{"anyOf":[{"type":"integer","maximum":7.0,"minimum":0.0},{"type":"null"}],"title":"Delete Message Days","description":"Ban only"}},"type":"object","required":["type"],"title":"WarnActionModel"},"WarnAutomationConfigUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"count_window_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":0.0},{"type":"null"}],"title":"Count Window Days"},"dm_on_action":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dm On Action"}},"type":"object","title":"WarnAutomationConfigUpdate"},"WarnDmSettingUpdate":{"properties":{"warn_dm_enabled":{"type":"boolean","title":"Warn Dm Enabled"}},"type":"object","required":["warn_dm_enabled"],"title":"WarnDmSettingUpdate"},"WarnRuleCreate":{"properties":{"warn_count":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Warn Count"},"enabled":{"type":"boolean","title":"Enabled","default":true},"actions":{"items":{"$ref":"#/components/schemas/WarnActionModel"},"type":"array","maxItems":5,"minItems":1,"title":"Actions"}},"type":"object","required":["warn_count","actions"],"title":"WarnRuleCreate"},"WarnRuleUpdate":{"properties":{"warn_count":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Warn Count"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"actions":{"anyOf":[{"items":{"$ref":"#/components/schemas/WarnActionModel"},"type":"array","maxItems":5,"minItems":1},{"type":"null"}],"title":"Actions"}},"type":"object","title":"WarnRuleUpdate"},"WarningDetail":{"properties":{"id":{"type":"integer","title":"Id"},"case_id":{"type":"integer","title":"Case Id"},"reason":{"type":"string","title":"Reason"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"is_active":{"type":"boolean","title":"Is Active"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"user_id":{"type":"string","title":"User Id"},"user_username":{"type":"string","title":"User Username"},"user_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Display Name"},"user_avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Avatar Url"},"moderator_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moderator Id"},"moderator_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moderator Username"},"moderator_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moderator Display Name"},"removed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Removed At"},"removed_by_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Removed By Id"},"removed_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Removed Reason"},"dm_sent":{"type":"boolean","title":"Dm Sent","default":false},"dm_failed_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dm Failed Reason"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"},"log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Channel Id"},"notes":{"items":{"$ref":"#/components/schemas/WarningNoteEntry"},"type":"array","title":"Notes","default":[]}},"type":"object","required":["id","case_id","reason","timestamp","is_active","user_id","user_username"],"title":"WarningDetail","description":"Detaillierte Warnung."},"WarningItem":{"properties":{"warning_id":{"type":"integer","title":"Warning Id"},"case_id":{"type":"integer","title":"Case Id"},"user":{"$ref":"#/components/schemas/UserSnippet"},"moderator":{"anyOf":[{"$ref":"#/components/schemas/UserSnippet"},{"type":"null"}]},"reason":{"type":"string","title":"Reason"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["warning_id","case_id","user","reason","timestamp"],"title":"WarningItem","description":"Eine Warnung."},"WarningNoteEntry":{"properties":{"content":{"type":"string","title":"Content"},"author_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Id"},"author_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Username"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["content","created_at"],"title":"WarningNoteEntry","description":"Einzelne Notiz zu einer Warnung."},"WarningStatus":{"type":"string","enum":["active","removed","all"],"title":"WarningStatus"},"WarningsListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"items":{"$ref":"#/components/schemas/WarningDetail"},"type":"array","title":"Data"},"pagination":{"additionalProperties":true,"type":"object","title":"Pagination"},"total_active":{"type":"integer","title":"Total Active"},"total_removed":{"type":"integer","title":"Total Removed"}},"type":"object","required":["data","pagination","total_active","total_removed"],"title":"WarningsListResponse","description":"API Response für Warnungs-Liste."},"WartezeitZuruecksetzung":{"properties":{"schluessel":{"items":{"type":"string","enum":["daily","work","crime","rob"]},"type":"array","maxItems":4,"minItems":1,"title":"Schluessel"},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","required":["schluessel"],"title":"WartezeitZuruecksetzung","description":"Wartezeiten zuruecksetzen - der haeufigste Supportfall ueberhaupt."},"WelcomeAIConfigUpdate":{"properties":{"welcome_ai_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Welcome Ai Enabled","description":"Enable/disable AI-generated welcome messages"}},"type":"object","title":"WelcomeAIConfigUpdate"},"WelcomeBackgroundBase64Update":{"properties":{"background_base64":{"type":"string","title":"Background Base64","description":"Base64-encoded image (max 5MB)"}},"type":"object","required":["background_base64"],"title":"WelcomeBackgroundBase64Update"},"WelcomeBannerBase64Update":{"properties":{"banner_base64":{"type":"string","title":"Banner Base64","description":"Base64-encoded image (max 4MB)"}},"type":"object","required":["banner_base64"],"title":"WelcomeBannerBase64Update"},"WelcomeChannelsUpdate":{"properties":{"welcome_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Welcome Channel Id","description":"Channel ID for welcome messages"},"goodbye_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Goodbye Channel Id","description":"Channel ID for goodbye messages"},"goodbye_log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Goodbye Log Channel Id","description":"Channel ID for goodbye logs"}},"type":"object","title":"WelcomeChannelsUpdate"},"WelcomeDMConfigUpdate":{"properties":{"welcome_dm_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Welcome Dm Enabled","description":"DM beim Join aktivieren/deaktivieren"},"welcome_dm_mode":{"anyOf":[{"type":"string","enum":["text","embed","container"]},{"type":"null"}],"title":"Welcome Dm Mode","description":"DM-Modus: text | embed | container"},"welcome_dm_text":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Welcome Dm Text","description":"Reiner Text für DM"},"welcome_dm_embed_template_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Welcome Dm Embed Template Id","description":"EmbedTemplate ID für DM (im Embed-Modus)"}},"type":"object","title":"WelcomeDMConfigUpdate"},"WelcomeEmbedConfigUpdate":{"properties":{"welcome_embed_template_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Welcome Embed Template Id","description":"EmbedTemplate ID für den Willkommens-Channel (None zum Entfernen)"},"welcome_embed_thumbnail_type":{"anyOf":[{"type":"string","enum":["user_avatar","server_icon","custom","none"]},{"type":"null"}],"title":"Welcome Embed Thumbnail Type","description":"Thumbnail-Typ: user_avatar | server_icon | custom (aus Template) | none"},"welcome_embed_image_type":{"anyOf":[{"type":"string","enum":["welcome_card","custom","none"]},{"type":"null"}],"title":"Welcome Embed Image Type","description":"Image-Typ: welcome_card (generierte Karte) | custom (aus Template) | none"}},"type":"object","title":"WelcomeEmbedConfigUpdate"},"WelcomeMessagesUpdate":{"properties":{"welcome_message_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Welcome Message Text","description":"Embed fallback text (max 2000 characters)"},"welcome_content_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Welcome Content Text","description":"Content text for cards (max 2000 characters)"},"welcome_card_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Welcome Card Text","description":"Text ON the card (max 200 characters)"},"goodbye_message_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Goodbye Message Text","description":"Goodbye message text (max 2000 characters)"},"goodbye_log_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Goodbye Log Text","description":"Goodbye log text (max 2000 characters)"}},"type":"object","title":"WelcomeMessagesUpdate"},"WelcomePremiumUpdate":{"properties":{"image_blur":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":0.0},{"type":"null"}],"title":"Image Blur","description":"Blur (0-20)"},"image_darken":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Image Darken","description":"Darken (0.0 - 1.0)"}},"type":"object","title":"WelcomePremiumUpdate"},"WelcomeStatusUpdate":{"properties":{"welcome_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Welcome Enabled","description":"Enable/disable welcome system"},"goodbye_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Goodbye Enabled","description":"Enable/disable goodbye system"},"welcome_card_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Welcome Card Enabled","description":"Enable/disable welcome card"},"welcome_display_mode":{"anyOf":[{"type":"string","enum":["card","embed","text","container"]},{"type":"null"}],"title":"Welcome Display Mode","description":"Display mode: card | embed | text"}},"type":"object","title":"WelcomeStatusUpdate"},"WhitelistCreate":{"properties":{"whitelist_type":{"type":"string","enum":["user","role","channel"],"title":"Whitelist Type"},"target_id":{"type":"string","title":"Target Id"},"exempted_systems":{"items":{"type":"string"},"type":"array","title":"Exempted Systems","default":["anti_spam","anti_link","anti_nuke","anti_raid"]},"reason":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Reason"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["whitelist_type","target_id"],"title":"WhitelistCreate"},"WhitelistEntry":{"properties":{"id":{"type":"integer","title":"Id"},"whitelist_type":{"type":"string","title":"Whitelist Type"},"target_id":{"type":"string","title":"Target Id"},"target_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Name"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"added_by_id":{"type":"string","title":"Added By Id"},"added_by_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Added By Username"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","whitelist_type","target_id","target_name","reason","added_by_id","added_by_username","created_at"],"title":"WhitelistEntry","description":"Whitelist Entry"},"WhitelistEntryResponse":{"properties":{"id":{"type":"integer","title":"Id"},"whitelist_type":{"type":"string","title":"Whitelist Type"},"target_id":{"type":"string","title":"Target Id"},"target_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Name"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"added_by_id":{"type":"string","title":"Added By Id"},"added_by_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Added By Username"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","whitelist_type","target_id","added_by_id","created_at"],"title":"WhitelistEntryResponse","description":"Response fuer einen Whitelist-Eintrag"},"WhitelistResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"total_entries":{"type":"integer","title":"Total Entries"},"data":{"items":{"$ref":"#/components/schemas/WhitelistEntry"},"type":"array","title":"Data"}},"type":"object","required":["success","total_entries","data"],"title":"WhitelistResponse","description":"Response for Whitelist"},"WirkungBeendigung":{"properties":{"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","title":"WirkungBeendigung"},"WirtschaftEinstellungen":{"properties":{"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled"},"starting_balance":{"anyOf":[{"type":"integer","maximum":1000000000.0,"minimum":0.0},{"type":"null"}],"title":"Starting Balance"},"max_daily_amount":{"anyOf":[{"type":"integer","maximum":1000000000.0,"minimum":0.0},{"type":"null"}],"title":"Max Daily Amount"},"gems_per_message":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":0.0},{"type":"null"}],"title":"Gems Per Message"},"gems_per_voice_minute":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":0.0},{"type":"null"}],"title":"Gems Per Voice Minute"},"daily_cooldown":{"anyOf":[{"type":"integer","maximum":604800.0,"minimum":0.0},{"type":"null"}],"title":"Daily Cooldown"},"work_cooldown":{"anyOf":[{"type":"integer","maximum":604800.0,"minimum":0.0},{"type":"null"}],"title":"Work Cooldown"},"crime_cooldown":{"anyOf":[{"type":"integer","maximum":604800.0,"minimum":0.0},{"type":"null"}],"title":"Crime Cooldown"},"rob_cooldown":{"anyOf":[{"type":"integer","maximum":604800.0,"minimum":0.0},{"type":"null"}],"title":"Rob Cooldown"},"work_multiplier":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Work Multiplier"},"daily_multiplier":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Daily Multiplier"},"robbery_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Robbery Enabled"},"trading_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Trading Enabled"},"gambling_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Gambling Enabled"},"economy_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Economy Channel Id"},"transaction_log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Log Channel Id"}},"type":"object","title":"WirtschaftEinstellungen","description":"Die Regler aus `economy_settings`.\n\nSie existieren seit dem ersten Tag und waren bis hierher **nicht\nerreichbar**: nichts im Code schrieb sie ausser `get_or_create` mit\nVorgabewerten. Von 1.312 Servern hatten 19 (1,4 %) je einen Wert\ngeaendert - nicht weil die Vorgaben passen, sondern weil es keinen Weg\ngab, sie zu aendern. Dieses Schema ist dieser Weg."},"WorkloadSettingsPayload":{"properties":{"board_enabled":{"type":"boolean","title":"Board Enabled","default":false},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"capacity_mode":{"type":"string","title":"Capacity Mode","default":"auto"},"capacity_per_supporter":{"type":"integer","title":"Capacity Per Supporter","default":3},"manual_capacity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Manual Capacity"},"count_only_online":{"type":"boolean","title":"Count Only Online","default":true},"show_wait_times":{"type":"boolean","title":"Show Wait Times","default":true},"show_supporter_breakdown":{"type":"boolean","title":"Show Supporter Breakdown","default":true},"show_category_breakdown":{"type":"boolean","title":"Show Category Breakdown","default":true},"show_closed_stats":{"type":"boolean","title":"Show Closed Stats","default":true},"show_handled_stats":{"type":"boolean","title":"Show Handled Stats","default":true},"ai_insight_enabled":{"type":"boolean","title":"Ai Insight Enabled","default":false}},"type":"object","title":"WorkloadSettingsPayload","description":"Einstellungen fuer das Ticket-Auslastungs-Board (GET-Response und PUT-Body, alles default AUS)"},"WorryCreate":{"properties":{"body":{"type":"string","maxLength":5000,"minLength":10,"title":"Body"},"category":{"type":"string","maxLength":40,"title":"Category","default":"other"},"anonymous":{"type":"boolean","title":"Anonymous","default":true}},"type":"object","required":["body"],"title":"WorryCreate"},"Zuruecksetzen":{"properties":{"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","title":"Zuruecksetzen"},"ZuweisenEingabe":{"properties":{"user_id":{"type":"string","maxLength":30,"minLength":15,"title":"User Id","description":"Discord User ID, der das Ereignis gehoert"}},"type":"object","required":["user_id"],"title":"ZuweisenEingabe"},"api__routers__achievements__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data","default":{}},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success"],"title":"ApiResponse"},"api__routers__appeals__ReorderRequest":{"properties":{"order":{"items":{"type":"integer"},"type":"array","title":"Order","description":"Fragen-IDs in der gewünschten neuen Reihenfolge"}},"type":"object","required":["order"],"title":"ReorderRequest"},"api__routers__appeals_public__SubmitRequest":{"properties":{"answers":{"items":{"$ref":"#/components/schemas/SubmitAnswer"},"type":"array","maxItems":25,"title":"Answers"}},"type":"object","title":"SubmitRequest"},"api__routers__applications_public__SubmitRequest":{"properties":{"position_id":{"type":"integer","title":"Position Id"},"answers":{"items":{"$ref":"#/components/schemas/SubmitAnswer"},"type":"array","maxItems":25,"title":"Answers"}},"type":"object","required":["position_id"],"title":"SubmitRequest"},"api__routers__auto_responder__ReorderRequest":{"properties":{"order":{"items":{"type":"integer"},"type":"array","title":"Order","description":"Response-IDs in der gewünschten neuen Reihenfolge"}},"type":"object","required":["order"],"title":"ReorderRequest"},"api__routers__autopfp__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data","default":{}},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success"],"title":"ApiResponse"},"api__routers__birthdays__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse"},"api__routers__boosting__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse"},"api__routers__bumpreminder__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse"},"api__routers__command_permissions__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse"},"api__routers__connectors__Antwort":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{},{"type":"null"}],"title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"Antwort"},"api__routers__counting_invite__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse"},"api__routers__ghostping__WhitelistAddRequest":{"properties":{"whitelist_type":{"type":"string","enum":["user","role","channel"],"title":"Whitelist Type","description":"Type of entry"},"target_id":{"type":"string","title":"Target Id","description":"Discord ID of target"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Reason for whitelist"}},"type":"object","required":["whitelist_type","target_id"],"title":"WhitelistAddRequest","description":"Request for adding to whitelist"},"api__routers__level_belohnungen__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data","default":{}},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success"],"title":"ApiResponse"},"api__routers__level_karte__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data","default":{}},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success"],"title":"ApiResponse"},"api__routers__level_mitglieder__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse"},"api__routers__level_mitglieder__Sammelaktion":{"properties":{"aktion":{"type":"string","enum":["xp_geben","xp_nehmen","level_setzen","zuruecksetzen","einfrieren","auftauen"],"title":"Aktion"},"wert":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Wert"},"filter":{"anyOf":[{"$ref":"#/components/schemas/SammelFilter"},{"type":"null"}]},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"},"bestaetigung":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bestaetigung"}},"type":"object","required":["aktion"],"title":"Sammelaktion","description":"Eine Aktion auf viele Profile.\n\n─── Warum Filter und Aktion in EINEM Koerper stehen ────────────────────\n\nWeil die Vorschau und die Ausfuehrung denselben Koerper bekommen muessen.\nKaeme die Empfaengermenge aus einem vorherigen Aufruf (etwa als Liste von\nIDs), koennte sich zwischen Vorschau und Klick etwas geaendert haben -\nund der Nutzer haette etwas anderes bestaetigt, als dann passiert.\n\nSo dagegen wird die Menge zweimal aus denselben Filtern gebildet. Sie\nkann sich trotzdem verschoben haben (jemand ist beigetreten), aber nicht\nunbemerkt: die Antwort der Ausfuehrung nennt die tatsaechliche Zahl.\n\n─── Warum EIN `wert` und nicht `betrag` und `level` ────────────────────\n\nWeil die Schublade ein Zahlenfeld hat und nicht zwei. Was die Zahl\nbedeutet, sagt die Aktion: bei `xp_geben` sind es XP, bei `level_setzen`\nist es eine Stufe. Zwei Felder waeren zwei Wege, dieselbe Eingabe\nfalsch zu stellen; welches gemeint ist, entscheidet `_modul_werte`.\n\n─── Warum die Aktion `level_setzen` heisst und nicht `stufe_setzen` ────\n\nWeil dieser Wortschatz nicht der Oberflaeche gehoert: `AKTIONEN` in\n`economy/level_sammelaktion.py` teilen Dashboard und Bot-Befehle, und\nderselbe Schluessel steht in jeder Protokollzeile, die es seit dem\nersten Lauf gibt. Die Oberflaeche schickt ihn deshalb unveraendert und\nuebersetzt nur ihre Beschriftung (\"Stufe setzen auf\").\n\nDas ist der Unterschied zum PATCH-Koerper eines EINZELNEN Mitglieds\n(`MitgliedAenderung`): dort ist `stufe_setzen` ein Feld dieses\nEndpunkts, das sonst niemand kennt - hier ist es eine Konstante, die\nausserhalb weiterlebt."},"api__routers__level_multiplikatoren__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data","default":{}},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success"],"title":"ApiResponse"},"api__routers__level_saison__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data","default":{}},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success"],"title":"ApiResponse"},"api__routers__level_saison__Bestaetigung":{"properties":{"bestaetigung":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Bestaetigung"},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"}},"type":"object","title":"Bestaetigung","description":"Der Satz, den man tippen muss - wenn man keinen eigenen Dialog hat.\n\nWie bei der Sammelaktion: die gefaehrlichen Vorgaenge dieses Systems\nhaben eine Bestaetigung, die kein Doppelklick erzeugt. Ein Saisonende\nsetzt hunderte Profile zurueck und ist nicht umkehrbar.\n\n─── Warum das Feld nicht mehr Pflicht ist ──────────────────────────────\n\nWeil das Dashboard es nie schickt. Es laesst den Menschen stattdessen\nden NAMEN der Saison abtippen (`SaisonReiter.jsx`,\n`UniversalConfirmDialog` mit `confirmPhrase`) und schickt danach einen\nleeren Koerper. Als Pflichtfeld war das hier deshalb kein Schutz,\nsondern ein 422er: der Vorgang liess sich aus der Oberflaeche gar nicht\nausloesen, und \"Saison beenden\" endete in einer Fehlermeldung ohne\nGrund.\n\nDie Absicherung ist damit nicht weg, sie steht an der Stelle, die der\nMensch sieht. Wer den Satz MITSCHICKT (Bot-Befehl, Skript, curl), wird\nweiter geprueft - `level_saison.BESTAETIGUNG_BEENDEN` oder der Name der\nSaison, beides zaehlt, denn beides ist \"ich habe die richtige Saison\ngemeint\". Ein falscher Satz bleibt ein Fehler; ein fehlender heisst nur:\nanderer Aufrufer.\n\n`max_length` ist 80 und nicht 40, weil ein Saisonname bis 80 Zeichen\nlang sein darf (`LevelSaison.name`) und sonst genau die langen Namen\nnicht bestaetigt werden koennten."},"api__routers__level_saison__SaisonAenderung":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":80,"minLength":1},{"type":"null"}],"title":"Name"},"dauer_tage":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":7.0},{"type":"null"}],"title":"Dauer Tage"},"reset_anteil":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Reset Anteil"},"platz_belohnungen":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Platz Belohnungen"},"ankuendigung_kanal_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Ankuendigung Kanal Id"}},"type":"object","title":"SaisonAenderung","description":"Der Anfragekoerper von PATCH - jedes Feld einzeln, alle optional.\n\nAuch hier die Dauer statt zweier Zeitstempel: sie ist es, was auf der\nKarte steht, und ein zweiter Weg, dieselbe Zeitspanne auszudruecken,\nwaere ein zweiter Weg, sie falsch auszudruecken. Bei einer LAUFENDEN\nSaison verschiebt sie nur das Ende - der Beginn liegt in der\nVergangenheit und wird nie angefasst (siehe `saison_aendern`)."},"api__routers__level_settings__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse"},"api__routers__logs__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse"},"api__routers__moderation_settings__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse"},"api__routers__monetization__ConfigUpdate":{"properties":{"trial_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trial Mode","description":"reverse | cardless_optin | card_required | off"},"reverse_trial_days":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":1.0},{"type":"null"}],"title":"Reverse Trial Days"},"grace_period_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":0.0},{"type":"null"}],"title":"Grace Period Days"},"payment_grace_days":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":0.0},{"type":"null"}],"title":"Payment Grace Days"},"annual_nudge_after_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":0.0},{"type":"null"}],"title":"Annual Nudge After Days"},"price_lock_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Price Lock Enabled"},"reverse_trial_backfill":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reverse Trial Backfill"},"reverse_trial_min_members":{"anyOf":[{"type":"integer","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Reverse Trial Min Members"}},"type":"object","title":"ConfigUpdate"},"api__routers__partner_reviews__ReviewerInfo":{"properties":{"id":{"type":"string","title":"Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"}},"type":"object","required":["id","username","avatar_url"],"title":"ReviewerInfo"},"api__routers__partner_reviews__StatsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"stats":{"$ref":"#/components/schemas/PurchaseReviewStats"}},"type":"object","required":["success","stats"],"title":"StatsResponse"},"api__routers__professional__Antwort":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{},{"type":"null"}],"title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"Antwort"},"api__routers__professional_identity__Antwort":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{},{"type":"null"}],"title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"Antwort"},"api__routers__professional_inbox__Antwort":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{},{"type":"null"}],"title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"Antwort"},"api__routers__professional_rollout__Antwort":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{},{"type":"null"}],"title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"Antwort"},"api__routers__restricted_channels__StatsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"total_restricted_channels":{"type":"integer","title":"Total Restricted Channels"},"active_restricted_channels":{"type":"integer","title":"Active Restricted Channels"},"total_deletions":{"type":"integer","title":"Total Deletions"},"last_7_days":{"type":"integer","title":"Last 7 Days"},"last_30_days":{"type":"integer","title":"Last 30 Days"},"top_offenders":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Offenders"},"most_active_channels":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Most Active Channels"}},"type":"object","required":["success","total_restricted_channels","active_restricted_channels","total_deletions","last_7_days","last_30_days","top_offenders","most_active_channels"],"title":"StatsResponse","description":"Statistiken fuer eingeschraenkte Kanaele"},"api__routers__restricted_channels__WhitelistAddRequest":{"properties":{"whitelist_type":{"type":"string","enum":["user","role"],"title":"Whitelist Type","description":"Typ des Eintrags"},"target_id":{"type":"string","title":"Target Id","description":"Discord ID des Ziels"},"reason":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Reason","description":"Grund fuer Whitelist"}},"type":"object","required":["whitelist_type","target_id"],"title":"WhitelistAddRequest","description":"Request zum Hinzufuegen eines Whitelist-Eintrags"},"api__routers__reviews__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse"},"api__routers__rssfeed__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse"},"api__routers__scheduled_events__ConfigUpdate":{"properties":{"log_interest":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Log Interest","description":"Zusagen in den Kanal posten?"},"log_withdraw":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Log Withdraw","description":"Absagen in den Kanal posten?"},"log_lifecycle":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Log Lifecycle","description":"Anlegen/Aendern/Start/Ende posten?"},"burst_threshold":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Burst Threshold","description":"Ab wie vielen Signalen in 15 s gebuendelt wird"}},"type":"object","title":"ConfigUpdate","description":"Alles hier betrifft NUR den Discord-Kanal.\n\nDas Mitschreiben selbst ist kein Schalter: was nicht festgehalten wird,\nwaehrend es passiert, kann Discord hinterher nicht nachliefern. Und\ngeloescht wird nie - siehe utils/event_interesse.py."},"api__routers__security__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse"},"api__routers__server_profile__GiveawayParticipant":{"properties":{"user":{"$ref":"#/components/schemas/UserSnippet"},"joined_at":{"type":"string","format":"date-time","title":"Joined At"}},"type":"object","required":["user","joined_at"],"title":"GiveawayParticipant","description":"Ein Giveaway-Teilnehmer."},"api__routers__server_profile__GiveawayWinnerInfo":{"properties":{"user":{"$ref":"#/components/schemas/UserSnippet"},"position":{"type":"integer","title":"Position"},"is_claimed":{"type":"boolean","title":"Is Claimed","default":false},"won_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Won At"}},"type":"object","required":["user","position"],"title":"GiveawayWinnerInfo","description":"Ein Giveaway-Gewinner."},"api__routers__server_profile__ServerProfileResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"server_id":{"type":"string","title":"Server Id"},"server_name":{"type":"string","title":"Server Name"},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Url"},"owner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Id"},"joined_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Joined At"},"member_count":{"type":"integer","title":"Member Count"},"customization":{"$ref":"#/components/schemas/ServerCustomizationSchema"},"invite_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Link","description":"Einladungslink des Servers, falls hinterlegt."},"is_discoverable":{"type":"boolean","title":"Is Discoverable","description":"Hat der Ranking-Task den Server fuer die Liste freigegeben?","default":false},"is_premium":{"type":"boolean","title":"Is Premium","description":"Does the server have premium status?","default":false},"is_professional":{"type":"boolean","title":"Is Professional","description":"Is the server on the Professional tier?","default":false},"plan":{"type":"string","title":"Plan","description":"Effective plan: free, premium or professional","default":"free"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Liste der aktiven Server-Tags"}},"type":"object","required":["server_id","server_name","icon_url","owner_id","joined_at","member_count","customization"],"title":"ServerProfileResponse","description":"Response for the server profile."},"api__routers__serverinfo__ServerProfileResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Url"},"invite_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Link"},"language":{"type":"string","title":"Language"},"created_at":{"type":"string","title":"Created At"},"is_premium":{"type":"boolean","title":"Is Premium"},"is_beta":{"type":"boolean","title":"Is Beta"},"is_public":{"type":"boolean","title":"Is Public"},"is_discoverable":{"type":"boolean","title":"Is Discoverable"},"is_banned":{"type":"boolean","title":"Is Banned"},"tags":{"items":{"$ref":"#/components/schemas/TagSchema"},"type":"array","title":"Tags","default":[]},"owner":{"$ref":"#/components/schemas/ServerOwnerInfo"},"stats":{"$ref":"#/components/schemas/api__routers__serverinfo__ServerStats"},"design":{"$ref":"#/components/schemas/ServerDesign"},"review_average":{"type":"number","title":"Review Average"},"review_count":{"type":"integer","title":"Review Count"}},"type":"object","required":["id","name","icon_url","invite_link","language","created_at","is_premium","is_beta","is_public","is_discoverable","is_banned","owner","stats","design","review_average","review_count"],"title":"ServerProfileResponse"},"api__routers__serverinfo__ServerStats":{"properties":{"total_members":{"type":"integer","title":"Total Members"},"online_members":{"type":"integer","title":"Online Members"}},"type":"object","required":["total_members","online_members"],"title":"ServerStats"},"api__routers__socialmedia__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse"},"api__routers__sticky_roles__ConfigUpdate":{"properties":{"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled"},"restore_mode":{"anyOf":[{"type":"string","enum":["all","allowlist","blocklist"]},{"type":"null"}],"title":"Restore Mode"},"role_allowlist":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Role Allowlist"},"role_blocklist":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Role Blocklist"},"retention_days":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":0.0},{"type":"null"}],"title":"Retention Days"},"restore_delay_seconds":{"anyOf":[{"type":"integer","maximum":30.0,"minimum":0.0},{"type":"null"}],"title":"Restore Delay Seconds"},"max_roles_restored":{"anyOf":[{"type":"integer","maximum":250.0,"minimum":1.0},{"type":"null"}],"title":"Max Roles Restored"},"skip_dangerous_permissions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Skip Dangerous Permissions"},"restore_nickname":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Restore Nickname"},"skip_if_kicked":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Skip If Kicked"},"skip_if_banned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Skip If Banned"},"ignore_bots":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ignore Bots"},"notify_user":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify User"},"notify_message":{"anyOf":[{"type":"string","maxLength":1500},{"type":"null"}],"title":"Notify Message"},"lock_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Lock Enabled"},"log_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Log Enabled"},"log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Channel Id"},"log_retention_days":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":0.0},{"type":"null"}],"title":"Log Retention Days"}},"type":"object","title":"ConfigUpdate"},"api__routers__sticky_roles__ReorderRequest":{"properties":{"area_ids":{"items":{"type":"integer"},"type":"array","minItems":1,"title":"Area Ids"}},"type":"object","required":["area_ids"],"title":"ReorderRequest"},"api__routers__subscriptions__Antwort":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{},{"type":"null"}],"title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"Antwort"},"api__routers__teams__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse","description":"Standard API Response"},"api__routers__user_profile__ServerProfileResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"first_seen_global":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen Global"},"customization":{"$ref":"#/components/schemas/ProfileCustomizationSchema"},"is_pro":{"type":"boolean","title":"Is Pro","description":"Indicates whether the user has an active Pro/Supreme plan.","default":false},"links":{"items":{"$ref":"#/components/schemas/UserProfileLinkSchema"},"type":"array","title":"Links","description":"Custom profile links","default":[]},"server_id":{"type":"string","title":"Server Id"},"server_name":{"type":"string","title":"Server Name"},"joined_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Joined At"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"stats":{"items":{"$ref":"#/components/schemas/ProfileStatsCategory"},"type":"array","title":"Stats"}},"type":"object","required":["user_id","username","avatar_url","first_seen_global","customization","server_id","server_name","joined_at","nickname","stats"],"title":"ServerProfileResponse","description":"Response for the server-specific profile."},"api__routers__verification__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse","description":"Standard API Response"},"api__routers__welcome__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse"},"api__schemas__bewerbung__ReviewerInfo":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"}},"type":"object","required":["user_id","username"],"title":"ReviewerInfo"},"api__schemas__clans__Bestaetigung":{"properties":{"bestaetigung":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Bestaetigung"}},"type":"object","title":"Bestaetigung","description":"Ein Wort, das man tippen muss.\n\nWie beim Marktabschalter und bei der Sammelaktion der Wirtschaft: ein\nHaken ist gesetzt, bevor man ihn gelesen hat; ein Wort muss man tippen.\nWelches Wort, entscheidet der Endpunkt - `sperren` fuer die Server-Sperre\neines Clans, der Clan-Tag fuer Uebergabe und Aufloesung. Das Feld ist\noptional, damit ein fehlendes Wort als 400 mit Erklaerung ankommt und\nnicht als 422 ohne."},"api__schemas__economy__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse","description":"Die Antwortform, die das Dashboard von allen Routern erwartet."},"api__schemas__economy__SaisonAenderung":{"properties":{"tage":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":7.0},{"type":"null"}],"title":"Tage"},"setzt_zurueck":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Setzt Zurueck"},"laeuft_weiter":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Laeuft Weiter"}},"type":"object","title":"SaisonAenderung","description":"Die laufende Saison anpassen. Alles wahlfrei - was fehlt, bleibt.\n\nDer Grund fuer diesen Endpunkt ist der AUS-Schalter. `laeuft_weiter`\nsteht als Vorgabe auf True, und das Beenden startet dann sofort die\nnaechste Saison; ohne einen Weg, das vorher umzustellen, war eine einmal\nangeschaltete Saison nicht mehr abschaltbar.\n\nKeine Wortlaut-Bestaetigung: die Aenderung selbst setzt nichts zurueck.\nDer Reset passiert weiterhin nur am Ende, und ein Ende in der\nVergangenheit weist `saison_aendern` ab - sonst waere eine verkuerzte\nDauer ein Reset ohne Bestaetigung durch die Hintertuer."},"api__schemas__economy__Sammelaktion":{"properties":{"ziel":{"type":"string","enum":["rolle","event","clan"],"title":"Ziel","default":"rolle"},"event_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Event Id"},"clan_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Clan Id"},"waehrung":{"type":"string","enum":["coins","xp"],"title":"Waehrung","default":"coins"},"rolle_id":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Rolle Id"},"aktion":{"type":"string","enum":["hinzufuegen","abziehen"],"title":"Aktion"},"betrag":{"type":"integer","maximum":10000000.0,"minimum":1.0,"title":"Betrag"},"grund":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Grund"},"bestaetigung":{"anyOf":[{"type":"string","const":"ausschuetten"},{"type":"null"}],"title":"Bestaetigung"},"vorgang_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Vorgang Id"}},"type":"object","required":["aktion","betrag"],"title":"Sammelaktion","description":"Vielen auf einmal etwas geben oder nehmen.\n\n─── Warum nur Coins und nur zwei Aktionen ──────────────────────────────\n\nGems und Tokens sind teilweise bezahlte Waehrung; eine Sammelvergabe\ndavon waere die Gems-Regel fuenfhundertfach umgangen. Die Bank hat je\nKonto ein Limit, das fuenfhundertmal einzeln zu pruefen waere. Und\n\"setzen\" auf fuenfhundert Konten ist der einzige Vorgang, der sich nicht\neinmal naeherungsweise zurueckdrehen laesst.\n\n─── Warum die Bestaetigung ein WORT ist ────────────────────────────────\n\nWie beim Marktabschalter und beim Massen-Reset. Ein Haken ist gesetzt,\nbevor man ihn gelesen hat; ein Wort muss man tippen."},"api__schemas__embeds__ApiResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success","data"],"title":"ApiResponse"},"api__schemas__giveaway__GiveawayParticipant":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"joined_at":{"type":"string","format":"date-time","title":"Joined At"},"is_valid":{"type":"boolean","title":"Is Valid"},"validation_passed":{"type":"boolean","title":"Validation Passed"},"validation_details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Validation Details"},"joined_guild_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Joined Guild Id"}},"type":"object","required":["user_id","username","avatar_url","joined_at","is_valid","validation_passed","validation_details"],"title":"GiveawayParticipant","description":"Teilnehmer-Informationen"},"api__schemas__giveaway__GiveawayStats":{"properties":{"total_entries":{"type":"integer","title":"Total Entries"},"valid_entries":{"type":"integer","title":"Valid Entries"},"invalid_entries":{"type":"integer","title":"Invalid Entries"},"winners_drawn":{"type":"integer","title":"Winners Drawn"},"requirements_summary":{"additionalProperties":true,"type":"object","title":"Requirements Summary"}},"type":"object","required":["total_entries","valid_entries","invalid_entries","winners_drawn","requirements_summary"],"title":"GiveawayStats","description":"Statistiken für ein Giveaway"},"api__schemas__giveaway__GiveawayWinnerInfo":{"properties":{"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"position":{"type":"integer","title":"Position"},"won_at":{"type":"string","format":"date-time","title":"Won At"},"is_claimed":{"type":"boolean","title":"Is Claimed"},"claimed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Claimed At"}},"type":"object","required":["user_id","username","avatar_url","position","won_at","is_claimed","claimed_at"],"title":"GiveawayWinnerInfo","description":"Gewinner-Informationen"},"api__schemas__selfroles__ConfigUpdate":{"properties":{"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"show_user_count":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show User Count"},"cooldown_seconds":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":0.0},{"type":"null"}],"title":"Cooldown Seconds"},"embed_title":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Embed Title"},"embed_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Description"},"embed_color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Embed Color"},"log_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Channel Id"},"log_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Log Enabled"},"max_roles_per_user_global":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Max Roles Per User Global"},"auto_cleanup":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Cleanup"},"require_confirmation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Require Confirmation"},"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled"},"image_position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Position","description":"Position des Bildes (top, bottom, separate)"},"use_color":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Color"}},"type":"object","title":"ConfigUpdate","description":"Schema zum Aktualisieren der Config"},"api__schemas__selfroles__ReorderRequest":{"properties":{"ids":{"items":{"type":"integer"},"type":"array","title":"Ids"}},"type":"object","required":["ids"],"title":"ReorderRequest","description":"Schema für Sortier-Requests"},"api__schemas__server__ServerStats":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Url"},"joined_at":{"type":"string","format":"date-time","title":"Joined At"},"current_members":{"type":"integer","title":"Current Members"},"weekly_growth":{"type":"integer","title":"Weekly Growth","default":0},"is_premium":{"type":"boolean","title":"Is Premium"},"is_beta":{"type":"boolean","title":"Is Beta"},"is_banned":{"type":"boolean","title":"Is Banned","default":false},"ban_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ban Reason"}},"type":"object","required":["id","name","joined_at","current_members","is_premium","is_beta"],"title":"ServerStats"},"api__schemas__server_stats__GiveawayStats":{"properties":{"total_giveaways":{"type":"integer","title":"Total Giveaways","default":0},"total_entries":{"type":"integer","title":"Total Entries","default":0},"avg_entries_per_giveaway":{"type":"number","title":"Avg Entries Per Giveaway","default":0.0}},"type":"object","title":"GiveawayStats"},"api__schemas__server_stats__LeaderboardEntry":{"properties":{"rank":{"type":"integer","title":"Rank"},"user":{"$ref":"#/components/schemas/UserEntry"},"value":{"title":"Value","description":"The stat value (count, seconds, etc.)"}},"type":"object","required":["rank","user","value"],"title":"LeaderboardEntry"},"api__schemas__users__LeaderboardEntry":{"properties":{"rank":{"type":"integer","title":"Rank","description":"Position im Leaderboard"},"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"value":{"type":"number","title":"Value","description":"Numerischer Wert für Sortierung"},"display_value":{"type":"string","title":"Display Value","description":"Formatierter Wert für Anzeige"}},"type":"object","required":["rank","user_id","username","value","display_value"],"title":"LeaderboardEntry","description":"Einzelner Leaderboard-Eintrag"},"api__utils__minecraft_http__Antwort":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"anyOf":[{},{"type":"null"}],"title":"Data"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"Antwort","description":"Die Huelle aller Antworten - dieselbe wie in api/routers/connectors.py.\n\nEine eigene Klasse und kein Import von dort: connectors.py haengt die\nMinecraft-Router an seinem Ende ein und laedt sie damit, waehrend es\nselbst noch geladen wird. Ein Import in die Gegenrichtung waere ein\nRingschluss, der nur zufaellig funktioniert."}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"},"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-Partner-Key"}}}}