{"info":{"title":"Millennium Ligue API","description":"Comptes confirmés, sessions et autorisations OAuth partenaires. Résultats versionnés et classement Glicko-2 de decks.","version":"0.4.4"},"tags":[{"name":"Operations","description":"État du service et de sa base dédiée"},{"name":"Account and partners","description":"Comptes et autorisations par ligue"}],"paths":{"/v1/identity/login-context":{"get":{"tags":["Account and partners"],"summary":"Vérifier le parcours de connexion Millennium Deck","security":[],"parameters":[{"name":"oauthQuery","in":"query","required":false,"schema":{"maxLength":8192,"type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["enabled","automatic"],"properties":{"enabled":{"type":"boolean"},"automatic":{"type":"boolean"}},"additionalProperties":false}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1IdentityLogin-context"}},"/v1/me/millennium-deck":{"get":{"tags":["Account and partners"],"summary":"Vérifier la liaison de mon compte Millennium Deck","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["enabled","linked"],"properties":{"enabled":{"type":"boolean"},"linked":{"type":"boolean"}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1MeMillennium-deck"}},"/v1/me":{"get":{"tags":["Account and partners"],"summary":"Identifier le compte et le type d’accès","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["user","authentication"],"properties":{"user":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"}}},"authentication":{"type":"object","required":["method","clientId","scopes"],"properties":{"method":{"type":"string","enum":["session","oauth"]},"clientId":{"nullable":true,"type":["string","null"]},"scopes":{"type":"array","items":{"type":"string"}},"millenniumDeckUserId":{"nullable":true,"type":["string","null"]}}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1Me"}},"/v1/leagues":{"get":{"tags":["Account and partners"],"summary":"Lister les ligues réellement accessibles","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagues"],"properties":{"leagues":{"type":"array","items":{"type":"object","required":["id","title","role"],"properties":{"id":{"format":"uuid","type":"string"},"title":{"type":"string"},"role":{"type":"string","enum":["reader","writer","owner"]}}}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1Leagues"},"post":{"tags":["Account and partners"],"summary":"Créer une ligue avec son propriétaire","security":[{"sessionCookie":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"title":{"minLength":1,"maxLength":120,"type":"string"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["title"],"properties":{"title":{"minLength":1,"maxLength":120,"type":"string"}}}},"multipart/form-data":{"schema":{"type":"object","required":["title"],"properties":{"title":{"minLength":1,"maxLength":120,"type":"string"}}}}}},"responses":{"201":{"description":"Response for status 201","content":{"application/json":{"schema":{"type":"object","required":["id","title","role"],"properties":{"id":{"format":"uuid","type":"string"},"title":{"type":"string"},"role":{"type":"string","enum":["reader","writer","owner"]}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"postV1Leagues"}},"/v1/leagues/{leagueId}":{"get":{"tags":["Account and partners"],"summary":"Lire une ligue autorisée","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["id","title","role"],"properties":{"id":{"format":"uuid","type":"string"},"title":{"type":"string"},"role":{"type":"string","enum":["reader","writer","owner"]}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1LeaguesByLeagueId"},"patch":{"tags":["Account and partners"],"summary":"Renommer une ligue selon rôle et scopes actuels","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"title":{"minLength":1,"maxLength":120,"type":"string"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["title"],"properties":{"title":{"minLength":1,"maxLength":120,"type":"string"}}}},"multipart/form-data":{"schema":{"type":"object","required":["title"],"properties":{"title":{"minLength":1,"maxLength":120,"type":"string"}}}}}},"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["id","title","role"],"properties":{"id":{"format":"uuid","type":"string"},"title":{"type":"string"},"role":{"type":"string","enum":["reader","writer","owner"]}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"patchV1LeaguesByLeagueId"}},"/v1/leagues/{leagueId}/permissions":{"get":{"tags":["Account and partners"],"summary":"Calculer les permissions effectives de la ligue et de ses résultats","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["role","permissions"],"properties":{"role":{"type":"string","enum":["reader","writer","owner"]},"permissions":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1LeaguesByLeagueIdPermissions"}},"/v1/partner-applications":{"get":{"tags":["Account and partners"],"summary":"Lister les applications enregistrées sans exposer de secret","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["applications"],"properties":{"applications":{"type":"array","items":{"type":"object","required":["clientId","name","origin","scopes"],"properties":{"clientId":{"type":"string"},"name":{"type":"string"},"origin":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}}}}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1Partner-applications"}},"/v1/leagues/{leagueId}/integrations":{"get":{"tags":["Account and partners"],"summary":"Consulter les accès accordés à une ligue","security":[{"sessionCookie":[]}],"parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["integrations"],"properties":{"integrations":{"type":"array","items":{"type":"object","required":["clientId","name","scopes"],"properties":{"clientId":{"type":"string"},"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}}}}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1LeaguesByLeagueIdIntegrations"}},"/v1/leagues/{leagueId}/integrations/{clientId}":{"put":{"tags":["Account and partners"],"summary":"Accorder ou limiter les scopes d’une application sur une ligue","security":[{"sessionCookie":[]}],"parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"clientId","in":"path","required":true,"schema":{"minLength":1,"maxLength":256,"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["scopes"],"properties":{"scopes":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string"}}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["scopes"],"properties":{"scopes":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string"}}}}},"multipart/form-data":{"schema":{"type":"object","required":["scopes"],"properties":{"scopes":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["success"],"properties":{"success":{"type":"boolean"}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"putV1LeaguesByLeagueIdIntegrationsByClientId"},"delete":{"tags":["Account and partners"],"summary":"Révoquer immédiatement l’accès d’une application à une ligue","security":[{"sessionCookie":[]}],"parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"clientId","in":"path","required":true,"schema":{"minLength":1,"maxLength":256,"type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["success"],"properties":{"success":{"type":"boolean"}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"deleteV1LeaguesByLeagueIdIntegrationsByClientId"}},"/v1/me/connections":{"get":{"tags":["Account and partners"],"summary":"Consulter ses consentements partenaires","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["connections"],"properties":{"connections":{"type":"array","items":{"type":"object","required":["clientId","name","scopes"],"properties":{"clientId":{"type":"string"},"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}}}}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1MeConnections"}},"/v1/me/connections/{clientId}/revoke":{"post":{"tags":["Account and partners"],"summary":"Révoquer un consentement et tous ses jetons, y compris le rafraîchissement","security":[{"sessionCookie":[]}],"parameters":[{"name":"clientId","in":"path","required":true,"schema":{"minLength":1,"maxLength":256,"type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["success"],"properties":{"success":{"type":"boolean"}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"postV1MeConnectionsByClientIdRevoke"}},"/v1/oauth/consent-details":{"get":{"tags":["Account and partners"],"summary":"Vérifier une demande signée avant d’afficher le consentement","security":[{"sessionCookie":[]}],"parameters":[{"name":"oauth_query","in":"query","required":true,"schema":{"minLength":1,"maxLength":16000,"type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["clientId","name","redirectOrigin","scopes"],"properties":{"clientId":{"type":"string"},"name":{"type":"string"},"redirectOrigin":{"type":"string"},"scopes":{"type":"array","items":{"type":"object","required":["code","label"],"properties":{"code":{"type":"string"},"label":{"type":"string"}}}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1OauthConsent-details"}},"/v1/leagues/{leagueId}/members":{"post":{"tags":["Account and partners"],"summary":"Ajouter un compte confirmé ou changer son rôle","security":[{"sessionCookie":[]}],"parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["userId","role"],"properties":{"userId":{"format":"uuid","type":"string"},"role":{"type":"string","enum":["reader","writer"]}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["userId","role"],"properties":{"userId":{"format":"uuid","type":"string"},"role":{"type":"string","enum":["reader","writer"]}}}},"multipart/form-data":{"schema":{"type":"object","required":["userId","role"],"properties":{"userId":{"format":"uuid","type":"string"},"role":{"type":"string","enum":["reader","writer"]}}}}}},"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["success"],"properties":{"success":{"type":"boolean"}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"postV1LeaguesByLeagueIdMembers"}},"/v1/leagues/{leagueId}/members/{userId}":{"delete":{"tags":["Account and partners"],"summary":"Retirer un membre sans supprimer sa ligue","security":[{"sessionCookie":[]}],"parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"userId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["success"],"properties":{"success":{"type":"boolean"}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"deleteV1LeaguesByLeagueIdMembersByUserId"}},"/v1/leagues/{leagueId}/presentation":{"get":{"tags":["Matches and standings"],"summary":"Illustrations et métadonnées historiques de présentation","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"description":"Lecture privée exigeant decks:read ET participants:read, le rôle et l’autorisation actuels de l’application. Champs visuels explicitement autorisés uniquement ; aucune composition, référence de collection ou archive brute.","parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["decks","participants"],"properties":{"decks":{"type":"array","items":{"type":"object","required":["id","imageUrl","coverPasscode","description","tags","playStyles","strategyTags"],"properties":{"id":{"format":"uuid","type":"string"},"imageUrl":{"nullable":true,"format":"uri","maxLength":1000,"type":["string","null"]},"coverPasscode":{"nullable":true,"pattern":"^[0-9]{8}$","type":["string","null"]},"description":{"maxLength":10000,"type":"string"},"tags":{"maxItems":32,"type":"array","items":{"minLength":1,"maxLength":80,"type":"string"}},"playStyles":{"maxItems":32,"type":"array","items":{"minLength":1,"maxLength":80,"type":"string"}},"strategyTags":{"maxItems":32,"type":"array","items":{"minLength":1,"maxLength":80,"type":"string"}}}}},"participants":{"type":"array","items":{"type":"object","required":["id","color","avatarUrl"],"properties":{"id":{"format":"uuid","type":"string"},"color":{"nullable":true,"pattern":"^#[0-9a-f]{6}$","type":["string","null"]},"avatarUrl":{"nullable":true,"format":"uri","maxLength":1000,"type":["string","null"]}}}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1LeaguesByLeagueIdPresentation"}},"/v1/leagues/{leagueId}/standings":{"get":{"tags":["Matches and standings"],"summary":"Classement de decks Glicko-2, paliers, réserve et statistiques","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","role","projection"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"role":{"type":"string","enum":["reader","writer","owner"]},"projection":{"type":"object","required":["rulesProfile","rankingMode","decks","tiers","reserve","players","headToHead","series"],"properties":{"rulesProfile":{"const":"millennium-legacy-v1","type":"string"},"rankingMode":{"type":"string","enum":["manual","auto"]},"decks":{"type":"array","items":{"type":"object","required":["id","title","participantId","tierId","position","stableOrder","archived","version","wins","losses","draws","matchesCount","firstCount","firstWins","secondCount","secondWins","currentStreak","lastPlayedAt","results","winRate","firstRate","secondRate","rating","rd","vol","reliable","autoTierId","conservativeScore","deltaLast"],"properties":{"id":{"format":"uuid","type":"string"},"title":{"type":"string"},"participantId":{"nullable":true,"format":"uuid","type":["string","null"]},"tierId":{"nullable":true,"format":"uuid","type":["string","null"]},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"stableOrder":{"type":"string"},"archived":{"type":"boolean"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"wins":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"losses":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"draws":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"matchesCount":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"firstCount":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"firstWins":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"secondCount":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"secondWins":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"currentStreak":{"anyOf":[{"format":"integer","default":0,"type":"string"},{"type":"integer"}]},"lastPlayedAt":{"nullable":true,"type":["string","null"]},"results":{"type":"array","items":{"type":"string","enum":["W","L","D"]}},"winRate":{"nullable":true,"type":["number","null"]},"firstRate":{"nullable":true,"type":["number","null"]},"secondRate":{"nullable":true,"type":["number","null"]},"rating":{"type":"number"},"rd":{"type":"number"},"vol":{"type":"number"},"reliable":{"type":"boolean"},"autoTierId":{"nullable":true,"format":"uuid","type":["string","null"]},"conservativeScore":{"type":"number"},"deltaLast":{"type":"number"}}}},"tiers":{"type":"array","items":{"type":"object","required":["id","label","color","position","stableOrder","version","decks"],"properties":{"id":{"format":"uuid","type":"string"},"label":{"type":"string"},"color":{"type":"string"},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"stableOrder":{"type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"decks":{"type":"array","items":{"type":"object","required":["id","title","participantId","tierId","position","stableOrder","archived","version","wins","losses","draws","matchesCount","firstCount","firstWins","secondCount","secondWins","currentStreak","lastPlayedAt","results","winRate","firstRate","secondRate","rating","rd","vol","reliable","autoTierId","conservativeScore","deltaLast"],"properties":{"id":{"format":"uuid","type":"string"},"title":{"type":"string"},"participantId":{"nullable":true,"format":"uuid","type":["string","null"]},"tierId":{"nullable":true,"format":"uuid","type":["string","null"]},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"stableOrder":{"type":"string"},"archived":{"type":"boolean"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"wins":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"losses":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"draws":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"matchesCount":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"firstCount":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"firstWins":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"secondCount":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"secondWins":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"currentStreak":{"anyOf":[{"format":"integer","default":0,"type":"string"},{"type":"integer"}]},"lastPlayedAt":{"nullable":true,"type":["string","null"]},"results":{"type":"array","items":{"type":"string","enum":["W","L","D"]}},"winRate":{"nullable":true,"type":["number","null"]},"firstRate":{"nullable":true,"type":["number","null"]},"secondRate":{"nullable":true,"type":["number","null"]},"rating":{"type":"number"},"rd":{"type":"number"},"vol":{"type":"number"},"reliable":{"type":"boolean"},"autoTierId":{"nullable":true,"format":"uuid","type":["string","null"]},"conservativeScore":{"type":"number"},"deltaLast":{"type":"number"}}}}}}},"reserve":{"type":"array","items":{"type":"object","required":["id","title","participantId","tierId","position","stableOrder","archived","version","wins","losses","draws","matchesCount","firstCount","firstWins","secondCount","secondWins","currentStreak","lastPlayedAt","results","winRate","firstRate","secondRate","rating","rd","vol","reliable","autoTierId","conservativeScore","deltaLast"],"properties":{"id":{"format":"uuid","type":"string"},"title":{"type":"string"},"participantId":{"nullable":true,"format":"uuid","type":["string","null"]},"tierId":{"nullable":true,"format":"uuid","type":["string","null"]},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"stableOrder":{"type":"string"},"archived":{"type":"boolean"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"wins":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"losses":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"draws":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"matchesCount":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"firstCount":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"firstWins":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"secondCount":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"secondWins":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"currentStreak":{"anyOf":[{"format":"integer","default":0,"type":"string"},{"type":"integer"}]},"lastPlayedAt":{"nullable":true,"type":["string","null"]},"results":{"type":"array","items":{"type":"string","enum":["W","L","D"]}},"winRate":{"nullable":true,"type":["number","null"]},"firstRate":{"nullable":true,"type":["number","null"]},"secondRate":{"nullable":true,"type":["number","null"]},"rating":{"type":"number"},"rd":{"type":"number"},"vol":{"type":"number"},"reliable":{"type":"boolean"},"autoTierId":{"nullable":true,"format":"uuid","type":["string","null"]},"conservativeScore":{"type":"number"},"deltaLast":{"type":"number"}}}},"players":{"type":"array","items":{"type":"object","required":["id","name","stableKey","version","wins","losses","draws","matchesCount","firstCount","firstWins","secondCount","secondWins","currentStreak","lastPlayedAt","results","winRate","firstRate","secondRate","internalMatches"],"properties":{"id":{"format":"uuid","type":"string"},"name":{"type":"string"},"stableKey":{"type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"wins":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"losses":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"draws":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"matchesCount":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"firstCount":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"firstWins":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"secondCount":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"secondWins":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"currentStreak":{"anyOf":[{"format":"integer","default":0,"type":"string"},{"type":"integer"}]},"lastPlayedAt":{"nullable":true,"type":["string","null"]},"results":{"type":"array","items":{"type":"string","enum":["W","L","D"]}},"winRate":{"nullable":true,"type":["number","null"]},"firstRate":{"nullable":true,"type":["number","null"]},"secondRate":{"nullable":true,"type":["number","null"]},"internalMatches":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}}},"headToHead":{"type":"array","items":{"type":"object","required":["deckAId","deckBId","winsA","winsB","draws","lastPlayedAt"],"properties":{"deckAId":{"format":"uuid","type":"string"},"deckBId":{"format":"uuid","type":"string"},"winsA":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"winsB":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"draws":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"lastPlayedAt":{"type":"string"}}}},"series":{"type":"object","patternProperties":{"^(.*)$":{"type":"array","items":{"type":"object","required":["playedAt","rating","matchId"],"properties":{"playedAt":{"type":"string"},"rating":{"type":"number"},"matchId":{"format":"uuid","type":"string"}}}}}}}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1LeaguesByLeagueIdStandings"}},"/v1/leagues/{leagueId}/decks":{"get":{"tags":["Matches and standings"],"summary":"Lister les decks, y compris archivés et leur version","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","decks"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"decks":{"type":"array","items":{"type":"object","required":["id","title","participantId","tierId","position","stableOrder","archived","version"],"properties":{"id":{"format":"uuid","type":"string"},"title":{"type":"string"},"participantId":{"nullable":true,"format":"uuid","type":["string","null"]},"tierId":{"nullable":true,"format":"uuid","type":["string","null"]},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"stableOrder":{"type":"string"},"archived":{"type":"boolean"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1LeaguesByLeagueIdDecks"},"post":{"tags":["Matches and standings"],"summary":"Créer un deck nommé indépendant de toute collection","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"description":"Idempotency-Key UUID obligatoire. Pour modifier une ressource : If-Match égal à son ETag courant. Réutiliser la même clé ET le même corps après une réponse perdue.","parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"format":"uuid","type":"string"}},{"name":"if-match","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"title":{"minLength":1,"maxLength":120,"type":"string"},"participantId":{"nullable":true,"format":"uuid","type":["string","null"]}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["title"],"properties":{"title":{"minLength":1,"maxLength":120,"type":"string"},"participantId":{"nullable":true,"format":"uuid","type":["string","null"]}}}},"multipart/form-data":{"schema":{"type":"object","required":["title"],"properties":{"title":{"minLength":1,"maxLength":120,"type":"string"},"participantId":{"nullable":true,"format":"uuid","type":["string","null"]}}}}}},"responses":{"201":{"description":"Response for status 201","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","data"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"data":{"type":"object","required":["id","title","participantId","tierId","position","stableOrder","archived","version"],"properties":{"id":{"format":"uuid","type":"string"},"title":{"type":"string"},"participantId":{"nullable":true,"format":"uuid","type":["string","null"]},"tierId":{"nullable":true,"format":"uuid","type":["string","null"]},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"stableOrder":{"type":"string"},"archived":{"type":"boolean"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}},"warnings":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"postV1LeaguesByLeagueIdDecks"}},"/v1/leagues/{leagueId}/decks/{id}":{"patch":{"tags":["Matches and standings"],"summary":"Renommer, attribuer ou archiver/réouvrir un deck","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"description":"Idempotency-Key UUID obligatoire. Pour modifier une ressource : If-Match égal à son ETag courant. Réutiliser la même clé ET le même corps après une réponse perdue.","parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"id","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"format":"uuid","type":"string"}},{"name":"if-match","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"minLength":1,"maxLength":120,"type":"string"},"participantId":{"nullable":true,"format":"uuid","type":["string","null"]},"archived":{"type":"boolean"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"title":{"minLength":1,"maxLength":120,"type":"string"},"participantId":{"nullable":true,"format":"uuid","type":["string","null"]},"archived":{"type":"boolean"}}}},"multipart/form-data":{"schema":{"type":"object","properties":{"title":{"minLength":1,"maxLength":120,"type":"string"},"participantId":{"nullable":true,"format":"uuid","type":["string","null"]},"archived":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","data"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"data":{"type":"object","required":["id","title","participantId","tierId","position","stableOrder","archived","version"],"properties":{"id":{"format":"uuid","type":"string"},"title":{"type":"string"},"participantId":{"nullable":true,"format":"uuid","type":["string","null"]},"tierId":{"nullable":true,"format":"uuid","type":["string","null"]},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"stableOrder":{"type":"string"},"archived":{"type":"boolean"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}},"warnings":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"patchV1LeaguesByLeagueIdDecksById"}},"/v1/leagues/{leagueId}/participants":{"get":{"tags":["Matches and standings"],"summary":"Lister les joueurs locaux de la ligue","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","participants"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"participants":{"type":"array","items":{"type":"object","required":["id","name","stableKey","version"],"properties":{"id":{"format":"uuid","type":"string"},"name":{"type":"string"},"stableKey":{"type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1LeaguesByLeagueIdParticipants"},"post":{"tags":["Matches and standings"],"summary":"Ajouter un joueur sans créer de compte ni de droit","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"description":"Idempotency-Key UUID obligatoire. Pour modifier une ressource : If-Match égal à son ETag courant. Réutiliser la même clé ET le même corps après une réponse perdue.","parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"format":"uuid","type":"string"}},{"name":"if-match","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"minLength":1,"maxLength":80,"type":"string"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["name"],"properties":{"name":{"minLength":1,"maxLength":80,"type":"string"}}}},"multipart/form-data":{"schema":{"type":"object","required":["name"],"properties":{"name":{"minLength":1,"maxLength":80,"type":"string"}}}}}},"responses":{"201":{"description":"Response for status 201","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","data"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"data":{"type":"object","required":["id","name","stableKey","version"],"properties":{"id":{"format":"uuid","type":"string"},"name":{"type":"string"},"stableKey":{"type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}},"warnings":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"postV1LeaguesByLeagueIdParticipants"}},"/v1/leagues/{leagueId}/participants/{id}":{"patch":{"tags":["Matches and standings"],"summary":"Renommer un joueur local","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"description":"Idempotency-Key UUID obligatoire. Pour modifier une ressource : If-Match égal à son ETag courant. Réutiliser la même clé ET le même corps après une réponse perdue.","parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"id","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"format":"uuid","type":"string"}},{"name":"if-match","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"minLength":1,"maxLength":80,"type":"string"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["name"],"properties":{"name":{"minLength":1,"maxLength":80,"type":"string"}}}},"multipart/form-data":{"schema":{"type":"object","required":["name"],"properties":{"name":{"minLength":1,"maxLength":80,"type":"string"}}}}}},"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","data"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"data":{"type":"object","required":["id","name","stableKey","version"],"properties":{"id":{"format":"uuid","type":"string"},"name":{"type":"string"},"stableKey":{"type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}},"warnings":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"patchV1LeaguesByLeagueIdParticipantsById"}},"/v1/leagues/{leagueId}/tiers":{"get":{"tags":["Matches and standings"],"summary":"Lister les paliers et leurs versions","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","tiers"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"tiers":{"type":"array","items":{"type":"object","required":["id","label","color","position","stableOrder","version"],"properties":{"id":{"format":"uuid","type":"string"},"label":{"type":"string"},"color":{"type":"string"},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"stableOrder":{"type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1LeaguesByLeagueIdTiers"},"post":{"tags":["Matches and standings"],"summary":"Créer un palier","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"description":"Idempotency-Key UUID obligatoire. Pour modifier une ressource : If-Match égal à son ETag courant. Réutiliser la même clé ET le même corps après une réponse perdue.","parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"format":"uuid","type":"string"}},{"name":"if-match","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["label","color","position"],"properties":{"label":{"minLength":1,"maxLength":24,"type":"string"},"color":{"pattern":"^#[0-9a-fA-F]{6}$","type":"string"},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["label","color","position"],"properties":{"label":{"minLength":1,"maxLength":24,"type":"string"},"color":{"pattern":"^#[0-9a-fA-F]{6}$","type":"string"},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}}},"multipart/form-data":{"schema":{"type":"object","required":["label","color","position"],"properties":{"label":{"minLength":1,"maxLength":24,"type":"string"},"color":{"pattern":"^#[0-9a-fA-F]{6}$","type":"string"},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}}}}},"responses":{"201":{"description":"Response for status 201","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","data"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"data":{"type":"object","required":["id","label","color","position","stableOrder","version"],"properties":{"id":{"format":"uuid","type":"string"},"label":{"type":"string"},"color":{"type":"string"},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"stableOrder":{"type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}},"warnings":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"postV1LeaguesByLeagueIdTiers"}},"/v1/leagues/{leagueId}/tiers/{id}":{"patch":{"tags":["Matches and standings"],"summary":"Modifier ou réordonner un palier","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"description":"Idempotency-Key UUID obligatoire. Pour modifier une ressource : If-Match égal à son ETag courant. Réutiliser la même clé ET le même corps après une réponse perdue.","parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"id","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"format":"uuid","type":"string"}},{"name":"if-match","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["label","color","position"],"properties":{"label":{"minLength":1,"maxLength":24,"type":"string"},"color":{"pattern":"^#[0-9a-fA-F]{6}$","type":"string"},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["label","color","position"],"properties":{"label":{"minLength":1,"maxLength":24,"type":"string"},"color":{"pattern":"^#[0-9a-fA-F]{6}$","type":"string"},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}}},"multipart/form-data":{"schema":{"type":"object","required":["label","color","position"],"properties":{"label":{"minLength":1,"maxLength":24,"type":"string"},"color":{"pattern":"^#[0-9a-fA-F]{6}$","type":"string"},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}}}}},"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","data"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"data":{"type":"object","required":["id","label","color","position","stableOrder","version"],"properties":{"id":{"format":"uuid","type":"string"},"label":{"type":"string"},"color":{"type":"string"},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"stableOrder":{"type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}},"warnings":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"patchV1LeaguesByLeagueIdTiersById"},"delete":{"tags":["Matches and standings"],"summary":"Retirer un palier et remettre son placement manuel en réserve","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"description":"Idempotency-Key UUID obligatoire. Pour modifier une ressource : If-Match égal à son ETag courant. Réutiliser la même clé ET le même corps après une réponse perdue.","parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"id","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"format":"uuid","type":"string"}},{"name":"if-match","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","data"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"data":{"type":"object","required":["success"],"properties":{"success":{"type":"boolean"}}},"warnings":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"deleteV1LeaguesByLeagueIdTiersById"}},"/v1/leagues/{leagueId}/layout":{"put":{"tags":["Matches and standings"],"summary":"Choisir le mode et conserver un placement manuel complet","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"description":"Idempotency-Key UUID obligatoire. Pour modifier une ressource : If-Match égal à son ETag courant. Réutiliser la même clé ET le même corps après une réponse perdue.","parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"format":"uuid","type":"string"}},{"name":"if-match","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["rankingMode","placements"],"properties":{"rankingMode":{"type":"string","enum":["manual","auto"]},"placements":{"maxItems":1000,"type":"array","items":{"type":"object","required":["deckId","tierId","position"],"properties":{"deckId":{"format":"uuid","type":"string"},"tierId":{"nullable":true,"format":"uuid","type":["string","null"]},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}}}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["rankingMode","placements"],"properties":{"rankingMode":{"type":"string","enum":["manual","auto"]},"placements":{"maxItems":1000,"type":"array","items":{"type":"object","required":["deckId","tierId","position"],"properties":{"deckId":{"format":"uuid","type":"string"},"tierId":{"nullable":true,"format":"uuid","type":["string","null"]},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}}}}}},"multipart/form-data":{"schema":{"type":"object","required":["rankingMode","placements"],"properties":{"rankingMode":{"type":"string","enum":["manual","auto"]},"placements":{"maxItems":1000,"type":"array","items":{"type":"object","required":["deckId","tierId","position"],"properties":{"deckId":{"format":"uuid","type":"string"},"tierId":{"nullable":true,"format":"uuid","type":["string","null"]},"position":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]}}}}}}}}},"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","data"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"data":{"type":"object","required":["success"],"properties":{"success":{"type":"boolean"}}},"warnings":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"putV1LeaguesByLeagueIdLayout"}},"/v1/leagues/{leagueId}/matches":{"get":{"tags":["Matches and standings"],"summary":"Historique paginé, ordre date puis ordre de rejeu décroissants","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"minimum":1,"maximum":100,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":100,"type":"integer"}]}},{"name":"cursor","in":"query","required":false,"schema":{"maxLength":512,"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["active","voided","all"]}},{"name":"deckId","in":"query","required":false,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","matches","nextCursor"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"matches":{"type":"array","items":{"type":"object","required":["id","version","status","replayOrder","payload"],"properties":{"id":{"format":"uuid","type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"status":{"type":"string","enum":["active","voided"]},"replayOrder":{"type":"string"},"payload":{"type":"object","required":["deckAId","deckBId","winnerDeckId","firstDeckId","playedAt","victoryMethod","victorySpeed","durationSeconds"],"properties":{"deckAId":{"format":"uuid","type":"string"},"deckBId":{"format":"uuid","type":"string"},"winnerDeckId":{"nullable":true,"format":"uuid","type":["string","null"]},"firstDeckId":{"format":"uuid","type":"string"},"playedAt":{"description":"ISO 8601 avec fuseau, précision maximale six décimales. UTC normalisé sans perte.","minLength":20,"maxLength":32,"type":"string"},"victoryMethod":{"nullable":true,"type":["string","null"],"enum":["combat","burn","special","deck_out","surrender","other"]},"victorySpeed":{"nullable":true,"type":["string","null"],"enum":["none","ftk","otk"]},"durationSeconds":{"nullable":true,"anyOf":[{"minimum":1,"maximum":86400,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":86400,"type":"integer"}]},{"type":"null"}]}}}}}},"nextCursor":{"nullable":true,"type":["string","null"]}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1LeaguesByLeagueIdMatches"},"post":{"tags":["Matches and standings"],"summary":"Saisir immédiatement un résultat de duel, sans score de manches","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"description":"Idempotency-Key UUID obligatoire. Pour modifier une ressource : If-Match égal à son ETag courant. Réutiliser la même clé ET le même corps après une réponse perdue.","parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"format":"uuid","type":"string"}},{"name":"if-match","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["deckAId","deckBId","winnerDeckId","firstDeckId","playedAt"],"properties":{"deckAId":{"format":"uuid","type":"string"},"deckBId":{"format":"uuid","type":"string"},"winnerDeckId":{"nullable":true,"format":"uuid","type":["string","null"]},"firstDeckId":{"format":"uuid","type":"string"},"playedAt":{"description":"ISO 8601 avec fuseau, précision maximale six décimales. UTC normalisé sans perte.","minLength":20,"maxLength":32,"type":"string"},"victoryMethod":{"nullable":true,"type":["string","null"],"enum":["combat","burn","special","deck_out","surrender","other"]},"victorySpeed":{"nullable":true,"type":["string","null"],"enum":["none","ftk","otk"]},"durationSeconds":{"nullable":true,"anyOf":[{"minimum":1,"maximum":86400,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":86400,"type":"integer"}]},{"type":"null"}]}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["deckAId","deckBId","winnerDeckId","firstDeckId","playedAt"],"properties":{"deckAId":{"format":"uuid","type":"string"},"deckBId":{"format":"uuid","type":"string"},"winnerDeckId":{"nullable":true,"format":"uuid","type":["string","null"]},"firstDeckId":{"format":"uuid","type":"string"},"playedAt":{"description":"ISO 8601 avec fuseau, précision maximale six décimales. UTC normalisé sans perte.","minLength":20,"maxLength":32,"type":"string"},"victoryMethod":{"nullable":true,"type":["string","null"],"enum":["combat","burn","special","deck_out","surrender","other"]},"victorySpeed":{"nullable":true,"type":["string","null"],"enum":["none","ftk","otk"]},"durationSeconds":{"nullable":true,"anyOf":[{"minimum":1,"maximum":86400,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":86400,"type":"integer"}]},{"type":"null"}]}}}},"multipart/form-data":{"schema":{"type":"object","required":["deckAId","deckBId","winnerDeckId","firstDeckId","playedAt"],"properties":{"deckAId":{"format":"uuid","type":"string"},"deckBId":{"format":"uuid","type":"string"},"winnerDeckId":{"nullable":true,"format":"uuid","type":["string","null"]},"firstDeckId":{"format":"uuid","type":"string"},"playedAt":{"description":"ISO 8601 avec fuseau, précision maximale six décimales. UTC normalisé sans perte.","minLength":20,"maxLength":32,"type":"string"},"victoryMethod":{"nullable":true,"type":["string","null"],"enum":["combat","burn","special","deck_out","surrender","other"]},"victorySpeed":{"nullable":true,"type":["string","null"],"enum":["none","ftk","otk"]},"durationSeconds":{"nullable":true,"anyOf":[{"minimum":1,"maximum":86400,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":86400,"type":"integer"}]},{"type":"null"}]}}}}}},"responses":{"201":{"description":"Response for status 201","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","data"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"data":{"type":"object","required":["id","version","status","replayOrder","payload"],"properties":{"id":{"format":"uuid","type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"status":{"type":"string","enum":["active","voided"]},"replayOrder":{"type":"string"},"payload":{"type":"object","required":["deckAId","deckBId","winnerDeckId","firstDeckId","playedAt","victoryMethod","victorySpeed","durationSeconds"],"properties":{"deckAId":{"format":"uuid","type":"string"},"deckBId":{"format":"uuid","type":"string"},"winnerDeckId":{"nullable":true,"format":"uuid","type":["string","null"]},"firstDeckId":{"format":"uuid","type":"string"},"playedAt":{"description":"ISO 8601 avec fuseau, précision maximale six décimales. UTC normalisé sans perte.","minLength":20,"maxLength":32,"type":"string"},"victoryMethod":{"nullable":true,"type":["string","null"],"enum":["combat","burn","special","deck_out","surrender","other"]},"victorySpeed":{"nullable":true,"type":["string","null"],"enum":["none","ftk","otk"]},"durationSeconds":{"nullable":true,"anyOf":[{"minimum":1,"maximum":86400,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":86400,"type":"integer"}]},{"type":"null"}]}}}}},"warnings":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"postV1LeaguesByLeagueIdMatches"}},"/v1/leagues/{leagueId}/matches/{id}":{"get":{"tags":["Matches and standings"],"summary":"Lire un résultat versionné et son ETag","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"id","in":"path","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","data"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"data":{"type":"object","required":["id","version","status","replayOrder","payload"],"properties":{"id":{"format":"uuid","type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"status":{"type":"string","enum":["active","voided"]},"replayOrder":{"type":"string"},"payload":{"type":"object","required":["deckAId","deckBId","winnerDeckId","firstDeckId","playedAt","victoryMethod","victorySpeed","durationSeconds"],"properties":{"deckAId":{"format":"uuid","type":"string"},"deckBId":{"format":"uuid","type":"string"},"winnerDeckId":{"nullable":true,"format":"uuid","type":["string","null"]},"firstDeckId":{"format":"uuid","type":"string"},"playedAt":{"description":"ISO 8601 avec fuseau, précision maximale six décimales. UTC normalisé sans perte.","minLength":20,"maxLength":32,"type":"string"},"victoryMethod":{"nullable":true,"type":["string","null"],"enum":["combat","burn","special","deck_out","surrender","other"]},"victorySpeed":{"nullable":true,"type":["string","null"],"enum":["none","ftk","otk"]},"durationSeconds":{"nullable":true,"anyOf":[{"minimum":1,"maximum":86400,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":86400,"type":"integer"}]},{"type":"null"}]}}}}},"warnings":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1LeaguesByLeagueIdMatchesById"},"patch":{"tags":["Matches and standings"],"summary":"Corriger un résultat actif avec un motif et sa version","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"description":"Idempotency-Key UUID obligatoire. Pour modifier une ressource : If-Match égal à son ETag courant. Réutiliser la même clé ET le même corps après une réponse perdue.","parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"id","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"format":"uuid","type":"string"}},{"name":"if-match","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["deckAId","deckBId","winnerDeckId","firstDeckId","playedAt","reason"],"properties":{"deckAId":{"format":"uuid","type":"string"},"deckBId":{"format":"uuid","type":"string"},"winnerDeckId":{"nullable":true,"format":"uuid","type":["string","null"]},"firstDeckId":{"format":"uuid","type":"string"},"playedAt":{"description":"ISO 8601 avec fuseau, précision maximale six décimales. UTC normalisé sans perte.","minLength":20,"maxLength":32,"type":"string"},"victoryMethod":{"nullable":true,"type":["string","null"],"enum":["combat","burn","special","deck_out","surrender","other"]},"victorySpeed":{"nullable":true,"type":["string","null"],"enum":["none","ftk","otk"]},"durationSeconds":{"nullable":true,"anyOf":[{"minimum":1,"maximum":86400,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":86400,"type":"integer"}]},{"type":"null"}]},"reason":{"minLength":1,"maxLength":500,"type":"string"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["deckAId","deckBId","winnerDeckId","firstDeckId","playedAt","reason"],"properties":{"deckAId":{"format":"uuid","type":"string"},"deckBId":{"format":"uuid","type":"string"},"winnerDeckId":{"nullable":true,"format":"uuid","type":["string","null"]},"firstDeckId":{"format":"uuid","type":"string"},"playedAt":{"description":"ISO 8601 avec fuseau, précision maximale six décimales. UTC normalisé sans perte.","minLength":20,"maxLength":32,"type":"string"},"victoryMethod":{"nullable":true,"type":["string","null"],"enum":["combat","burn","special","deck_out","surrender","other"]},"victorySpeed":{"nullable":true,"type":["string","null"],"enum":["none","ftk","otk"]},"durationSeconds":{"nullable":true,"anyOf":[{"minimum":1,"maximum":86400,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":86400,"type":"integer"}]},{"type":"null"}]},"reason":{"minLength":1,"maxLength":500,"type":"string"}}}},"multipart/form-data":{"schema":{"type":"object","required":["deckAId","deckBId","winnerDeckId","firstDeckId","playedAt","reason"],"properties":{"deckAId":{"format":"uuid","type":"string"},"deckBId":{"format":"uuid","type":"string"},"winnerDeckId":{"nullable":true,"format":"uuid","type":["string","null"]},"firstDeckId":{"format":"uuid","type":"string"},"playedAt":{"description":"ISO 8601 avec fuseau, précision maximale six décimales. UTC normalisé sans perte.","minLength":20,"maxLength":32,"type":"string"},"victoryMethod":{"nullable":true,"type":["string","null"],"enum":["combat","burn","special","deck_out","surrender","other"]},"victorySpeed":{"nullable":true,"type":["string","null"],"enum":["none","ftk","otk"]},"durationSeconds":{"nullable":true,"anyOf":[{"minimum":1,"maximum":86400,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":86400,"type":"integer"}]},{"type":"null"}]},"reason":{"minLength":1,"maxLength":500,"type":"string"}}}}}},"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","data"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"data":{"type":"object","required":["id","version","status","replayOrder","payload"],"properties":{"id":{"format":"uuid","type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"status":{"type":"string","enum":["active","voided"]},"replayOrder":{"type":"string"},"payload":{"type":"object","required":["deckAId","deckBId","winnerDeckId","firstDeckId","playedAt","victoryMethod","victorySpeed","durationSeconds"],"properties":{"deckAId":{"format":"uuid","type":"string"},"deckBId":{"format":"uuid","type":"string"},"winnerDeckId":{"nullable":true,"format":"uuid","type":["string","null"]},"firstDeckId":{"format":"uuid","type":"string"},"playedAt":{"description":"ISO 8601 avec fuseau, précision maximale six décimales. UTC normalisé sans perte.","minLength":20,"maxLength":32,"type":"string"},"victoryMethod":{"nullable":true,"type":["string","null"],"enum":["combat","burn","special","deck_out","surrender","other"]},"victorySpeed":{"nullable":true,"type":["string","null"],"enum":["none","ftk","otk"]},"durationSeconds":{"nullable":true,"anyOf":[{"minimum":1,"maximum":86400,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":86400,"type":"integer"}]},{"type":"null"}]}}}}},"warnings":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"patchV1LeaguesByLeagueIdMatchesById"}},"/v1/leagues/{leagueId}/matches/{id}/void":{"post":{"tags":["Matches and standings"],"summary":"Annuler sans effacer le résultat ni ses versions","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"description":"Idempotency-Key UUID obligatoire. Pour modifier une ressource : If-Match égal à son ETag courant. Réutiliser la même clé ET le même corps après une réponse perdue.","parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"id","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"format":"uuid","type":"string"}},{"name":"if-match","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["reason"],"properties":{"reason":{"minLength":1,"maxLength":500,"type":"string"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["reason"],"properties":{"reason":{"minLength":1,"maxLength":500,"type":"string"}}}},"multipart/form-data":{"schema":{"type":"object","required":["reason"],"properties":{"reason":{"minLength":1,"maxLength":500,"type":"string"}}}}}},"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","data"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"data":{"type":"object","required":["id","version","status","replayOrder","payload"],"properties":{"id":{"format":"uuid","type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"status":{"type":"string","enum":["active","voided"]},"replayOrder":{"type":"string"},"payload":{"type":"object","required":["deckAId","deckBId","winnerDeckId","firstDeckId","playedAt","victoryMethod","victorySpeed","durationSeconds"],"properties":{"deckAId":{"format":"uuid","type":"string"},"deckBId":{"format":"uuid","type":"string"},"winnerDeckId":{"nullable":true,"format":"uuid","type":["string","null"]},"firstDeckId":{"format":"uuid","type":"string"},"playedAt":{"description":"ISO 8601 avec fuseau, précision maximale six décimales. UTC normalisé sans perte.","minLength":20,"maxLength":32,"type":"string"},"victoryMethod":{"nullable":true,"type":["string","null"],"enum":["combat","burn","special","deck_out","surrender","other"]},"victorySpeed":{"nullable":true,"type":["string","null"],"enum":["none","ftk","otk"]},"durationSeconds":{"nullable":true,"anyOf":[{"minimum":1,"maximum":86400,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":86400,"type":"integer"}]},{"type":"null"}]}}}}},"warnings":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"postV1LeaguesByLeagueIdMatchesByIdVoid"}},"/v1/leagues/{leagueId}/matches/{id}/restore":{"post":{"tags":["Matches and standings"],"summary":"Copier une ancienne révision dans une nouvelle version","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"description":"Idempotency-Key UUID obligatoire. Pour modifier une ressource : If-Match égal à son ETag courant. Réutiliser la même clé ET le même corps après une réponse perdue.","parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"id","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"idempotency-key","in":"header","required":false,"schema":{"format":"uuid","type":"string"}},{"name":"if-match","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["reason","revisionId"],"properties":{"reason":{"minLength":1,"maxLength":500,"type":"string"},"revisionId":{"format":"uuid","type":"string"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["reason","revisionId"],"properties":{"reason":{"minLength":1,"maxLength":500,"type":"string"},"revisionId":{"format":"uuid","type":"string"}}}},"multipart/form-data":{"schema":{"type":"object","required":["reason","revisionId"],"properties":{"reason":{"minLength":1,"maxLength":500,"type":"string"},"revisionId":{"format":"uuid","type":"string"}}}}}},"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","data"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"data":{"type":"object","required":["id","version","status","replayOrder","payload"],"properties":{"id":{"format":"uuid","type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"status":{"type":"string","enum":["active","voided"]},"replayOrder":{"type":"string"},"payload":{"type":"object","required":["deckAId","deckBId","winnerDeckId","firstDeckId","playedAt","victoryMethod","victorySpeed","durationSeconds"],"properties":{"deckAId":{"format":"uuid","type":"string"},"deckBId":{"format":"uuid","type":"string"},"winnerDeckId":{"nullable":true,"format":"uuid","type":["string","null"]},"firstDeckId":{"format":"uuid","type":"string"},"playedAt":{"description":"ISO 8601 avec fuseau, précision maximale six décimales. UTC normalisé sans perte.","minLength":20,"maxLength":32,"type":"string"},"victoryMethod":{"nullable":true,"type":["string","null"],"enum":["combat","burn","special","deck_out","surrender","other"]},"victorySpeed":{"nullable":true,"type":["string","null"],"enum":["none","ftk","otk"]},"durationSeconds":{"nullable":true,"anyOf":[{"minimum":1,"maximum":86400,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":86400,"type":"integer"}]},{"type":"null"}]}}}}},"warnings":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"postV1LeaguesByLeagueIdMatchesByIdRestore"}},"/v1/leagues/{leagueId}/matches/{id}/revisions":{"get":{"tags":["Matches and standings"],"summary":"Lire les révisions immuables, auteurs et provenance inconnue explicite","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"id","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"minimum":1,"maximum":100,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":100,"type":"integer"}]}},{"name":"cursor","in":"query","required":false,"schema":{"maxLength":512,"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["active","voided","all"]}},{"name":"deckId","in":"query","required":false,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","revisions","nextCursor"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"revisions":{"type":"array","items":{"type":"object","required":["id","matchId","version","action","reason","actorId","actorName","clientId","before","after","context","at"],"properties":{"id":{"format":"uuid","type":"string"},"matchId":{"format":"uuid","type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"action":{"type":"string"},"reason":{"type":"string"},"actorId":{"format":"uuid","type":"string"},"actorName":{"type":"string"},"clientId":{"nullable":true,"type":["string","null"]},"before":{"nullable":true,"type":["object","null"],"required":["id","version","status","replayOrder","payload"],"properties":{"id":{"format":"uuid","type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"status":{"type":"string","enum":["active","voided"]},"replayOrder":{"type":"string"},"payload":{"type":"object","required":["deckAId","deckBId","winnerDeckId","firstDeckId","playedAt","victoryMethod","victorySpeed","durationSeconds"],"properties":{"deckAId":{"format":"uuid","type":"string"},"deckBId":{"format":"uuid","type":"string"},"winnerDeckId":{"nullable":true,"format":"uuid","type":["string","null"]},"firstDeckId":{"format":"uuid","type":"string"},"playedAt":{"description":"ISO 8601 avec fuseau, précision maximale six décimales. UTC normalisé sans perte.","minLength":20,"maxLength":32,"type":"string"},"victoryMethod":{"nullable":true,"type":["string","null"],"enum":["combat","burn","special","deck_out","surrender","other"]},"victorySpeed":{"nullable":true,"type":["string","null"],"enum":["none","ftk","otk"]},"durationSeconds":{"nullable":true,"anyOf":[{"minimum":1,"maximum":86400,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":86400,"type":"integer"}]},{"type":"null"}]}}}}},"after":{"type":"object","required":["id","version","status","replayOrder","payload"],"properties":{"id":{"format":"uuid","type":"string"},"version":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"status":{"type":"string","enum":["active","voided"]},"replayOrder":{"type":"string"},"payload":{"type":"object","required":["deckAId","deckBId","winnerDeckId","firstDeckId","playedAt","victoryMethod","victorySpeed","durationSeconds"],"properties":{"deckAId":{"format":"uuid","type":"string"},"deckBId":{"format":"uuid","type":"string"},"winnerDeckId":{"nullable":true,"format":"uuid","type":["string","null"]},"firstDeckId":{"format":"uuid","type":"string"},"playedAt":{"description":"ISO 8601 avec fuseau, précision maximale six décimales. UTC normalisé sans perte.","minLength":20,"maxLength":32,"type":"string"},"victoryMethod":{"nullable":true,"type":["string","null"],"enum":["combat","burn","special","deck_out","surrender","other"]},"victorySpeed":{"nullable":true,"type":["string","null"],"enum":["none","ftk","otk"]},"durationSeconds":{"nullable":true,"anyOf":[{"minimum":1,"maximum":86400,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":86400,"type":"integer"}]},{"type":"null"}]}}}}},"context":{"type":"object","required":["composition","pilots","provenance"],"properties":{"composition":{"type":"null"},"pilots":{"type":"null"},"provenance":{"type":"string","enum":["unknown","legacy_import"]}}},"at":{"type":"string"}}}},"nextCursor":{"nullable":true,"type":["string","null"]}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1LeaguesByLeagueIdMatchesByIdRevisions"}},"/v1/leagues/{leagueId}/activity":{"get":{"tags":["Matches and standings"],"summary":"Lire le journal paginé des mutations commises","security":[{"sessionCookie":[]},{"bearerAuth":[]}],"parameters":[{"name":"leagueId","in":"path","required":true,"schema":{"format":"uuid","type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"minimum":1,"maximum":100,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":1,"maximum":100,"type":"integer"}]}},{"name":"cursor","in":"query","required":false,"schema":{"maxLength":512,"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["active","voided","all"]}},{"name":"deckId","in":"query","required":false,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["leagueVersion","projectionVersion","events","nextCursor"],"properties":{"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"events":{"type":"array","items":{"type":"object","required":["id","sequence","action","actorId","clientId","entityId","leagueVersion","projectionVersion","at"],"properties":{"id":{"format":"uuid","type":"string"},"sequence":{"type":"string"},"action":{"type":"string"},"actorId":{"format":"uuid","type":"string"},"clientId":{"nullable":true,"type":["string","null"]},"entityId":{"nullable":true,"format":"uuid","type":["string","null"]},"leagueVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"projectionVersion":{"minimum":0,"maximum":2147483647,"anyOf":[{"format":"integer","default":0,"type":"string"},{"minimum":0,"maximum":2147483647,"type":"integer"}]},"at":{"type":"string"}}}},"nextCursor":{"nullable":true,"type":["string","null"]}}}}}},"400":{"description":"Response for status 400","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"401":{"description":"Response for status 401","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"403":{"description":"Response for status 403","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"404":{"description":"Response for status 404","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"409":{"description":"Response for status 409","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"412":{"description":"Response for status 412","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"422":{"description":"Response for status 422","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"428":{"description":"Response for status 428","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Response for status 429","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"500":{"description":"Response for status 500","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getV1LeaguesByLeagueIdActivity"}},"/health/live":{"get":{"tags":["Operations"],"summary":"Vérifier le processus API","responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["status","service"],"properties":{"status":{"const":"ok","type":"string"},"service":{"const":"millennium-league-api","type":"string"}}}}}}},"operationId":"getHealthLive"}},"/health/ready":{"get":{"tags":["Operations"],"summary":"Vérifier PostgreSQL et le schéma attendu","responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["status","database","stage"],"properties":{"status":{"const":"ready","type":"string"},"database":{"const":"reachable","type":"string"},"stage":{"type":"string","enum":["foundation","authentication","league"]}},"additionalProperties":false}}}},"503":{"description":"Response for status 503","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"const":"database_unavailable","type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getHealthReady"}},"/version":{"get":{"tags":["Operations"],"summary":"Identifier la version du socle","responses":{"200":{"description":"Response for status 200","content":{"application/json":{"schema":{"type":"object","required":["version","stage","build"],"properties":{"version":{"type":"string"},"stage":{"type":"string","enum":["foundation","authentication","league"]},"build":{"type":"string"}},"additionalProperties":false}}}}},"operationId":"getVersion"}},"/api/auth/sign-in/social":{"post":{"tags":["Default"],"description":"Sign in with a social provider","operationId":"socialSignIn","security":[],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"callbackURL":{"type":"string","description":"Callback URL to redirect to after the user has signed in"},"newUserCallbackURL":{"type":"string"},"errorCallbackURL":{"type":"string","description":"Callback URL to redirect to if an error happens"},"provider":{"anyOf":[{"type":"string","enum":["apple","atlassian","cloudflare","cognito","discord","facebook","figma","github","microsoft","google","huggingface","slack","spotify","twitch","twitter","dropbox","kick","linear","linkedin","gitlab","tiktok","reddit","roblox","salesforce","vk","zoom","notion","kakao","naver","line","paybin","paypal","polar","railway","vercel","wechat"]},{"type":"string"}]},"disableRedirect":{"type":"boolean","description":"Disable automatic redirection to the provider. Useful for handling the redirection yourself"},"idToken":{"type":"object","properties":{"token":{"type":"string","description":"ID token from the provider"},"nonce":{"type":"string","description":"Nonce used to generate the token"},"accessToken":{"type":"string","description":"Access token from the provider"},"refreshToken":{"type":"string","description":"Refresh token from the provider"},"expiresAt":{"type":"number","description":"Expiry date of the token"},"user":{"type":"object","properties":{"name":{"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"}}},"email":{"type":"string"}},"description":"The user object from the provider. Only available for some providers like Apple."}},"required":["token"]},"scopes":{"type":"array","items":{"type":"string"},"description":"Array of scopes to request from the provider. This will override the default scopes passed."},"requestSignUp":{"type":"boolean","description":"Explicitly request sign-up. Useful when disableImplicitSignUp is true for this provider"},"loginHint":{"type":"string","description":"The login hint to use for the authorization code request"},"additionalParams":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Extra query parameters to append to the provider authorization URL (e.g. Cognito identity_provider, Google hd)."},"additionalData":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["provider"]}}}},"responses":{"200":{"description":"Success - Returns session details (idToken branch) or an authorize URL (redirect branch)","content":{"application/json":{"schema":{"type":"object","description":"Returns session details when idToken is provided, or an authorize URL otherwise","properties":{"token":{"type":"string"},"user":{"type":"object","$ref":"#/components/schemas/User"},"url":{"type":"string"},"redirect":{"type":"boolean"}},"required":["redirect"]}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/callback/millennium-deck":{"get":{"tags":["Default"],"security":[],"parameters":[],"responses":{"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}},"post":{"tags":["Default"],"security":[],"parameters":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"error":{"type":"string"},"device_id":{"type":"string"},"error_description":{"type":"string"},"state":{"type":"string"},"user":{"type":"string"},"iss":{"type":"string"}}}}}},"responses":{"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/get-session":{"get":{"tags":["Default"],"description":"Get the current session","operationId":"getSession","security":[{"sessionCookie":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":["object","null"],"properties":{"session":{"$ref":"#/components/schemas/Session"},"user":{"$ref":"#/components/schemas/User"}},"required":["session","user"]}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}},"post":{"tags":["Default"],"description":"Get the current session","operationId":"getSessionPost","security":[{"sessionCookie":[]}],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":["object","null"],"properties":{"session":{"$ref":"#/components/schemas/Session"},"user":{"$ref":"#/components/schemas/User"}},"required":["session","user"]}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/sign-out":{"post":{"tags":["Default"],"description":"Sign out the current user","operationId":"signOut","security":[{"sessionCookie":[]}],"parameters":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"callbackURL":{"type":"string","description":"The URL to redirect to after provider logout"},"disableRedirect":{"type":"boolean","description":"Return the provider logout URL without redirecting"},"state":{"type":"string","description":"State to pass to the provider logout endpoint"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"url":{"type":"string","description":"Provider logout URL when RP-initiated logout is available"},"redirect":{"type":"boolean","description":"Whether the client should redirect to the provider logout URL"}}}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/sign-up/email":{"post":{"tags":["Default"],"description":"Sign up a user using email and password","operationId":"signUpWithEmailAndPassword","security":[],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"The name of the user"},"email":{"type":"string","description":"The email of the user"},"password":{"type":"string","description":"The password of the user"},"image":{"type":"string","description":"The profile image URL of the user"},"callbackURL":{"type":"string","description":"The URL to use for email verification callback"},"rememberMe":{"type":"boolean","description":"If this is false, the session will not be remembered. Default is `true`."}},"required":["name","email","password"]}}}},"responses":{"200":{"description":"Successfully created user","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","nullable":true,"description":"Authentication token for the session"},"user":{"type":"object","properties":{"id":{"type":"string","description":"The unique identifier of the user"},"email":{"type":"string","format":"email","description":"The email address of the user"},"name":{"type":"string","description":"The name of the user"},"image":{"type":"string","format":"uri","nullable":true,"description":"The profile image URL of the user"},"emailVerified":{"type":"boolean","description":"Whether the email has been verified"},"createdAt":{"type":"string","format":"date-time","description":"When the user was created"},"updatedAt":{"type":"string","format":"date-time","description":"When the user was last updated"}},"required":["id","email","name","emailVerified","createdAt","updatedAt"]}},"required":["user"]}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"422":{"description":"Unprocessable Entity. User already exists or failed to create user.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}}},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/sign-in/email":{"post":{"tags":["Default"],"description":"Sign in with email and password","operationId":"signInEmail","security":[],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"Email of the user"},"password":{"type":"string","description":"Password of the user"},"callbackURL":{"type":"string","description":"Callback URL to use as a redirect for email verification"},"rememberMe":{"type":"boolean","description":"If this is false, the session will not be remembered. Default is `true`."}},"required":["email","password"]}}}},"responses":{"200":{"description":"Success - Returns either session details or redirect URL","content":{"application/json":{"schema":{"type":"object","description":"Session response when idToken is provided","properties":{"redirect":{"type":"boolean","enum":[false]},"token":{"type":"string","description":"Session token"},"url":{"type":"string","nullable":true},"user":{"type":"object","$ref":"#/components/schemas/User"}},"required":["redirect","token","user"]}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/reset-password":{"post":{"tags":["Default"],"description":"Reset the password for a user","operationId":"resetPassword","security":[],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"newPassword":{"type":"string","description":"The new password to set"},"token":{"type":"string","description":"The token to reset the password"}},"required":["newPassword"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"boolean"}}}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/verify-email":{"get":{"tags":["Default"],"description":"Verify the email of the user","security":[],"parameters":[{"name":"token","in":"query","description":"The token to verify the email","required":true,"schema":{"type":"string"}},{"name":"callbackURL","in":"query","description":"The URL to redirect to after email verification","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","$ref":"#/components/schemas/User"},"status":{"type":"boolean","description":"Indicates if the email was verified successfully"}},"required":["user","status"]}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/send-verification-email":{"post":{"tags":["Default"],"description":"Send a verification email to the user","operationId":"sendVerificationEmail","security":[],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"The email to send the verification email to","example":"user@example.com"},"callbackURL":{"type":"string","description":"The URL to use for email verification callback","example":"https://example.com/callback","nullable":true}},"required":["email"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"boolean","description":"Indicates if the email was sent successfully","example":true}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Error message","example":"Verification email isn't enabled"}}}}}},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/request-password-reset":{"post":{"tags":["Default"],"description":"Send a password reset email to the user","operationId":"requestPasswordReset","security":[],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"The email address of the user to send a password reset email to"},"redirectTo":{"type":"string","description":"The URL to redirect the user to reset their password. If the token isn't valid or expired, it'll be redirected with a query parameter `?error=INVALID_TOKEN`. If the token is valid, it'll be redirected with a query parameter `?token=VALID_TOKEN"}},"required":["email"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"boolean"},"message":{"type":"string"}}}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/reset-password/{token}":{"get":{"tags":["Default"],"description":"Redirects the user to the callback URL with the token","operationId":"resetPasswordCallback","security":[],"parameters":[{"name":"token","in":"path","required":true,"description":"The token to reset the password","schema":{"type":"string"}},{"name":"callbackURL","in":"query","required":true,"description":"The URL to redirect the user to reset their password","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"}}}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/list-sessions":{"get":{"tags":["Default"],"description":"List all active sessions for the user","operationId":"listUserSessions","security":[{"sessionCookie":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Session"}}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/revoke-session":{"post":{"tags":["Default"],"description":"Revoke a single session","security":[{"sessionCookie":[]}],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","description":"The token to revoke"}},"required":["token"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"boolean","description":"Indicates if the session was revoked successfully"}},"required":["status"]}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/revoke-sessions":{"post":{"tags":["Default"],"description":"Revoke all sessions for the user","security":[{"sessionCookie":[]}],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"boolean","description":"Indicates if all sessions were revoked successfully"}},"required":["status"]}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/revoke-other-sessions":{"post":{"tags":["Default"],"description":"Revoke all other sessions for the user except the current one","security":[{"sessionCookie":[]}],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"boolean","description":"Indicates if all other sessions were revoked successfully"}},"required":["status"]}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/link-social":{"post":{"tags":["Default"],"description":"Link a social account to the user","operationId":"linkSocialAccount","security":[{"sessionCookie":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"callbackURL":{"type":"string","description":"The URL to redirect to after the user has signed in"},"provider":{"anyOf":[{"type":"string","enum":["apple","atlassian","cloudflare","cognito","discord","facebook","figma","github","microsoft","google","huggingface","slack","spotify","twitch","twitter","dropbox","kick","linear","linkedin","gitlab","tiktok","reddit","roblox","salesforce","vk","zoom","notion","kakao","naver","line","paybin","paypal","polar","railway","vercel","wechat"]},{"type":"string"}]},"idToken":{"type":"object","properties":{"token":{"type":"string"},"nonce":{"type":"string"},"accessToken":{"type":"string"},"refreshToken":{"type":"string"}},"required":["token"]},"requestSignUp":{"type":"boolean"},"scopes":{"type":"array","items":{"type":"string"},"description":"Additional scopes to request from the provider"},"errorCallbackURL":{"type":"string","description":"The URL to redirect to if there is an error during the link process"},"disableRedirect":{"type":"boolean","description":"Disable automatic redirection to the provider. Useful for handling the redirection yourself"},"loginHint":{"type":"string","description":"The login hint to use for the authorization code request"},"additionalParams":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Extra query parameters to append to the provider authorization URL (e.g. Cognito identity_provider, Google hd)."},"additionalData":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["provider"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The authorization URL to redirect the user to"},"redirect":{"type":"boolean","description":"Indicates if the user should be redirected to the authorization URL"},"status":{"type":"boolean"}},"required":["redirect"]}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/error":{"get":{"tags":["Default"],"description":"Displays an error page","security":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"text/html":{"schema":{"type":"string","description":"The HTML content of the error page"}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/oauth2/authorize":{"get":{"tags":["Oauth-provider"],"description":"Authorize an OAuth 2.1 request from query parameters or an application/x-www-form-urlencoded POST body","security":[],"parameters":[{"name":"response_type","in":"query","required":false,"schema":{"type":"string"},"description":"OAuth 2.1 response type (e.g., 'code')"},{"name":"client_id","in":"query","required":true,"schema":{"type":"string"},"description":"OAuth 2.1 client ID"},{"name":"redirect_uri","in":"query","required":false,"schema":{"type":"string","format":"uri"},"description":"OAuth 2.1 redirect URI"},{"name":"scope","in":"query","required":false,"schema":{"type":"string"},"description":"OAuth 2.1 scopes (space-separated)"},{"name":"state","in":"query","required":false,"schema":{"type":"string"},"description":"OAuth 2.1 state parameter"},{"name":"request_uri","in":"query","required":false,"schema":{"type":"string"},"description":"Pushed Authorization Request URI referencing stored parameters"},{"name":"code_challenge","in":"query","required":false,"schema":{"type":"string"},"description":"PKCE code challenge"},{"name":"code_challenge_method","in":"query","required":false,"schema":{"type":"string"},"description":"PKCE code challenge method"},{"name":"nonce","in":"query","required":false,"schema":{"type":"string"},"description":"OpenID Connect nonce"},{"name":"max_age","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"Maximum authentication age in seconds; forces re-authentication when exceeded"},{"name":"resource","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}},"description":"Requested protected resource(s) for the access token. May be supplied multiple times as repeated 'resource' query parameters (RFC 8707) or as an array of strings."},{"name":"prompt","in":"query","required":false,"schema":{"type":"string"},"description":"OAuth2 prompt parameter"}],"responses":{"302":{"description":"Redirect to client with code or error","headers":{"Location":{"description":"Redirect URI with code or error","schema":{"type":"string","format":"uri"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"error_description":{"type":"string"},"state":{"type":"string"}},"required":["error"]}}}},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}},"post":{"tags":["Oauth-provider"],"description":"Authorize an OAuth 2.1 request from query parameters or an application/x-www-form-urlencoded POST body","security":[],"parameters":[{"name":"response_type","in":"query","required":false,"schema":{"type":"string"},"description":"OAuth 2.1 response type (e.g., 'code')"},{"name":"client_id","in":"query","required":true,"schema":{"type":"string"},"description":"OAuth 2.1 client ID"},{"name":"redirect_uri","in":"query","required":false,"schema":{"type":"string","format":"uri"},"description":"OAuth 2.1 redirect URI"},{"name":"scope","in":"query","required":false,"schema":{"type":"string"},"description":"OAuth 2.1 scopes (space-separated)"},{"name":"state","in":"query","required":false,"schema":{"type":"string"},"description":"OAuth 2.1 state parameter"},{"name":"request_uri","in":"query","required":false,"schema":{"type":"string"},"description":"Pushed Authorization Request URI referencing stored parameters"},{"name":"code_challenge","in":"query","required":false,"schema":{"type":"string"},"description":"PKCE code challenge"},{"name":"code_challenge_method","in":"query","required":false,"schema":{"type":"string"},"description":"PKCE code challenge method"},{"name":"nonce","in":"query","required":false,"schema":{"type":"string"},"description":"OpenID Connect nonce"},{"name":"max_age","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"Maximum authentication age in seconds; forces re-authentication when exceeded"},{"name":"resource","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}},"description":"Requested protected resource(s) for the access token. May be supplied multiple times as repeated 'resource' query parameters (RFC 8707) or as an array of strings."},{"name":"prompt","in":"query","required":false,"schema":{"type":"string"},"description":"OAuth2 prompt parameter"}],"responses":{"302":{"description":"Redirect to client with code or error","headers":{"Location":{"description":"Redirect URI with code or error","schema":{"type":"string","format":"uri"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"error_description":{"type":"string"},"state":{"type":"string"}},"required":["error"]}}}},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/oauth2/consent":{"post":{"tags":["Oauth-provider"],"description":"Handle OAuth2 consent","security":[{"sessionCookie":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"accept":{"type":"boolean","description":"Accept or deny user consent for a set of scopes"},"scope":{"type":"string"},"claims":{"anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]},"oauth_query":{"type":"string"}},"required":["accept"]}}}},"responses":{"200":{"description":"Consent processed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"redirect":{"type":"boolean","description":"Always true. Indicates the caller should redirect to `url`.","enum":[true]},"url":{"type":"string","format":"uri-reference","description":"The absolute or relative URI to redirect to next."}},"required":["redirect","url"]}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/oauth2/continue":{"post":{"tags":["Oauth-provider"],"description":"Continues OAuth2 authorization flow","security":[{"sessionCookie":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"selected":{"type":"boolean"},"created":{"type":"boolean"},"postLogin":{"type":"boolean"},"oauth_query":{"type":"string"}}}}}},"responses":{"200":{"description":"Authorization flow continued successfully","content":{"application/json":{"schema":{"type":"object","properties":{"redirect":{"type":"boolean","description":"Always true. Indicates the caller should redirect to `url`.","enum":[true]},"url":{"type":"string","format":"uri-reference","description":"The absolute or relative URI to redirect to next."}},"required":["redirect","url"]}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/oauth2/token":{"post":{"tags":["Oauth-provider"],"description":"Obtain an OAuth2.1 access token","security":[],"parameters":[{"name":"DPoP","in":"header","required":false,"schema":{"type":"string"},"description":"RFC 9449 DPoP proof JWT for issuing DPoP-bound tokens"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"grant_type":{"type":"string","description":"OAuth2 grant type"},"client_id":{"type":"string","description":"OAuth2 client ID"},"client_secret":{"type":"string","description":"OAuth2 client secret"},"code":{"type":"string","description":"Authorization code (for authorization_code grant)"},"code_verifier":{"type":"string","description":"PKCE code verifier (for authorization_code grant)"},"redirect_uri":{"type":"string","format":"uri","description":"Redirect URI (for authorization_code grant)"},"refresh_token":{"type":"string","description":"Refresh token (for refresh_token grant)"},"resource":{"oneOf":[{"type":"string","description":"Single resource (URL)"},{"type":"array","items":{"type":"string"},"description":"Multiple resources (URLs)"}],"description":"Requested protected resource(s) for the access token"},"scope":{"type":"string","description":"Requested scopes (for client_credentials grant)"}},"required":["grant_type"]}}}},"responses":{"200":{"description":"Access token response","content":{"application/json":{"schema":{"type":"object","properties":{"access_token":{"type":"string","description":"The access token issued by the authorization server"},"token_type":{"type":"string","description":"The type of the token issued","enum":["Bearer","DPoP"]},"expires_in":{"type":"number","description":"Lifetime in seconds of the access token"},"refresh_token":{"type":"string","description":"Refresh token, if issued"},"scope":{"type":"string","description":"Scopes granted by the access token"},"id_token":{"type":"string","description":"ID Token (if OpenID Connect)"}},"required":["access_token","token_type","expires_in"]}}}},"400":{"description":"Invalid request or error response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"error_description":{"type":"string"},"error_uri":{"type":"string"}},"required":["error"]}}}},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/oauth2/introspect":{"post":{"tags":["Oauth-provider"],"description":"Introspect an OAuth2 access or refresh token","security":[{"clientBasic":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth2 client ID"},"client_secret":{"type":"string","description":"OAuth2 client secret"},"token":{"type":"string","description":"The token to introspect (access or refresh token)"},"token_type_hint":{"type":"string","description":"Hint about the token type. Recognized values: `access_token`, `refresh_token`."}},"required":["token"]}}}},"responses":{"200":{"description":"Token introspection response","content":{"application/json":{"schema":{"type":"object","properties":{"active":{"type":"boolean","description":"Whether the token is active"},"scope":{"type":"string","description":"Scopes associated with the token"},"client_id":{"type":"string","description":"Client ID associated with the token"},"username":{"type":"string","description":"Username associated with the token"},"token_type":{"type":"string","description":"Type of the token"},"exp":{"type":"number","description":"Expiration time of the token (seconds since epoch)"},"iat":{"type":"number","description":"Issued at time (seconds since epoch)"},"nbf":{"type":"number","description":"Not before time (seconds since epoch)"},"sub":{"type":"string","description":"Subject of the token"},"aud":{"type":"string","description":"Audience of the token"},"iss":{"type":"string","description":"Issuer of the token"},"jti":{"type":"string","description":"JWT ID"}},"required":["active"]}}}},"400":{"description":"Invalid request or error response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"error_description":{"type":"string"},"error_uri":{"type":"string"}},"required":["error"]}}}},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/oauth2/revoke":{"post":{"tags":["Oauth-provider"],"description":"Revoke an OAuth2 access or refresh token","security":[],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_id":{"type":"string","description":"OAuth2 client ID"},"client_secret":{"type":"string","description":"OAuth2 client secret"},"token":{"type":"string","description":"The token to revoke (access or refresh token)"},"token_type_hint":{"type":"string","description":"Hint about the token type. Recognized values: `access_token`, `refresh_token`."}},"required":["token"]}}}},"responses":{"200":{"description":"Token revoked successfully. The response body is empty.","content":{"application/json":{"schema":{"type":"object","description":"Empty object on success"}}}},"400":{"description":"Invalid request or error response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"error_description":{"type":"string"},"error_uri":{"type":"string"}},"required":["error"]}}}},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/oauth2/userinfo":{"get":{"tags":["Oauth-provider"],"description":"Get OpenID Connect user information (UserInfo endpoint)","security":[{"bearerAuth":[]}],"parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer or DPoP access token"},{"name":"DPoP","in":"header","required":false,"schema":{"type":"string"},"description":"RFC 9449 DPoP proof JWT when using a DPoP-bound access token"}],"responses":{"200":{"description":"User information retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"sub":{"type":"string","description":"Subject identifier (user ID)"},"email":{"type":"string","format":"email","nullable":true,"description":"User's email address, included if 'email' scope is granted"},"name":{"type":"string","nullable":true,"description":"User's full name, included if 'profile' scope is granted"},"picture":{"type":"string","format":"uri","nullable":true,"description":"User's profile picture URL, included if 'profile' scope is granted"},"given_name":{"type":"string","nullable":true,"description":"User's given name, included if 'profile' scope is granted"},"family_name":{"type":"string","nullable":true,"description":"User's family name, included if 'profile' scope is granted"},"email_verified":{"type":"boolean","nullable":true,"description":"Whether the email is verified, included if 'email' scope is granted"}},"required":["sub"]}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"description":"Unauthorized - invalid or missing access token","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"error_description":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Forbidden - insufficient scope","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"error_description":{"type":"string"}},"required":["error"]}}}},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}},"post":{"tags":["Oauth-provider"],"description":"Get OpenID Connect user information (UserInfo endpoint)","security":[{"bearerAuth":[]}],"parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer or DPoP access token"},{"name":"DPoP","in":"header","required":false,"schema":{"type":"string"},"description":"RFC 9449 DPoP proof JWT when using a DPoP-bound access token"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"access_token":{"type":"string"}}}}}},"responses":{"200":{"description":"User information retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"sub":{"type":"string","description":"Subject identifier (user ID)"},"email":{"type":"string","format":"email","nullable":true,"description":"User's email address, included if 'email' scope is granted"},"name":{"type":"string","nullable":true,"description":"User's full name, included if 'profile' scope is granted"},"picture":{"type":"string","format":"uri","nullable":true,"description":"User's profile picture URL, included if 'profile' scope is granted"},"given_name":{"type":"string","nullable":true,"description":"User's given name, included if 'profile' scope is granted"},"family_name":{"type":"string","nullable":true,"description":"User's family name, included if 'profile' scope is granted"},"email_verified":{"type":"boolean","nullable":true,"description":"Whether the email is verified, included if 'email' scope is granted"}},"required":["sub"]}}}},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"description":"Unauthorized - invalid or missing access token","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"error_description":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Forbidden - insufficient scope","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"error_description":{"type":"string"}},"required":["error"]}}}},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/oauth2/public-client":{"get":{"tags":["Oauth-provider"],"description":"Gets publicly available client fields","security":[{"sessionCookie":[]}],"parameters":[{"name":"client_id","in":"query","schema":{"type":"string"}}],"responses":{"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/oauth2/get-consent":{"get":{"tags":["Oauth-provider"],"description":"Gets details of a specific OAuth2 consent for a user","security":[{"sessionCookie":[]}],"parameters":[{"name":"id","in":"query","schema":{"type":"string"}}],"responses":{"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}},"/api/auth/oauth2/get-consents":{"get":{"tags":["Oauth-provider"],"description":"Gets all available OAuth2 consents for a user","security":[{"sessionCookie":[]}],"parameters":[],"responses":{"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Bad Request. Usually due to missing parameters, or invalid parameters."},"401":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"description":"Unauthorized. Due to missing or invalid authentication."},"403":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Forbidden. You do not have permission to access this resource or to perform this action."},"404":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Not Found. The requested resource was not found."},"429":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Too Many Requests. You have exceeded the rate limit. Try again later."},"500":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}},"description":"Internal Server Error. This is a problem with the server that you cannot fix."}}}}},"components":{"schemas":{"User":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"name":{"type":"string"},"email":{"type":"string"},"emailVerified":{"type":"boolean","default":false,"readOnly":true},"image":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","name","email","emailVerified","createdAt","updatedAt"]},"Session":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"expiresAt":{"type":"string","format":"date-time"},"token":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"ipAddress":{"type":"string"},"userAgent":{"type":"string"},"userId":{"type":"string"}},"required":["id","expiresAt","token","createdAt","updatedAt","userId"]},"Account":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"accountId":{"type":"string"},"providerId":{"type":"string"},"userId":{"type":"string"},"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"idToken":{"type":"string"},"accessTokenExpiresAt":{"type":"string","format":"date-time"},"refreshTokenExpiresAt":{"type":"string","format":"date-time"},"scope":{"type":"string"},"password":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","accountId","providerId","userId","createdAt","updatedAt"]},"Verification":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"identifier":{"type":"string"},"value":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","identifier","value","expiresAt","createdAt","updatedAt"]},"OauthClient":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"clientId":{"type":"string"},"clientSecret":{"type":"string"},"clientDiscoveryId":{"type":"string"},"disabled":{"type":"boolean","default":false},"skipConsent":{"type":"boolean"},"enableEndSession":{"type":"boolean"},"subjectType":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"clientCredentialsScopes":{"type":"array","items":{"type":"string"},"default":[]},"userId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"name":{"type":"string"},"uri":{"type":"string"},"icon":{"type":"string"},"contacts":{"type":"array","items":{"type":"string"}},"tos":{"type":"string"},"policy":{"type":"string"},"softwareId":{"type":"string"},"softwareVersion":{"type":"string"},"softwareStatement":{"type":"string"},"redirectUris":{"type":"array","items":{"type":"string"}},"postLogoutRedirectUris":{"type":"array","items":{"type":"string"}},"backchannelLogoutUri":{"type":"string"},"backchannelLogoutSessionRequired":{"type":"boolean"},"tokenEndpointAuthMethod":{"type":"string"},"applicationType":{"type":"string"},"jwks":{"type":"string"},"jwksUri":{"type":"string"},"grantTypes":{"type":"array","items":{"type":"string"}},"responseTypes":{"type":"array","items":{"type":"string"}},"requirePKCE":{"type":"boolean"},"dpopBoundAccessTokens":{"type":"boolean","default":false},"referenceId":{"type":"string"},"metadata":{"type":"json"}},"required":["id","clientId","redirectUris"]},"OauthResource":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"identifier":{"type":"string"},"name":{"type":"string"},"accessTokenTtl":{"type":"number"},"refreshTokenTtl":{"type":"number"},"signingAlgorithm":{"type":"string"},"signingKeyId":{"type":"string"},"allowedScopes":{"type":"array","items":{"type":"string"}},"customClaims":{"type":"json"},"dpopBoundAccessTokensRequired":{"type":"boolean","default":false},"disabled":{"type":"boolean","default":false},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"policyVersion":{"type":"number","default":1},"metadata":{"type":"json"}},"required":["id","identifier","name"]},"OauthClientResource":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"clientId":{"type":"string"},"resourceId":{"type":"string"},"metadata":{"type":"json"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","clientId","resourceId"]},"OauthRefreshToken":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"token":{"type":"string"},"clientId":{"type":"string"},"sessionId":{"type":"string"},"userId":{"type":"string"},"referenceId":{"type":"string"},"authorizationCodeId":{"type":"string"},"resources":{"type":"array","items":{"type":"string"}},"requestedUserInfoClaims":{"type":"array","items":{"type":"string"}},"expiresAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"revoked":{"type":"string","format":"date-time"},"rotatedAt":{"type":"string","format":"date-time"},"rotationReplayResponse":{"type":"string"},"rotationReplayExpiresAt":{"type":"string","format":"date-time"},"authTime":{"type":"string","format":"date-time"},"confirmation":{"type":"json"},"scopes":{"type":"array","items":{"type":"string"}}},"required":["id","token","clientId","userId","scopes"]},"OauthAccessToken":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"token":{"type":"string"},"clientId":{"type":"string"},"sessionId":{"type":"string"},"userId":{"type":"string"},"referenceId":{"type":"string"},"authorizationCodeId":{"type":"string"},"resources":{"type":"array","items":{"type":"string"}},"requestedUserInfoClaims":{"type":"array","items":{"type":"string"}},"refreshId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"revoked":{"type":"string","format":"date-time"},"confirmation":{"type":"json"},"scopes":{"type":"array","items":{"type":"string"}}},"required":["id","clientId","scopes"]},"OauthConsent":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"clientId":{"type":"string"},"userId":{"type":"string"},"referenceId":{"type":"string"},"resources":{"type":"array","items":{"type":"string"}},"requestedUserInfoClaims":{"type":"array","items":{"type":"string"}},"scopes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","clientId","scopes"]},"OauthClientAssertion":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"expiresAt":{"type":"string","format":"date-time"}},"required":["id","expiresAt"]},"RateLimit":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"key":{"type":"string"},"count":{"type":"number"},"lastRequest":{"type":"number"}},"required":["id","key","count","lastRequest"]}},"securitySchemes":{"clientBasic":{"type":"http","scheme":"basic"},"bearerAuth":{"type":"http","scheme":"bearer"},"sessionCookie":{"type":"apiKey","in":"cookie","name":"millennium-league.session_token"}}},"openapi":"3.1.2"}