{
  "openapi": "3.0.3",
  "info": {
    "title": "API Kaleo",
    "version": "2026-10-08",
    "description": "Kaleo AI fournit une API web pour contrôler vos sessions de diffusion, récupérer les analyses des spectateurs et surveiller les appareils Kaleo Connect. Vous pouvez utiliser notre API pour intégrer vos contrôles AVL personnalisés et vos flux de travail selon vos besoins.\n\nPour commencer, suivez les instructions ci-dessous pour obtenir une clé API, trouver votre ID d’église et authentifier vos requêtes.\n\n## Obtenir une clé API\n\n1. Allez à la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord.\n2. Entrez un nom et sélectionnez **Créer une clé API**.\n3. Copiez la clé et conservez-la en lieu sûr. La clé complète est affichée une seule fois.\n\nChaque clé fonctionne pour une seule église. Son créateur doit rester membre de l’église.\n\n## Trouver votre ID d’église\n\nCopiez l’**ID d’église** depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord. Utilisez-le comme `churchId` dans vos requêtes API.\n\n## Authentification\n\nEnvoyez votre clé exactement telle que copiée depuis la page [API](https://app.withkaleo.com/to/integrations/api) avec chaque requête :\n\n```text\nAuthorization: Bearer YOUR_API_KEY\n```\n\nDans le bac à sable API, saisissez uniquement votre clé copiée. Bearer est ajouté automatiquement."
  },
  "servers": [
    {
      "url": "https://babel.withkaleo.com",
      "description": "API de production"
    }
  ],
  "tags": [
    {
      "name": "Languages",
      "description": "Langues prises en charge pour les locuteurs et les traductions.",
      "x-displayName": "Langues"
    },
    {
      "name": "Devices",
      "description": "Appareils Kaleo Connect pouvant être surveillés et contrôlés à distance via l’API.",
      "x-displayName": "Appareils"
    },
    {
      "name": "Streaming",
      "description": "**Note : le point de terminaison Démarrer la diffusion ne peut être utilisé que pour démarrer la diffusion depuis un appareil Kaleo Connect.** Ce point de terminaison ne peut pas être utilisé pour démarrer la diffusion depuis un navigateur web. Tous les autres points de terminaison de diffusion contrôlent à la fois les navigateurs et les appareils Kaleo Connect.",
      "x-displayName": "Diffusion"
    },
    {
      "name": "Sessions",
      "description": "Historique des sessions et analyses des spectateurs.",
      "x-displayName": "Sessions"
    }
  ],
  "security": [
    {
      "ApiKeyBearer": []
    }
  ],
  "paths": {
    "/v1/church/{churchId}/devices": {
      "get": {
        "operationId": "listDevices",
        "summary": "Lister les appareils",
        "tags": [
          "Devices"
        ],
        "description": "Lister les appareils Kaleo Connect et leur disponibilité des fonctionnalités.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Votre ID d’église. Copiez-le depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Devices"
                },
                "example": {
                  "devices": [
                    {
                      "id": "00000000-0000-4000-8000-000000000002",
                      "name": "Sanctuary Mac",
                      "status": "online",
                      "capabilities": [
                        {
                          "capability": "audio-source",
                          "status": "ready"
                        },
                        {
                          "capability": "audio-output",
                          "status": "ready"
                        },
                        {
                          "capability": "propresenter",
                          "status": "unavailable"
                        }
                      ],
                      "lastSeenAt": null
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Les réponses ne sont pas mises en cache.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clé API manquante ou invalide, y compris expiration, révocation, mauvaise église ou propriétaire n’étant plus membre.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Échec temporaire du service ou de l’authentification. Réconciliez l’état avant de réessayer une requête de contrôle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "DEVICES_UNAVAILABLE"
                }
              }
            }
          }
        },
        "x-kaleo-anchor": "List devices"
      }
    },
    "/v1/church/{churchId}/devices/{deviceId}": {
      "get": {
        "operationId": "getDevice",
        "summary": "Obtenir un appareil",
        "tags": [
          "Devices"
        ],
        "description": "Lire un appareil Kaleo Connect et sa disponibilité des fonctionnalités.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Votre ID d’église. Copiez-le depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "deviceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "ID de l’appareil depuis `GET /devices`."
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceDetails"
                },
                "example": {
                  "device": {
                    "id": "00000000-0000-4000-8000-000000000002",
                    "name": "Sanctuary Mac",
                    "status": "online",
                    "capabilities": [
                      {
                        "capability": "audio-source",
                        "status": "ready"
                      },
                      {
                        "capability": "audio-output",
                        "status": "ready"
                      },
                      {
                        "capability": "propresenter",
                        "status": "unavailable"
                      }
                    ],
                    "lastSeenAt": null
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Les réponses ne sont pas mises en cache.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clé API manquante ou invalide, y compris expiration, révocation, mauvaise église ou propriétaire n’étant plus membre.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "404": {
            "description": "L’appareil n’existe pas dans cette église.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "DEVICE_NOT_FOUND"
                }
              }
            }
          },
          "503": {
            "description": "Échec temporaire du service ou de l’authentification. Réconciliez l’état avant de réessayer une requête de contrôle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "DEVICES_UNAVAILABLE"
                }
              }
            }
          }
        },
        "x-kaleo-anchor": "Get device"
      }
    },
    "/v1/church/{churchId}/streaming": {
      "get": {
        "operationId": "getStreaming",
        "summary": "Obtenir le statut de diffusion",
        "tags": [
          "Streaming"
        ],
        "description": "Lire la session en cours et les paramètres partagés de l’église. Tous les champs sont présents, même en veille.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Votre ID d’église. Copiez-le depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StreamingStatus"
                },
                "example": {
                  "streaming": true,
                  "sessionId": "00000000-0000-4000-8000-000000000001",
                  "startedAt": "2026-10-08T14:00:00.000Z",
                  "deadlineAt": "2026-10-08T16:00:00.000Z",
                  "speakerLanguage": "en",
                  "targetLanguages": [
                    "fr-FR"
                  ],
                  "voice": "male",
                  "visible": true,
                  "publisher": {
                    "kind": "connect",
                    "id": "00000000-0000-4000-8000-000000000002",
                    "name": "Sanctuary Mac"
                  },
                  "phase": "streaming",
                  "streamSettings": {
                    "revision": 4,
                    "settings": {
                      "speakerLanguage": "en",
                      "targetLanguages": [
                        "fr-FR"
                      ],
                      "duration": 3600
                    }
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Les réponses ne sont pas mises en cache.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clé API manquante ou invalide, y compris expiration, révocation, mauvaise église ou propriétaire n’étant plus membre.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Échec temporaire du service ou de l’authentification. Réconciliez l’état avant de réessayer une requête de contrôle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "CONTROL_UNAVAILABLE"
                }
              }
            }
          }
        },
        "x-kaleo-anchor": "Get streaming status"
      }
    },
    "/v1/church/{churchId}/streaming/start": {
      "post": {
        "operationId": "startStreaming",
        "summary": "Démarrer la diffusion",
        "tags": [
          "Streaming"
        ],
        "description": "Démarrez la diffusion sur un appareil Kaleo Connect en utilisant les paramètres enregistrés. Le corps optionnel peut sélectionner un `deviceId` et remplacer les paramètres pour cette session. Sans `deviceId`, Kaleo choisit la source audio par défaut configurée sur la page [Kaleo Connect](https://app.withkaleo.com/to/integrations/connect) (sous Intégrations) dans votre tableau de bord s’il y a plusieurs appareils audio disponibles, ou la seule source audio disponible si un seul appareil est disponible.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Votre ID d’église. Copiez-le depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StreamingStatus"
                },
                "example": {
                  "streaming": true,
                  "sessionId": "00000000-0000-4000-8000-000000000001",
                  "startedAt": "2026-10-08T14:00:00.000Z",
                  "deadlineAt": "2026-10-08T16:00:00.000Z",
                  "speakerLanguage": "en",
                  "targetLanguages": [
                    "fr-FR"
                  ],
                  "voice": "male",
                  "visible": true,
                  "publisher": {
                    "kind": "connect",
                    "id": "00000000-0000-4000-8000-000000000002",
                    "name": "Sanctuary Mac"
                  },
                  "phase": "streaming",
                  "streamSettings": {
                    "revision": 4,
                    "settings": {
                      "speakerLanguage": "en",
                      "targetLanguages": [
                        "fr-FR"
                      ],
                      "duration": 3600
                    }
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Les réponses ne sont pas mises en cache.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "JSON mal formé, champs non pris en charge ou valeurs invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Clé API manquante ou invalide, y compris expiration, révocation, mauvaise église ou propriétaire n’étant plus membre.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "403": {
            "description": "Le plan, la langue ou les limites d’utilisation empêchent ce démarrage.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "PLAN_LIMIT"
                }
              }
            }
          },
          "409": {
            "description": "Conflit de session active, source audio manquante ou sélection par défaut manquante, ou appareil sélectionné non prêt. Lisez le statut de diffusion et la disponibilité de l’appareil ; choisissez une valeur par défaut sur la page [Kaleo Connect](https://app.withkaleo.com/to/integrations/connect) (sous Intégrations) dans votre tableau de bord ou fournissez `deviceId` si nécessaire.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "ACTIVE_SESSION"
                }
              }
            }
          },
          "503": {
            "description": "Échec temporaire du service ou de l’authentification. Réconciliez l’état avant de réessayer une requête de contrôle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "CONTROL_UNAVAILABLE"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StartStreaming"
              },
              "examples": {
                "defaultAudioSource": {
                  "summary": "Utiliser la source audio par défaut",
                  "value": {}
                },
                "explicitDevice": {
                  "summary": "Choisissez un appareil pour cette session",
                  "value": {
                    "deviceId": "00000000-0000-4000-8000-000000000002"
                  }
                }
              }
            }
          },
          "description": "Omettez le corps ou envoyez `{}` pour utiliser la source audio par défaut et les paramètres enregistrés. Envoyez `deviceId` pour choisir un autre appareil pour cette session."
        },
        "x-kaleo-anchor": "Start streaming"
      }
    },
    "/v1/church/{churchId}/streaming/stop": {
      "post": {
        "operationId": "stopStreaming",
        "summary": "Arrêter la diffusion",
        "tags": [
          "Streaming"
        ],
        "description": "Arrêtez la session de diffusion en cours. Aucun corps de requête n’est nécessaire.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Votre ID d’église. Copiez-le depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StreamingStatus"
                },
                "example": {
                  "streaming": false,
                  "sessionId": null,
                  "startedAt": null,
                  "deadlineAt": null,
                  "speakerLanguage": null,
                  "targetLanguages": [],
                  "voice": "male",
                  "visible": true,
                  "publisher": null,
                  "phase": "idle",
                  "streamSettings": {
                    "revision": 4,
                    "settings": {
                      "speakerLanguage": "en",
                      "targetLanguages": [
                        "fr-FR"
                      ],
                      "duration": 3600
                    }
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Les réponses ne sont pas mises en cache.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clé API manquante ou invalide, y compris expiration, révocation, mauvaise église ou propriétaire n’étant plus membre.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Échec temporaire du service ou de l’authentification. Réconciliez l’état avant de réessayer une requête de contrôle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "CONTROL_UNAVAILABLE"
                }
              }
            }
          }
        },
        "x-kaleo-anchor": "Stop streaming"
      }
    },
    "/v1/church/{churchId}/streaming/voice": {
      "patch": {
        "operationId": "changeVoice",
        "summary": "Changer la voix de traduction",
        "tags": [
          "Streaming"
        ],
        "description": "Changez la voix de traduction pendant que la diffusion est inactive ou en cours.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Votre ID d’église. Copiez-le depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StreamingStatus"
                },
                "example": {
                  "streaming": true,
                  "sessionId": "00000000-0000-4000-8000-000000000001",
                  "startedAt": "2026-10-08T14:00:00.000Z",
                  "deadlineAt": "2026-10-08T16:00:00.000Z",
                  "speakerLanguage": "en",
                  "targetLanguages": [
                    "fr-FR"
                  ],
                  "voice": "female",
                  "visible": true,
                  "publisher": {
                    "kind": "connect",
                    "id": "00000000-0000-4000-8000-000000000002",
                    "name": "Sanctuary Mac"
                  },
                  "phase": "streaming",
                  "streamSettings": {
                    "revision": 4,
                    "settings": {
                      "speakerLanguage": "en",
                      "targetLanguages": [
                        "fr-FR"
                      ],
                      "duration": 3600
                    }
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Les réponses ne sont pas mises en cache.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "JSON mal formé, champs non pris en charge ou valeurs invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Clé API manquante ou invalide, y compris expiration, révocation, mauvaise église ou propriétaire n’étant plus membre.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "409": {
            "description": "Le flux a changé ou la commande n’a pas pu être confirmée. Lisez le statut de diffusion actuel avant d’envoyer une autre commande.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "SESSION_CHANGED"
                }
              }
            }
          },
          "503": {
            "description": "Échec temporaire du service ou de l’authentification. Réconciliez l’état avant de réessayer une requête de contrôle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "CONTROL_UNAVAILABLE"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeVoice"
              },
              "example": {
                "voice": "female"
              }
            }
          }
        },
        "x-kaleo-anchor": "Change translation voice"
      }
    },
    "/v1/church/{churchId}/streaming/visibility": {
      "patch": {
        "operationId": "changeVisibility",
        "summary": "Changer la visibilité",
        "tags": [
          "Streaming"
        ],
        "description": "Afficher ou masquer les sous-titres pendant que la diffusion est inactive ou en cours. Masquer les sous-titres ne stoppe pas la session.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Votre ID d’église. Copiez-le depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StreamingStatus"
                },
                "example": {
                  "streaming": true,
                  "sessionId": "00000000-0000-4000-8000-000000000001",
                  "startedAt": "2026-10-08T14:00:00.000Z",
                  "deadlineAt": "2026-10-08T16:00:00.000Z",
                  "speakerLanguage": "en",
                  "targetLanguages": [
                    "fr-FR"
                  ],
                  "voice": "male",
                  "visible": false,
                  "publisher": {
                    "kind": "connect",
                    "id": "00000000-0000-4000-8000-000000000002",
                    "name": "Sanctuary Mac"
                  },
                  "phase": "streaming",
                  "streamSettings": {
                    "revision": 4,
                    "settings": {
                      "speakerLanguage": "en",
                      "targetLanguages": [
                        "fr-FR"
                      ],
                      "duration": 3600
                    }
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Les réponses ne sont pas mises en cache.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "JSON mal formé, champs non pris en charge ou valeurs invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Clé API manquante ou invalide, y compris expiration, révocation, mauvaise église ou propriétaire n’étant plus membre.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Échec temporaire du service ou de l’authentification. Réconciliez l’état avant de réessayer une requête de contrôle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "CONTROL_UNAVAILABLE"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeVisibility"
              },
              "example": {
                "visible": false
              }
            }
          }
        },
        "x-kaleo-anchor": "Change visibility"
      }
    },
    "/v1/church/{churchId}/streaming/captions/clear": {
      "post": {
        "operationId": "clearCaptions",
        "summary": "Effacer les sous-titres",
        "tags": [
          "Streaming"
        ],
        "description": "Effacez le flux de sous-titres actuel. Aucun corps de requête n’est nécessaire.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Votre ID d’église. Copiez-le depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StreamingStatus"
                },
                "example": {
                  "streaming": true,
                  "sessionId": "00000000-0000-4000-8000-000000000001",
                  "startedAt": "2026-10-08T14:00:00.000Z",
                  "deadlineAt": "2026-10-08T16:00:00.000Z",
                  "speakerLanguage": "en",
                  "targetLanguages": [
                    "fr-FR"
                  ],
                  "voice": "male",
                  "visible": true,
                  "publisher": {
                    "kind": "connect",
                    "id": "00000000-0000-4000-8000-000000000002",
                    "name": "Sanctuary Mac"
                  },
                  "phase": "streaming",
                  "streamSettings": {
                    "revision": 4,
                    "settings": {
                      "speakerLanguage": "en",
                      "targetLanguages": [
                        "fr-FR"
                      ],
                      "duration": 3600
                    }
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Les réponses ne sont pas mises en cache.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clé API manquante ou invalide, y compris expiration, révocation, mauvaise église ou propriétaire n’étant plus membre.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Échec temporaire du service ou de l’authentification. Réconciliez l’état avant de réessayer une requête de contrôle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "CONTROL_UNAVAILABLE"
                }
              }
            }
          }
        },
        "x-kaleo-anchor": "Clear captions"
      }
    },
    "/v1/church/{churchId}/streaming/deadline": {
      "patch": {
        "operationId": "changeDeadline",
        "summary": "Changer la date limite d’arrêt automatique",
        "tags": [
          "Streaming"
        ],
        "description": "Définissez l’heure d’arrêt automatique pour une session active. Renvoie le statut de diffusion mis à jour.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Votre ID d’église. Copiez-le depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StreamingStatus"
                },
                "example": {
                  "streaming": true,
                  "sessionId": "00000000-0000-4000-8000-000000000001",
                  "startedAt": "2026-10-08T14:00:00.000Z",
                  "deadlineAt": "2026-10-08T16:00:00.000Z",
                  "speakerLanguage": "en",
                  "targetLanguages": [
                    "fr-FR"
                  ],
                  "voice": "male",
                  "visible": true,
                  "publisher": {
                    "kind": "connect",
                    "id": "00000000-0000-4000-8000-000000000002",
                    "name": "Sanctuary Mac"
                  },
                  "phase": "streaming",
                  "streamSettings": {
                    "revision": 4,
                    "settings": {
                      "speakerLanguage": "en",
                      "targetLanguages": [
                        "fr-FR"
                      ],
                      "duration": 3600
                    }
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Les réponses ne sont pas mises en cache.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "JSON mal formé, champs non pris en charge ou valeurs invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Clé API manquante ou invalide, y compris expiration, révocation, mauvaise église ou propriétaire n’étant plus membre.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "409": {
            "description": "`STREAM_OFFLINE` en veille ; `INVALID_DEADLINE` pour une date limite hors de la plage autorisée. Lisez le statut de diffusion actuel avant d’envoyer une autre commande.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_DEADLINE"
                }
              }
            }
          },
          "503": {
            "description": "Échec temporaire du service ou de l’authentification. Réconciliez l’état avant de réessayer une requête de contrôle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "CONTROL_UNAVAILABLE"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeDeadline"
              },
              "example": {
                "deadlineAt": "2026-10-08T16:00:00Z"
              }
            }
          }
        },
        "x-kaleo-anchor": "Change auto-stop deadline"
      }
    },
    "/v1/church/{churchId}/sessions": {
      "get": {
        "operationId": "listSessions",
        "summary": "Lister les sessions",
        "tags": [
          "Sessions"
        ],
        "description": "Lister les sessions, les plus récentes en premier, avec les analyses des spectateurs.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Votre ID d’église. Copiez-le depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            },
            "description": "Numéro de page, à partir de 1. Les valeurs supérieures à la dernière page renvoient la dernière page."
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 14
            },
            "description": "Sessions par page. Les valeurs supérieures à 100 utilisent 100."
          },
          {
            "name": "startedAfter",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Inclure les sessions commencées à ou après cette heure. Inclure Z ou un décalage horaire."
          },
          {
            "name": "startedBefore",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Inclure les sessions commencées à ou avant cette heure. Inclure Z ou un décalage horaire. Doit être à ou après `startedAfter`."
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HistoryPage"
                },
                "example": {
                  "sessions": [
                    {
                      "sessionId": "00000000-0000-4000-8000-000000000001",
                      "startedAt": "2026-10-04T14:00:00.000Z",
                      "endedAt": "2026-10-04T15:00:00.000Z",
                      "duration": 3600,
                      "speakerLanguage": "en",
                      "targetLanguages": [
                        "fr-FR"
                      ],
                      "transcriptAvailable": true,
                      "publicSharingEnabled": false,
                      "analytics": {
                        "sessionId": "00000000-0000-4000-8000-000000000001",
                        "status": "finalized",
                        "viewers": 12,
                        "viewerLanguages": {
                          "en": 8,
                          "fr-FR": 6
                        }
                      }
                    }
                  ],
                  "total": 1,
                  "page": 1,
                  "pageSize": 14
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Les réponses de lecture ne sont pas mises en cache.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Pagination entière positive invalide ou plage de temps invalide/inversée.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_HISTORY_RANGE"
                }
              }
            }
          },
          "401": {
            "description": "Clé API manquante ou invalide, y compris expiration, révocation, mauvaise église ou propriétaire n’étant plus membre de l’église.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Service d’historique ou d’authentification indisponible. Pas un résultat d’historique vide.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "SESSION_HISTORY_UNAVAILABLE"
                }
              }
            }
          }
        },
        "x-kaleo-anchor": "List sessions"
      }
    },
    "/v1/church/{churchId}/sessions/{sessionId}": {
      "get": {
        "operationId": "getSession",
        "summary": "Obtenir une session",
        "tags": [
          "Sessions"
        ],
        "description": "Lire une session et ses analyses des spectateurs.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Votre ID d’église. Copiez-le depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "ID de session depuis `GET /sessions`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionDetails"
                },
                "example": {
                  "session": {
                    "sessionId": "00000000-0000-4000-8000-000000000001",
                    "startedAt": "2026-10-04T14:00:00.000Z",
                    "endedAt": "2026-10-04T15:00:00.000Z",
                    "duration": 3600,
                    "speakerLanguage": "en",
                    "targetLanguages": [
                      "fr-FR"
                    ],
                    "transcriptAvailable": true,
                    "publicSharingEnabled": false,
                    "analytics": {
                      "sessionId": "00000000-0000-4000-8000-000000000001",
                      "status": "finalized",
                      "viewers": 12,
                      "viewerLanguages": {
                        "en": 8,
                        "fr-FR": 6
                      }
                    }
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Les réponses de lecture ne sont pas mises en cache.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clé API manquante ou invalide, y compris expiration, révocation, mauvaise église ou propriétaire n’étant plus membre de l’église.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "404": {
            "description": "Session manquante, supprimée, ID invalide ou appartenant à un autre propriétaire.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "SESSION_NOT_FOUND"
                }
              }
            }
          },
          "503": {
            "description": "Service d’historique ou d’authentification indisponible.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "SESSION_HISTORY_UNAVAILABLE"
                }
              }
            }
          }
        },
        "x-kaleo-anchor": "Get session"
      }
    },
    "/v1/church/{churchId}/languages/speaker": {
      "get": {
        "operationId": "listSpeakerLanguages",
        "summary": "Lister les langues des locuteurs",
        "tags": [
          "Languages"
        ],
        "description": "Lister les langues des locuteurs prises en charge. Utilisez ces codes dans `speakerLanguage`.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Votre ID d’église. Copiez-le depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Languages"
                },
                "example": {
                  "languages": [
                    {
                      "code": "en",
                      "name": "English",
                      "nativeName": "English",
                      "emoji": "🌎"
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Les réponses ne sont pas mises en cache.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clé API manquante ou invalide, y compris expiration, révocation, mauvaise église ou propriétaire n’étant plus membre.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Le service d’authentification est temporairement indisponible.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "AUTHENTICATION_UNAVAILABLE"
                }
              }
            }
          }
        },
        "x-kaleo-anchor": "List speaker languages"
      }
    },
    "/v1/church/{churchId}/languages/target": {
      "get": {
        "operationId": "listTargetLanguages",
        "summary": "Lister les langues cibles",
        "tags": [
          "Languages"
        ],
        "description": "Lister les langues de traduction prises en charge. Utilisez ces codes dans `targetLanguages`.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Votre ID d’église. Copiez-le depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Languages"
                },
                "example": {
                  "languages": [
                    {
                      "code": "en",
                      "name": "English",
                      "nativeName": "English",
                      "emoji": "🌎"
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Les réponses ne sont pas mises en cache.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clé API manquante ou invalide, y compris expiration, révocation, mauvaise église ou propriétaire n’étant plus membre.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Le service d’authentification est temporairement indisponible.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "AUTHENTICATION_UNAVAILABLE"
                }
              }
            }
          }
        },
        "x-kaleo-anchor": "List target languages"
      }
    },
    "/v1/church/{churchId}/languages/{code}": {
      "get": {
        "operationId": "getLanguage",
        "summary": "Obtenir une langue",
        "tags": [
          "Languages"
        ],
        "description": "Lire les noms et emoji pour un code de langue pris en charge.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Votre ID d’église. Copiez-le depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "code",
            "in": "path",
            "required": true,
            "description": "Code de langue exact, tel que `en` ou `zh-Hans`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LanguageDetails"
                },
                "example": {
                  "language": {
                    "code": "fr",
                    "name": "French (General)",
                    "nativeName": "Français",
                    "emoji": "🇫🇷"
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Les réponses ne sont pas mises en cache.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clé API manquante ou invalide, y compris expiration, révocation, mauvaise église ou propriétaire n’étant plus membre.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "404": {
            "description": "Code de langue non pris en charge.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "LANGUAGE_NOT_FOUND"
                }
              }
            }
          },
          "503": {
            "description": "Le service d’authentification est temporairement indisponible.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "AUTHENTICATION_UNAVAILABLE"
                }
              }
            }
          }
        },
        "x-kaleo-anchor": "Get language"
      }
    },
    "/v1/church/{churchId}/streaming/deadline/adjust": {
      "post": {
        "operationId": "adjustDeadline",
        "summary": "Ajuster l’heure d’arrêt automatique",
        "tags": [
          "Streaming"
        ],
        "description": "Ajouter ou soustraire du temps d’arrêt automatique. En veille, modifiez la durée pour le prochain démarrage manuel. En diffusion, modifiez la date limite actuelle. Chaque requête applique un ajustement séparé.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Votre ID d’église. Copiez-le depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StreamingStatus"
                },
                "example": {
                  "streaming": true,
                  "sessionId": "00000000-0000-4000-8000-000000000001",
                  "startedAt": "2026-10-08T14:00:00.000Z",
                  "deadlineAt": "2026-10-08T16:00:00.000Z",
                  "speakerLanguage": "en",
                  "targetLanguages": [
                    "fr-FR"
                  ],
                  "voice": "male",
                  "visible": true,
                  "publisher": {
                    "kind": "connect",
                    "id": "00000000-0000-4000-8000-000000000002",
                    "name": "Sanctuary Mac"
                  },
                  "phase": "streaming",
                  "streamSettings": {
                    "revision": 4,
                    "settings": {
                      "speakerLanguage": "en",
                      "targetLanguages": [
                        "fr-FR"
                      ],
                      "duration": 3600
                    }
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Les réponses ne sont pas mises en cache.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "JSON mal formé, champs non pris en charge ou valeurs invalides.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Clé API manquante ou invalide, y compris expiration, révocation, mauvaise église ou propriétaire n’étant plus membre.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "409": {
            "description": "`INVALID_DEADLINE` pour une date limite en direct hors de la plage autorisée ; `DEADLINE_NOT_SET` lorsque la session n’a pas de date limite. `SETTINGS_CHANGED` ou `SESSION_ACTIVE` lorsque les paramètres en veille ou l’admission ont changé simultanément. Lisez le statut de diffusion actuel avant d’envoyer une autre commande.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_DEADLINE"
                }
              }
            }
          },
          "503": {
            "description": "Échec temporaire du service ou de l’authentification. Réconciliez l’état avant de réessayer une requête de contrôle.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "CONTROL_UNAVAILABLE"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdjustDeadline"
              },
              "example": {
                "deltaSeconds": 120
              }
            }
          }
        },
        "x-kaleo-anchor": "Adjust auto-stop time"
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKeyBearer": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "API key",
        "description": "Entrez votre clé API exactement telle que copiée depuis la page [API](https://app.withkaleo.com/to/integrations/api) (sous Intégrations) dans votre tableau de bord. Bearer est ajouté automatiquement. Elle fonctionne pour une seule église tant que son créateur reste membre."
      }
    },
    "schemas": {
      "Device": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "ID de l’appareil. Passez cette valeur comme `deviceId` dans les requêtes."
          },
          "name": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "offline",
              "online",
              "maintenance"
            ],
            "description": "État de la connexion. Hors ligne après 90 secondes sans contact ; maintenance signifie temporairement indisponible."
          },
          "capabilities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DeviceCapability"
            },
            "description": "Disponibilité de chaque fonctionnalité sur cet appareil."
          },
          "lastSeenAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Dernier contact avec Kaleo ; `null` si inconnu."
          }
        },
        "required": [
          "id",
          "name",
          "status",
          "capabilities",
          "lastSeenAt"
        ],
        "additionalProperties": false
      },
      "DeviceCapability": {
        "type": "object",
        "properties": {
          "capability": {
            "type": "string",
            "enum": [
              "audio-source",
              "audio-output",
              "propresenter"
            ],
            "description": "Fonction locale : capture audio, lecture de la parole traduite ou entrée de diapositive ProPresenter."
          },
          "status": {
            "type": "string",
            "enum": [
              "ready",
              "unavailable",
              "offline"
            ],
            "description": "Indique si cette fonctionnalité est prête à être utilisée."
          }
        },
        "required": [
          "capability",
          "status"
        ],
        "additionalProperties": false
      },
      "Devices": {
        "type": "object",
        "properties": {
          "devices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Device"
            }
          }
        },
        "required": [
          "devices"
        ],
        "additionalProperties": false
      },
      "DeviceDetails": {
        "type": "object",
        "properties": {
          "device": {
            "$ref": "#/components/schemas/Device"
          }
        },
        "required": [
          "device"
        ],
        "additionalProperties": false
      },
      "ProPresenterSelection": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "default"
                ],
                "description": "Utiliser l’appareil ProPresenter par défaut de l’église."
              }
            },
            "required": [
              "mode"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "none"
                ],
                "description": "Ne pas utiliser ProPresenter pour cette session."
              }
            },
            "required": [
              "mode"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "device"
                ],
                "description": "Utiliser l’appareil spécifié par `deviceId`."
              },
              "deviceId": {
                "type": "string",
                "description": "ID de l’appareil source ProPresenter, depuis `GET /devices`. Peut différer de la source audio."
              }
            },
            "required": [
              "mode",
              "deviceId"
            ],
            "additionalProperties": false
          }
        ],
        "description": "Choisissez la source ProPresenter pour cette session. Configurez sa connexion dans Connect."
      },
      "StartStreaming": {
        "type": "object",
        "properties": {
          "deviceId": {
            "type": "string",
            "description": "ID optionnel de l’appareil source audio depuis `GET /devices`. Remplace la valeur par défaut de l’église pour cette session. Si omis, utilise la source audio par défaut enregistrée ou le seul appareil apparié capable d’audio ; plusieurs appareils sans valeur par défaut nécessitent une sélection. L’appareil sélectionné doit toujours être prêt."
          },
          "overrides": {
            "type": "object",
            "properties": {
              "speakerLanguage": {
                "type": "string",
                "description": "Code depuis `GET /languages/speaker`. Utilisez `\"mul\"` pour le mode multilingue."
              },
              "targetLanguages": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 1,
                "description": "Codes depuis `GET /languages/target`. Utilisez `[\"ALL\"]` pour toutes les cibles prises en charge, dans la limite de votre plan."
              },
              "duration": {
                "type": "integer",
                "minimum": 60,
                "maximum": 21600,
                "description": "Durée jusqu’à l’arrêt automatique, en secondes."
              },
              "proPresenter": {
                "$ref": "#/components/schemas/ProPresenterSelection"
              }
            },
            "required": [],
            "additionalProperties": false,
            "description": "Paramètres uniquement pour cette session. Les champs omis utilisent les valeurs par défaut enregistrées."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "ChangeVoice": {
        "type": "object",
        "properties": {
          "voice": {
            "type": "string",
            "enum": [
              "male",
              "female"
            ],
            "description": "Voix de traduction. Peut changer en veille ou en diffusion."
          }
        },
        "required": [
          "voice"
        ],
        "additionalProperties": false
      },
      "ChangeVisibility": {
        "type": "object",
        "properties": {
          "visible": {
            "type": "boolean",
            "description": "`true` affiche les sous-titres ; `false` les masque pendant que la diffusion continue."
          }
        },
        "required": [
          "visible"
        ],
        "additionalProperties": false
      },
      "ChangeDeadline": {
        "type": "object",
        "properties": {
          "deadlineAt": {
            "type": "string",
            "format": "date-time",
            "description": "Heure future d’arrêt automatique avec Z ou un décalage horaire. Pas plus tard que six heures après `startedAt`."
          }
        },
        "required": [
          "deadlineAt"
        ],
        "additionalProperties": false
      },
      "Error": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "enum": [
              false
            ]
          },
          "error": {
            "type": "string"
          }
        },
        "required": [
          "success",
          "error"
        ]
      },
      "Analytics": {
        "type": "object",
        "properties": {
          "sessionId": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "live",
              "pending",
              "finalized"
            ],
            "description": "`live` : comptes provisoires ; `pending` : en attente des comptes finaux ; `finalized` : comptes enregistrés."
          },
          "viewers": {
            "type": "integer",
            "minimum": 0,
            "nullable": true,
            "description": "Identités uniques des spectateurs pour la session, pas les spectateurs actuels. `null` si indisponible ; 0 signifie aucun spectateur."
          },
          "viewerLanguages": {
            "type": "object",
            "nullable": true,
            "additionalProperties": {
              "type": "integer",
              "minimum": 0
            },
            "description": "Analyses des spectateurs par code de langue. Un spectateur peut apparaître dans plusieurs langues. `null` si indisponible."
          }
        },
        "required": [
          "sessionId",
          "status",
          "viewers",
          "viewerLanguages"
        ]
      },
      "HistorySession": {
        "type": "object",
        "properties": {
          "sessionId": {
            "type": "string"
          },
          "startedAt": {
            "type": "string",
            "format": "date-time"
          },
          "endedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Heure de fin de session ; `null` si non terminée ou indisponible."
          },
          "duration": {
            "type": "integer",
            "nullable": true,
            "description": "Durée enregistrée de la session en secondes ; `null` si non terminée ou indisponible."
          },
          "speakerLanguage": {
            "type": "string",
            "nullable": true,
            "description": "Code de langue du locuteur ; `null` si non enregistré."
          },
          "targetLanguages": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Codes des langues de traduction enregistrées, ou `[\"ALL\"]`."
          },
          "transcriptAvailable": {
            "type": "boolean",
            "description": "`true` lorsque la transcription enregistrée est prête. Ne donne pas accès public ni URL de téléchargement."
          },
          "publicSharingEnabled": {
            "type": "boolean",
            "description": "`true` lorsque le partage public est activé pour la session terminée."
          },
          "analytics": {
            "$ref": "#/components/schemas/Analytics"
          }
        },
        "required": [
          "sessionId",
          "startedAt",
          "endedAt",
          "duration",
          "speakerLanguage",
          "targetLanguages",
          "transcriptAvailable",
          "publicSharingEnabled",
          "analytics"
        ]
      },
      "HistoryPage": {
        "type": "object",
        "properties": {
          "sessions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HistorySession"
            }
          },
          "total": {
            "type": "integer",
            "minimum": 0,
            "description": "Nombre total de sessions correspondant aux filtres, sur toutes les pages."
          },
          "page": {
            "type": "integer",
            "minimum": 1,
            "description": "Page retournée ; peut être inférieure à celle demandée."
          },
          "pageSize": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "description": "Nombre maximum de sessions par page, plafonné à 100."
          }
        },
        "required": [
          "sessions",
          "total",
          "page",
          "pageSize"
        ]
      },
      "SessionDetails": {
        "type": "object",
        "properties": {
          "session": {
            "$ref": "#/components/schemas/HistorySession"
          }
        },
        "required": [
          "session"
        ]
      },
      "Language": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "Utilisez ce code exact dans les champs de langue."
          },
          "name": {
            "type": "string",
            "description": "Nom affiché en anglais."
          },
          "nativeName": {
            "type": "string",
            "description": "Nom dans sa propre langue ; anglais si indisponible."
          },
          "emoji": {
            "type": "string",
            "description": "Emoji affiché pour cette langue."
          }
        },
        "required": [
          "code",
          "name",
          "nativeName",
          "emoji"
        ],
        "additionalProperties": false
      },
      "Languages": {
        "type": "object",
        "properties": {
          "languages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Language"
            }
          }
        },
        "required": [
          "languages"
        ],
        "additionalProperties": false
      },
      "LanguageDetails": {
        "type": "object",
        "properties": {
          "language": {
            "$ref": "#/components/schemas/Language"
          }
        },
        "required": [
          "language"
        ],
        "additionalProperties": false
      },
      "StreamingStatus": {
        "type": "object",
        "properties": {
          "streaming": {
            "type": "boolean",
            "description": "`true` pendant une session active, y compris démarrage, reconnexions et arrêt. Ne confirme pas que l’audio arrive."
          },
          "sessionId": {
            "type": "string",
            "nullable": true,
            "description": "ID de session actuelle ; `null` en veille."
          },
          "startedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Heure de début de la session actuelle ; `null` en veille."
          },
          "deadlineAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Heure d’arrêt automatique ; `null` en veille ou si aucune date limite enregistrée."
          },
          "speakerLanguage": {
            "type": "string",
            "nullable": true,
            "description": "Code de langue du locuteur actuel ; `null` en veille."
          },
          "targetLanguages": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Codes des langues de traduction actuelles ; vide en veille."
          },
          "voice": {
            "type": "string",
            "enum": [
              "male",
              "female",
              null
            ],
            "nullable": false,
            "description": "Voix de traduction, y compris en veille."
          },
          "visible": {
            "type": "boolean",
            "description": "`true` affiche les sous-titres ; `false` les masque. S’applique aussi en veille."
          },
          "publisher": {
            "type": "object",
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "browser",
                  "connect"
                ]
              },
              "id": {
                "type": "string",
                "description": "ID de l’appareil lorsque `kind` est `connect` ; ID de l’éditeur du navigateur lorsque `kind` est `browser`."
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "kind",
              "id",
              "name"
            ],
            "additionalProperties": false,
            "nullable": true,
            "description": "Appareil Kaleo Connect ou navigateur qui envoie l’audio ; `null` en veille."
          },
          "phase": {
            "type": "string",
            "enum": [
              "idle",
              "starting",
              "streaming",
              "reconnecting",
              "ending"
            ],
            "description": "Étape de la session ; veille signifie qu’aucune session n’est active."
          },
          "streamSettings": {
            "type": "object",
            "description": "Paramètres par défaut de l’église pour le prochain démarrage manuel. Les sessions actives ne modifient pas ces valeurs.",
            "required": [
              "revision",
              "settings"
            ],
            "properties": {
              "revision": {
                "type": "integer",
                "minimum": 0,
                "description": "Augmente lorsque ces valeurs par défaut changent."
              },
              "settings": {
                "type": "object",
                "required": [
                  "speakerLanguage",
                  "targetLanguages",
                  "duration"
                ],
                "properties": {
                  "speakerLanguage": {
                    "type": "string",
                    "description": "Code de langue du locuteur par défaut."
                  },
                  "targetLanguages": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Codes des langues de traduction par défaut ; `[\"ALL\"]` sélectionne toutes les cibles prises en charge."
                  },
                  "duration": {
                    "type": "integer",
                    "minimum": 60,
                    "maximum": 21600,
                    "description": "Durée jusqu’à l’arrêt automatique, en secondes."
                  }
                }
              }
            }
          }
        },
        "required": [
          "streaming",
          "phase",
          "sessionId",
          "startedAt",
          "deadlineAt",
          "speakerLanguage",
          "targetLanguages",
          "voice",
          "visible",
          "publisher",
          "streamSettings"
        ],
        "additionalProperties": false,
        "description": "Session actuelle et paramètres partagés de l’église. Tous les champs sont présents, même en veille."
      },
      "AdjustDeadline": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "deltaSeconds"
        ],
        "properties": {
          "deltaSeconds": {
            "type": "integer",
            "minimum": -21600,
            "maximum": 21600,
            "description": "Secondes à ajouter à la durée en veille ou à la date limite actuelle ; les valeurs négatives soustraient. Ne peut pas être 0. Durée en veille : 60–21600 secondes. Date limite en direct : future, dans les six heures suivant `startedAt`.",
            "not": {
              "enum": [
                0
              ]
            }
          }
        }
      }
    }
  }
}
