{
  "openapi": "3.0.3",
  "info": {
    "title": "Kaleo API",
    "version": "2026-10-08",
    "description": "Kaleo AI biedt een web-API om je streaming sessies te beheren, kijkersanalyses op te halen en Kaleo Connect-apparaten te monitoren. Je kunt onze API gebruiken om te integreren in je eigen AVL-bedieningen en workflows indien nodig.\n\nOm te beginnen, volg de onderstaande instructies om een API-sleutel te verkrijgen, je kerk-ID te vinden en je verzoeken te authenticeren.\n\n## Verkrijg een API-sleutel\n\n1. Ga naar de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard.\n2. Voer een naam in en selecteer **Maak API-sleutel aan**.\n3. Kopieer de sleutel en bewaar deze veilig. De volledige sleutel wordt slechts één keer getoond.\n\nElke sleutel werkt voor één kerk. De maker moet lid blijven van de kerk.\n\n## Vind je kerk-ID\n\nKopieer de **Kerk-ID** van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard. Gebruik deze als `churchId` in je API-verzoeken.\n\n## Authenticatie\n\nStuur je sleutel exact zoals gekopieerd van de [API](https://app.withkaleo.com/to/integrations/api) pagina mee met elk verzoek:\n\n```text\nAuthorization: Bearer YOUR_API_KEY\n```\n\nVoer in de API-playground alleen je gekopieerde sleutel in. Bearer wordt automatisch toegevoegd."
  },
  "servers": [
    {
      "url": "https://babel.withkaleo.com",
      "description": "Productie-API"
    }
  ],
  "tags": [
    {
      "name": "Languages",
      "description": "Ondersteunde sprekers- en vertaaltalen.",
      "x-displayName": "Talen"
    },
    {
      "name": "Devices",
      "description": "Kaleo Connect-apparaten die via API kunnen worden gemonitord en op afstand bediend.",
      "x-displayName": "Apparaten"
    },
    {
      "name": "Streaming",
      "description": "**Opmerking: de Start streaming endpoint kan alleen worden gebruikt om streaming te starten vanaf een Kaleo Connect-apparaat.** Deze endpoint kan niet worden gebruikt om streaming te starten vanuit een webbrowser. Alle andere streaming endpoints bedienen zowel browser- als Kaleo Connect-apparaten.",
      "x-displayName": "Streaming"
    },
    {
      "name": "Sessions",
      "description": "Sessiegeschiedenis en kijkersanalyses.",
      "x-displayName": "Sessies"
    }
  ],
  "security": [
    {
      "ApiKeyBearer": []
    }
  ],
  "paths": {
    "/v1/church/{churchId}/devices": {
      "get": {
        "operationId": "listDevices",
        "summary": "Apparaten weergeven",
        "tags": [
          "Devices"
        ],
        "description": "Lijst van Kaleo Connect-apparaten en hun functionaliteitsstatus.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Je kerk-ID. Kopieer deze van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succes",
            "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": "Antwoorden worden niet gecachet.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Ontbrekende of ongeldige API-sleutel, inclusief verlopen, ingetrokken, verkeerde kerk, of maker is geen lid meer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Tijdelijke service- of authenticatiefout. Breng de status in overeenstemming voordat je een bedieningsverzoek opnieuw probeert.",
            "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": "Apparaat ophalen",
        "tags": [
          "Devices"
        ],
        "description": "Lees één Kaleo Connect-apparaat en de functionaliteitsstatus.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Je kerk-ID. Kopieer deze van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "deviceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Apparaat-ID van `GET /devices`."
          }
        ],
        "responses": {
          "200": {
            "description": "Succes",
            "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": "Antwoorden worden niet gecachet.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Ontbrekende of ongeldige API-sleutel, inclusief verlopen, ingetrokken, verkeerde kerk, of maker is geen lid meer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "404": {
            "description": "Apparaat bestaat niet in deze kerk.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "DEVICE_NOT_FOUND"
                }
              }
            }
          },
          "503": {
            "description": "Tijdelijke service- of authenticatiefout. Breng de status in overeenstemming voordat je een bedieningsverzoek opnieuw probeert.",
            "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": "Streamingstatus ophalen",
        "tags": [
          "Streaming"
        ],
        "description": "Lees de huidige sessie en gedeelde kerkinstellingen. Alle velden zijn aanwezig, ook tijdens inactiviteit.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Je kerk-ID. Kopieer deze van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succes",
            "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": "Antwoorden worden niet gecachet.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Ontbrekende of ongeldige API-sleutel, inclusief verlopen, ingetrokken, verkeerde kerk, of maker is geen lid meer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Tijdelijke service- of authenticatiefout. Breng de status in overeenstemming voordat je een bedieningsverzoek opnieuw probeert.",
            "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": "Start streaming",
        "tags": [
          "Streaming"
        ],
        "description": "Start streaming op een Kaleo Connect-apparaat met opgeslagen instellingen. De optionele body kan een `deviceId` selecteren en instellingen voor deze sessie overschrijven. Zonder `deviceId` kiest Kaleo de standaard audio-bron die is geconfigureerd op de [Kaleo Connect](https://app.withkaleo.com/to/integrations/connect) pagina (onder Integraties) in je dashboard als er meerdere audio-capabele apparaten beschikbaar zijn, of het enige beschikbare audio-bronapparaat als er slechts één is.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Je kerk-ID. Kopieer deze van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succes",
            "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": "Antwoorden worden niet gecachet.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Verkeerd gevormde JSON, niet-ondersteunde velden of ongeldige waarden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Ontbrekende of ongeldige API-sleutel, inclusief verlopen, ingetrokken, verkeerde kerk, of maker is geen lid meer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "403": {
            "description": "Plan-, taal- of gebruikslimieten verhinderen deze start.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "PLAN_LIMIT"
                }
              }
            }
          },
          "409": {
            "description": "Conflict met actieve sessie, ontbrekende audio-bron of standaardselectie, of geselecteerd apparaat niet klaar. Lees streamingstatus en apparaatgereedheid; kies een standaard op de [Kaleo Connect](https://app.withkaleo.com/to/integrations/connect) pagina (onder Integraties) in je dashboard of geef `deviceId` op indien nodig.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "ACTIVE_SESSION"
                }
              }
            }
          },
          "503": {
            "description": "Tijdelijke service- of authenticatiefout. Breng de status in overeenstemming voordat je een bedieningsverzoek opnieuw probeert.",
            "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": "Gebruik de standaard audio-invoer",
                  "value": {}
                },
                "explicitDevice": {
                  "summary": "Kies een apparaat voor deze sessie",
                  "value": {
                    "deviceId": "00000000-0000-4000-8000-000000000002"
                  }
                }
              }
            }
          },
          "description": "Laat de body weg of stuur `{}` om de standaard audio-bron en opgeslagen instellingen te gebruiken. Stuur `deviceId` om een ander apparaat voor deze sessie te kiezen."
        },
        "x-kaleo-anchor": "Start streaming"
      }
    },
    "/v1/church/{churchId}/streaming/stop": {
      "post": {
        "operationId": "stopStreaming",
        "summary": "Stop streaming",
        "tags": [
          "Streaming"
        ],
        "description": "Stop de huidige streaming sessie. Er is geen request body nodig.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Je kerk-ID. Kopieer deze van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succes",
            "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": "Antwoorden worden niet gecachet.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Ontbrekende of ongeldige API-sleutel, inclusief verlopen, ingetrokken, verkeerde kerk, of maker is geen lid meer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Tijdelijke service- of authenticatiefout. Breng de status in overeenstemming voordat je een bedieningsverzoek opnieuw probeert.",
            "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": "Vertaalstem wijzigen",
        "tags": [
          "Streaming"
        ],
        "description": "Wijzig de vertaalstem tijdens inactiviteit of streaming.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Je kerk-ID. Kopieer deze van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succes",
            "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": "Antwoorden worden niet gecachet.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Verkeerd gevormde JSON, niet-ondersteunde velden of ongeldige waarden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Ontbrekende of ongeldige API-sleutel, inclusief verlopen, ingetrokken, verkeerde kerk, of maker is geen lid meer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "409": {
            "description": "De stream is gewijzigd of de opdracht kon niet worden bevestigd. Lees de huidige streamingstatus voordat je een nieuwe opdracht verstuurt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "SESSION_CHANGED"
                }
              }
            }
          },
          "503": {
            "description": "Tijdelijke service- of authenticatiefout. Breng de status in overeenstemming voordat je een bedieningsverzoek opnieuw probeert.",
            "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": "Zichtbaarheid wijzigen",
        "tags": [
          "Streaming"
        ],
        "description": "Toon of verberg ondertitels tijdens inactiviteit of streaming. Het verbergen van ondertitels stopt de sessie niet.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Je kerk-ID. Kopieer deze van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succes",
            "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": "Antwoorden worden niet gecachet.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Verkeerd gevormde JSON, niet-ondersteunde velden of ongeldige waarden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Ontbrekende of ongeldige API-sleutel, inclusief verlopen, ingetrokken, verkeerde kerk, of maker is geen lid meer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Tijdelijke service- of authenticatiefout. Breng de status in overeenstemming voordat je een bedieningsverzoek opnieuw probeert.",
            "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": "Ondertitels wissen",
        "tags": [
          "Streaming"
        ],
        "description": "Wis de huidige ondertitelstroom. Er is geen request body nodig.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Je kerk-ID. Kopieer deze van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succes",
            "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": "Antwoorden worden niet gecachet.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Ontbrekende of ongeldige API-sleutel, inclusief verlopen, ingetrokken, verkeerde kerk, of maker is geen lid meer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Tijdelijke service- of authenticatiefout. Breng de status in overeenstemming voordat je een bedieningsverzoek opnieuw probeert.",
            "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": "Automatische stopdeadline wijzigen",
        "tags": [
          "Streaming"
        ],
        "description": "Stel de automatische stoptijd in voor een actieve sessie. Geeft de bijgewerkte streamingstatus terug.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Je kerk-ID. Kopieer deze van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succes",
            "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": "Antwoorden worden niet gecachet.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Verkeerd gevormde JSON, niet-ondersteunde velden of ongeldige waarden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Ontbrekende of ongeldige API-sleutel, inclusief verlopen, ingetrokken, verkeerde kerk, of maker is geen lid meer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "409": {
            "description": "`STREAM_OFFLINE` tijdens inactiviteit; `INVALID_DEADLINE` voor een deadline buiten het toegestane venster. Lees de huidige streamingstatus voordat je een nieuwe opdracht verstuurt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_DEADLINE"
                }
              }
            }
          },
          "503": {
            "description": "Tijdelijke service- of authenticatiefout. Breng de status in overeenstemming voordat je een bedieningsverzoek opnieuw probeert.",
            "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": "Sessies weergeven",
        "tags": [
          "Sessions"
        ],
        "description": "Lijst sessies, nieuwste eerst, met kijkersanalyses.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Je kerk-ID. Kopieer deze van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            },
            "description": "Paginanummer, beginnend bij 1. Waarden boven de laatste pagina retourneren de laatste pagina."
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 14
            },
            "description": "Sessies per pagina. Waarden boven 100 gebruiken 100."
          },
          {
            "name": "startedAfter",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Inclusief sessies gestart op of na deze tijd. Inclusief Z of een tijdzone-offset."
          },
          {
            "name": "startedBefore",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Inclusief sessies gestart op of voor deze tijd. Inclusief Z of een tijdzone-offset. Moet gelijk zijn aan of na `startedAfter`."
          }
        ],
        "responses": {
          "200": {
            "description": "Succes",
            "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": "Leesantwoorden worden niet gecachet.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Ongeldige positieve gehele paginering of ongeldige/omgekeerde tijdstempelrange.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_HISTORY_RANGE"
                }
              }
            }
          },
          "401": {
            "description": "Ontbrekende of ongeldige API-sleutel, inclusief verlopen, ingetrokken, verkeerde kerk, of maker is geen lid meer van de kerk.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Geschiedenis- of authenticatieservice niet beschikbaar. Geen leeg geschiedenisresultaat.",
            "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": "Sessie ophalen",
        "tags": [
          "Sessions"
        ],
        "description": "Lees één sessie en de kijkersanalyses.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Je kerk-ID. Kopieer deze van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "Sessie-ID van `GET /sessions`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succes",
            "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": "Leesantwoorden worden niet gecachet.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Ontbrekende of ongeldige API-sleutel, inclusief verlopen, ingetrokken, verkeerde kerk, of maker is geen lid meer van de kerk.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "404": {
            "description": "Ontbrekende, verwijderde, ongeldige-ID of anders eigendom sessie.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "SESSION_NOT_FOUND"
                }
              }
            }
          },
          "503": {
            "description": "Geschiedenis- of authenticatieservice niet beschikbaar.",
            "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": "Sprekers talen weergeven",
        "tags": [
          "Languages"
        ],
        "description": "Lijst van ondersteunde sprekertalen. Gebruik deze codes in `speakerLanguage`.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Je kerk-ID. Kopieer deze van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succes",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Languages"
                },
                "example": {
                  "languages": [
                    {
                      "code": "en",
                      "name": "English",
                      "nativeName": "English",
                      "emoji": "🌎"
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Antwoorden worden niet gecachet.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Ontbrekende of ongeldige API-sleutel, inclusief verlopen, ingetrokken, verkeerde kerk, of maker is geen lid meer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Authenticatieservice is tijdelijk niet beschikbaar.",
            "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": "Doeltalen weergeven",
        "tags": [
          "Languages"
        ],
        "description": "Lijst van ondersteunde vertaaltalen. Gebruik deze codes in `targetLanguages`.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Je kerk-ID. Kopieer deze van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succes",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Languages"
                },
                "example": {
                  "languages": [
                    {
                      "code": "en",
                      "name": "English",
                      "nativeName": "English",
                      "emoji": "🌎"
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Antwoorden worden niet gecachet.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Ontbrekende of ongeldige API-sleutel, inclusief verlopen, ingetrokken, verkeerde kerk, of maker is geen lid meer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Authenticatieservice is tijdelijk niet beschikbaar.",
            "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": "Taal ophalen",
        "tags": [
          "Languages"
        ],
        "description": "Lees de namen en emoji voor één ondersteunde taalcode.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Je kerk-ID. Kopieer deze van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "code",
            "in": "path",
            "required": true,
            "description": "Exacte taalcode, zoals `en` of `zh-Hans`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succes",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LanguageDetails"
                },
                "example": {
                  "language": {
                    "code": "fr",
                    "name": "French (General)",
                    "nativeName": "Français",
                    "emoji": "🇫🇷"
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Antwoorden worden niet gecachet.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Ontbrekende of ongeldige API-sleutel, inclusief verlopen, ingetrokken, verkeerde kerk, of maker is geen lid meer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "404": {
            "description": "Niet-ondersteunde taalcode.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "LANGUAGE_NOT_FOUND"
                }
              }
            }
          },
          "503": {
            "description": "Authenticatieservice is tijdelijk niet beschikbaar.",
            "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": "Automatische stoptijd aanpassen",
        "tags": [
          "Streaming"
        ],
        "description": "Voeg automatische stoptijd toe of trek deze af. Tijdens inactiviteit wijzig je de duur voor de volgende handmatige start. Tijdens streaming wijzig je de huidige deadline. Elk verzoek past een afzonderlijke aanpassing toe.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Je kerk-ID. Kopieer deze van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succes",
            "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": "Antwoorden worden niet gecachet.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Verkeerd gevormde JSON, niet-ondersteunde velden of ongeldige waarden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Ontbrekende of ongeldige API-sleutel, inclusief verlopen, ingetrokken, verkeerde kerk, of maker is geen lid meer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "409": {
            "description": "`INVALID_DEADLINE` voor een live deadline buiten het toegestane venster; `DEADLINE_NOT_SET` wanneer de sessie geen deadline heeft. `SETTINGS_CHANGED` of `SESSION_ACTIVE` wanneer inactieve instellingen of toelating gelijktijdig zijn gewijzigd. Lees de huidige streamingstatus voordat je een nieuwe opdracht verstuurt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_DEADLINE"
                }
              }
            }
          },
          "503": {
            "description": "Tijdelijke service- of authenticatiefout. Breng de status in overeenstemming voordat je een bedieningsverzoek opnieuw probeert.",
            "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": "Voer je API-sleutel exact in zoals gekopieerd van de [API](https://app.withkaleo.com/to/integrations/api) pagina (onder Integraties) in je dashboard. Bearer wordt automatisch toegevoegd. Het werkt voor één kerk zolang de maker lid blijft."
      }
    },
    "schemas": {
      "Device": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Apparaat-ID. Gebruik deze waarde als `deviceId` in verzoeken."
          },
          "name": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "offline",
              "online",
              "maintenance"
            ],
            "description": "Verbindingsstatus. Offline na 90 seconden zonder contact; onderhoud betekent tijdelijk niet beschikbaar."
          },
          "capabilities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DeviceCapability"
            },
            "description": "Gereedheid van elke functie op dit apparaat."
          },
          "lastSeenAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Laatste contact met Kaleo; `null` als onbekend."
          }
        },
        "required": [
          "id",
          "name",
          "status",
          "capabilities",
          "lastSeenAt"
        ],
        "additionalProperties": false
      },
      "DeviceCapability": {
        "type": "object",
        "properties": {
          "capability": {
            "type": "string",
            "enum": [
              "audio-source",
              "audio-output",
              "propresenter"
            ],
            "description": "Lokale functie: audio-opname, vertaalde spraakweergave of ProPresenter-dia-invoer."
          },
          "status": {
            "type": "string",
            "enum": [
              "ready",
              "unavailable",
              "offline"
            ],
            "description": "Of deze functie klaar is voor gebruik."
          }
        },
        "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": "Gebruik het standaard ProPresenter-apparaat van de kerk."
              }
            },
            "required": [
              "mode"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "none"
                ],
                "description": "Gebruik ProPresenter niet voor deze sessie."
              }
            },
            "required": [
              "mode"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "device"
                ],
                "description": "Gebruik het apparaat gespecificeerd door `deviceId`."
              },
              "deviceId": {
                "type": "string",
                "description": "Apparaat-ID van de ProPresenter-bron, van `GET /devices`. Kan verschillen van de audio-bron."
              }
            },
            "required": [
              "mode",
              "deviceId"
            ],
            "additionalProperties": false
          }
        ],
        "description": "Kies de ProPresenter-bron voor deze sessie. Configureer de verbinding in Connect."
      },
      "StartStreaming": {
        "type": "object",
        "properties": {
          "deviceId": {
            "type": "string",
            "description": "Optionele audio-bron apparaat-ID van `GET /devices`. Overschrijft de standaard van de kerk voor deze sessie. Indien weggelaten, gebruik de opgeslagen standaard audio-bron of het enige audio-bron-capabele gekoppelde apparaat; meerdere apparaten zonder standaard vereisen selectie. Het geselecteerde apparaat moet nog steeds klaar zijn."
          },
          "overrides": {
            "type": "object",
            "properties": {
              "speakerLanguage": {
                "type": "string",
                "description": "Code van `GET /languages/speaker`. Gebruik `\"mul\"` voor Meertalige modus."
              },
              "targetLanguages": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 1,
                "description": "Codes van `GET /languages/target`. Gebruik `[\"ALL\"]` voor alle ondersteunde doelen, binnen je planlimiet."
              },
              "duration": {
                "type": "integer",
                "minimum": 60,
                "maximum": 21600,
                "description": "Tijd tot automatische stop, in seconden."
              },
              "proPresenter": {
                "$ref": "#/components/schemas/ProPresenterSelection"
              }
            },
            "required": [],
            "additionalProperties": false,
            "description": "Instellingen alleen voor deze sessie. Weggelaten velden gebruiken opgeslagen standaardwaarden."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "ChangeVoice": {
        "type": "object",
        "properties": {
          "voice": {
            "type": "string",
            "enum": [
              "male",
              "female"
            ],
            "description": "Vertaalstem. Kan worden gewijzigd tijdens inactiviteit of streaming."
          }
        },
        "required": [
          "voice"
        ],
        "additionalProperties": false
      },
      "ChangeVisibility": {
        "type": "object",
        "properties": {
          "visible": {
            "type": "boolean",
            "description": "`true` toont ondertitels; `false` verbergt ze terwijl streaming doorgaat."
          }
        },
        "required": [
          "visible"
        ],
        "additionalProperties": false
      },
      "ChangeDeadline": {
        "type": "object",
        "properties": {
          "deadlineAt": {
            "type": "string",
            "format": "date-time",
            "description": "Toekomstige automatische stoptijd met Z of een tijdzone-offset. Niet later dan zes uur na `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`: voorlopige tellingen; `pending`: wacht op definitieve tellingen; `finalized`: opgeslagen tellingen."
          },
          "viewers": {
            "type": "integer",
            "minimum": 0,
            "nullable": true,
            "description": "Unieke kijkeridentiteiten voor de sessie, niet de huidige kijkers. `null` als niet beschikbaar; 0 betekent geen kijkers."
          },
          "viewerLanguages": {
            "type": "object",
            "nullable": true,
            "additionalProperties": {
              "type": "integer",
              "minimum": 0
            },
            "description": "Kijkersanalyses per taalcode. Een kijker kan in meerdere talen voorkomen. `null` als niet beschikbaar."
          }
        },
        "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": "Eindtijd van sessie; `null` als onafgewerkt of niet beschikbaar."
          },
          "duration": {
            "type": "integer",
            "nullable": true,
            "description": "Geregistreerde sessieduur in seconden; `null` als onafgewerkt of niet beschikbaar."
          },
          "speakerLanguage": {
            "type": "string",
            "nullable": true,
            "description": "Sprekerstaalcode; `null` als niet geregistreerd."
          },
          "targetLanguages": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Geregistreerde vertaaltalcodes, of `[\"ALL\"]`."
          },
          "transcriptAvailable": {
            "type": "boolean",
            "description": "`true` wanneer het opgeslagen transcript klaar is. Geeft geen openbare toegang of download-URL."
          },
          "publicSharingEnabled": {
            "type": "boolean",
            "description": "`true` wanneer openbare deling is ingeschakeld voor de voltooide sessie."
          },
          "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": "Totaal aantal sessies dat aan de filters voldoet, over alle pagina's."
          },
          "page": {
            "type": "integer",
            "minimum": 1,
            "description": "Teruggegeven pagina; kan lager zijn dan aangevraagd."
          },
          "pageSize": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "description": "Maximaal aantal sessies per pagina, begrensd op 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": "Gebruik deze exacte code in taalvelden."
          },
          "name": {
            "type": "string",
            "description": "Engelse weergavenaam."
          },
          "nativeName": {
            "type": "string",
            "description": "Naam in de eigen taal; Engels als niet beschikbaar."
          },
          "emoji": {
            "type": "string",
            "description": "Weergave-emoji voor deze taal."
          }
        },
        "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` tijdens een actieve sessie, inclusief opstarten, opnieuw verbinden en afsluiten. Bevestigt niet dat audio binnenkomt."
          },
          "sessionId": {
            "type": "string",
            "nullable": true,
            "description": "Huidige sessie-ID; `null` tijdens inactiviteit."
          },
          "startedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Starttijd huidige sessie; `null` tijdens inactiviteit."
          },
          "deadlineAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Automatische stoptijd; `null` tijdens inactiviteit of als geen deadline is geregistreerd."
          },
          "speakerLanguage": {
            "type": "string",
            "nullable": true,
            "description": "Huidige sprekerstaalcode; `null` tijdens inactiviteit."
          },
          "targetLanguages": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Huidige vertaaltalcodes; leeg tijdens inactiviteit."
          },
          "voice": {
            "type": "string",
            "enum": [
              "male",
              "female",
              null
            ],
            "nullable": false,
            "description": "Vertaalstem, ook tijdens inactiviteit."
          },
          "visible": {
            "type": "boolean",
            "description": "`true` toont ondertitels; `false` verbergt ze. Geldt ook tijdens inactiviteit."
          },
          "publisher": {
            "type": "object",
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "browser",
                  "connect"
                ]
              },
              "id": {
                "type": "string",
                "description": "Apparaat-ID wanneer `kind` `connect` is; browser-uitgever-ID wanneer `kind` `browser` is."
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "kind",
              "id",
              "name"
            ],
            "additionalProperties": false,
            "nullable": true,
            "description": "Kaleo Connect-apparaat of browser die audio verzendt; `null` tijdens inactiviteit."
          },
          "phase": {
            "type": "string",
            "enum": [
              "idle",
              "starting",
              "streaming",
              "reconnecting",
              "ending"
            ],
            "description": "Sessie-fase; inactiviteit betekent dat er geen actieve sessie is."
          },
          "streamSettings": {
            "type": "object",
            "description": "Kerkstandaarden voor de volgende handmatige start. Actieve sessie-overschrijvingen wijzigen deze waarden niet.",
            "required": [
              "revision",
              "settings"
            ],
            "properties": {
              "revision": {
                "type": "integer",
                "minimum": 0,
                "description": "Stijgt wanneer deze standaarden veranderen."
              },
              "settings": {
                "type": "object",
                "required": [
                  "speakerLanguage",
                  "targetLanguages",
                  "duration"
                ],
                "properties": {
                  "speakerLanguage": {
                    "type": "string",
                    "description": "Standaard sprekerstaalcode."
                  },
                  "targetLanguages": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Standaard vertaaltalcodes; `[\"ALL\"]` selecteert alle ondersteunde doelen."
                  },
                  "duration": {
                    "type": "integer",
                    "minimum": 60,
                    "maximum": 21600,
                    "description": "Tijd tot automatische stop, in seconden."
                  }
                }
              }
            }
          }
        },
        "required": [
          "streaming",
          "phase",
          "sessionId",
          "startedAt",
          "deadlineAt",
          "speakerLanguage",
          "targetLanguages",
          "voice",
          "visible",
          "publisher",
          "streamSettings"
        ],
        "additionalProperties": false,
        "description": "Huidige sessie en gedeelde kerkinstellingen. Alle velden zijn aanwezig, ook tijdens inactiviteit."
      },
      "AdjustDeadline": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "deltaSeconds"
        ],
        "properties": {
          "deltaSeconds": {
            "type": "integer",
            "minimum": -21600,
            "maximum": 21600,
            "description": "Seconden om toe te voegen aan de inactieve duur of huidige deadline; negatieve waarden trekken af. Kan niet 0 zijn. Inactieve duur: 60–21600 seconden. Live deadline: toekomst, binnen zes uur na `startedAt`.",
            "not": {
              "enum": [
                0
              ]
            }
          }
        }
      }
    }
  }
}
