{
  "openapi": "3.1.0",
  "info": {
    "title": "CAPIT Chat — Console et admissions",
    "version": "1.0.0",
    "description": "API versionnée de console. /manage est l’alias utilisé par la console existante. Chaque requête vérifie le propriétaire et le tenant. POST exige l’origine exacte de la console ; cookie sécurisé propre au domaine. Les quotas payants et paiements ne sont pas ouverts. Le widget public conserve /chat/api et /chat/socket."
  },
  "servers": [
    {
      "url": "https://chat.capit.net/chat"
    },
    {
      "url": "https://api.capit.net/chat"
    }
  ],
  "paths": {
    "/api/v1/console/me": {
      "get": {
        "summary": "Compte commun connecté",
        "description": "",
        "security": [
          {
            "ownerSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "name": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "name"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    },
    "/api/v1/console/workspaces": {
      "get": {
        "summary": "Lister ses chats",
        "description": "",
        "security": [
          {
            "ownerSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "id": {
                        "type": "string",
                        "format": "uuid"
                      },
                      "name": {
                        "type": "string"
                      },
                      "plan": {
                        "type": "string"
                      },
                      "origins": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "format": "uri",
                          "pattern": "^https://[^/]+$"
                        }
                      }
                    },
                    "required": [
                      "id",
                      "name",
                      "plan",
                      "origins"
                    ]
                  }
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      },
      "post": {
        "summary": "Créer son chat gratuit",
        "description": "Compte OIDC CAPIT obligatoire. Jusqu’à dix espaces par propriétaire, cinq créations par heure. Gratuit cinq personnes simultanées par espace. Aucun paiement.",
        "security": [
          {
            "ownerSession": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  "origins": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 20,
                    "items": {
                      "type": "string",
                      "format": "uri",
                      "pattern": "^https://[^/]+$"
                    }
                  }
                },
                "required": [
                  "name",
                  "origins"
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    },
    "/api/v1/console/workspaces/{id}": {
      "get": {
        "summary": "Lire réglages, consommation et formule",
        "description": "",
        "security": [
          {
            "ownerSession": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      },
      "post": {
        "summary": "Enregistrer les réglages",
        "description": "Le plan et ses plafonds ne sont pas modifiables depuis la console. Les valeurs dépassant la formule sont refusées.",
        "security": [
          {
            "ownerSession": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  "origins": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 20,
                    "items": {
                      "type": "string",
                      "format": "uri",
                      "pattern": "^https://[^/]+$"
                    }
                  },
                  "settings": {
                    "$ref": "#/components/schemas/Settings"
                  },
                  "retentionDays": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 365
                  },
                  "automaticModeration": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "name",
                  "origins",
                  "settings",
                  "retentionDays",
                  "automaticModeration"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    },
    "/api/v1/console/workspaces/{id}/grant": {
      "post": {
        "summary": "Tester le chat avec son identité de propriétaire",
        "description": "Grant HS256 valable 60 secondes et à usage unique ; sa session reste liée à la session CAPIT.",
        "security": [
          {
            "ownerSession": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {},
                "required": []
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    },
    "/api/v1/console/workspaces/{id}/key": {
      "post": {
        "summary": "Consulter sa clé serveur",
        "description": "Action explicite du propriétaire. Réponse confidentielle sans cache. Ne jamais transmettre cette clé aux visiteurs, dans une URL ou un snippet iframe.",
        "security": [
          {
            "ownerSession": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {},
                "required": []
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    },
    "/api/v1/console/workspaces/{id}/key/rotate": {
      "post": {
        "summary": "Renouveler la clé serveur",
        "description": "Invalide les anciens grants et jetons de reprise invités signés ; les sessions de participation déjà créées expirent selon leur durée normale. Mettre à jour le serveur intégrateur. Les instances synchronisent le registre sous 30 secondes.",
        "security": [
          {
            "ownerSession": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {},
                "required": []
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    },
    "/api/v1/console/workspaces/{id}/export": {
      "get": {
        "summary": "Exporter une page d’historique public",
        "description": "500 messages maximum. Utiliser les deux valeurs next pour poursuivre. Aucun historique privé.",
        "security": [
          {
            "ownerSession": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "after",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "in": "query",
            "name": "afterId",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    },
    "/api/v1/console/workspaces/{id}/members": {
      "get": {
        "summary": "Lister les utilisateurs",
        "description": "Pagination par identifiant, cent utilisateurs maximum. Aucune adresse e-mail ni identité de fournisseur.",
        "security": [
          {
            "ownerSession": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "after",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    },
    "/api/v1/console/workspaces/{id}/queue": {
      "get": {
        "summary": "Lire les contenus en attente ou signalés",
        "description": "Les échanges privés publiés non signalés sont exclus. Accès journalisé.",
        "security": [
          {
            "ownerSession": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    },
    "/api/v1/console/workspaces/{id}/audit": {
      "get": {
        "summary": "Lire les cent derniers événements techniques",
        "description": "",
        "security": [
          {
            "ownerSession": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    },
    "/api/v1/console/workspaces/{id}/media/{media}": {
      "get": {
        "summary": "Examiner un média en attente ou signalé",
        "description": "Réponse binaire seulement si en attente ou signalé ; accès journalisé.",
        "security": [
          {
            "ownerSession": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "path",
            "name": "media",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    },
    "/api/v1/console/workspaces/{id}/decision": {
      "post": {
        "summary": "Traiter une modération",
        "description": "",
        "security": [
          {
            "ownerSession": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "kind": {
                    "enum": [
                      "message",
                      "media"
                    ]
                  },
                  "approve": {
                    "type": "boolean"
                  },
                  "reason": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500
                  }
                },
                "required": [
                  "id",
                  "kind",
                  "approve",
                  "reason"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    },
    "/api/v1/console/workspaces/{id}/ban": {
      "post": {
        "summary": "Suspendre ou rétablir un membre",
        "description": "0 lève la suspension ; null est sans échéance. Les comptes système et administrateurs ne peuvent pas être suspendus par cette route.",
        "security": [
          {
            "ownerSession": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "target": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "minutes": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "minimum": 0,
                    "maximum": 525600
                  },
                  "reason": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500
                  }
                },
                "required": [
                  "target",
                  "minutes",
                  "reason"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    },
    "/api/v1/console/workspaces/{id}/role": {
      "post": {
        "summary": "Modifier un rôle",
        "description": "",
        "security": [
          {
            "ownerSession": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "target": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "role": {
                    "enum": [
                      "member",
                      "moderator",
                      "admin"
                    ]
                  },
                  "reason": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500
                  }
                },
                "required": [
                  "target",
                  "role",
                  "reason"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    },
    "/api/guest": {
      "post": {
        "summary": "Obtenir une identité invitée",
        "description": "Doit être activé pour cet espace. Identité aléatoire côté serveur ; reprise signée maximum 24 heures. Aucun rôle fourni par le navigateur.",
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "tenant": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 60
                  },
                  "resume": {
                    "type": "string"
                  }
                },
                "required": [
                  "tenant",
                  "name"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    },
    "/api/session": {
      "post": {
        "summary": "Échanger un grant contre une session",
        "description": "Grant HS256 tenant/issuer/audience jeanne-chat, sub, name, iat/exp (60 secondes), jti UUID unique, role optionnel. Origine autorisée obligatoire. HTTP409 chat_full si nouvelle personne au-delà de la capacité ; renouvellement d’une admission existante accepté.",
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "tenant": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "grant": {
                    "type": "string"
                  }
                },
                "required": [
                  "tenant",
                  "grant"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    },
    "/api/capacity": {
      "get": {
        "summary": "Lire la capacité de son espace",
        "description": "",
        "security": [
          {
            "participantSession": []
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides"
          },
          "401": {
            "description": "Session manquante ou expirée"
          },
          "403": {
            "description": "Origine ou droit refusé"
          },
          "404": {
            "description": "Ressource absente ou inaccessible"
          },
          "409": {
            "description": "Quota atteint ou conflit"
          },
          "429": {
            "description": "Limitation de débit"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ownerSession": {
        "type": "apiKey",
        "in": "cookie",
        "name": "__Host-capitchat"
      },
      "participantSession": {
        "type": "http",
        "scheme": "bearer"
      }
    },
    "schemas": {
      "Settings": {
        "type": "object",
        "properties": {
          "description": {
            "default": "",
            "type": "string",
            "maxLength": 300
          },
          "logo": {
            "default": "",
            "type": "string",
            "maxLength": 500
          },
          "mode": {
            "default": "light",
            "type": "string",
            "enum": [
              "light",
              "dark"
            ]
          },
          "accent": {
            "default": "#653b88",
            "type": "string",
            "pattern": "^#[a-f0-9]{6}$"
          },
          "photos": {
            "default": true,
            "type": "boolean"
          },
          "presenceDots": {
            "default": false,
            "type": "boolean"
          },
          "profileColors": {
            "default": false,
            "type": "boolean"
          },
          "privateChat": {
            "default": true,
            "type": "boolean"
          },
          "invitations": {
            "default": true,
            "type": "boolean"
          },
          "photosEnabled": {
            "default": true,
            "type": "boolean"
          },
          "audioEnabled": {
            "default": true,
            "type": "boolean"
          },
          "notifications": {
            "default": true,
            "type": "boolean"
          },
          "allowGuests": {
            "default": false,
            "type": "boolean"
          },
          "authenticatedOnly": {
            "default": [],
            "maxItems": 3,
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "private",
                "photo",
                "audio"
              ]
            }
          },
          "botName": {
            "default": "Assistant",
            "type": "string",
            "minLength": 1,
            "maxLength": 40
          },
          "welcome": {
            "default": "Bonjour {name}",
            "type": "string",
            "maxLength": 200
          },
          "animationInterval": {
            "default": 30,
            "type": "integer",
            "minimum": 15,
            "maximum": 1440
          },
          "idleMinutes": {
            "default": 10,
            "type": "integer",
            "minimum": 5,
            "maximum": 1440
          },
          "startHourUTC": {
            "default": 0,
            "type": "integer",
            "minimum": 0,
            "maximum": 23
          },
          "endHourUTC": {
            "default": 24,
            "type": "integer",
            "minimum": 0,
            "maximum": 24
          },
          "language": {
            "default": "fr",
            "type": "string",
            "enum": [
              "fr",
              "en",
              "de",
              "es",
              "it",
              "pt",
              "nl",
              "pl",
              "tr"
            ]
          },
          "animationMode": {
            "default": "off",
            "type": "string",
            "enum": [
              "off",
              "after_message",
              "scheduled"
            ]
          },
          "instructions": {
            "default": "",
            "type": "string",
            "maxLength": 1500
          },
          "forbiddenWords": {
            "default": [],
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 2,
              "maxLength": 50
            }
          },
          "actions": {
            "default": [
              "profile",
              "public",
              "private"
            ],
            "maxItems": 3,
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "profile",
                "public",
                "private"
              ]
            }
          },
          "width": {
            "default": 1000,
            "type": "integer",
            "minimum": 280,
            "maximum": 2000
          },
          "height": {
            "default": 640,
            "type": "integer",
            "minimum": 320,
            "maximum": 1200
          },
          "position": {
            "default": "page",
            "type": "string",
            "enum": [
              "page",
              "bottom-right",
              "bottom-left"
            ]
          }
        },
        "required": [
          "description",
          "logo",
          "mode",
          "accent",
          "photos",
          "presenceDots",
          "profileColors",
          "privateChat",
          "invitations",
          "photosEnabled",
          "audioEnabled",
          "notifications",
          "allowGuests",
          "authenticatedOnly",
          "botName",
          "welcome",
          "animationInterval",
          "idleMinutes",
          "startHourUTC",
          "endHourUTC",
          "language",
          "animationMode",
          "instructions",
          "forbiddenWords",
          "actions",
          "width",
          "height",
          "position"
        ],
        "additionalProperties": false
      }
    }
  }
}
