{
  "openapi": "3.0.3",
  "info": {
    "title": "My Live Sport · API web",
    "version": "1",
    "description": "Jeton d’entreprise créé dans Compte → API et tokens par un administrateur de cette entreprise. La gestion des jetons et le Swagger intégré sont réservés aux administrateurs. Lecture seule par défaut ; sports et expiration configurables. Chaque jeton accède uniquement aux données de son entreprise. Le statut actif du créateur, son rôle administrateur et la licence de l’entreprise sont revérifiés à chaque requête, même pour un administrateur serveur. Les champs des données et les types d’événements dépendent du sport. POST écrit réellement dans le match et peut recalculer score et composition. Aucun cookie de session n’est nécessaire."
  },
  "servers": [
    {
      "url": "/",
      "description": "Cette application (Swagger intégré)"
    },
    {
      "url": "https://app.mylivesport.fr",
      "description": "Application publique"
    }
  ],
  "security": [
    {
      "ApiBearer": []
    }
  ],
  "paths": {
    "/api/football/get_all_championship": {
      "get": {
        "tags": [
          "Football"
        ],
        "summary": "Lister les championnats accessibles",
        "operationId": "football_get_all_championship",
        "parameters": [
          {
            "name": "include_archived",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "enum": [
                0,
                1
              ],
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/football/get_championship": {
      "get": {
        "tags": [
          "Football"
        ],
        "summary": "Lire un championnat",
        "operationId": "football_get_championship",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/football/get_all_matchs": {
      "get": {
        "tags": [
          "Football"
        ],
        "summary": "Lister les matchs visibles du championnat",
        "operationId": "football_get_all_matchs",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/football/get_match": {
      "get": {
        "tags": [
          "Football"
        ],
        "summary": "Lire le match et ses droits",
        "operationId": "football_get_match",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/football/get_match_events": {
      "get": {
        "tags": [
          "Football"
        ],
        "summary": "Lire les événements du match",
        "operationId": "football_get_match_events",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/football/get_match_players": {
      "get": {
        "tags": [
          "Football"
        ],
        "summary": "Lire la composition du match",
        "operationId": "football_get_match_players",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/football/get_championship_standings": {
      "get": {
        "tags": [
          "Football"
        ],
        "summary": "Lire les classements du championnat",
        "operationId": "football_get_championship_standings",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "day_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Journée du classement historique. Omis : classement courant."
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/football/get_match_snapshot": {
      "get": {
        "tags": [
          "Football"
        ],
        "summary": "Lire le contexte sportif, les journées voisines, buteurs et classement",
        "operationId": "football_get_match_snapshot",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SnapshotSuccess"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/football/get_all_days": {
      "get": {
        "tags": [
          "Football"
        ],
        "summary": "Lister les journées du championnat",
        "operationId": "football_get_all_days",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/football/get_all_phases": {
      "get": {
        "tags": [
          "Football"
        ],
        "summary": "Lister les phases du championnat",
        "operationId": "football_get_all_phases",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/football/get_all_groups": {
      "get": {
        "tags": [
          "Football"
        ],
        "summary": "Lister les groupes du championnat",
        "operationId": "football_get_all_groups",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/football/update_match_event": {
      "post": {
        "tags": [
          "Football"
        ],
        "summary": "Créer ou modifier un événement du match",
        "operationId": "football_update_match_event",
        "description": "Exige un jeton Lecture et écriture d’événements et les droits sur le match. id=\"new\" crée un événement ; un identifiant numérique modifie un événement de ce même match. Aucun mécanisme d’idempotence : vérifier les événements avant de réessayer après une coupure. Les exemples utilisent des identifiants fictifs et le type 1 dont le sens varie selon le sport.",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "match_id",
                  "club_id",
                  "type"
                ],
                "properties": {
                  "id": {
                    "oneOf": [
                      {
                        "type": "integer",
                        "minimum": 1
                      },
                      {
                        "type": "string",
                        "enum": [
                          "new"
                        ]
                      }
                    ]
                  },
                  "match_id": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "type": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 30
                  },
                  "player_id": {
                    "type": "integer",
                    "nullable": true
                  },
                  "player_id_in": {
                    "type": "integer",
                    "nullable": true
                  },
                  "club_id": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "timer": {
                    "type": "string",
                    "nullable": true
                  },
                  "additional_timer": {
                    "type": "integer",
                    "nullable": true
                  },
                  "value": {
                    "type": "string",
                    "nullable": true,
                    "maxLength": 255
                  }
                }
              },
              "example": {
                "id": "new",
                "match_id": 2,
                "club_id": 3,
                "type": 1,
                "player_id": 11,
                "timer": "23"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Événement enregistré.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/futsal/get_all_championship": {
      "get": {
        "tags": [
          "Futsal"
        ],
        "summary": "Lister les championnats accessibles",
        "operationId": "futsal_get_all_championship",
        "parameters": [
          {
            "name": "include_archived",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "enum": [
                0,
                1
              ],
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/futsal/get_championship": {
      "get": {
        "tags": [
          "Futsal"
        ],
        "summary": "Lire un championnat",
        "operationId": "futsal_get_championship",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/futsal/get_all_matchs": {
      "get": {
        "tags": [
          "Futsal"
        ],
        "summary": "Lister les matchs visibles du championnat",
        "operationId": "futsal_get_all_matchs",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/futsal/get_match": {
      "get": {
        "tags": [
          "Futsal"
        ],
        "summary": "Lire le match et ses droits",
        "operationId": "futsal_get_match",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/futsal/get_match_events": {
      "get": {
        "tags": [
          "Futsal"
        ],
        "summary": "Lire les événements du match",
        "operationId": "futsal_get_match_events",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/futsal/get_match_players": {
      "get": {
        "tags": [
          "Futsal"
        ],
        "summary": "Lire la composition du match",
        "operationId": "futsal_get_match_players",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/futsal/get_championship_standings": {
      "get": {
        "tags": [
          "Futsal"
        ],
        "summary": "Lire les classements du championnat",
        "operationId": "futsal_get_championship_standings",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "day_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Journée du classement historique. Omis : classement courant."
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/futsal/get_match_snapshot": {
      "get": {
        "tags": [
          "Futsal"
        ],
        "summary": "Lire le contexte sportif, les journées voisines, buteurs et classement",
        "operationId": "futsal_get_match_snapshot",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SnapshotSuccess"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/futsal/get_all_days": {
      "get": {
        "tags": [
          "Futsal"
        ],
        "summary": "Lister les journées du championnat",
        "operationId": "futsal_get_all_days",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/futsal/get_all_phases": {
      "get": {
        "tags": [
          "Futsal"
        ],
        "summary": "Lister les phases du championnat",
        "operationId": "futsal_get_all_phases",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/futsal/get_all_groups": {
      "get": {
        "tags": [
          "Futsal"
        ],
        "summary": "Lister les groupes du championnat",
        "operationId": "futsal_get_all_groups",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/futsal/update_match_event": {
      "post": {
        "tags": [
          "Futsal"
        ],
        "summary": "Créer ou modifier un événement du match",
        "operationId": "futsal_update_match_event",
        "description": "Exige un jeton Lecture et écriture d’événements et les droits sur le match. id=\"new\" crée un événement ; un identifiant numérique modifie un événement de ce même match. Aucun mécanisme d’idempotence : vérifier les événements avant de réessayer après une coupure. Les exemples utilisent des identifiants fictifs et le type 1 dont le sens varie selon le sport.",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "match_id",
                  "club_id",
                  "type"
                ],
                "properties": {
                  "id": {
                    "oneOf": [
                      {
                        "type": "integer",
                        "minimum": 1
                      },
                      {
                        "type": "string",
                        "enum": [
                          "new"
                        ]
                      }
                    ]
                  },
                  "match_id": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "type": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 30
                  },
                  "player_id": {
                    "type": "integer",
                    "nullable": true
                  },
                  "player_id_in": {
                    "type": "integer",
                    "nullable": true
                  },
                  "club_id": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "timer": {
                    "type": "string",
                    "nullable": true
                  },
                  "additional_timer": {
                    "type": "integer",
                    "nullable": true
                  },
                  "value": {
                    "type": "string",
                    "nullable": true,
                    "maxLength": 255
                  }
                }
              },
              "example": {
                "id": "new",
                "match_id": 2,
                "club_id": 3,
                "type": 1,
                "player_id": 11,
                "timer": "23"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Événement enregistré.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/hockey/get_all_championship": {
      "get": {
        "tags": [
          "Hockey"
        ],
        "summary": "Lister les championnats accessibles",
        "operationId": "hockey_get_all_championship",
        "parameters": [
          {
            "name": "include_archived",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "enum": [
                0,
                1
              ],
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/hockey/get_championship": {
      "get": {
        "tags": [
          "Hockey"
        ],
        "summary": "Lire un championnat",
        "operationId": "hockey_get_championship",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/hockey/get_all_matchs": {
      "get": {
        "tags": [
          "Hockey"
        ],
        "summary": "Lister les matchs visibles du championnat",
        "operationId": "hockey_get_all_matchs",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/hockey/get_match": {
      "get": {
        "tags": [
          "Hockey"
        ],
        "summary": "Lire le match et ses droits",
        "operationId": "hockey_get_match",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/hockey/get_match_events": {
      "get": {
        "tags": [
          "Hockey"
        ],
        "summary": "Lire les événements du match",
        "operationId": "hockey_get_match_events",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/hockey/get_match_players": {
      "get": {
        "tags": [
          "Hockey"
        ],
        "summary": "Lire la composition du match",
        "operationId": "hockey_get_match_players",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/hockey/get_championship_standings": {
      "get": {
        "tags": [
          "Hockey"
        ],
        "summary": "Lire les classements du championnat",
        "operationId": "hockey_get_championship_standings",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "day_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Journée du classement historique. Omis : classement courant."
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/hockey/get_match_snapshot": {
      "get": {
        "tags": [
          "Hockey"
        ],
        "summary": "Lire le contexte sportif, les journées voisines, buteurs et classement",
        "operationId": "hockey_get_match_snapshot",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SnapshotSuccess"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/hockey/get_all_days": {
      "get": {
        "tags": [
          "Hockey"
        ],
        "summary": "Lister les journées du championnat",
        "operationId": "hockey_get_all_days",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/hockey/get_all_phases": {
      "get": {
        "tags": [
          "Hockey"
        ],
        "summary": "Lister les phases du championnat",
        "operationId": "hockey_get_all_phases",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/hockey/get_all_groups": {
      "get": {
        "tags": [
          "Hockey"
        ],
        "summary": "Lister les groupes du championnat",
        "operationId": "hockey_get_all_groups",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/hockey/update_match_event": {
      "post": {
        "tags": [
          "Hockey"
        ],
        "summary": "Créer ou modifier un événement du match",
        "operationId": "hockey_update_match_event",
        "description": "Exige un jeton Lecture et écriture d’événements et les droits sur le match. id=\"new\" crée un événement ; un identifiant numérique modifie un événement de ce même match. Aucun mécanisme d’idempotence : vérifier les événements avant de réessayer après une coupure. Les exemples utilisent des identifiants fictifs et le type 1 dont le sens varie selon le sport.",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "match_id",
                  "club_id",
                  "type"
                ],
                "properties": {
                  "id": {
                    "oneOf": [
                      {
                        "type": "integer",
                        "minimum": 1
                      },
                      {
                        "type": "string",
                        "enum": [
                          "new"
                        ]
                      }
                    ]
                  },
                  "match_id": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "type": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 30
                  },
                  "player_id": {
                    "type": "integer",
                    "nullable": true
                  },
                  "player_id_in": {
                    "type": "integer",
                    "nullable": true
                  },
                  "club_id": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "timer": {
                    "type": "string",
                    "nullable": true
                  },
                  "additional_timer": {
                    "type": "integer",
                    "nullable": true
                  },
                  "value": {
                    "type": "string",
                    "nullable": true,
                    "maxLength": 255
                  }
                }
              },
              "example": {
                "id": "new",
                "match_id": 2,
                "club_id": 3,
                "type": 1,
                "player_id": 11,
                "timer": "23"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Événement enregistré.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/basketball/get_all_championship": {
      "get": {
        "tags": [
          "Basketball"
        ],
        "summary": "Lister les championnats accessibles",
        "operationId": "basketball_get_all_championship",
        "parameters": [
          {
            "name": "include_archived",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "enum": [
                0,
                1
              ],
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/basketball/get_championship": {
      "get": {
        "tags": [
          "Basketball"
        ],
        "summary": "Lire un championnat",
        "operationId": "basketball_get_championship",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/basketball/get_all_matchs": {
      "get": {
        "tags": [
          "Basketball"
        ],
        "summary": "Lister les matchs visibles du championnat",
        "operationId": "basketball_get_all_matchs",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/basketball/get_match": {
      "get": {
        "tags": [
          "Basketball"
        ],
        "summary": "Lire le match et ses droits",
        "operationId": "basketball_get_match",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/basketball/get_match_events": {
      "get": {
        "tags": [
          "Basketball"
        ],
        "summary": "Lire les événements du match",
        "operationId": "basketball_get_match_events",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/basketball/get_match_players": {
      "get": {
        "tags": [
          "Basketball"
        ],
        "summary": "Lire la composition du match",
        "operationId": "basketball_get_match_players",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/basketball/get_championship_standings": {
      "get": {
        "tags": [
          "Basketball"
        ],
        "summary": "Lire les classements du championnat",
        "operationId": "basketball_get_championship_standings",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "day_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Journée du classement historique. Omis : classement courant."
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/basketball/get_match_snapshot": {
      "get": {
        "tags": [
          "Basketball"
        ],
        "summary": "Lire le contexte sportif, les journées voisines, buteurs et classement",
        "operationId": "basketball_get_match_snapshot",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SnapshotSuccess"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/basketball/get_all_days": {
      "get": {
        "tags": [
          "Basketball"
        ],
        "summary": "Lister les journées du championnat",
        "operationId": "basketball_get_all_days",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/basketball/get_all_phases": {
      "get": {
        "tags": [
          "Basketball"
        ],
        "summary": "Lister les phases du championnat",
        "operationId": "basketball_get_all_phases",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/basketball/get_all_groups": {
      "get": {
        "tags": [
          "Basketball"
        ],
        "summary": "Lister les groupes du championnat",
        "operationId": "basketball_get_all_groups",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/basketball/update_match_event": {
      "post": {
        "tags": [
          "Basketball"
        ],
        "summary": "Créer ou modifier un événement du match",
        "operationId": "basketball_update_match_event",
        "description": "Exige un jeton Lecture et écriture d’événements et les droits sur le match. id=\"new\" crée un événement ; un identifiant numérique modifie un événement de ce même match. Aucun mécanisme d’idempotence : vérifier les événements avant de réessayer après une coupure. Les exemples utilisent des identifiants fictifs et le type 1 dont le sens varie selon le sport.",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "match_id",
                  "club_id",
                  "type"
                ],
                "properties": {
                  "id": {
                    "oneOf": [
                      {
                        "type": "integer",
                        "minimum": 1
                      },
                      {
                        "type": "string",
                        "enum": [
                          "new"
                        ]
                      }
                    ]
                  },
                  "match_id": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "type": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 30
                  },
                  "player_id": {
                    "type": "integer",
                    "nullable": true
                  },
                  "player_id_in": {
                    "type": "integer",
                    "nullable": true
                  },
                  "club_id": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "timer": {
                    "type": "string",
                    "nullable": true
                  },
                  "additional_timer": {
                    "type": "integer",
                    "nullable": true
                  },
                  "value": {
                    "type": "string",
                    "nullable": true,
                    "maxLength": 255
                  }
                }
              },
              "example": {
                "id": "new",
                "match_id": 2,
                "club_id": 3,
                "type": 1,
                "player_id": 11,
                "timer": "23"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Événement enregistré.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/handball/get_all_championship": {
      "get": {
        "tags": [
          "Handball"
        ],
        "summary": "Lister les championnats accessibles",
        "operationId": "handball_get_all_championship",
        "parameters": [
          {
            "name": "include_archived",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "enum": [
                0,
                1
              ],
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/handball/get_championship": {
      "get": {
        "tags": [
          "Handball"
        ],
        "summary": "Lire un championnat",
        "operationId": "handball_get_championship",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/handball/get_all_matchs": {
      "get": {
        "tags": [
          "Handball"
        ],
        "summary": "Lister les matchs visibles du championnat",
        "operationId": "handball_get_all_matchs",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/handball/get_match": {
      "get": {
        "tags": [
          "Handball"
        ],
        "summary": "Lire le match et ses droits",
        "operationId": "handball_get_match",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/handball/get_match_events": {
      "get": {
        "tags": [
          "Handball"
        ],
        "summary": "Lire les événements du match",
        "operationId": "handball_get_match_events",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/handball/get_match_players": {
      "get": {
        "tags": [
          "Handball"
        ],
        "summary": "Lire la composition du match",
        "operationId": "handball_get_match_players",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/handball/get_championship_standings": {
      "get": {
        "tags": [
          "Handball"
        ],
        "summary": "Lire les classements du championnat",
        "operationId": "handball_get_championship_standings",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "day_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Journée du classement historique. Omis : classement courant."
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/handball/get_match_snapshot": {
      "get": {
        "tags": [
          "Handball"
        ],
        "summary": "Lire le contexte sportif, les journées voisines, buteurs et classement",
        "operationId": "handball_get_match_snapshot",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SnapshotSuccess"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/handball/get_all_days": {
      "get": {
        "tags": [
          "Handball"
        ],
        "summary": "Lister les journées du championnat",
        "operationId": "handball_get_all_days",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/handball/get_all_phases": {
      "get": {
        "tags": [
          "Handball"
        ],
        "summary": "Lister les phases du championnat",
        "operationId": "handball_get_all_phases",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/handball/get_all_groups": {
      "get": {
        "tags": [
          "Handball"
        ],
        "summary": "Lister les groupes du championnat",
        "operationId": "handball_get_all_groups",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/handball/update_match_event": {
      "post": {
        "tags": [
          "Handball"
        ],
        "summary": "Créer ou modifier un événement du match",
        "operationId": "handball_update_match_event",
        "description": "Exige un jeton Lecture et écriture d’événements et les droits sur le match. id=\"new\" crée un événement ; un identifiant numérique modifie un événement de ce même match. Aucun mécanisme d’idempotence : vérifier les événements avant de réessayer après une coupure. Les exemples utilisent des identifiants fictifs et le type 1 dont le sens varie selon le sport.",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "match_id",
                  "club_id",
                  "type"
                ],
                "properties": {
                  "id": {
                    "oneOf": [
                      {
                        "type": "integer",
                        "minimum": 1
                      },
                      {
                        "type": "string",
                        "enum": [
                          "new"
                        ]
                      }
                    ]
                  },
                  "match_id": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "type": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 30
                  },
                  "player_id": {
                    "type": "integer",
                    "nullable": true
                  },
                  "player_id_in": {
                    "type": "integer",
                    "nullable": true
                  },
                  "club_id": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "timer": {
                    "type": "string",
                    "nullable": true
                  },
                  "additional_timer": {
                    "type": "integer",
                    "nullable": true
                  },
                  "value": {
                    "type": "string",
                    "nullable": true,
                    "maxLength": 255
                  }
                }
              },
              "example": {
                "id": "new",
                "match_id": 2,
                "club_id": 3,
                "type": 1,
                "player_id": 11,
                "timer": "23"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Événement enregistré.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/tennis/get_all_championship": {
      "get": {
        "tags": [
          "Tennis"
        ],
        "summary": "Lister les championnats accessibles",
        "operationId": "tennis_get_all_championship",
        "parameters": [
          {
            "name": "include_archived",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "enum": [
                0,
                1
              ],
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/tennis/get_championship": {
      "get": {
        "tags": [
          "Tennis"
        ],
        "summary": "Lire un championnat",
        "operationId": "tennis_get_championship",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/tennis/get_all_matchs": {
      "get": {
        "tags": [
          "Tennis"
        ],
        "summary": "Lister les matchs visibles du championnat",
        "operationId": "tennis_get_all_matchs",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/tennis/get_match": {
      "get": {
        "tags": [
          "Tennis"
        ],
        "summary": "Lire le match et ses droits",
        "operationId": "tennis_get_match",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/tennis/get_match_events": {
      "get": {
        "tags": [
          "Tennis"
        ],
        "summary": "Lire les événements du match",
        "operationId": "tennis_get_match_events",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/tennis/get_match_sets": {
      "get": {
        "tags": [
          "Tennis"
        ],
        "summary": "Lire les sets du match",
        "operationId": "tennis_get_match_sets",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/tennis/get_championship_standings": {
      "get": {
        "tags": [
          "Tennis"
        ],
        "summary": "Lire les classements du championnat",
        "operationId": "tennis_get_championship_standings",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "day_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Journée du classement historique. Omis : classement courant."
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/tennis/get_match_snapshot": {
      "get": {
        "tags": [
          "Tennis"
        ],
        "summary": "Lire le contexte sportif, les journées voisines, buteurs et classement",
        "operationId": "tennis_get_match_snapshot",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "match_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SnapshotSuccess"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/tennis/get_all_days": {
      "get": {
        "tags": [
          "Tennis"
        ],
        "summary": "Lister les journées du championnat",
        "operationId": "tennis_get_all_days",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/tennis/get_all_phases": {
      "get": {
        "tags": [
          "Tennis"
        ],
        "summary": "Lister les phases du championnat",
        "operationId": "tennis_get_all_phases",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/tennis/get_all_groups": {
      "get": {
        "tags": [
          "Tennis"
        ],
        "summary": "Lister les groupes du championnat",
        "operationId": "tennis_get_all_groups",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Données du sport.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "204": {
            "description": "Aucune donnée ; corps vide, ne pas appeler JSON.parse."
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/tennis/update_match_event": {
      "post": {
        "tags": [
          "Tennis"
        ],
        "summary": "Créer ou modifier un événement du match",
        "operationId": "tennis_update_match_event",
        "description": "Exige un jeton Lecture et écriture d’événements et les droits sur le match. id=\"new\" crée un événement ; un identifiant numérique modifie un événement de ce même match. Aucun mécanisme d’idempotence : vérifier les événements avant de réessayer après une coupure. Les exemples utilisent des identifiants fictifs et le type 1 dont le sens varie selon le sport.",
        "parameters": [
          {
            "name": "championship_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "match_id",
                  "type"
                ],
                "properties": {
                  "id": {
                    "oneOf": [
                      {
                        "type": "integer",
                        "minimum": 1
                      },
                      {
                        "type": "string",
                        "enum": [
                          "new"
                        ]
                      }
                    ]
                  },
                  "match_id": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "type": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 6
                  },
                  "player_id": {
                    "type": "integer",
                    "nullable": true
                  },
                  "set_number": {
                    "type": "integer",
                    "nullable": true
                  },
                  "note": {
                    "type": "string",
                    "nullable": true
                  }
                }
              },
              "example": {
                "id": "new",
                "match_id": 2,
                "type": 1,
                "player_id": 11,
                "set_number": 1,
                "note": ""
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Événement enregistré.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Success"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres ou JSON invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Clé ou jeton absent, invalide, expiré ou révoqué.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Sport, opération, compte, équipe ou licence non autorisé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Validation métier refusée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "428": {
            "description": "Session absente lorsque aucun en-tête Bearer n’est fourni.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Erreur interne.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiBearer": {
        "type": "http",
        "scheme": "bearer",
        "description": "Jeton mls_api_… appartenant à une entreprise et géré uniquement par ses administrateurs. Saisir le jeton sans préfixe Bearer dans Authorize."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string"
          },
          "success": {
            "type": "boolean"
          },
          "errors": {
            "type": "object",
            "additionalProperties": true
          },
          "error_id": {
            "type": "string"
          }
        },
        "additionalProperties": true
      },
      "Success": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {},
          "id": {
            "oneOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ]
          }
        },
        "additionalProperties": true
      },
      "MatchSummary": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "sport": {
            "type": "string"
          },
          "championshipId": {
            "type": "string"
          },
          "dayId": {
            "type": "string"
          },
          "dayLabel": {
            "type": "string"
          },
          "date": {
            "type": "string"
          },
          "time": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "timer": {
            "type": "string"
          },
          "period": {
            "type": "string"
          },
          "homeTeamId": {
            "type": "string"
          },
          "awayTeamId": {
            "type": "string"
          },
          "homeTeam": {
            "type": "string"
          },
          "awayTeam": {
            "type": "string"
          },
          "homeName": {
            "type": "string"
          },
          "awayName": {
            "type": "string"
          },
          "homeShortName": {
            "type": "string"
          },
          "awayShortName": {
            "type": "string"
          },
          "homeScore": {
            "type": "number",
            "nullable": true
          },
          "awayScore": {
            "type": "number",
            "nullable": true
          },
          "homeShootoutScore": {
            "type": "number",
            "nullable": true
          },
          "awayShootoutScore": {
            "type": "number",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MatchDetails": {
        "type": "object",
        "description": "Données sportives enregistrées. Textes absents vides, scores absents null ; aucun numéro de journée déduit de son ID. Au tennis, les scores sont les sets gagnés et les noms incluent les partenaires en double.",
        "properties": {
          "id": {
            "type": "string"
          },
          "sport": {
            "type": "string"
          },
          "championshipId": {
            "type": "string"
          },
          "dayId": {
            "type": "string"
          },
          "dayLabel": {
            "type": "string"
          },
          "date": {
            "type": "string"
          },
          "time": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "timer": {
            "type": "string"
          },
          "period": {
            "type": "string"
          },
          "homeTeamId": {
            "type": "string"
          },
          "awayTeamId": {
            "type": "string"
          },
          "homeTeam": {
            "type": "string"
          },
          "awayTeam": {
            "type": "string"
          },
          "homeName": {
            "type": "string"
          },
          "awayName": {
            "type": "string"
          },
          "homeShortName": {
            "type": "string"
          },
          "awayShortName": {
            "type": "string"
          },
          "homeScore": {
            "type": "number",
            "nullable": true
          },
          "awayScore": {
            "type": "number",
            "nullable": true
          },
          "homeShootoutScore": {
            "type": "number",
            "nullable": true
          },
          "awayShootoutScore": {
            "type": "number",
            "nullable": true
          },
          "competition": {
            "type": "string"
          },
          "season": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "stadium": {
            "type": "string"
          },
          "venue": {
            "type": "string"
          },
          "officials": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "role": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                }
              },
              "additionalProperties": false
            }
          },
          "commentators": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "role": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                }
              },
              "additionalProperties": false
            }
          },
          "weather": {
            "type": "object",
            "properties": {
              "sky": {
                "type": "string"
              },
              "temperature": {
                "type": "string"
              },
              "humidity": {
                "type": "string"
              },
              "wind": {
                "type": "string"
              }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": false
      },
      "MatchDay": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "relation": {
            "type": "string",
            "enum": [
              "previous",
              "current",
              "next"
            ]
          },
          "matches": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MatchSummary"
            }
          }
        },
        "additionalProperties": false
      },
      "Scorer": {
        "type": "object",
        "description": "Un événement de score sauvegardé. Hors tirs au but et événements optimistes. side désigne le bénéficiaire du score, y compris pour un CSC. Football/futsal/handball/hockey : 1 point ; basket : 1, 2 ou 3. Tableau vide au tennis.",
        "properties": {
          "eventId": {
            "type": "string"
          },
          "playerId": {
            "type": "string"
          },
          "playerName": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "side": {
            "type": "string",
            "enum": [
              "home",
              "away"
            ]
          },
          "type": {
            "type": "integer",
            "enum": [
              1,
              2,
              6
            ]
          },
          "timer": {
            "type": "string",
            "nullable": true
          },
          "additionalTimer": {
            "type": "integer",
            "nullable": true
          },
          "points": {
            "type": "integer",
            "minimum": 1,
            "maximum": 3
          },
          "ownGoal": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "Standing": {
        "type": "object",
        "description": "Classement chargé dans la page locale, courant dans le snapshot web. dayId identifie un éventuel historique ; points peut être négatif après une pénalité.",
        "properties": {
          "entityId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "dayId": {
            "type": "string"
          },
          "phaseId": {
            "type": "string"
          },
          "groupId": {
            "type": "string"
          },
          "groupName": {
            "type": "string"
          },
          "rank": {
            "type": "number",
            "nullable": true
          },
          "previousRank": {
            "type": "number",
            "nullable": true
          },
          "rankMovement": {
            "type": "number",
            "nullable": true
          },
          "played": {
            "type": "number",
            "nullable": true
          },
          "wins": {
            "type": "number",
            "nullable": true
          },
          "draws": {
            "type": "number",
            "nullable": true
          },
          "losses": {
            "type": "number",
            "nullable": true
          },
          "goalsFor": {
            "type": "number",
            "nullable": true
          },
          "goalsAgainst": {
            "type": "number",
            "nullable": true
          },
          "goalDifference": {
            "type": "number",
            "nullable": true
          },
          "points": {
            "type": "number",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MatchSnapshot": {
        "type": "object",
        "required": [
          "contextKey",
          "context",
          "match",
          "matchDays",
          "scorers",
          "standings"
        ],
        "properties": {
          "contextKey": {
            "type": "string"
          },
          "context": {
            "type": "object",
            "properties": {
              "sport": {
                "type": "string"
              },
              "championshipId": {
                "type": "string"
              },
              "matchId": {
                "type": "string"
              }
            }
          },
          "match": {
            "$ref": "#/components/schemas/MatchDetails"
          },
          "matchDays": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MatchDay"
            }
          },
          "scorers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Scorer"
            }
          },
          "standings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Standing"
            }
          }
        },
        "additionalProperties": false
      },
      "SnapshotSuccess": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "$ref": "#/components/schemas/MatchSnapshot"
          }
        }
      }
    }
  }
}
