{"openapi":"3.2.0","info":{"title":"SIGPAS — API des clubs","version":"1.4","description":"API HTTP JSON pour logiciels et agents IA. OAuth 2.0 client_credentials. Le parcours normal commence par GET /seasons, puis suit les collections de la saison choisie. Ce contrat décrit les champs disponibles pour ce club selon ses fonctionnalités activées. Conserver son cache par URL de club et revalider avec ETag ; une modification de configuration peut changer le contrat sans changer sa version. Les champs absents ne sont pas acceptés en écriture. Chaque accès est limité à un club et aux scopes configurés. Les créations et modifications exigent Idempotency-Key. Les dates-heures utilisent RFC 3339, les dates civiles YYYY-MM-DD. Les montants de paiements sont exprimés en centimes entiers ; les tarifs historiques des activités en euros entiers. Aucun serveur MCP n’est requis."},"servers":[{"url":"https://sigpas.fr/ugsp/api/v1"}],"externalDocs":{"url":"https://sigpas.fr/ugsp/api/v1/docs"},"x-sigpas-guide":{"start_path":"/seasons","path_convention":"Ajouter les chemins à la base API du club (qui se termine par /api/v1), y compris lorsqu’ils commencent par /. Remplacer {id} par l’identifiant choisi à cette étape.","concepts":{"Saison":"GET /seasons fournit une liste courte pour choisir son id et ses dates. Une saison peut chevaucher deux années civiles. Suivre detail_path pour les paramètres complets disponibles dans ce club (groups:read).","Commune":"GET /communes?postal_code=… fournit les communes du référentiel SIGPAS, comme le formulaire adhérent. Utiliser exactement city_code, y compris les particularités locales ; ne pas déduire un code INSEE du code postal.","Personne":"/members/{id} est une fiche du club, conservée entre les saisons. Créer une fiche ne crée aucune inscription.","Adhérent de la saison":"/seasons/{id}/members contient les personnes ayant au moins une inscription annuelle validée, sans doublon. Les participants uniquement inscrits à un événement en sont exclus.","Groupe ou événement":"Chaque groupe et événement appartient à une saison. Suivre son members_path pour lire ses participants validés.","Inscription":"Lien entre une personne et un groupe ou événement. Son état valid vaut null (en attente), true (validée) ou false (refusée).","Séance":"Occurrence datée d’un cours, créneau ou événement, identifiée par date, type et course_id. Utiliser /attendance pour les personnes attendues à une date précise."},"workflows":[{"intent":"Consulter ou modifier les paramètres d’une saison","steps":[{"method":"GET","path":"/seasons","instruction":"Choisir la saison dans la liste courte.","required_scopes":[]},{"method":"GET","path":"/seasons/{id}","instruction":"Suivre detail_path pour lire les paramètres disponibles pour ce club.","required_scopes":["groups:read"]},{"method":"PATCH","path":"/seasons/{id}","instruction":"Fournir uniquement les champs à modifier, décrits dans le contrat du club, avec Idempotency-Key.","required_scopes":["groups:write"]}]},{"intent":"Renseigner la commune d’une personne ou la priorité géographique d’une saison","steps":[{"method":"GET","path":"/communes","instruction":"Fournir postal_code sur cinq chiffres ; choisir la commune parmi les résultats et reprendre exactement city_code.","required_scopes":[]}]},{"intent":"Lister les adhérents d’une saison","steps":[{"method":"GET","path":"/seasons","instruction":"Choisir la saison demandée d’après ses dates.","required_scopes":[]},{"method":"GET","path":"/seasons/{id}/members","instruction":"Suivre members_path et toute la pagination.","required_scopes":["groups:read","members:read"]}]},{"intent":"Lister les participants d’un groupe","steps":[{"method":"GET","path":"/seasons","instruction":"Choisir la saison demandée.","required_scopes":[]},{"method":"GET","path":"/seasons/{id}/groups","instruction":"Suivre groups_path et choisir le groupe.","required_scopes":["groups:read"]},{"method":"GET","path":"/groups/{id}/members","instruction":"Suivre le members_path du groupe choisi.","required_scopes":["groups:read","members:read"]}]},{"intent":"Lister les participants d’un événement","steps":[{"method":"GET","path":"/seasons","instruction":"Choisir la saison demandée.","required_scopes":[]},{"method":"GET","path":"/seasons/{id}/events","instruction":"Suivre events_path et choisir l’événement.","required_scopes":["events:read"]},{"method":"GET","path":"/events/{id}/members","instruction":"Suivre le members_path de l’événement choisi.","required_scopes":["events:read","registrations:read","members:read"]}]},{"intent":"Trouver les groupes d’un jour de la semaine","steps":[{"method":"GET","path":"/seasons","instruction":"Choisir la saison demandée.","required_scopes":[]},{"method":"POST","path":"/groups/search","instruction":"Fournir season_id et day, par exemple mardi. Il s’agit des horaires habituels ; pour une date précise, utiliser le parcours des séances.","required_scopes":["groups:read"]}]},{"intent":"Retrouver une personne et ses inscriptions","steps":[{"method":"GET","path":"/seasons","instruction":"Choisir la saison demandée.","required_scopes":[]},{"method":"POST","path":"/members/search","instruction":"Fournir season_id et query (nom ou email du membre ou parent). La recherche porte sur les adhérents validés de la saison.","required_scopes":["members:read","groups:read"]},{"method":"GET","path":"/members/{id}/registrations","instruction":"Suivre registrations_path pour les inscriptions annuelles et événementielles, y compris celles en attente ou refusées.","required_scopes":["members:read","registrations:read"]}]},{"intent":"Consulter les séances et participants d’une date","steps":[{"method":"GET","path":"/attendance","instruction":"Fournir date au format YYYY-MM-DD pour lister les séances.","required_scopes":["attendance:read"]},{"method":"GET","path":"/attendance","instruction":"Conserver date, ajouter type et course_id de la séance choisie pour lire les participants attendus et leur présence.","required_scopes":["attendance:read"]}]},{"intent":"Consulter les présences d’une personne","steps":[{"method":"GET","path":"/members/{id}/attendance","instruction":"Après identification dans la saison, suivre attendance_path. season_id est obligatoire. Une présence non renseignée ne signifie pas une absence.","required_scopes":["members:read","attendance:read"]}]},{"intent":"Faire l’appel","steps":[{"method":"GET","path":"/attendance","instruction":"Choisir la séance à la date voulue, puis lire ses participants avec date, type et course_id.","required_scopes":["attendance:read"]},{"method":"POST","path":"/attendance","instruction":"Fournir date, type, course_id, member_id et presence, avec une clé Idempotency-Key unique par écriture.","required_scopes":["attendance:write"]}]}],"club_contract":"Lire openapi.json à l’URL du club concerné : les champs dépendent des fonctionnalités activées. Conserver le contrat et son ETag par URL de club, puis revalider avec If-None-Match. Un changement de configuration peut modifier le contrat sans changer sa version. Les permissions de l’intégration sont indiquées dans GET /context ; elles restent nécessaires pour les opérations disponibles.","global_exports":"GET /members?all=true contient toutes les fiches, y compris sans inscription et des anciennes saisons. Ne choisir cet export que si toutes les fiches sont explicitement demandées. Utiliser aussi all=true sur GET /groups et GET /events pour couvrir toutes les saisons. Depuis le contrat 1.4, l’absence de all reste acceptée avec HTTP 200, les mêmes données et la même pagination, mais cet usage est déprécié (en-têtes Deprecation et Link rel=\"deprecation\"). Aucune date de suppression n’est fixée."},"security":[{"oauth2":[]}],"tags":[{"name":"discovery","description":"Découverte de l’API, documentation et authentification OAuth 2.0."},{"name":"seasonal","description":"Parcours principal : choisir une saison, puis consulter ses adhérents, groupes et événements."},{"name":"members","description":"Fiches de personnes conservées entre les saisons. Une fiche seule ne constitue pas une adhésion."},{"name":"registrations","description":"Demandes annuelles ou ponctuelles, activité demandée, dates et état de validation. Les informations médicales et le détail des paiements sont exclus. Création, modification, validation, refus ou annulation d’une inscription."},{"name":"groups","description":"Paramètres des saisons, sports, groupes, créneaux, horaires, lieux, capacités et règles d’inscription. La liste nominative des inscrits nécessite aussi l’accès aux adhérents. Création, modification et suppression des saisons ; création et modification des groupes, créneaux, horaires, lieux et capacités."},{"name":"events","description":"Événements, dates, lieux, capacités, tarifs et paramètres d’inscription. Les participants relèvent des accès aux inscriptions et aux adhérents. Création, modification et suppression des événements et de leurs paramètres."},{"name":"attendance","description":"Séances à appeler, participants attendus et statuts de présence, d’absence ou d’absence excusée. L’accès aux fiches complètes des participants nécessite aussi l’accès aux adhérents. Saisie et correction du statut de présence d’un participant pour un cours, un créneau ou un événement."},{"name":"payments","description":"Montants, dates, modes, états et affectations aux inscriptions. Les numéros de carte et coordonnées bancaires ne sont pas inclus. Enregistrement, correction, affectation et suppression des paiements dans SIGPAS."},{"name":"documents","description":"Métadonnées et contenu des documents déposés ou générés. Ces fichiers peuvent contenir des données personnelles sensibles. Dépôt, remplacement et suppression de documents."},{"name":"medical","description":"Attestations de questionnaire de santé, certificats médicaux, dates, types, décisions de validation et suivi par saison. Enregistrement des attestations et certificats, puis validation ou refus des pièces médicales."},{"name":"staff_hours","description":"Relevés mensuels validés par le personnel, avec leurs dates, durées et descriptions. La saisie et la validation restent réservées au membre du personnel dans SIGPAS."},{"name":"exports","description":"Exports globaux explicites, couvrant toutes les saisons."}],"paths":{"/":{"get":{"operationId":"get_","summary":"GET /","tags":["discovery"],"security":[],"parameters":[],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/openapi.json":{"get":{"operationId":"get_openapi_json","summary":"GET /openapi.json","tags":["discovery"],"security":[],"parameters":[],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/docs":{"get":{"operationId":"get_docs","summary":"GET /docs","tags":["discovery"],"security":[],"parameters":[],"responses":{"200":{"description":"Succès","content":{"text/html":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/changes":{"get":{"operationId":"get_changes","summary":"Consulter les changements du contrat API","tags":["discovery"],"security":[],"parameters":[{"name":"since","in":"query","required":false,"description":"Dernière version du contrat connue par le client. Valeur par défaut : 0.0.","schema":{"type":"string","pattern":"^[0-9]+\\.[0-9]+(?:\\.[0-9]+)?$"}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiChanges"}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Retourne un résumé sémantique des évolutions du contrat API postérieures à la version indiquée."}},"/oauth-authorization-server":{"get":{"operationId":"get_oauth-authorization-server","summary":"GET /oauth-authorization-server","tags":["discovery"],"security":[],"parameters":[],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/oauth-protected-resource":{"get":{"operationId":"get_oauth-protected-resource","summary":"GET /oauth-protected-resource","tags":["discovery"],"security":[],"parameters":[],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/webhook-schema.json":{"get":{"operationId":"get_webhook-schema_json","summary":"GET /webhook-schema.json","tags":["discovery"],"security":[],"parameters":[],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/staff-hours/{id}":{"get":{"operationId":"get_staff-hours_id","summary":"GET /staff-hours/{id}","tags":["staff_hours"],"security":[{"oauth2":["staff_hours:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"month","in":"query","required":true,"schema":{"type":"string","pattern":"^[12][0-9]{3}-(0[1-9]|1[0-2])$"}},{"name":"after","in":"query","schema":{"type":"integer","minimum":0,"default":0}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"object","required":["member_id","month","submitted","total_seconds","entries"],"properties":{"member_id":{"type":"integer"},"month":{"type":"string"},"submitted":{"const":true},"total_seconds":{"type":"integer"},"entries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"begin":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"duration_seconds":{"type":"integer"},"information":{"type":["string","null"]}}}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Heures du mois validé par le personnel, avec total_seconds et entries paginées. 404 si le mois n’est pas validé ; 403 si la fonctionnalité est désactivée."}},"/token":{"post":{"operationId":"post_token","summary":"POST /token","tags":["discovery"],"security":[],"parameters":[],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["access_token","token_type","expires_in","scope"],"properties":{"access_token":{"type":"string"},"token_type":{"type":"string","const":"Bearer"},"expires_in":{"type":"integer","const":600},"scope":{"type":"string"}}}}}},"default":{"$ref":"#/components/responses/OAuthError"}},"description":"OAuth 2.0 client_credentials. Authentification client_secret_basic (HTTP Basic), client_secret_post ou private_key_jwt RS256. Utiliser une seule méthode. JWT : iss=sub=client_id, aud=URL canonique du token, iat/exp entiers, durée maximale 300 s, jti unique de 16 à 191 caractères, non réutilisable. Jeton opaque valable 600 s. Limite : 30 requêtes/minute/IP/club. Si l’API du club est désactivée, la réponse 403 contient unauthorized_client et error_uri vers les instructions d’activation.","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["grant_type"],"properties":{"grant_type":{"type":"string","readOnly":true,"description":"Chemin à appeler avec GET, relatif à la base /api/v1 du club.","const":"client_credentials"},"client_id":{"type":"string","readOnly":true,"description":"Chemin à appeler avec GET, relatif à la base /api/v1 du club."},"client_secret":{"type":"string","readOnly":true,"description":"Chemin à appeler avec GET, relatif à la base /api/v1 du club."},"client_assertion_type":{"type":"string","readOnly":true,"description":"Chemin à appeler avec GET, relatif à la base /api/v1 du club.","const":"urn:ietf:params:oauth:client-assertion-type:jwt-bearer"},"client_assertion":{"type":"string","readOnly":true,"description":"Chemin à appeler avec GET, relatif à la base /api/v1 du club."},"scope":{"type":"string","readOnly":true,"description":"Chemin à appeler avec GET, relatif à la base /api/v1 du club."}}}}}}}},"/context":{"get":{"operationId":"get_context","summary":"GET /context","tags":["discovery"],"security":[{"oauth2":[]}],"parameters":[],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["status","club","start_path","integration"],"properties":{"status":{"type":"string","const":"ok"},"club":{"type":"string"},"start_path":{"type":"string","const":"/seasons"},"guide":{"type":"object","description":"Concepts et parcours décrits dans x-sigpas-guide."},"integration":{"type":"object","required":["client_id","name","permissions"],"properties":{"client_id":{"type":"string"},"name":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/attendance":{"get":{"operationId":"get_attendance","summary":"Consulter les séances ou participants d’une date","tags":["attendance"],"security":[{"oauth2":["attendance:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"offset","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}},{"name":"date","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["lesson","slot","event"]}},{"name":"course_id","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"oneOf":[{"type":"object","required":["type","id","date","title","begin","end","location","can_take_attendance"],"properties":{"type":{"type":"string","enum":["lesson","slot","event"]},"id":{"type":"integer"},"date":{"type":"string","format":"date"},"title":{"type":"string"},"begin":{"type":"string"},"end":{"type":"string"},"location":{"type":"string"},"can_take_attendance":{"type":"boolean"}}},{"type":"object","required":["id","first_name","last_name","presence"],"properties":{"id":{"type":"integer"},"first_name":{"type":"string"},"last_name":{"type":"string"},"presence":{"type":["string","null"],"enum":["present","absent","excused",null]}}}]}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_offset":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Liste les séances à une date. Fournir type et course_id pour obtenir les participants attendus et leur présence."},"post":{"operationId":"post_attendance","summary":"Renseigner la présence d’un participant à une séance","tags":["attendance"],"security":[{"oauth2":["attendance:write"]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["date","type","course_id","member_id","presence"],"properties":{"date":{"type":"string","format":"date"},"type":{"type":"string","enum":["lesson","slot","event"]},"course_id":{"type":"integer","minimum":1,"maximum":2147483647},"member_id":{"type":"integer","minimum":1,"maximum":2147483647},"presence":{"type":"string","enum":["present","absent","excused"]}}}}}}}},"/seasons":{"get":{"operationId":"get_seasons","summary":"Lister les saisons du club en format court","tags":["seasonal"],"security":[{"oauth2":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"description":"Identifiant stable de la saison, attribué par SIGPAS.","readOnly":true},"name":{"type":["string","null"],"maxLength":255,"description":"Nom affiché de la saison.","examples":["2026–2027"]},"start_date":{"type":["string","null"],"format":"date","description":"Premier jour de la saison.","examples":["2026-09-01"]},"end_date":{"type":["string","null"],"format":"date","description":"Dernier jour de la saison, inclus.","examples":["2027-08-31"]},"registration_start":{"type":["string","null"],"format":"date","description":"Ouverture générale des inscriptions."},"registration_end":{"type":["string","null"],"format":"date","description":"Dernier jour des inscriptions, inclus."},"detail_path":{"type":"string","readOnly":true,"description":"Chemin à appeler avec GET, relatif à la base /api/v1 du club."},"members_path":{"type":"string","readOnly":true,"description":"Chemin à appeler avec GET, relatif à la base /api/v1 du club."},"groups_path":{"type":"string","readOnly":true,"description":"Chemin à appeler avec GET, relatif à la base /api/v1 du club."},"events_path":{"type":"string","readOnly":true,"description":"Chemin à appeler avec GET, relatif à la base /api/v1 du club."}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Point de départ des parcours par saison. Chaque saison expose members_path, groups_path et events_path, avec uniquement son nom et ses dates principales. detail_path mène aux paramètres complets et exige groups:read. Choisissez la saison dont les dates correspondent au besoin, puis suivez ces chemins plutôt que les collections globales."},"post":{"operationId":"post_seasons","summary":"Créer une saison","tags":["seasonal"],"security":[{"oauth2":["groups:write"]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"201":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Crée une saison. Les options omises prennent les valeurs par défaut du schéma. Les dates de fin doivent suivre ou égaler les débuts correspondants ; les ouvertures prioritaires doivent précéder ou égaler l’ouverture générale. city_registration_start exige city_code.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"name":{"type":"string","minLength":2,"maxLength":255,"description":"Nom affiché de la saison.","examples":["2026–2027"]},"start_date":{"type":"string","format":"date","description":"Premier jour de la saison.","examples":["2026-09-01"]},"end_date":{"type":"string","format":"date","description":"Dernier jour de la saison, inclus.","examples":["2027-08-31"]},"registration_start":{"type":"string","format":"date","description":"Ouverture générale des inscriptions."},"registration_end":{"type":"string","format":"date","description":"Dernier jour des inscriptions, inclus."},"membership_cost_euros":{"type":"integer","minimum":0,"maximum":10000000,"default":0,"description":"Coût de l’adhésion à la saison, en euros entiers, hors tarifs des groupes et licences proposées."},"previous_registration_start":{"type":["string","null"],"format":"date","default":null,"description":"Ouverture prioritaire pour les anciens adhérents. null utilise l’ouverture générale."},"previous_registration_all":{"type":"boolean","default":false,"description":"true étend la priorité à tous les anciens inscrits, saisons et événements ; false la limite aux adhérents de la saison précédente."},"city_registration_start":{"type":["string","null"],"format":"date","default":null,"description":"Ouverture prioritaire pour la commune désignée par city_code. null utilise l’ouverture générale."},"city_code":{"type":["string","null"],"minLength":5,"maxLength":5,"default":null,"description":"Code de la commune bénéficiant de la priorité. Reprendre exactement city_code de GET /communes?postal_code=… ; null désactive la priorité géographique."},"max_annual_registrations":{"type":"integer","minimum":0,"maximum":2147483647,"default":0,"description":"Nombre maximum d’inscriptions annuelles par adhérent dans cette saison. 0 signifie illimité."},"licence_immediate_payment":{"type":"boolean","default":false,"description":"Lors d’un paiement échelonné, inclure le montant restant des licences dans la première échéance."}},"required":["name","start_date","end_date","registration_start","registration_end"]}}}}}},"/seasons/{id}":{"get":{"operationId":"get_seasons_id","summary":"Consulter tous les paramètres disponibles d’une saison","tags":["seasonal"],"security":[{"oauth2":["groups:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"description":"Identifiant stable de la saison, attribué par SIGPAS.","readOnly":true},"name":{"type":["string","null"],"maxLength":255,"description":"Nom affiché de la saison.","examples":["2026–2027"]},"start_date":{"type":["string","null"],"format":"date","description":"Premier jour de la saison.","examples":["2026-09-01"]},"end_date":{"type":["string","null"],"format":"date","description":"Dernier jour de la saison, inclus.","examples":["2027-08-31"]},"registration_start":{"type":["string","null"],"format":"date","description":"Ouverture générale des inscriptions."},"registration_end":{"type":["string","null"],"format":"date","description":"Dernier jour des inscriptions, inclus."},"membership_cost_euros":{"type":["integer","null"],"maximum":10000000,"default":0,"description":"Coût de l’adhésion à la saison, en euros entiers, hors tarifs des groupes et licences proposées."},"previous_registration_start":{"type":["string","null"],"format":"date","default":null,"description":"Ouverture prioritaire pour les anciens adhérents. null utilise l’ouverture générale."},"previous_registration_all":{"type":["boolean","null"],"default":false,"description":"true étend la priorité à tous les anciens inscrits, saisons et événements ; false la limite aux adhérents de la saison précédente."},"city_registration_start":{"type":["string","null"],"format":"date","default":null,"description":"Ouverture prioritaire pour la commune désignée par city_code. null utilise l’ouverture générale."},"city_code":{"type":["string","null"],"maxLength":5,"default":null,"description":"Code de la commune bénéficiant de la priorité. Reprendre exactement city_code de GET /communes?postal_code=… ; null désactive la priorité géographique."},"max_annual_registrations":{"type":["integer","null"],"maximum":2147483647,"default":0,"description":"Nombre maximum d’inscriptions annuelles par adhérent dans cette saison. 0 signifie illimité."},"licence_immediate_payment":{"type":["boolean","null"],"default":false,"description":"Lors d’un paiement échelonné, inclure le montant restant des licences dans la première échéance."},"detail_path":{"type":"string","readOnly":true,"description":"Chemin à appeler avec GET, relatif à la base /api/v1 du club."},"members_path":{"type":"string","readOnly":true,"description":"Chemin à appeler avec GET, relatif à la base /api/v1 du club."},"groups_path":{"type":"string","readOnly":true,"description":"Chemin à appeler avec GET, relatif à la base /api/v1 du club."},"events_path":{"type":"string","readOnly":true,"description":"Chemin à appeler avec GET, relatif à la base /api/v1 du club."}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Détail des paramètres de la saison disponibles pour ce club. Nécessite groups:read."},"patch":{"operationId":"patch_seasons_id","summary":"Modifier une saison","tags":["seasonal"],"security":[{"oauth2":["groups:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Modifie les champs fournis et conserve les champs omis. null réinitialise une ouverture prioritaire à l’ouverture générale. Pour retirer la priorité géographique, mettre city_code et city_registration_start à null. Les règles de dates de la création s’appliquent aussi après modification.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"name":{"type":"string","minLength":2,"maxLength":255,"description":"Nom affiché de la saison.","examples":["2026–2027"]},"start_date":{"type":"string","format":"date","description":"Premier jour de la saison.","examples":["2026-09-01"]},"end_date":{"type":"string","format":"date","description":"Dernier jour de la saison, inclus.","examples":["2027-08-31"]},"registration_start":{"type":"string","format":"date","description":"Ouverture générale des inscriptions."},"registration_end":{"type":"string","format":"date","description":"Dernier jour des inscriptions, inclus."},"membership_cost_euros":{"type":"integer","minimum":0,"maximum":10000000,"default":0,"description":"Coût de l’adhésion à la saison, en euros entiers, hors tarifs des groupes et licences proposées."},"previous_registration_start":{"type":["string","null"],"format":"date","default":null,"description":"Ouverture prioritaire pour les anciens adhérents. null utilise l’ouverture générale."},"previous_registration_all":{"type":"boolean","default":false,"description":"true étend la priorité à tous les anciens inscrits, saisons et événements ; false la limite aux adhérents de la saison précédente."},"city_registration_start":{"type":["string","null"],"format":"date","default":null,"description":"Ouverture prioritaire pour la commune désignée par city_code. null utilise l’ouverture générale."},"city_code":{"type":["string","null"],"minLength":5,"maxLength":5,"default":null,"description":"Code de la commune bénéficiant de la priorité. Reprendre exactement city_code de GET /communes?postal_code=… ; null désactive la priorité géographique."},"max_annual_registrations":{"type":"integer","minimum":0,"maximum":2147483647,"default":0,"description":"Nombre maximum d’inscriptions annuelles par adhérent dans cette saison. 0 signifie illimité."},"licence_immediate_payment":{"type":"boolean","default":false,"description":"Lors d’un paiement échelonné, inclure le montant restant des licences dans la première échéance."}},"required":[]}}}}},"delete":{"operationId":"delete_seasons_id","summary":"Supprimer une saison","tags":["seasonal"],"security":[{"oauth2":["groups:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Supprime la saison. Répond 409 season_in_use si des données liées empêchent la suppression (groupes, événements, créneaux, paiements, licences, etc.). Les données liées configurées en suppression en cascade sont supprimées avec elle."}},"/communes":{"get":{"operationId":"get_communes","summary":"Rechercher les communes SIGPAS par code postal","tags":["discovery"],"security":[{"oauth2":[]}],"parameters":[{"name":"postal_code","in":"query","required":true,"schema":{"type":"string","pattern":"^[0-9]{5}$","examples":["20167","98830"]}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["city_code","name","postal_code"],"properties":{"city_code":{"type":"string","description":"Identifiant exact du référentiel SIGPAS à utiliser dans members.city_code ou seasons.city_code. Ne pas le recalculer ni le normaliser.","examples":["2A004"]},"name":{"type":"string","description":"Nom de la commune proposé dans le formulaire adhérent."},"postal_code":{"type":"string","description":"Code postal recherché, conservé comme chaîne avec ses éventuels zéros initiaux.","examples":["20167"]}}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Recherche exacte par code postal dans le même référentiel SIGPAS que le formulaire adhérent, avec ses alias et particularités locales. Tous les résultats sont renvoyés, sans pagination ; un code postal inconnu renvoie data: []. Reprendre city_code sans le normaliser."}},"/seasons/{id}/members":{"get":{"operationId":"get_seasons_id_members","summary":"Lister les adhérents inscrits dans une saison","tags":["seasonal"],"security":[{"oauth2":["groups:read","members:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647,"readOnly":true,"description":"Identifiant de la fiche personne, stable entre les saisons. Une fiche ne constitue pas une inscription."},"email":{"type":["string","null"],"format":"email","maxLength":127,"description":"Adresse email de la personne. Un changement réinitialise sa validation."},"first_name":{"type":["string","null"],"maxLength":63,"description":"Prénom de la personne."},"last_name":{"type":["string","null"],"maxLength":63,"description":"Nom de famille de la personne."},"phone":{"type":["string","null"],"maxLength":15,"description":"Téléphone de la personne ; null signifie non renseigné et efface la valeur en écriture."},"birth_date":{"type":["string","null"],"format":"date","description":"Date de naissance au format YYYY-MM-DD ; null signifie non renseignée et efface la valeur en écriture."},"sex":{"type":["string","null"],"enum":["Homme","Femme",null],"description":"Sexe renseigné dans la fiche ; null signifie non renseigné et efface la valeur en écriture."},"city_code":{"type":["string","null"],"maxLength":5,"description":"Code de commune du référentiel SIGPAS. Reprendre exactement city_code de GET /communes?postal_code=… ; ce n’est pas un code postal. null signifie non renseigné et efface la valeur en écriture."},"address":{"type":["string","null"],"maxLength":10000,"description":"Adresse de la personne, hors commune ; null signifie non renseignée et efface la valeur en écriture."},"email_verified":{"type":["boolean","null"],"readOnly":true,"description":"Indique si l’adresse email a été validée. Champ en lecture seule."},"created_at":{"type":["string","null"],"format":"date-time","readOnly":true,"description":"Date et heure de création de la fiche, en RFC 3339 ; null si inconnue. Champ en lecture seule."},"parents":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"type":["string","null"],"enum":["Pere","Mere","Institution","Responsable_legal","Famille_accueil","Sans_objet",null],"description":"Lien du représentant avec la personne : père, mère, institution, responsable légal, famille d’accueil ou sans objet."},"first_name":{"type":["string","null"],"maxLength":63,"description":"Prénom du représentant."},"last_name":{"type":["string","null"],"maxLength":63,"description":"Nom du représentant."},"title":{"type":["string","null"],"maxLength":63,"description":"Intitulé du représentant ou de l’institution."},"phone":{"type":["string","null"],"maxLength":15,"description":"Téléphone du représentant."},"email":{"type":["string","null"],"maxLength":127,"description":"Adresse email du représentant."},"profession":{"type":["string","null"],"maxLength":127,"description":"Profession du représentant."}}},"description":"Représentants légaux. En écriture, remplace toute la liste ; [] supprime tous les représentants. Un champ parents omis conserve la liste existante. Deux représentants au maximum en écriture."},"season_id":{"type":"integer"},"registrations":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","group_id","group_name","season_id","valid"],"properties":{"id":{"type":"integer"},"group_id":{"type":"integer"},"group_name":{"type":"string"},"season_id":{"type":"integer"},"valid":{"type":"boolean","const":true}}}},"registrations_path":{"type":"string"},"attendance_path":{"type":"string"}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Liste paginée et sans doublon des adhérents ayant au moins une inscription annuelle validée dans la saison. Les personnes sans inscription validée ne sont jamais renvoyées. Chaque adhérent contient ses inscriptions de la saison et les chemins vers ses inscriptions et présences."}},"/seasons/{id}/groups":{"get":{"operationId":"get_seasons_id_groups","summary":"Lister les groupes d’une saison","tags":["seasonal"],"security":[{"oauth2":["groups:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"name":{"type":["string","null"],"maxLength":255},"season_id":{"type":["integer","null"],"maximum":2147483647},"sport_id":{"type":["integer","null"],"maximum":2147483647},"description":{"type":["string","null"],"maxLength":10000},"sex":{"type":["string","null"],"enum":["Homme","Femme","Homme et femme",null]},"type":{"type":["string","null"],"enum":["Loisir","Intermediaire","Competition",null]},"capacity":{"type":["integer","null"],"maximum":100000},"birth_year_start":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"birth_year_end":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"auto_validate":{"type":["boolean","null"]},"invitation_only":{"type":["boolean","null"]},"cost_euros":{"type":["integer","null"],"maximum":10000000,"description":"Montant en euros entiers."},"slot_count":{"type":["integer","null"],"maximum":100},"slot_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100},"licence_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100},"season_path":{"type":"string"},"members_path":{"type":"string"}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Liste paginée des groupes de la saison. Chaque groupe expose members_path."}},"/seasons/{id}/events":{"get":{"operationId":"get_seasons_id_events","summary":"Lister les événements d’une saison","tags":["seasonal"],"security":[{"oauth2":["events:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"name":{"type":["string","null"],"maxLength":255},"season_id":{"type":["integer","null"],"maximum":2147483647},"sport_id":{"type":["integer","null"],"maximum":2147483647},"description":{"type":["string","null"],"maxLength":10000},"begin":{"type":["string","null"],"format":"date-time"},"end":{"type":["string","null"],"format":"date-time"},"location":{"type":["string","null"],"maxLength":10000},"capacity":{"type":["integer","null"],"maximum":100000},"registration_deadline":{"type":["string","null"],"format":"date"},"registration_opening":{"type":["string","null"],"format":"date"},"birth_year_start":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"birth_year_end":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"cost_euros":{"type":["integer","null"],"maximum":10000000,"description":"Montant en euros entiers."},"external_access":{"type":["boolean","null"]},"external_cost_euros":{"type":["integer","null"],"maximum":10000000,"description":"Montant en euros entiers."},"membership_required":{"type":["boolean","null"]},"auto_validate":{"type":["boolean","null"]},"pre_registration_required":{"type":["boolean","null"]},"external_registration":{"type":["boolean","null"]},"season_path":{"type":"string"},"members_path":{"type":"string"}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Liste paginée des événements de la saison. Chaque événement expose members_path."}},"/members":{"get":{"operationId":"get_members","summary":"Exporter toutes les fiches de personnes, inscrites ou non","tags":["exports"],"security":[{"oauth2":["members:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}},{"name":"all","in":"query","required":false,"description":"Confirmation explicite d’un export exceptionnel couvrant toutes les saisons. L’omission reste acceptée mais est dépréciée ; les réponses portent Deprecation et Link rel=\"deprecation\".","schema":{"type":"boolean","const":true}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647,"readOnly":true,"description":"Identifiant de la fiche personne, stable entre les saisons. Une fiche ne constitue pas une inscription."},"email":{"type":["string","null"],"format":"email","maxLength":127,"description":"Adresse email de la personne. Un changement réinitialise sa validation."},"first_name":{"type":["string","null"],"maxLength":63,"description":"Prénom de la personne."},"last_name":{"type":["string","null"],"maxLength":63,"description":"Nom de famille de la personne."},"phone":{"type":["string","null"],"maxLength":15,"description":"Téléphone de la personne ; null signifie non renseigné et efface la valeur en écriture."},"birth_date":{"type":["string","null"],"format":"date","description":"Date de naissance au format YYYY-MM-DD ; null signifie non renseignée et efface la valeur en écriture."},"sex":{"type":["string","null"],"enum":["Homme","Femme",null],"description":"Sexe renseigné dans la fiche ; null signifie non renseigné et efface la valeur en écriture."},"city_code":{"type":["string","null"],"maxLength":5,"description":"Code de commune du référentiel SIGPAS. Reprendre exactement city_code de GET /communes?postal_code=… ; ce n’est pas un code postal. null signifie non renseigné et efface la valeur en écriture."},"address":{"type":["string","null"],"maxLength":10000,"description":"Adresse de la personne, hors commune ; null signifie non renseignée et efface la valeur en écriture."},"email_verified":{"type":["boolean","null"],"readOnly":true,"description":"Indique si l’adresse email a été validée. Champ en lecture seule."},"created_at":{"type":["string","null"],"format":"date-time","readOnly":true,"description":"Date et heure de création de la fiche, en RFC 3339 ; null si inconnue. Champ en lecture seule."},"parents":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"type":["string","null"],"enum":["Pere","Mere","Institution","Responsable_legal","Famille_accueil","Sans_objet",null],"description":"Lien du représentant avec la personne : père, mère, institution, responsable légal, famille d’accueil ou sans objet."},"first_name":{"type":["string","null"],"maxLength":63,"description":"Prénom du représentant."},"last_name":{"type":["string","null"],"maxLength":63,"description":"Nom du représentant."},"title":{"type":["string","null"],"maxLength":63,"description":"Intitulé du représentant ou de l’institution."},"phone":{"type":["string","null"],"maxLength":15,"description":"Téléphone du représentant."},"email":{"type":["string","null"],"maxLength":127,"description":"Adresse email du représentant."},"profession":{"type":["string","null"],"maxLength":127,"description":"Profession du représentant."}}},"description":"Représentants légaux. En écriture, remplace toute la liste ; [] supprime tous les représentants. Un champ parents omis conserve la liste existante. Deux représentants au maximum en écriture."}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}},"headers":{"Deprecation":{"description":"Présent uniquement sans all. Date de dépréciation au format RFC 9745 (@ suivi du timestamp Unix).","schema":{"type":"string","pattern":"^@[0-9]+$"}},"Link":{"description":"Sans all, ajoute un lien rel=\"deprecation\" vers la migration aux liens de découverte.","schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Export global exceptionnel de toutes les saisons. Utiliser all=true sur chaque page. Sans ce paramètre, la réponse reste HTTP 200 avec les mêmes données et la même pagination, mais les en-têtes Deprecation et Link rel=\"deprecation\" signalent cet usage déprécié. Aucune date de suppression n’est fixée. Pour une lecture métier normale, commencez par GET /seasons et suivez le chemin saisonnier correspondant. Cette collection contient toutes les fiches de personnes du club, y compris celles sans inscription. Elle ne représente pas les adhérents d’une saison."},"post":{"operationId":"post_members","summary":"Créer une fiche de personne sans l’inscrire","tags":["members"],"security":[{"oauth2":["members:write"]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"201":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Crée la fiche d’une personne dans le club. Pour l’inscrire, créer ensuite une inscription annuelle avec member_id et group_id, ou événementielle avec member_id et event_id. La création de la fiche ne crée aucune inscription.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"email":{"type":"string","format":"email","maxLength":127,"description":"Adresse email de la personne. Un changement réinitialise sa validation."},"first_name":{"type":"string","minLength":1,"maxLength":63,"description":"Prénom de la personne."},"last_name":{"type":"string","minLength":1,"maxLength":63,"description":"Nom de famille de la personne."},"phone":{"type":["string","null"],"maxLength":15,"description":"Téléphone de la personne ; null signifie non renseigné et efface la valeur en écriture."},"birth_date":{"type":["string","null"],"format":"date","description":"Date de naissance au format YYYY-MM-DD ; null signifie non renseignée et efface la valeur en écriture."},"sex":{"type":["string","null"],"enum":["Homme","Femme",null],"description":"Sexe renseigné dans la fiche ; null signifie non renseigné et efface la valeur en écriture."},"city_code":{"type":["string","null"],"maxLength":5,"minLength":5,"description":"Code de commune du référentiel SIGPAS. Reprendre exactement city_code de GET /communes?postal_code=… ; ce n’est pas un code postal. null signifie non renseigné et efface la valeur en écriture."},"address":{"type":["string","null"],"maxLength":10000,"description":"Adresse de la personne, hors commune ; null signifie non renseignée et efface la valeur en écriture."},"parents":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"type":"string","enum":["Pere","Mere","Institution","Responsable_legal","Famille_accueil","Sans_objet"],"description":"Lien du représentant avec la personne : père, mère, institution, responsable légal, famille d’accueil ou sans objet."},"first_name":{"type":"string","maxLength":63,"description":"Prénom du représentant."},"last_name":{"type":"string","maxLength":63,"description":"Nom du représentant."},"title":{"type":"string","maxLength":63,"description":"Intitulé du représentant ou de l’institution."},"phone":{"type":"string","maxLength":15,"description":"Téléphone du représentant."},"email":{"type":"string","maxLength":127,"description":"Adresse email du représentant."},"profession":{"type":"string","maxLength":127,"description":"Profession du représentant."}}},"maxItems":2,"description":"Représentants légaux. En écriture, remplace toute la liste ; [] supprime tous les représentants. Un champ parents omis conserve la liste existante. Deux représentants au maximum en écriture."}},"required":["email","first_name","last_name"]}}}}}},"/members/{id}":{"get":{"operationId":"get_members_id","summary":"Consulter la fiche d’une personne","tags":["members"],"security":[{"oauth2":["members:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647,"readOnly":true,"description":"Identifiant de la fiche personne, stable entre les saisons. Une fiche ne constitue pas une inscription."},"email":{"type":["string","null"],"format":"email","maxLength":127,"description":"Adresse email de la personne. Un changement réinitialise sa validation."},"first_name":{"type":["string","null"],"maxLength":63,"description":"Prénom de la personne."},"last_name":{"type":["string","null"],"maxLength":63,"description":"Nom de famille de la personne."},"phone":{"type":["string","null"],"maxLength":15,"description":"Téléphone de la personne ; null signifie non renseigné et efface la valeur en écriture."},"birth_date":{"type":["string","null"],"format":"date","description":"Date de naissance au format YYYY-MM-DD ; null signifie non renseignée et efface la valeur en écriture."},"sex":{"type":["string","null"],"enum":["Homme","Femme",null],"description":"Sexe renseigné dans la fiche ; null signifie non renseigné et efface la valeur en écriture."},"city_code":{"type":["string","null"],"maxLength":5,"description":"Code de commune du référentiel SIGPAS. Reprendre exactement city_code de GET /communes?postal_code=… ; ce n’est pas un code postal. null signifie non renseigné et efface la valeur en écriture."},"address":{"type":["string","null"],"maxLength":10000,"description":"Adresse de la personne, hors commune ; null signifie non renseignée et efface la valeur en écriture."},"email_verified":{"type":["boolean","null"],"readOnly":true,"description":"Indique si l’adresse email a été validée. Champ en lecture seule."},"created_at":{"type":["string","null"],"format":"date-time","readOnly":true,"description":"Date et heure de création de la fiche, en RFC 3339 ; null si inconnue. Champ en lecture seule."},"parents":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"type":["string","null"],"enum":["Pere","Mere","Institution","Responsable_legal","Famille_accueil","Sans_objet",null],"description":"Lien du représentant avec la personne : père, mère, institution, responsable légal, famille d’accueil ou sans objet."},"first_name":{"type":["string","null"],"maxLength":63,"description":"Prénom du représentant."},"last_name":{"type":["string","null"],"maxLength":63,"description":"Nom du représentant."},"title":{"type":["string","null"],"maxLength":63,"description":"Intitulé du représentant ou de l’institution."},"phone":{"type":["string","null"],"maxLength":15,"description":"Téléphone du représentant."},"email":{"type":["string","null"],"maxLength":127,"description":"Adresse email du représentant."},"profession":{"type":["string","null"],"maxLength":127,"description":"Profession du représentant."}}},"description":"Représentants légaux. En écriture, remplace toute la liste ; [] supprime tous les représentants. Un champ parents omis conserve la liste existante. Deux représentants au maximum en écriture."}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"operationId":"patch_members_id","summary":"Modifier la fiche d’une personne","tags":["members"],"security":[{"oauth2":["members:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Les champs omis sont conservés. null efface un champ nullable. parents remplace la liste entière des représentants ; [] les supprime tous. Modifier l’adresse email réinitialise sa validation si elle change. Pour city_code, reprendre un résultat de GET /communes?postal_code=… .","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"email":{"type":"string","format":"email","maxLength":127,"description":"Adresse email de la personne. Un changement réinitialise sa validation."},"first_name":{"type":"string","minLength":1,"maxLength":63,"description":"Prénom de la personne."},"last_name":{"type":"string","minLength":1,"maxLength":63,"description":"Nom de famille de la personne."},"phone":{"type":["string","null"],"maxLength":15,"description":"Téléphone de la personne ; null signifie non renseigné et efface la valeur en écriture."},"birth_date":{"type":["string","null"],"format":"date","description":"Date de naissance au format YYYY-MM-DD ; null signifie non renseignée et efface la valeur en écriture."},"sex":{"type":["string","null"],"enum":["Homme","Femme",null],"description":"Sexe renseigné dans la fiche ; null signifie non renseigné et efface la valeur en écriture."},"city_code":{"type":["string","null"],"maxLength":5,"minLength":5,"description":"Code de commune du référentiel SIGPAS. Reprendre exactement city_code de GET /communes?postal_code=… ; ce n’est pas un code postal. null signifie non renseigné et efface la valeur en écriture."},"address":{"type":["string","null"],"maxLength":10000,"description":"Adresse de la personne, hors commune ; null signifie non renseignée et efface la valeur en écriture."},"parents":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"type":"string","enum":["Pere","Mere","Institution","Responsable_legal","Famille_accueil","Sans_objet"],"description":"Lien du représentant avec la personne : père, mère, institution, responsable légal, famille d’accueil ou sans objet."},"first_name":{"type":"string","maxLength":63,"description":"Prénom du représentant."},"last_name":{"type":"string","maxLength":63,"description":"Nom du représentant."},"title":{"type":"string","maxLength":63,"description":"Intitulé du représentant ou de l’institution."},"phone":{"type":"string","maxLength":15,"description":"Téléphone du représentant."},"email":{"type":"string","maxLength":127,"description":"Adresse email du représentant."},"profession":{"type":"string","maxLength":127,"description":"Profession du représentant."}}},"maxItems":2,"description":"Représentants légaux. En écriture, remplace toute la liste ; [] supprime tous les représentants. Un champ parents omis conserve la liste existante. Deux représentants au maximum en écriture."}},"required":[]}}}}}},"/sports":{"get":{"operationId":"get_sports","summary":"GET /sports","tags":["groups"],"security":[{"oauth2":["groups:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"name":{"type":["string","null"],"maxLength":127},"active":{"type":["boolean","null"]}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"post":{"operationId":"post_sports","summary":"POST /sports","tags":["groups"],"security":[{"oauth2":["groups:write"]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"201":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"name":{"type":"string","minLength":2,"maxLength":127}},"required":["name"]}}}}}},"/sports/{id}":{"get":{"operationId":"get_sports_id","summary":"GET /sports/{id}","tags":["groups"],"security":[{"oauth2":["groups:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"name":{"type":["string","null"],"maxLength":127},"active":{"type":["boolean","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"operationId":"patch_sports_id","summary":"PATCH /sports/{id}","tags":["groups"],"security":[{"oauth2":["groups:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"name":{"type":"string","minLength":2,"maxLength":127}},"required":[]}}}}}},"/groups":{"get":{"operationId":"get_groups","summary":"Exporter exceptionnellement les groupes de toutes les saisons","tags":["exports"],"security":[{"oauth2":["groups:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}},{"name":"all","in":"query","required":false,"description":"Confirmation explicite d’un export exceptionnel couvrant toutes les saisons. L’omission reste acceptée mais est dépréciée ; les réponses portent Deprecation et Link rel=\"deprecation\".","schema":{"type":"boolean","const":true}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"name":{"type":["string","null"],"maxLength":255},"season_id":{"type":["integer","null"],"maximum":2147483647},"sport_id":{"type":["integer","null"],"maximum":2147483647},"description":{"type":["string","null"],"maxLength":10000},"sex":{"type":["string","null"],"enum":["Homme","Femme","Homme et femme",null]},"type":{"type":["string","null"],"enum":["Loisir","Intermediaire","Competition",null]},"capacity":{"type":["integer","null"],"maximum":100000},"birth_year_start":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"birth_year_end":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"auto_validate":{"type":["boolean","null"]},"invitation_only":{"type":["boolean","null"]},"cost_euros":{"type":["integer","null"],"maximum":10000000,"description":"Montant en euros entiers."},"slot_count":{"type":["integer","null"],"maximum":100},"slot_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100},"licence_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100},"season_path":{"type":"string"},"members_path":{"type":"string"}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}},"headers":{"Deprecation":{"description":"Présent uniquement sans all. Date de dépréciation au format RFC 9745 (@ suivi du timestamp Unix).","schema":{"type":"string","pattern":"^@[0-9]+$"}},"Link":{"description":"Sans all, ajoute un lien rel=\"deprecation\" vers la migration aux liens de découverte.","schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Export global exceptionnel de toutes les saisons. Utiliser all=true sur chaque page. Sans ce paramètre, la réponse reste HTTP 200 avec les mêmes données et la même pagination, mais les en-têtes Deprecation et Link rel=\"deprecation\" signalent cet usage déprécié. Aucune date de suppression n’est fixée. Pour une lecture métier normale, commencez par GET /seasons et suivez le chemin saisonnier correspondant."},"post":{"operationId":"post_groups","summary":"POST /groups","tags":["groups"],"security":[{"oauth2":["groups:write"]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"201":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"name":{"type":"string","minLength":2,"maxLength":255},"season_id":{"type":"integer","minimum":1,"maximum":2147483647},"sport_id":{"type":["integer","null"],"minimum":1,"maximum":2147483647},"description":{"type":"string","maxLength":10000},"sex":{"type":"string","enum":["Homme","Femme","Homme et femme"]},"type":{"type":"string","enum":["Loisir","Intermediaire","Competition"]},"capacity":{"type":["integer","null"],"minimum":0,"maximum":100000},"birth_year_start":{"type":"integer","minimum":1900,"maximum":2200,"description":"Année de naissance limite."},"birth_year_end":{"type":"integer","minimum":1900,"maximum":2200,"description":"Année de naissance limite."},"auto_validate":{"type":"boolean"},"invitation_only":{"type":"boolean"},"cost_euros":{"type":"integer","minimum":0,"maximum":10000000,"description":"Montant en euros entiers."},"slot_count":{"type":"integer","minimum":0,"maximum":100},"slot_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100},"licence_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100}},"required":["name","season_id","birth_year_start","birth_year_end"]}}}}}},"/groups/{id}":{"get":{"operationId":"get_groups_id","summary":"GET /groups/{id}","tags":["groups"],"security":[{"oauth2":["groups:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"name":{"type":["string","null"],"maxLength":255},"season_id":{"type":["integer","null"],"maximum":2147483647},"sport_id":{"type":["integer","null"],"maximum":2147483647},"description":{"type":["string","null"],"maxLength":10000},"sex":{"type":["string","null"],"enum":["Homme","Femme","Homme et femme",null]},"type":{"type":["string","null"],"enum":["Loisir","Intermediaire","Competition",null]},"capacity":{"type":["integer","null"],"maximum":100000},"birth_year_start":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"birth_year_end":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"auto_validate":{"type":["boolean","null"]},"invitation_only":{"type":["boolean","null"]},"cost_euros":{"type":["integer","null"],"maximum":10000000,"description":"Montant en euros entiers."},"slot_count":{"type":["integer","null"],"maximum":100},"slot_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100},"licence_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100},"season_path":{"type":"string"},"members_path":{"type":"string"}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"operationId":"patch_groups_id","summary":"PATCH /groups/{id}","tags":["groups"],"security":[{"oauth2":["groups:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"name":{"type":"string","minLength":2,"maxLength":255},"season_id":{"type":"integer","minimum":1,"maximum":2147483647},"sport_id":{"type":["integer","null"],"minimum":1,"maximum":2147483647},"description":{"type":"string","maxLength":10000},"sex":{"type":"string","enum":["Homme","Femme","Homme et femme"]},"type":{"type":"string","enum":["Loisir","Intermediaire","Competition"]},"capacity":{"type":["integer","null"],"minimum":0,"maximum":100000},"birth_year_start":{"type":"integer","minimum":1900,"maximum":2200,"description":"Année de naissance limite."},"birth_year_end":{"type":"integer","minimum":1900,"maximum":2200,"description":"Année de naissance limite."},"auto_validate":{"type":"boolean"},"invitation_only":{"type":"boolean"},"cost_euros":{"type":"integer","minimum":0,"maximum":10000000,"description":"Montant en euros entiers."},"slot_count":{"type":"integer","minimum":0,"maximum":100},"slot_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100},"licence_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100}},"required":[]}}}}}},"/slots":{"get":{"operationId":"get_slots","summary":"GET /slots","tags":["groups"],"security":[{"oauth2":["groups:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"name":{"type":["string","null"],"maxLength":255},"season_id":{"type":["integer","null"],"maximum":2147483647},"sport_id":{"type":["integer","null"],"maximum":2147483647},"day":{"type":["string","null"],"enum":["lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche",null]},"hour":{"type":["integer","null"],"maximum":23},"minute":{"type":["integer","null"],"maximum":59},"duration_minutes":{"type":["integer","null"],"maximum":1440},"location":{"type":["string","null"],"maxLength":10000},"capacity":{"type":["integer","null"],"maximum":100000},"birth_year_start":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"birth_year_end":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"sex":{"type":["string","null"],"enum":["Homme","Femme","Homme et femme",null]},"trainer_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100,"minItems":1}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"post":{"operationId":"post_slots","summary":"POST /slots","tags":["groups"],"security":[{"oauth2":["groups:write"]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"201":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"name":{"type":"string","minLength":2,"maxLength":255},"season_id":{"type":"integer","minimum":1,"maximum":2147483647},"sport_id":{"type":["integer","null"],"minimum":1,"maximum":2147483647},"day":{"type":"string","enum":["lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche"]},"hour":{"type":"integer","minimum":0,"maximum":23},"minute":{"type":"integer","minimum":0,"maximum":59},"duration_minutes":{"type":"integer","minimum":1,"maximum":1440},"location":{"type":"string","maxLength":10000},"trainer_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100,"minItems":1},"capacity":{"type":"integer","minimum":0,"maximum":100000},"birth_year_start":{"type":["integer","null"],"minimum":1900,"maximum":2200,"description":"Année de naissance limite."},"birth_year_end":{"type":["integer","null"],"minimum":1900,"maximum":2200,"description":"Année de naissance limite."},"sex":{"type":["string","null"],"enum":["Homme","Femme","Homme et femme",null]}},"required":["name","season_id","day","hour","minute","duration_minutes","trainer_ids","capacity"]}}}}}},"/slots/{id}":{"get":{"operationId":"get_slots_id","summary":"GET /slots/{id}","tags":["groups"],"security":[{"oauth2":["groups:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"name":{"type":["string","null"],"maxLength":255},"season_id":{"type":["integer","null"],"maximum":2147483647},"sport_id":{"type":["integer","null"],"maximum":2147483647},"day":{"type":["string","null"],"enum":["lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche",null]},"hour":{"type":["integer","null"],"maximum":23},"minute":{"type":["integer","null"],"maximum":59},"duration_minutes":{"type":["integer","null"],"maximum":1440},"location":{"type":["string","null"],"maxLength":10000},"capacity":{"type":["integer","null"],"maximum":100000},"birth_year_start":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"birth_year_end":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"sex":{"type":["string","null"],"enum":["Homme","Femme","Homme et femme",null]},"trainer_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100,"minItems":1}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"operationId":"patch_slots_id","summary":"PATCH /slots/{id}","tags":["groups"],"security":[{"oauth2":["groups:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"name":{"type":"string","minLength":2,"maxLength":255},"season_id":{"type":"integer","minimum":1,"maximum":2147483647},"sport_id":{"type":["integer","null"],"minimum":1,"maximum":2147483647},"day":{"type":"string","enum":["lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche"]},"hour":{"type":"integer","minimum":0,"maximum":23},"minute":{"type":"integer","minimum":0,"maximum":59},"duration_minutes":{"type":"integer","minimum":1,"maximum":1440},"location":{"type":"string","maxLength":10000},"trainer_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100,"minItems":1},"capacity":{"type":"integer","minimum":0,"maximum":100000},"birth_year_start":{"type":["integer","null"],"minimum":1900,"maximum":2200,"description":"Année de naissance limite."},"birth_year_end":{"type":["integer","null"],"minimum":1900,"maximum":2200,"description":"Année de naissance limite."},"sex":{"type":["string","null"],"enum":["Homme","Femme","Homme et femme",null]}},"required":[]}}}}}},"/lessons":{"get":{"operationId":"get_lessons","summary":"GET /lessons","tags":["groups"],"security":[{"oauth2":["groups:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"group_id":{"type":["integer","null"],"maximum":2147483647},"day":{"type":["string","null"],"enum":["lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche",null]},"hour":{"type":["integer","null"],"maximum":23},"minute":{"type":["integer","null"],"maximum":59},"duration_minutes":{"type":["integer","null"],"maximum":1440},"location":{"type":["string","null"],"maxLength":10000},"trainer_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100,"minItems":1}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"post":{"operationId":"post_lessons","summary":"POST /lessons","tags":["groups"],"security":[{"oauth2":["groups:write"]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"201":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"group_id":{"type":"integer","minimum":1,"maximum":2147483647},"day":{"type":"string","enum":["lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche"]},"hour":{"type":"integer","minimum":0,"maximum":23},"minute":{"type":"integer","minimum":0,"maximum":59},"duration_minutes":{"type":"integer","minimum":1,"maximum":1440},"location":{"type":"string","maxLength":10000},"trainer_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100,"minItems":1}},"required":["group_id","day","hour","minute","duration_minutes","trainer_ids"]}}}}}},"/lessons/{id}":{"get":{"operationId":"get_lessons_id","summary":"GET /lessons/{id}","tags":["groups"],"security":[{"oauth2":["groups:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"group_id":{"type":["integer","null"],"maximum":2147483647},"day":{"type":["string","null"],"enum":["lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche",null]},"hour":{"type":["integer","null"],"maximum":23},"minute":{"type":["integer","null"],"maximum":59},"duration_minutes":{"type":["integer","null"],"maximum":1440},"location":{"type":["string","null"],"maxLength":10000},"trainer_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100,"minItems":1}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"operationId":"patch_lessons_id","summary":"PATCH /lessons/{id}","tags":["groups"],"security":[{"oauth2":["groups:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"group_id":{"type":"integer","minimum":1,"maximum":2147483647},"day":{"type":"string","enum":["lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche"]},"hour":{"type":"integer","minimum":0,"maximum":23},"minute":{"type":"integer","minimum":0,"maximum":59},"duration_minutes":{"type":"integer","minimum":1,"maximum":1440},"location":{"type":"string","maxLength":10000},"trainer_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100,"minItems":1}},"required":[]}}}}}},"/events":{"get":{"operationId":"get_events","summary":"Exporter exceptionnellement les événements de toutes les saisons","tags":["exports"],"security":[{"oauth2":["events:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}},{"name":"all","in":"query","required":false,"description":"Confirmation explicite d’un export exceptionnel couvrant toutes les saisons. L’omission reste acceptée mais est dépréciée ; les réponses portent Deprecation et Link rel=\"deprecation\".","schema":{"type":"boolean","const":true}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"name":{"type":["string","null"],"maxLength":255},"season_id":{"type":["integer","null"],"maximum":2147483647},"sport_id":{"type":["integer","null"],"maximum":2147483647},"description":{"type":["string","null"],"maxLength":10000},"begin":{"type":["string","null"],"format":"date-time"},"end":{"type":["string","null"],"format":"date-time"},"location":{"type":["string","null"],"maxLength":10000},"capacity":{"type":["integer","null"],"maximum":100000},"registration_deadline":{"type":["string","null"],"format":"date"},"registration_opening":{"type":["string","null"],"format":"date"},"birth_year_start":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"birth_year_end":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"cost_euros":{"type":["integer","null"],"maximum":10000000,"description":"Montant en euros entiers."},"external_access":{"type":["boolean","null"]},"external_cost_euros":{"type":["integer","null"],"maximum":10000000,"description":"Montant en euros entiers."},"membership_required":{"type":["boolean","null"]},"auto_validate":{"type":["boolean","null"]},"pre_registration_required":{"type":["boolean","null"]},"external_registration":{"type":["boolean","null"]},"season_path":{"type":"string"},"members_path":{"type":"string"}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}},"headers":{"Deprecation":{"description":"Présent uniquement sans all. Date de dépréciation au format RFC 9745 (@ suivi du timestamp Unix).","schema":{"type":"string","pattern":"^@[0-9]+$"}},"Link":{"description":"Sans all, ajoute un lien rel=\"deprecation\" vers la migration aux liens de découverte.","schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Export global exceptionnel de toutes les saisons. Utiliser all=true sur chaque page. Sans ce paramètre, la réponse reste HTTP 200 avec les mêmes données et la même pagination, mais les en-têtes Deprecation et Link rel=\"deprecation\" signalent cet usage déprécié. Aucune date de suppression n’est fixée. Pour une lecture métier normale, commencez par GET /seasons et suivez le chemin saisonnier correspondant."},"post":{"operationId":"post_events","summary":"POST /events","tags":["events"],"security":[{"oauth2":["events:write"]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"201":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"name":{"type":"string","minLength":2,"maxLength":255},"season_id":{"type":"integer","minimum":1,"maximum":2147483647},"sport_id":{"type":["integer","null"],"minimum":1,"maximum":2147483647},"description":{"type":"string","maxLength":10000},"begin":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"location":{"type":"string","maxLength":10000},"capacity":{"type":["integer","null"],"minimum":0,"maximum":100000},"registration_deadline":{"type":["string","null"],"format":"date"},"registration_opening":{"type":["string","null"],"format":"date"},"birth_year_start":{"type":"integer","minimum":1900,"maximum":2200,"description":"Année de naissance limite."},"birth_year_end":{"type":"integer","minimum":1900,"maximum":2200,"description":"Année de naissance limite."},"cost_euros":{"type":"integer","minimum":0,"maximum":10000000,"description":"Montant en euros entiers."},"external_access":{"type":"boolean"},"external_cost_euros":{"type":["integer","null"],"minimum":0,"maximum":10000000,"description":"Montant en euros entiers."},"membership_required":{"type":"boolean"},"auto_validate":{"type":"boolean"},"pre_registration_required":{"type":"boolean"},"external_registration":{"type":"boolean"}},"required":["name","season_id","begin","end","birth_year_start","birth_year_end"]}}}}}},"/events/{id}":{"get":{"operationId":"get_events_id","summary":"GET /events/{id}","tags":["events"],"security":[{"oauth2":["events:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"name":{"type":["string","null"],"maxLength":255},"season_id":{"type":["integer","null"],"maximum":2147483647},"sport_id":{"type":["integer","null"],"maximum":2147483647},"description":{"type":["string","null"],"maxLength":10000},"begin":{"type":["string","null"],"format":"date-time"},"end":{"type":["string","null"],"format":"date-time"},"location":{"type":["string","null"],"maxLength":10000},"capacity":{"type":["integer","null"],"maximum":100000},"registration_deadline":{"type":["string","null"],"format":"date"},"registration_opening":{"type":["string","null"],"format":"date"},"birth_year_start":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"birth_year_end":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"cost_euros":{"type":["integer","null"],"maximum":10000000,"description":"Montant en euros entiers."},"external_access":{"type":["boolean","null"]},"external_cost_euros":{"type":["integer","null"],"maximum":10000000,"description":"Montant en euros entiers."},"membership_required":{"type":["boolean","null"]},"auto_validate":{"type":["boolean","null"]},"pre_registration_required":{"type":["boolean","null"]},"external_registration":{"type":["boolean","null"]},"season_path":{"type":"string"},"members_path":{"type":"string"}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"operationId":"patch_events_id","summary":"PATCH /events/{id}","tags":["events"],"security":[{"oauth2":["events:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"name":{"type":"string","minLength":2,"maxLength":255},"season_id":{"type":"integer","minimum":1,"maximum":2147483647},"sport_id":{"type":["integer","null"],"minimum":1,"maximum":2147483647},"description":{"type":"string","maxLength":10000},"begin":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"location":{"type":"string","maxLength":10000},"capacity":{"type":["integer","null"],"minimum":0,"maximum":100000},"registration_deadline":{"type":["string","null"],"format":"date"},"registration_opening":{"type":["string","null"],"format":"date"},"birth_year_start":{"type":"integer","minimum":1900,"maximum":2200,"description":"Année de naissance limite."},"birth_year_end":{"type":"integer","minimum":1900,"maximum":2200,"description":"Année de naissance limite."},"cost_euros":{"type":"integer","minimum":0,"maximum":10000000,"description":"Montant en euros entiers."},"external_access":{"type":"boolean"},"external_cost_euros":{"type":["integer","null"],"minimum":0,"maximum":10000000,"description":"Montant en euros entiers."},"membership_required":{"type":"boolean"},"auto_validate":{"type":"boolean"},"pre_registration_required":{"type":"boolean"},"external_registration":{"type":"boolean"}},"required":[]}}}}}},"/annual-registrations":{"get":{"operationId":"get_annual-registrations","summary":"GET /annual-registrations","tags":["registrations"],"security":[{"oauth2":["registrations:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"member_id":{"type":["integer","null"],"maximum":2147483647},"group_id":{"type":["integer","null"],"maximum":2147483647},"registered_at":{"type":["string","null"],"format":"date-time"},"valid":{"type":["boolean","null"],"description":"null : en attente ; true : validée ; false : refusée."},"validated_at":{"type":["string","null"],"format":"date-time"},"slot_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100},"licence_id":{"type":["integer","null"],"minimum":1,"maximum":2147483647}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"post":{"operationId":"post_annual-registrations","summary":"Inscrire une personne à un groupe","tags":["registrations"],"security":[{"oauth2":["registrations:write"]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"201":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"member_id":{"type":"integer","minimum":1,"maximum":2147483647},"group_id":{"type":"integer","minimum":1,"maximum":2147483647},"slot_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100},"licence_id":{"type":["integer","null"],"minimum":1,"maximum":2147483647}},"required":["member_id","group_id"]}}}}}},"/annual-registrations/{id}":{"get":{"operationId":"get_annual-registrations_id","summary":"GET /annual-registrations/{id}","tags":["registrations"],"security":[{"oauth2":["registrations:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"member_id":{"type":["integer","null"],"maximum":2147483647},"group_id":{"type":["integer","null"],"maximum":2147483647},"registered_at":{"type":["string","null"],"format":"date-time"},"valid":{"type":["boolean","null"],"description":"null : en attente ; true : validée ; false : refusée."},"validated_at":{"type":["string","null"],"format":"date-time"},"slot_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100},"licence_id":{"type":["integer","null"],"minimum":1,"maximum":2147483647}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"operationId":"patch_annual-registrations_id","summary":"PATCH /annual-registrations/{id}","tags":["registrations"],"security":[{"oauth2":["registrations:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"member_id":{"type":"integer","minimum":1,"maximum":2147483647},"group_id":{"type":"integer","minimum":1,"maximum":2147483647},"slot_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100},"licence_id":{"type":["integer","null"],"minimum":1,"maximum":2147483647}},"required":[]}}}}},"delete":{"operationId":"delete_annual-registrations_id","summary":"DELETE /annual-registrations/{id}","tags":["registrations"],"security":[{"oauth2":["registrations:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/annual-registrations/{id}/validate":{"post":{"operationId":"post_annual-registrations_id_validate","summary":"POST /annual-registrations/{id}/validate","tags":["registrations"],"security":[{"oauth2":["registrations:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/annual-registrations/{id}/refuse":{"post":{"operationId":"post_annual-registrations_id_refuse","summary":"POST /annual-registrations/{id}/refuse","tags":["registrations"],"security":[{"oauth2":["registrations:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/annual-registrations/{id}/cancel":{"post":{"operationId":"post_annual-registrations_id_cancel","summary":"POST /annual-registrations/{id}/cancel","tags":["registrations"],"security":[{"oauth2":["registrations:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/event-registrations":{"get":{"operationId":"get_event-registrations","summary":"GET /event-registrations","tags":["registrations"],"security":[{"oauth2":["registrations:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"member_id":{"type":["integer","null"],"maximum":2147483647},"event_id":{"type":["integer","null"],"maximum":2147483647},"registered_at":{"type":["string","null"],"format":"date-time"},"valid":{"type":["boolean","null"],"description":"null : en attente ; true : validée ; false : refusée."},"validated_at":{"type":["string","null"],"format":"date-time"},"slot_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100},"licence_id":{"type":["integer","null"],"minimum":1,"maximum":2147483647}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"post":{"operationId":"post_event-registrations","summary":"Inscrire une personne à un événement","tags":["registrations"],"security":[{"oauth2":["registrations:write"]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"201":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"member_id":{"type":"integer","minimum":1,"maximum":2147483647},"event_id":{"type":"integer","minimum":1,"maximum":2147483647}},"required":["member_id","event_id"]}}}}}},"/event-registrations/{id}":{"get":{"operationId":"get_event-registrations_id","summary":"GET /event-registrations/{id}","tags":["registrations"],"security":[{"oauth2":["registrations:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"member_id":{"type":["integer","null"],"maximum":2147483647},"event_id":{"type":["integer","null"],"maximum":2147483647},"registered_at":{"type":["string","null"],"format":"date-time"},"valid":{"type":["boolean","null"],"description":"null : en attente ; true : validée ; false : refusée."},"validated_at":{"type":["string","null"],"format":"date-time"},"slot_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100},"licence_id":{"type":["integer","null"],"minimum":1,"maximum":2147483647}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"delete":{"operationId":"delete_event-registrations_id","summary":"DELETE /event-registrations/{id}","tags":["registrations"],"security":[{"oauth2":["registrations:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/event-registrations/{id}/validate":{"post":{"operationId":"post_event-registrations_id_validate","summary":"POST /event-registrations/{id}/validate","tags":["registrations"],"security":[{"oauth2":["registrations:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/event-registrations/{id}/refuse":{"post":{"operationId":"post_event-registrations_id_refuse","summary":"POST /event-registrations/{id}/refuse","tags":["registrations"],"security":[{"oauth2":["registrations:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/event-registrations/{id}/cancel":{"post":{"operationId":"post_event-registrations_id_cancel","summary":"POST /event-registrations/{id}/cancel","tags":["registrations"],"security":[{"oauth2":["registrations:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/payments":{"get":{"operationId":"get_payments","summary":"GET /payments","tags":["payments"],"security":[{"oauth2":["payments:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"member_id":{"type":["integer","null"],"maximum":2147483647},"season_id":{"type":["integer","null"],"maximum":2147483647},"amount_cents":{"type":["integer","null"],"maximum":1000000000},"method":{"type":["string","null"],"maxLength":255,"description":"Mode de règlement manuel, sans coordonnées bancaires."},"type":{"type":["string","null"],"enum":["Paiement","Reduction","Remboursement","Autre",null,"ReportSolde"]},"received_on":{"type":["string","null"],"format":"date"},"recorded_at":{"type":["string","null"],"format":"date-time"},"allocations":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"registration_id":{"type":"integer"},"amount_cents":{"type":"integer"}}}}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"post":{"operationId":"post_payments","summary":"POST /payments","tags":["payments"],"security":[{"oauth2":["payments:write"]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"201":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"member_id":{"type":"integer","minimum":1,"maximum":2147483647},"season_id":{"type":"integer","minimum":1,"maximum":2147483647},"amount_cents":{"type":"integer","minimum":1,"maximum":1000000000},"method":{"type":"string","minLength":1,"maxLength":255,"description":"Mode de règlement manuel, sans coordonnées bancaires."},"type":{"type":"string","enum":["Paiement","Reduction","Remboursement","Autre"]},"received_on":{"type":"string","format":"date"},"allocations":{"type":"array","items":{"type":"string","maxLength":100,"minLength":1},"maxItems":100}},"required":["member_id","season_id","amount_cents","method","received_on"]}}}}}},"/payments/{id}":{"get":{"operationId":"get_payments_id","summary":"GET /payments/{id}","tags":["payments"],"security":[{"oauth2":["payments:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"member_id":{"type":["integer","null"],"maximum":2147483647},"season_id":{"type":["integer","null"],"maximum":2147483647},"amount_cents":{"type":["integer","null"],"maximum":1000000000},"method":{"type":["string","null"],"maxLength":255,"description":"Mode de règlement manuel, sans coordonnées bancaires."},"type":{"type":["string","null"],"enum":["Paiement","Reduction","Remboursement","Autre",null,"ReportSolde"]},"received_on":{"type":["string","null"],"format":"date"},"recorded_at":{"type":["string","null"],"format":"date-time"},"allocations":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"registration_id":{"type":"integer"},"amount_cents":{"type":"integer"}}}}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"operationId":"patch_payments_id","summary":"PATCH /payments/{id}","tags":["payments"],"security":[{"oauth2":["payments:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"member_id":{"type":"integer","minimum":1,"maximum":2147483647},"season_id":{"type":"integer","minimum":1,"maximum":2147483647},"amount_cents":{"type":"integer","minimum":1,"maximum":1000000000},"method":{"type":"string","minLength":1,"maxLength":255,"description":"Mode de règlement manuel, sans coordonnées bancaires."},"type":{"type":"string","enum":["Paiement","Reduction","Remboursement","Autre"]},"received_on":{"type":"string","format":"date"},"allocations":{"type":"array","items":{"type":"string","maxLength":100,"minLength":1},"maxItems":100}},"required":[]}}}}}},"/documents":{"get":{"operationId":"get_documents","summary":"GET /documents","tags":["documents"],"security":[{"oauth2":["documents:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"name":{"type":["string","null"],"maxLength":255},"description":{"type":["string","null"],"maxLength":10000}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"post":{"operationId":"post_documents","summary":"POST /documents","tags":["documents"],"security":[{"oauth2":["documents:write"]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"201":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"name":{"type":"string","minLength":2,"maxLength":255},"description":{"type":"string","maxLength":10000},"content_base64":{"type":"string","minLength":4,"maxLength":13981016,"contentEncoding":"base64","description":"PDF, JPEG ou PNG, maximum 10 Mio décodés."}},"required":["name","content_base64"]}}}}}},"/documents/{id}":{"get":{"operationId":"get_documents_id","summary":"GET /documents/{id}","tags":["documents"],"security":[{"oauth2":["documents:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"name":{"type":["string","null"],"maxLength":255},"description":{"type":["string","null"],"maxLength":10000}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"operationId":"patch_documents_id","summary":"PATCH /documents/{id}","tags":["documents"],"security":[{"oauth2":["documents:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"name":{"type":"string","minLength":2,"maxLength":255},"description":{"type":"string","maxLength":10000},"content_base64":{"type":"string","minLength":4,"maxLength":13981016,"contentEncoding":"base64","description":"PDF, JPEG ou PNG, maximum 10 Mio décodés."}},"required":[]}}}}},"delete":{"operationId":"delete_documents_id","summary":"DELETE /documents/{id}","tags":["documents"],"security":[{"oauth2":["documents:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/documents/{id}/content":{"get":{"operationId":"get_documents_id_content","summary":"GET /documents/{id}/content","tags":["documents"],"security":[{"oauth2":["documents:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"*/*":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/medical":{"get":{"operationId":"get_medical","summary":"GET /medical","tags":["medical"],"security":[{"oauth2":["medical:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"health_questionnaire":{"type":["boolean","null"],"description":"null : en attente ; true : validée ; false : refusée."},"certificate_begin":{"type":["string","null"],"format":"date"},"certificate_end":{"type":["string","null"],"format":"date"},"certificate_type":{"type":["string","null"],"enum":["standard","performance","elite","reprise",null]},"valid":{"type":["boolean","null"],"description":"null : en attente ; true : validée ; false : refusée."},"validated_at":{"type":["string","null"],"format":"date-time"},"seasons":{"type":"array","items":{"type":"object","properties":{"season_id":{"type":"integer"},"questionnaire_attested_at":{"type":["string","null"],"format":"date-time"},"certificate_date":{"type":["string","null"],"format":"date"},"certificate_type":{"type":["string","null"]},"valid":{"type":["boolean","null"]},"decided_at":{"type":["string","null"],"format":"date-time"}}}}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/medical/{id}":{"get":{"operationId":"get_medical_id","summary":"GET /medical/{id}","tags":["medical"],"security":[{"oauth2":["medical:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"health_questionnaire":{"type":["boolean","null"],"description":"null : en attente ; true : validée ; false : refusée."},"certificate_begin":{"type":["string","null"],"format":"date"},"certificate_end":{"type":["string","null"],"format":"date"},"certificate_type":{"type":["string","null"],"enum":["standard","performance","elite","reprise",null]},"valid":{"type":["boolean","null"],"description":"null : en attente ; true : validée ; false : refusée."},"validated_at":{"type":["string","null"],"format":"date-time"},"seasons":{"type":"array","items":{"type":"object","properties":{"season_id":{"type":"integer"},"questionnaire_attested_at":{"type":["string","null"],"format":"date-time"},"certificate_date":{"type":["string","null"],"format":"date"},"certificate_type":{"type":["string","null"]},"valid":{"type":["boolean","null"]},"decided_at":{"type":["string","null"],"format":"date-time"}}}}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"operationId":"patch_medical_id","summary":"PATCH /medical/{id}","tags":["medical"],"security":[{"oauth2":["medical:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"minProperties":2,"properties":{"season_id":{"type":"integer","minimum":1,"maximum":2147483647},"health_questionnaire":{"type":["boolean","null"],"description":"null : en attente ; true : validée ; false : refusée."},"certificate_begin":{"type":["string","null"],"format":"date"},"certificate_end":{"type":["string","null"],"format":"date"},"certificate_type":{"type":"string","enum":["standard","performance","elite","reprise"]},"valid":{"type":["boolean","null"],"description":"null : en attente ; true : validée ; false : refusée."},"content_base64":{"type":"string","minLength":4,"maxLength":13981016,"contentEncoding":"base64","description":"PDF, JPEG ou PNG, maximum 10 Mio décodés."}},"required":["season_id"]}}}}}},"/medical/{id}/content":{"get":{"operationId":"get_medical_id_content","summary":"GET /medical/{id}/content","tags":["medical"],"security":[{"oauth2":["medical:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"*/*":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/groups/{id}/members":{"get":{"operationId":"get_groups_id_members","summary":"Lister les adhérents validés d’un groupe","tags":["groups"],"security":[{"oauth2":["groups:read","members:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647,"readOnly":true,"description":"Identifiant de la fiche personne, stable entre les saisons. Une fiche ne constitue pas une inscription."},"email":{"type":["string","null"],"format":"email","maxLength":127,"description":"Adresse email de la personne. Un changement réinitialise sa validation."},"first_name":{"type":["string","null"],"maxLength":63,"description":"Prénom de la personne."},"last_name":{"type":["string","null"],"maxLength":63,"description":"Nom de famille de la personne."},"phone":{"type":["string","null"],"maxLength":15,"description":"Téléphone de la personne ; null signifie non renseigné et efface la valeur en écriture."},"birth_date":{"type":["string","null"],"format":"date","description":"Date de naissance au format YYYY-MM-DD ; null signifie non renseignée et efface la valeur en écriture."},"sex":{"type":["string","null"],"enum":["Homme","Femme",null],"description":"Sexe renseigné dans la fiche ; null signifie non renseigné et efface la valeur en écriture."},"city_code":{"type":["string","null"],"maxLength":5,"description":"Code de commune du référentiel SIGPAS. Reprendre exactement city_code de GET /communes?postal_code=… ; ce n’est pas un code postal. null signifie non renseigné et efface la valeur en écriture."},"address":{"type":["string","null"],"maxLength":10000,"description":"Adresse de la personne, hors commune ; null signifie non renseignée et efface la valeur en écriture."},"email_verified":{"type":["boolean","null"],"readOnly":true,"description":"Indique si l’adresse email a été validée. Champ en lecture seule."},"created_at":{"type":["string","null"],"format":"date-time","readOnly":true,"description":"Date et heure de création de la fiche, en RFC 3339 ; null si inconnue. Champ en lecture seule."},"parents":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"type":["string","null"],"enum":["Pere","Mere","Institution","Responsable_legal","Famille_accueil","Sans_objet",null],"description":"Lien du représentant avec la personne : père, mère, institution, responsable légal, famille d’accueil ou sans objet."},"first_name":{"type":["string","null"],"maxLength":63,"description":"Prénom du représentant."},"last_name":{"type":["string","null"],"maxLength":63,"description":"Nom du représentant."},"title":{"type":["string","null"],"maxLength":63,"description":"Intitulé du représentant ou de l’institution."},"phone":{"type":["string","null"],"maxLength":15,"description":"Téléphone du représentant."},"email":{"type":["string","null"],"maxLength":127,"description":"Adresse email du représentant."},"profession":{"type":["string","null"],"maxLength":127,"description":"Profession du représentant."}}},"description":"Représentants légaux. En écriture, remplace toute la liste ; [] supprime tous les représentants. Un champ parents omis conserve la liste existante. Deux représentants au maximum en écriture."}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Liste paginée des adhérents dont l’inscription à ce groupe est validée. Le groupe porte son season_id ; utilisez POST /groups/search pour le trouver par saison, jour ou nom."}},"/members/{id}/attendance":{"get":{"operationId":"get_members_id_attendance","summary":"Consulter les présences d’un adhérent pour une saison","tags":["attendance"],"security":[{"oauth2":["members:read","attendance:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"offset","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}},{"name":"season_id","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","format":"date"}},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","format":"date"}},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["lesson","slot","event"]}},{"name":"presence","in":"query","required":false,"schema":{"type":"string","enum":["present","absent","excused"]}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["member_id","season_id","date","type","course_id","group_id","title","begin","end","location","presence","course_attendance_path"],"properties":{"member_id":{"type":"integer"},"season_id":{"type":"integer"},"date":{"type":"string","format":"date"},"type":{"type":"string","enum":["lesson","slot","event"]},"course_id":{"type":"integer"},"group_id":{"type":["integer","null"]},"title":{"type":"string"},"begin":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"},"location":{"type":"string"},"presence":{"type":"string","enum":["present","absent","excused"]},"course_attendance_path":{"type":"string"}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_offset":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Historique paginé des présences effectivement renseignées pour un adhérent pendant une saison : cours, créneaux et événements. Une séance sans présence enregistrée n’est pas interprétée comme une absence. Les filtres de dates, de type et de présence sont facultatifs."}},"/members/{id}/registrations":{"get":{"operationId":"get_members_id_registrations","summary":"Consulter les inscriptions d’un adhérent pour une saison","tags":["members"],"security":[{"oauth2":["members:read","registrations:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"offset","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}},{"name":"season_id","in":"query","required":true,"description":"Identifiant obtenu avec GET /seasons.","schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["registration_type","id","member_id","season_id","group_id","event_id","activity_name","registered_at","valid","validated_at","registration_path","activity_path"],"properties":{"registration_type":{"type":"string","enum":["annual","event"]},"id":{"type":"integer"},"member_id":{"type":"integer"},"season_id":{"type":"integer"},"group_id":{"type":["integer","null"]},"event_id":{"type":["integer","null"]},"activity_name":{"type":"string"},"registered_at":{"type":["string","null"],"format":"date-time"},"valid":{"type":["boolean","null"]},"validated_at":{"type":["string","null"],"format":"date-time"},"registration_path":{"type":"string"},"activity_path":{"type":"string"}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_offset":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Liste les inscriptions annuelles et événementielles d’un adhérent dans une saison. Chaque entrée indique son type, son état et les chemins de l’inscription et de l’activité."}},"/members/search":{"post":{"operationId":"post_members_search","summary":"Rechercher un adhérent dans une saison","tags":["seasonal"],"security":[{"oauth2":["members:read","groups:read"]}],"parameters":[],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647,"readOnly":true,"description":"Identifiant de la fiche personne, stable entre les saisons. Une fiche ne constitue pas une inscription."},"email":{"type":["string","null"],"format":"email","maxLength":127,"description":"Adresse email de la personne. Un changement réinitialise sa validation."},"first_name":{"type":["string","null"],"maxLength":63,"description":"Prénom de la personne."},"last_name":{"type":["string","null"],"maxLength":63,"description":"Nom de famille de la personne."},"phone":{"type":["string","null"],"maxLength":15,"description":"Téléphone de la personne ; null signifie non renseigné et efface la valeur en écriture."},"birth_date":{"type":["string","null"],"format":"date","description":"Date de naissance au format YYYY-MM-DD ; null signifie non renseignée et efface la valeur en écriture."},"sex":{"type":["string","null"],"enum":["Homme","Femme",null],"description":"Sexe renseigné dans la fiche ; null signifie non renseigné et efface la valeur en écriture."},"city_code":{"type":["string","null"],"maxLength":5,"description":"Code de commune du référentiel SIGPAS. Reprendre exactement city_code de GET /communes?postal_code=… ; ce n’est pas un code postal. null signifie non renseigné et efface la valeur en écriture."},"address":{"type":["string","null"],"maxLength":10000,"description":"Adresse de la personne, hors commune ; null signifie non renseignée et efface la valeur en écriture."},"email_verified":{"type":["boolean","null"],"readOnly":true,"description":"Indique si l’adresse email a été validée. Champ en lecture seule."},"created_at":{"type":["string","null"],"format":"date-time","readOnly":true,"description":"Date et heure de création de la fiche, en RFC 3339 ; null si inconnue. Champ en lecture seule."},"parents":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"type":["string","null"],"enum":["Pere","Mere","Institution","Responsable_legal","Famille_accueil","Sans_objet",null],"description":"Lien du représentant avec la personne : père, mère, institution, responsable légal, famille d’accueil ou sans objet."},"first_name":{"type":["string","null"],"maxLength":63,"description":"Prénom du représentant."},"last_name":{"type":["string","null"],"maxLength":63,"description":"Nom du représentant."},"title":{"type":["string","null"],"maxLength":63,"description":"Intitulé du représentant ou de l’institution."},"phone":{"type":["string","null"],"maxLength":15,"description":"Téléphone du représentant."},"email":{"type":["string","null"],"maxLength":127,"description":"Adresse email du représentant."},"profession":{"type":["string","null"],"maxLength":127,"description":"Profession du représentant."}}},"description":"Représentants légaux. En écriture, remplace toute la liste ; [] supprime tous les représentants. Un champ parents omis conserve la liste existante. Deux représentants au maximum en écriture."},"matches":{"type":"array","items":{"type":"string","enum":["member_name","member_email","parent_name","parent_email"]}},"season_id":{"type":"integer"},"registrations":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","group_id","group_name","season_id","valid"],"properties":{"id":{"type":"integer"},"group_id":{"type":"integer"},"group_name":{"type":"string"},"season_id":{"type":"integer"},"valid":{"type":"boolean","const":true}}}},"registrations_path":{"type":"string"},"attendance_path":{"type":"string"}}}},"meta":{"type":"object","additionalProperties":false,"required":["limit","truncated"],"properties":{"limit":{"type":"integer"},"truncated":{"type":"boolean"}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Recherche, dans une saison obligatoire, un adhérent par nom ou prénom partiel, ou par adresse email exacte. La recherche couvre aussi les noms et emails des représentants légaux. group_id permet de limiter la recherche à un groupe de cette saison. Seules les inscriptions validées sont retenues. Utilisez POST afin que les données personnelles recherchées ne figurent pas dans l’URL ni dans les journaux d’accès HTTP.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["query","season_id"],"properties":{"query":{"type":"string","minLength":2,"maxLength":127,"description":"Nom ou prénom partiel, ou adresse email exacte de l’adhérent ou d’un représentant légal."},"season_id":{"type":"integer","minimum":1,"maximum":2147483647},"group_id":{"type":"integer","minimum":1,"maximum":2147483647},"limit":{"type":"integer","minimum":1,"maximum":50,"default":20}}}}}}}},"/groups/search":{"post":{"operationId":"post_groups_search","summary":"Rechercher des groupes dans une saison","tags":["seasonal"],"security":[{"oauth2":["groups:read"]}],"parameters":[],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647},"name":{"type":["string","null"],"maxLength":255},"season_id":{"type":["integer","null"],"maximum":2147483647},"sport_id":{"type":["integer","null"],"maximum":2147483647},"description":{"type":["string","null"],"maxLength":10000},"sex":{"type":["string","null"],"enum":["Homme","Femme","Homme et femme",null]},"type":{"type":["string","null"],"enum":["Loisir","Intermediaire","Competition",null]},"capacity":{"type":["integer","null"],"maximum":100000},"birth_year_start":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"birth_year_end":{"type":["integer","null"],"maximum":2200,"description":"Année de naissance limite."},"auto_validate":{"type":["boolean","null"]},"invitation_only":{"type":["boolean","null"]},"cost_euros":{"type":["integer","null"],"maximum":10000000,"description":"Montant en euros entiers."},"slot_count":{"type":["integer","null"],"maximum":100},"slot_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100},"licence_ids":{"type":"array","items":{"type":"integer","minimum":1,"maximum":2147483647},"maxItems":100},"season_path":{"type":"string"},"members_path":{"type":"string","description":"Chemin relatif à appeler avec GET pour obtenir les adhérents validés du groupe."},"schedules":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["type","id","name","day","hour","minute","duration_minutes","location"],"properties":{"type":{"type":"string","enum":["lesson","slot"]},"id":{"type":"integer"},"name":{"type":["string","null"]},"day":{"type":"string","enum":["lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche"]},"hour":{"type":"integer"},"minute":{"type":"integer"},"duration_minutes":{"type":"integer"},"location":{"type":["string","null"]}}}},"member_count":{"type":"integer","minimum":0}}}},"meta":{"type":"object","additionalProperties":false,"required":["limit","truncated"],"properties":{"limit":{"type":"integer"},"truncated":{"type":"boolean"}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}},"description":"Recherche les groupes d’une saison par nom, jour de pratique et/ou sport. Chaque résultat contient ses horaires, son nombre d’inscrits validés et members_path. Pour répondre à « qui participe à un groupe le mardi ? », recherchez day=mardi puis appelez GET /groups/{id}/members pour chaque groupe retenu.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["season_id"],"properties":{"season_id":{"type":"integer","minimum":1,"maximum":2147483647},"query":{"type":"string","minLength":2,"maxLength":255,"description":"Partie du nom du groupe."},"day":{"type":"string","enum":["lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche"]},"sport_id":{"type":"integer","minimum":1,"maximum":2147483647},"limit":{"type":"integer","minimum":1,"maximum":50,"default":20}}}}}}}},"/events/{id}/members":{"get":{"operationId":"get_events_id_members","summary":"Lister les participants validés d’un événement","tags":["events"],"security":[{"oauth2":["events:read","registrations:read","members:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"id":{"type":["integer","null"],"maximum":2147483647,"readOnly":true,"description":"Identifiant de la fiche personne, stable entre les saisons. Une fiche ne constitue pas une inscription."},"email":{"type":["string","null"],"format":"email","maxLength":127,"description":"Adresse email de la personne. Un changement réinitialise sa validation."},"first_name":{"type":["string","null"],"maxLength":63,"description":"Prénom de la personne."},"last_name":{"type":["string","null"],"maxLength":63,"description":"Nom de famille de la personne."},"phone":{"type":["string","null"],"maxLength":15,"description":"Téléphone de la personne ; null signifie non renseigné et efface la valeur en écriture."},"birth_date":{"type":["string","null"],"format":"date","description":"Date de naissance au format YYYY-MM-DD ; null signifie non renseignée et efface la valeur en écriture."},"sex":{"type":["string","null"],"enum":["Homme","Femme",null],"description":"Sexe renseigné dans la fiche ; null signifie non renseigné et efface la valeur en écriture."},"city_code":{"type":["string","null"],"maxLength":5,"description":"Code de commune du référentiel SIGPAS. Reprendre exactement city_code de GET /communes?postal_code=… ; ce n’est pas un code postal. null signifie non renseigné et efface la valeur en écriture."},"address":{"type":["string","null"],"maxLength":10000,"description":"Adresse de la personne, hors commune ; null signifie non renseignée et efface la valeur en écriture."},"email_verified":{"type":["boolean","null"],"readOnly":true,"description":"Indique si l’adresse email a été validée. Champ en lecture seule."},"created_at":{"type":["string","null"],"format":"date-time","readOnly":true,"description":"Date et heure de création de la fiche, en RFC 3339 ; null si inconnue. Champ en lecture seule."},"parents":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"type":["string","null"],"enum":["Pere","Mere","Institution","Responsable_legal","Famille_accueil","Sans_objet",null],"description":"Lien du représentant avec la personne : père, mère, institution, responsable légal, famille d’accueil ou sans objet."},"first_name":{"type":["string","null"],"maxLength":63,"description":"Prénom du représentant."},"last_name":{"type":["string","null"],"maxLength":63,"description":"Nom du représentant."},"title":{"type":["string","null"],"maxLength":63,"description":"Intitulé du représentant ou de l’institution."},"phone":{"type":["string","null"],"maxLength":15,"description":"Téléphone du représentant."},"email":{"type":["string","null"],"maxLength":127,"description":"Adresse email du représentant."},"profession":{"type":["string","null"],"maxLength":127,"description":"Profession du représentant."}}},"description":"Représentants légaux. En écriture, remplace toute la liste ; [] supprime tous les représentants. Un champ parents omis conserve la liste existante. Deux représentants au maximum en écriture."}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/payments/{id}/allocation-options":{"get":{"operationId":"get_payments_id_allocation-options","summary":"GET /payments/{id}/allocation-options","tags":["payments"],"security":[{"oauth2":["payments:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","description":"Valeur à transmettre dans allocations."},"label":{"type":"string"},"amount_cents":{"type":"integer"},"allocated_cents":{"type":"integer"},"selected":{"type":"boolean"},"source":{"type":["string","null"]}}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/annual-registrations/{id}/invoice":{"get":{"operationId":"get_annual-registrations_id_invoice","summary":"GET /annual-registrations/{id}/invoice","tags":["registrations"],"security":[{"oauth2":["documents:read","payments:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/pdf":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/event-registrations/{id}/invoice":{"get":{"operationId":"get_event-registrations_id_invoice","summary":"GET /event-registrations/{id}/invoice","tags":["registrations"],"security":[{"oauth2":["documents:read","payments:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"application/pdf":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/member-documents/{id}":{"get":{"operationId":"get_member-documents_id","summary":"GET /member-documents/{id}","tags":["discovery"],"security":[{"oauth2":["documents:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"after","in":"query","description":"Valeur next_after ou next_offset de la réponse précédente.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Identifiant field_id du champ document."},"name":{"type":"string"},"description":{"type":["string","null"]},"required":{"type":"boolean"},"available":{"type":"boolean"},"mime_type":{"type":["string","null"]},"size_bytes":{"type":["integer","null"]}}}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_after":{"type":["integer","null"]}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/member-documents/{id}/fields/{field_id}":{"put":{"operationId":"put_member-documents_id_fields_field_id","summary":"PUT /member-documents/{id}/fields/{field_id}","tags":["discovery"],"security":[{"oauth2":["documents:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"field_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["content_base64"],"properties":{"content_base64":{"type":"string","minLength":4,"maxLength":13981016,"contentEncoding":"base64","description":"PDF, JPEG ou PNG, maximum 10 Mio décodés."}}}}}}},"delete":{"operationId":"delete_member-documents_id_fields_field_id","summary":"DELETE /member-documents/{id}/fields/{field_id}","tags":["discovery"],"security":[{"oauth2":["documents:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"field_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mutation"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/member-documents/{id}/fields/{field_id}/content":{"get":{"operationId":"get_member-documents_id_fields_field_id_content","summary":"GET /member-documents/{id}/fields/{field_id}/content","tags":["discovery"],"security":[{"oauth2":["documents:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}},{"name":"field_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"maximum":2147483647}}],"responses":{"200":{"description":"Succès","content":{"*/*":{"schema":{"type":"string"}}}},"default":{"$ref":"#/components/responses/Problem"}}}}},"webhooks":{"members.created":{"post":{"operationId":"webhook_members_created","summary":"Adhérent créé","description":"Un nouveau compte adhérent est créé. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"members.created"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"members.updated":{"post":{"operationId":"webhook_members_updated","summary":"Adhérent modifié","description":"Les informations d’un adhérent sont modifiées. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"members.updated"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"members.deleted":{"post":{"operationId":"webhook_members_deleted","summary":"Adhérent supprimé","description":"Un compte adhérent est supprimé. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"members.deleted"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"registrations.created":{"post":{"operationId":"webhook_registrations_created","summary":"Inscription créée","description":"Une demande annuelle ou ponctuelle est créée. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"registrations.created"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"registrations.updated":{"post":{"operationId":"webhook_registrations_updated","summary":"Inscription modifiée","description":"Le contenu d’une inscription est modifié. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"registrations.updated"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"registrations.validated":{"post":{"operationId":"webhook_registrations_validated","summary":"Inscription validée","description":"Une inscription est acceptée par le club. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"registrations.validated"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"registrations.rejected":{"post":{"operationId":"webhook_registrations_rejected","summary":"Inscription refusée","description":"Une inscription est refusée par le club. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"registrations.rejected"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"registrations.cancelled":{"post":{"operationId":"webhook_registrations_cancelled","summary":"Inscription annulée","description":"Une inscription précédemment créée est annulée. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"registrations.cancelled"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"groups.created":{"post":{"operationId":"webhook_groups_created","summary":"Groupe ou créneau créé","description":"Un groupe ou un créneau est créé. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"groups.created"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"groups.updated":{"post":{"operationId":"webhook_groups_updated","summary":"Groupe ou créneau modifié","description":"La configuration d’un groupe ou d’un créneau change. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"groups.updated"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"groups.deleted":{"post":{"operationId":"webhook_groups_deleted","summary":"Groupe ou créneau supprimé","description":"Un groupe ou un créneau est supprimé. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"groups.deleted"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"events.created":{"post":{"operationId":"webhook_events_created","summary":"Événement créé","description":"Un événement ponctuel est créé. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"events.created"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"events.updated":{"post":{"operationId":"webhook_events_updated","summary":"Événement modifié","description":"La configuration d’un événement change. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"events.updated"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"events.deleted":{"post":{"operationId":"webhook_events_deleted","summary":"Événement supprimé","description":"Un événement ponctuel est supprimé. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"events.deleted"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"attendance.present_recorded":{"post":{"operationId":"webhook_attendance_present_recorded","summary":"Présence saisie","description":"Un participant est marqué présent à une séance. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"attendance.present_recorded"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"attendance.absent_recorded":{"post":{"operationId":"webhook_attendance_absent_recorded","summary":"Absence saisie","description":"Un participant est marqué absent à une séance. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"attendance.absent_recorded"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"attendance.excused_recorded":{"post":{"operationId":"webhook_attendance_excused_recorded","summary":"Absence excusée saisie","description":"Un participant est marqué absent avec une absence excusée ou prévue. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"attendance.excused_recorded"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"attendance.cleared":{"post":{"operationId":"webhook_attendance_cleared","summary":"Pointage effacé","description":"Le statut de présence précédemment saisi pour un participant est effacé. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"attendance.cleared"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"payments.created":{"post":{"operationId":"webhook_payments_created","summary":"Paiement enregistré","description":"Un paiement est enregistré dans SIGPAS. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"payments.created"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"payments.updated":{"post":{"operationId":"webhook_payments_updated","summary":"Paiement modifié","description":"Un paiement existant est corrigé ou réaffecté. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"payments.updated"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"payments.deleted":{"post":{"operationId":"webhook_payments_deleted","summary":"Paiement supprimé","description":"Un paiement précédemment enregistré est supprimé. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"payments.deleted"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"documents.created":{"post":{"operationId":"webhook_documents_created","summary":"Document déposé","description":"Un document est déposé ou généré dans SIGPAS. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"documents.created"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"documents.updated":{"post":{"operationId":"webhook_documents_updated","summary":"Document remplacé","description":"Le contenu ou les informations d’un document sont remplacés. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"documents.updated"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"documents.deleted":{"post":{"operationId":"webhook_documents_deleted","summary":"Document supprimé","description":"Un document précédemment déposé est supprimé. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"documents.deleted"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"medical.submitted":{"post":{"operationId":"webhook_medical_submitted","summary":"Pièce médicale déposée","description":"Une attestation ou un certificat médical est déposé. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"medical.submitted"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"medical.validated":{"post":{"operationId":"webhook_medical_validated","summary":"Pièce médicale validée","description":"Une pièce médicale est acceptée par le club. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"medical.validated"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"medical.rejected":{"post":{"operationId":"webhook_medical_rejected","summary":"Pièce médicale refusée","description":"Une pièce médicale est refusée par le club. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"medical.rejected"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}},"staff_hours.month_submitted":{"post":{"operationId":"webhook_staff_hours_month_submitted","summary":"Relevé mensuel validé","description":"Un membre du personnel termine et valide son relevé d’heures du mois. Signature Standard Webhooks HMAC-SHA256 ; voir /docs#webhooks.","security":[],"parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/cloudevents+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"properties":{"type":{"const":"staff_hours.month_submitted"}}}]}}}},"responses":{"2XX":{"description":"Notification enregistrée durablement par le destinataire."}}}}},"components":{"securitySchemes":{"oauth2":{"type":"oauth2","flows":{"clientCredentials":{"tokenUrl":"https://sigpas.fr/ugsp/api/v1/token","scopes":{"members:read":"Identité, coordonnées, date de naissance, représentants légaux et état du compte. Les informations médicales, paiements et documents sont exclus.","members:write":"Création et modification des informations d’identité, de contact et des représentants légaux.","registrations:read":"Demandes annuelles ou ponctuelles, activité demandée, dates et état de validation. Les informations médicales et le détail des paiements sont exclus.","registrations:write":"Création, modification, validation, refus ou annulation d’une inscription.","groups:read":"Paramètres des saisons, sports, groupes, créneaux, horaires, lieux, capacités et règles d’inscription. La liste nominative des inscrits nécessite aussi l’accès aux adhérents.","groups:write":"Création, modification et suppression des saisons ; création et modification des groupes, créneaux, horaires, lieux et capacités.","events:read":"Événements, dates, lieux, capacités, tarifs et paramètres d’inscription. Les participants relèvent des accès aux inscriptions et aux adhérents.","events:write":"Création, modification et suppression des événements et de leurs paramètres.","attendance:read":"Séances à appeler, participants attendus et statuts de présence, d’absence ou d’absence excusée. L’accès aux fiches complètes des participants nécessite aussi l’accès aux adhérents.","attendance:write":"Saisie et correction du statut de présence d’un participant pour un cours, un créneau ou un événement.","payments:read":"Montants, dates, modes, états et affectations aux inscriptions. Les numéros de carte et coordonnées bancaires ne sont pas inclus.","payments:write":"Enregistrement, correction, affectation et suppression des paiements dans SIGPAS.","documents:read":"Métadonnées et contenu des documents déposés ou générés. Ces fichiers peuvent contenir des données personnelles sensibles.","documents:write":"Dépôt, remplacement et suppression de documents.","medical:read":"Attestations de questionnaire de santé, certificats médicaux, dates, types, décisions de validation et suivi par saison.","medical:write":"Enregistrement des attestations et certificats, puis validation ou refus des pièces médicales.","staff_hours:read":"Relevés mensuels validés par le personnel, avec leurs dates, durées et descriptions."}}}}},"schemas":{"Webhook":{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"Notification SIGPAS v1 — CloudEvents 1.0","type":"object","required":["specversion","id","source","type","subject","time","datacontenttype","dataschema","data"],"properties":{"specversion":{"const":"1.0"},"id":{"type":"string","pattern":"^[a-f0-9]{32}$"},"source":{"type":"string","format":"uri"},"type":{"type":"string","enum":["members.created","members.updated","members.deleted","registrations.created","registrations.updated","registrations.validated","registrations.rejected","registrations.cancelled","groups.created","groups.updated","groups.deleted","events.created","events.updated","events.deleted","attendance.present_recorded","attendance.absent_recorded","attendance.excused_recorded","attendance.cleared","payments.created","payments.updated","payments.deleted","documents.created","documents.updated","documents.deleted","medical.submitted","medical.validated","medical.rejected","staff_hours.month_submitted"]},"subject":{"type":"string"},"time":{"type":"string","format":"date-time"},"datacontenttype":{"const":"application/json"},"dataschema":{"type":"string","format":"uri"},"data":{"type":"object","required":["resource","context","links"],"properties":{"resource":{"type":"object","required":["type","id","url","required_scopes","deleted"],"properties":{"url":{"type":"string","format":"uri"},"required_scopes":{"type":"array","items":{"type":"string"}},"type":{"type":"string"},"id":{"type":"string"},"deleted":{"type":"boolean"}}},"context":{"type":"object","description":"Références au moment du changement. Présence : member_id, course_type, course_id, date, presence. Heures : member_id, year, month. Pièce adhérent : member_id, field_id. Inscription : member_id et group_id ou event_id.","properties":{"member_id":{"type":["integer","null"]},"group_id":{"type":["integer","null"]},"event_id":{"type":["integer","null"]},"season_id":{"type":["integer","null"]},"field_id":{"type":"integer"},"course_id":{"type":"integer"},"course_type":{"enum":["lesson","slot","event"]},"date":{"type":["string","null"],"format":"date"},"presence":{"enum":["present","absent","excused",null]},"year":{"type":"integer"},"month":{"type":"integer","minimum":1,"maximum":12},"kind":{"type":"string"}}},"links":{"type":"object","additionalProperties":{"type":"object","required":["url","required_scopes"],"properties":{"url":{"type":"string","format":"uri"},"required_scopes":{"type":"array","items":{"type":"string"}}}},"description":"Liens facultatifs ; chaque lien indique ses autorisations supplémentaires."}}}}},"Problem":{"type":"object","required":["type","title","status","detail","code"],"properties":{"type":{"type":"string","description":"about:blank ou URL de documentation du type de problème."},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"code":{"type":"string","description":"integration_api_disabled indique que le directeur doit activer Accès pour logiciels externes dans Administration → Fonctionnalités."}}},"Mutation":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["id"],"properties":{"id":{"type":"integer"}}}}},"ApiChanges":{"type":"object","additionalProperties":false,"required":["from","to","changes","openapi"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"changes":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["version","date","type","summary","operations_added","recommendation"],"properties":{"version":{"type":"string"},"date":{"type":"string","format":"date"},"type":{"type":"string","enum":["additive","fix","breaking"]},"summary":{"type":"string"},"operations_added":{"type":"array","items":{"type":"string"}},"recommendation":{"type":"string"}}}},"openapi":{"type":"string","format":"uri"}}}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":true,"description":"Une nouvelle clé par opération. Réutiliser la même clé et le même corps après une coupure. Même réponse d’identifiant, sans répéter l’écriture. Une autre requête avec cette clé renvoie 409. Clés conservées pendant la durée de vie de l’intégration.","schema":{"type":"string","minLength":16,"maxLength":128,"pattern":"^[A-Za-z0-9._:-]+$"}}},"responses":{"Problem":{"description":"Erreur HTTP documentée par status, code et detail.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"OAuthError":{"description":"Erreur OAuth documentée par error et error_description.","content":{"application/json":{"schema":{"type":"object","required":["error","error_description"],"properties":{"error":{"type":"string"},"error_description":{"type":"string"},"error_uri":{"type":"string","format":"uri"}}}}}}}}}