{
  "openapi": "3.0.3",
  "info": {
    "title": "Kaleo API",
    "version": "2026-10-08",
    "description": "Kaleo AI tillhandahåller ett webb-API för att styra dina streaming-sessioner, hämta tittaranalys och övervaka Kaleo Connect-enheter. Du kan använda vårt API för att integrera i dina egna AVL-kontroller och arbetsflöden efter behov.\n\nFör att komma igång, följ instruktionerna nedan för att få en API-nyckel, hitta din kyrko-ID och autentisera dina förfrågningar.\n\n## Skaffa en API-nyckel\n\n1. Gå till sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel.\n2. Ange ett namn och välj **Skapa API-nyckel**.\n3. Kopiera nyckeln och spara den säkert. Den fullständiga nyckeln visas endast en gång.\n\nVarje nyckel gäller för en kyrka. Skaparen måste förbli medlem i kyrkan.\n\n## Hitta din kyrko-ID\n\nKopiera **Kyrko-ID** från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel. Använd det som `churchId` i dina API-förfrågningar.\n\n## Autentisering\n\nSkicka din nyckel exakt som kopierad från sidan [API](https://app.withkaleo.com/to/integrations/api) med varje förfrågan:\n\n```text\nAuthorization: Bearer YOUR_API_KEY\n```\n\nI API-lekplatsen anger du endast din kopierade nyckel. Bearer läggs till automatiskt."
  },
  "servers": [
    {
      "url": "https://babel.withkaleo.com",
      "description": "Produktions-API"
    }
  ],
  "tags": [
    {
      "name": "Languages",
      "description": "Stödda språk för talare och översättning.",
      "x-displayName": "Språk"
    },
    {
      "name": "Devices",
      "description": "Kaleo Connect-enheter som kan övervakas och fjärrstyras via API.",
      "x-displayName": "Enheter"
    },
    {
      "name": "Streaming",
      "description": "**Observera: Endast slutpunkten Start streaming kan användas för att starta streaming från en Kaleo Connect-enhet.** Denna slutpunkt kan inte användas för att starta streaming från en webbläsare. Alla andra streaming-slutpunkter styr både webbläsare och Kaleo Connect-enheter.",
      "x-displayName": "Streaming"
    },
    {
      "name": "Sessions",
      "description": "Sessionshistorik och tittaranalys.",
      "x-displayName": "Sessioner"
    }
  ],
  "security": [
    {
      "ApiKeyBearer": []
    }
  ],
  "paths": {
    "/v1/church/{churchId}/devices": {
      "get": {
        "operationId": "listDevices",
        "summary": "Lista enheter",
        "tags": [
          "Devices"
        ],
        "description": "Lista Kaleo Connect-enheter och deras funktionsberedskap.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Ditt kyrko-ID. Kopiera det från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lyckades",
            "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": "Svar cachas inte.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Saknad eller ogiltig API-nyckel, inklusive utgång, återkallelse, fel kyrka eller att ägaren inte längre är medlem.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Tillfällig tjänste- eller autentiseringsfel. Synkronisera tillstånd innan du försöker igen.",
            "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": "Hämta enhet",
        "tags": [
          "Devices"
        ],
        "description": "Läs en Kaleo Connect-enhet och dess funktionsberedskap.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Ditt kyrko-ID. Kopiera det från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "deviceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enhets-ID från `GET /devices`."
          }
        ],
        "responses": {
          "200": {
            "description": "Lyckades",
            "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": "Svar cachas inte.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Saknad eller ogiltig API-nyckel, inklusive utgång, återkallelse, fel kyrka eller att ägaren inte längre är medlem.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "404": {
            "description": "Enheten finns inte i denna kyrka.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "DEVICE_NOT_FOUND"
                }
              }
            }
          },
          "503": {
            "description": "Tillfällig tjänste- eller autentiseringsfel. Synkronisera tillstånd innan du försöker igen.",
            "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": "Hämta streamingstatus",
        "tags": [
          "Streaming"
        ],
        "description": "Läs aktuell session och delade kyrkoinställningar. Alla fält är närvarande, även när inaktiv.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Ditt kyrko-ID. Kopiera det från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lyckades",
            "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": "Svar cachas inte.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Saknad eller ogiltig API-nyckel, inklusive utgång, återkallelse, fel kyrka eller att ägaren inte längre är medlem.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Tillfällig tjänste- eller autentiseringsfel. Synkronisera tillstånd innan du försöker igen.",
            "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": "Starta streaming",
        "tags": [
          "Streaming"
        ],
        "description": "Starta streaming på en Kaleo Connect-enhet med sparade inställningar. Den valfria kroppen kan välja en `deviceId` och åsidosätta inställningar för denna session. Utan `deviceId` väljer Kaleo standardljudkällan konfigurerad på sidan [Kaleo Connect](https://app.withkaleo.com/to/integrations/connect) (under Integrationer) i din kontrollpanel om flera ljudenheter finns tillgängliga, eller den enda tillgängliga ljudkällan om endast en finns.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Ditt kyrko-ID. Kopiera det från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lyckades",
            "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": "Svar cachas inte.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Felaktig JSON, icke-stödda fält eller ogiltiga värden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Saknad eller ogiltig API-nyckel, inklusive utgång, återkallelse, fel kyrka eller att ägaren inte längre är medlem.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "403": {
            "description": "Plan-, språk- eller användningsbegränsningar förhindrar denna start.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "PLAN_LIMIT"
                }
              }
            }
          },
          "409": {
            "description": "Konflikt med aktiv session, saknad ljudkälla eller standardval, eller vald enhet inte redo. Läs streamingstatus och enhetsberedskap; välj en standard på sidan [Kaleo Connect](https://app.withkaleo.com/to/integrations/connect) (under Integrationer) i din kontrollpanel eller ange `deviceId` vid behov.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "ACTIVE_SESSION"
                }
              }
            }
          },
          "503": {
            "description": "Tillfällig tjänste- eller autentiseringsfel. Synkronisera tillstånd innan du försöker igen.",
            "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": "Använd standardljudkälla",
                  "value": {}
                },
                "explicitDevice": {
                  "summary": "Välj en enhet för denna session",
                  "value": {
                    "deviceId": "00000000-0000-4000-8000-000000000002"
                  }
                }
              }
            }
          },
          "description": "Uteslut kroppen eller skicka `{}` för att använda standardljudkällan och sparade inställningar. Skicka `deviceId` för att välja en annan enhet för denna session."
        },
        "x-kaleo-anchor": "Start streaming"
      }
    },
    "/v1/church/{churchId}/streaming/stop": {
      "post": {
        "operationId": "stopStreaming",
        "summary": "Stoppa streaming",
        "tags": [
          "Streaming"
        ],
        "description": "Stoppa den aktuella streaming-sessionen. Ingen begäran behövs i kroppen.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Ditt kyrko-ID. Kopiera det från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lyckades",
            "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": "Svar cachas inte.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Saknad eller ogiltig API-nyckel, inklusive utgång, återkallelse, fel kyrka eller att ägaren inte längre är medlem.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Tillfällig tjänste- eller autentiseringsfel. Synkronisera tillstånd innan du försöker igen.",
            "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": "Byt översättarröst",
        "tags": [
          "Streaming"
        ],
        "description": "Byt översättarröst medan inaktiv eller under streaming.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Ditt kyrko-ID. Kopiera det från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lyckades",
            "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": "Svar cachas inte.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Felaktig JSON, icke-stödda fält eller ogiltiga värden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Saknad eller ogiltig API-nyckel, inklusive utgång, återkallelse, fel kyrka eller att ägaren inte längre är medlem.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "409": {
            "description": "Strömmen ändrades eller kommandot kunde inte bekräftas. Läs aktuell streamingstatus innan du skickar ett nytt kommando.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "SESSION_CHANGED"
                }
              }
            }
          },
          "503": {
            "description": "Tillfällig tjänste- eller autentiseringsfel. Synkronisera tillstånd innan du försöker igen.",
            "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": "Ändra synlighet",
        "tags": [
          "Streaming"
        ],
        "description": "Visa eller dölj undertexter medan inaktiv eller under streaming. Att dölja undertexter stoppar inte sessionen.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Ditt kyrko-ID. Kopiera det från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lyckades",
            "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": "Svar cachas inte.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Felaktig JSON, icke-stödda fält eller ogiltiga värden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Saknad eller ogiltig API-nyckel, inklusive utgång, återkallelse, fel kyrka eller att ägaren inte längre är medlem.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Tillfällig tjänste- eller autentiseringsfel. Synkronisera tillstånd innan du försöker igen.",
            "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": "Rensa undertexter",
        "tags": [
          "Streaming"
        ],
        "description": "Rensa den aktuella undertextflödet. Ingen begäran behövs i kroppen.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Ditt kyrko-ID. Kopiera det från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lyckades",
            "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": "Svar cachas inte.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Saknad eller ogiltig API-nyckel, inklusive utgång, återkallelse, fel kyrka eller att ägaren inte längre är medlem.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Tillfällig tjänste- eller autentiseringsfel. Synkronisera tillstånd innan du försöker igen.",
            "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": "Ändra automatisk stopp-tid",
        "tags": [
          "Streaming"
        ],
        "description": "Ställ in automatisk stopptid för en aktiv session. Returnerar uppdaterad streamingstatus.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Ditt kyrko-ID. Kopiera det från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lyckades",
            "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": "Svar cachas inte.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Felaktig JSON, icke-stödda fält eller ogiltiga värden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Saknad eller ogiltig API-nyckel, inklusive utgång, återkallelse, fel kyrka eller att ägaren inte längre är medlem.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "409": {
            "description": "`STREAM_OFFLINE` när inaktiv; `INVALID_DEADLINE` för en deadline utanför tillåtet intervall. Läs aktuell streamingstatus innan du skickar ett nytt kommando.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_DEADLINE"
                }
              }
            }
          },
          "503": {
            "description": "Tillfällig tjänste- eller autentiseringsfel. Synkronisera tillstånd innan du försöker igen.",
            "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": "Lista sessioner",
        "tags": [
          "Sessions"
        ],
        "description": "Lista sessioner, nyast först, med tittaranalys.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Ditt kyrko-ID. Kopiera det från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            },
            "description": "Sidnummer, börjar på 1. Värden över sista sidan returnerar sista sidan."
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 14
            },
            "description": "Sessioner per sida. Värden över 100 använder 100."
          },
          {
            "name": "startedAfter",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Inkludera sessioner startade vid eller efter denna tid. Inkludera Z eller tidszonsförskjutning."
          },
          {
            "name": "startedBefore",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Inkludera sessioner startade vid eller före denna tid. Inkludera Z eller tidszonsförskjutning. Måste vara vid eller efter `startedAfter`."
          }
        ],
        "responses": {
          "200": {
            "description": "Lyckades",
            "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": "Läs-svar cachas inte.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Ogiltig positiv heltals-paginering eller ogiltigt/omvänt tidsintervall.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_HISTORY_RANGE"
                }
              }
            }
          },
          "401": {
            "description": "Saknad eller ogiltig API-nyckel, inklusive utgång, återkallelse, fel kyrka eller att ägaren inte längre är medlem i kyrkan.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Historik- eller autentiseringstjänst otillgänglig. Inte ett tomt historikresultat.",
            "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": "Hämta session",
        "tags": [
          "Sessions"
        ],
        "description": "Läs en session och dess tittaranalys.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Ditt kyrko-ID. Kopiera det från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "Sessions-ID från `GET /sessions`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lyckades",
            "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": "Läs-svar cachas inte.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Saknad eller ogiltig API-nyckel, inklusive utgång, återkallelse, fel kyrka eller att ägaren inte längre är medlem i kyrkan.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "404": {
            "description": "Saknad, borttagen, ogiltigt ID eller annorlunda ägd session.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "SESSION_NOT_FOUND"
                }
              }
            }
          },
          "503": {
            "description": "Historik- eller autentiseringstjänst otillgänglig.",
            "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": "Lista talarspråk",
        "tags": [
          "Languages"
        ],
        "description": "Lista stödda talarspråk. Använd dessa koder i `speakerLanguage`.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Ditt kyrko-ID. Kopiera det från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lyckades",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Languages"
                },
                "example": {
                  "languages": [
                    {
                      "code": "en",
                      "name": "English",
                      "nativeName": "English",
                      "emoji": "🌎"
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Svar cachas inte.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Saknad eller ogiltig API-nyckel, inklusive utgång, återkallelse, fel kyrka eller att ägaren inte längre är medlem.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Autentiseringstjänst är tillfälligt otillgänglig.",
            "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": "Lista målspråk",
        "tags": [
          "Languages"
        ],
        "description": "Lista stödda översättningsspråk. Använd dessa koder i `targetLanguages`.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Ditt kyrko-ID. Kopiera det från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lyckades",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Languages"
                },
                "example": {
                  "languages": [
                    {
                      "code": "en",
                      "name": "English",
                      "nativeName": "English",
                      "emoji": "🌎"
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Svar cachas inte.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Saknad eller ogiltig API-nyckel, inklusive utgång, återkallelse, fel kyrka eller att ägaren inte längre är medlem.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Autentiseringstjänst är tillfälligt otillgänglig.",
            "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": "Hämta språk",
        "tags": [
          "Languages"
        ],
        "description": "Läs namn och emoji för en stödd språkkod.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Ditt kyrko-ID. Kopiera det från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "code",
            "in": "path",
            "required": true,
            "description": "Exakt språkkod, såsom `en` eller `zh-Hans`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lyckades",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LanguageDetails"
                },
                "example": {
                  "language": {
                    "code": "fr",
                    "name": "French (General)",
                    "nativeName": "Français",
                    "emoji": "🇫🇷"
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Svar cachas inte.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Saknad eller ogiltig API-nyckel, inklusive utgång, återkallelse, fel kyrka eller att ägaren inte längre är medlem.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "404": {
            "description": "Ej stödd språkkod.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "LANGUAGE_NOT_FOUND"
                }
              }
            }
          },
          "503": {
            "description": "Autentiseringstjänst är tillfälligt otillgänglig.",
            "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": "Justera automatisk stopptid",
        "tags": [
          "Streaming"
        ],
        "description": "Lägg till eller dra ifrån automatisk stopptid. När inaktiv ändrar du varaktigheten för nästa manuella start. Under streaming ändrar du aktuell deadline. Varje förfrågan tillämpar en separat justering.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "Ditt kyrko-ID. Kopiera det från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Lyckades",
            "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": "Svar cachas inte.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Felaktig JSON, icke-stödda fält eller ogiltiga värden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Saknad eller ogiltig API-nyckel, inklusive utgång, återkallelse, fel kyrka eller att ägaren inte längre är medlem.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "409": {
            "description": "`INVALID_DEADLINE` för en live-deadline utanför tillåtet intervall; `DEADLINE_NOT_SET` när sessionen saknar deadline. `SETTINGS_CHANGED` eller `SESSION_ACTIVE` när inaktiva inställningar eller tillträde ändrats samtidigt. Läs aktuell streamingstatus innan du skickar ett nytt kommando.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_DEADLINE"
                }
              }
            }
          },
          "503": {
            "description": "Tillfällig tjänste- eller autentiseringsfel. Synkronisera tillstånd innan du försöker igen.",
            "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": "Ange din API-nyckel exakt som kopierad från sidan [API](https://app.withkaleo.com/to/integrations/api) (under Integrationer) i din kontrollpanel. Bearer läggs till automatiskt. Den gäller för en kyrka så länge skaparen är medlem."
      }
    },
    "schemas": {
      "Device": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Enhets-ID. Skicka detta värde som `deviceId` i förfrågningar."
          },
          "name": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "offline",
              "online",
              "maintenance"
            ],
            "description": "Anslutningsstatus. Offline efter 90 sekunder utan kontakt; underhåll betyder tillfälligt otillgänglig."
          },
          "capabilities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DeviceCapability"
            },
            "description": "Bereddhet för varje funktion på denna enhet."
          },
          "lastSeenAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Senaste kontakt med Kaleo; `null` om okänd."
          }
        },
        "required": [
          "id",
          "name",
          "status",
          "capabilities",
          "lastSeenAt"
        ],
        "additionalProperties": false
      },
      "DeviceCapability": {
        "type": "object",
        "properties": {
          "capability": {
            "type": "string",
            "enum": [
              "audio-source",
              "audio-output",
              "propresenter"
            ],
            "description": "Lokal funktion: ljudupptagning, uppspelning av översatt tal eller ProPresenter-slideingång."
          },
          "status": {
            "type": "string",
            "enum": [
              "ready",
              "unavailable",
              "offline"
            ],
            "description": "Om denna funktion är redo att användas."
          }
        },
        "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": "Använd kyrkans standard ProPresenter-enhet."
              }
            },
            "required": [
              "mode"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "none"
                ],
                "description": "Använd inte ProPresenter för denna session."
              }
            },
            "required": [
              "mode"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "device"
                ],
                "description": "Använd enheten specificerad av `deviceId`."
              },
              "deviceId": {
                "type": "string",
                "description": "Enhets-ID för ProPresenter-källa, från `GET /devices`. Kan skilja sig från ljudkällan."
              }
            },
            "required": [
              "mode",
              "deviceId"
            ],
            "additionalProperties": false
          }
        ],
        "description": "Välj ProPresenter-källa för denna session. Konfigurera dess anslutning i Connect."
      },
      "StartStreaming": {
        "type": "object",
        "properties": {
          "deviceId": {
            "type": "string",
            "description": "Valfritt enhets-ID för ljudkälla från `GET /devices`. Åsidosätter kyrkans standard för denna session. Om utelämnad används sparad standardljudkälla eller den enda ljudkälla som är ihopparad; flera enheter utan standard kräver val. Den valda enheten måste fortfarande vara redo."
          },
          "overrides": {
            "type": "object",
            "properties": {
              "speakerLanguage": {
                "type": "string",
                "description": "Kod från `GET /languages/speaker`. Använd `\"mul\"` för flerspråkigt läge."
              },
              "targetLanguages": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 1,
                "description": "Koder från `GET /languages/target`. Använd `[\"ALL\"]` för alla stödda mål inom din planbegränsning."
              },
              "duration": {
                "type": "integer",
                "minimum": 60,
                "maximum": 21600,
                "description": "Tid tills automatisk stopp, i sekunder."
              },
              "proPresenter": {
                "$ref": "#/components/schemas/ProPresenterSelection"
              }
            },
            "required": [],
            "additionalProperties": false,
            "description": "Inställningar endast för denna session. Uteslutna fält använder sparade standardvärden."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "ChangeVoice": {
        "type": "object",
        "properties": {
          "voice": {
            "type": "string",
            "enum": [
              "male",
              "female"
            ],
            "description": "Översättarröst. Kan ändras medan inaktiv eller under streaming."
          }
        },
        "required": [
          "voice"
        ],
        "additionalProperties": false
      },
      "ChangeVisibility": {
        "type": "object",
        "properties": {
          "visible": {
            "type": "boolean",
            "description": "`true` visar undertexter; `false` döljer dem medan streaming fortsätter."
          }
        },
        "required": [
          "visible"
        ],
        "additionalProperties": false
      },
      "ChangeDeadline": {
        "type": "object",
        "properties": {
          "deadlineAt": {
            "type": "string",
            "format": "date-time",
            "description": "Framtida automatisk stopptid med Z eller tidszonsförskjutning. Senast sex timmar efter `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`: preliminära räkningar; `pending`: väntar på slutgiltiga räkningar; `finalized`: sparade räkningar."
          },
          "viewers": {
            "type": "integer",
            "minimum": 0,
            "nullable": true,
            "description": "Unika tittaridentiteter för sessionen, inte aktuella tittare. `null` om otillgänglig; 0 betyder inga tittare."
          },
          "viewerLanguages": {
            "type": "object",
            "nullable": true,
            "additionalProperties": {
              "type": "integer",
              "minimum": 0
            },
            "description": "Tittaranalys per språkkod. En tittare kan förekomma i flera språk. `null` om otillgänglig."
          }
        },
        "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": "Sessionens sluttid; `null` om ofullständig eller otillgänglig."
          },
          "duration": {
            "type": "integer",
            "nullable": true,
            "description": "Inspelad sessionstid i sekunder; `null` om ofullständig eller otillgänglig."
          },
          "speakerLanguage": {
            "type": "string",
            "nullable": true,
            "description": "Talarspråkkod; `null` om ej inspelad."
          },
          "targetLanguages": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Inspelade översättningsspråkkoder, eller `[\"ALL\"]`."
          },
          "transcriptAvailable": {
            "type": "boolean",
            "description": "`true` när sparad transkription är klar. Ger inte offentlig åtkomst eller nedladdnings-URL."
          },
          "publicSharingEnabled": {
            "type": "boolean",
            "description": "`true` när offentlig delning är aktiverad för avslutad session."
          },
          "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": "Totalt antal sessioner som matchar filtren, över alla sidor."
          },
          "page": {
            "type": "integer",
            "minimum": 1,
            "description": "Returnerad sida; kan vara lägre än begärd."
          },
          "pageSize": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "description": "Maximalt antal sessioner per sida, begränsat till 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": "Använd denna exakta kod i språkfält."
          },
          "name": {
            "type": "string",
            "description": "Engelskt visningsnamn."
          },
          "nativeName": {
            "type": "string",
            "description": "Namn på sitt eget språk; engelska om otillgängligt."
          },
          "emoji": {
            "type": "string",
            "description": "Visnings-emoji för detta språk."
          }
        },
        "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` under en aktiv session, inklusive uppstart, återanslutningar och avstängning. Bekräftar inte att ljud anländer."
          },
          "sessionId": {
            "type": "string",
            "nullable": true,
            "description": "Aktuellt sessions-ID; `null` när inaktiv."
          },
          "startedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Aktuell sessions starttid; `null` när inaktiv."
          },
          "deadlineAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Automatisk stopptid; `null` när inaktiv eller om ingen deadline är inspelad."
          },
          "speakerLanguage": {
            "type": "string",
            "nullable": true,
            "description": "Aktuell talarspråkkod; `null` när inaktiv."
          },
          "targetLanguages": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Aktuella översättningsspråkkoder; tomt när inaktiv."
          },
          "voice": {
            "type": "string",
            "enum": [
              "male",
              "female",
              null
            ],
            "nullable": false,
            "description": "Översättarröst, även när inaktiv."
          },
          "visible": {
            "type": "boolean",
            "description": "`true` visar undertexter; `false` döljer dem. Gäller även när inaktiv."
          },
          "publisher": {
            "type": "object",
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "browser",
                  "connect"
                ]
              },
              "id": {
                "type": "string",
                "description": "Enhets-ID när `kind` är `connect`; webbläsarens publicerare-ID när `kind` är `browser`."
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "kind",
              "id",
              "name"
            ],
            "additionalProperties": false,
            "nullable": true,
            "description": "Kaleo Connect-enhet eller webbläsare som skickar ljud; `null` när inaktiv."
          },
          "phase": {
            "type": "string",
            "enum": [
              "idle",
              "starting",
              "streaming",
              "reconnecting",
              "ending"
            ],
            "description": "Sessionsfas; inaktiv betyder att ingen session är aktiv."
          },
          "streamSettings": {
            "type": "object",
            "description": "Kyrkans standardinställningar för nästa manuella start. Aktiva sessionsändringar ändrar inte dessa värden.",
            "required": [
              "revision",
              "settings"
            ],
            "properties": {
              "revision": {
                "type": "integer",
                "minimum": 0,
                "description": "Ökar när dessa standardvärden ändras."
              },
              "settings": {
                "type": "object",
                "required": [
                  "speakerLanguage",
                  "targetLanguages",
                  "duration"
                ],
                "properties": {
                  "speakerLanguage": {
                    "type": "string",
                    "description": "Standard talarspråkkod."
                  },
                  "targetLanguages": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Standard översättningsspråkkoder; `[\"ALL\"]` väljer alla stödda mål."
                  },
                  "duration": {
                    "type": "integer",
                    "minimum": 60,
                    "maximum": 21600,
                    "description": "Tid tills automatisk stopp, i sekunder."
                  }
                }
              }
            }
          }
        },
        "required": [
          "streaming",
          "phase",
          "sessionId",
          "startedAt",
          "deadlineAt",
          "speakerLanguage",
          "targetLanguages",
          "voice",
          "visible",
          "publisher",
          "streamSettings"
        ],
        "additionalProperties": false,
        "description": "Aktuell session och delade kyrkoinställningar. Alla fält är närvarande, även när inaktiv."
      },
      "AdjustDeadline": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "deltaSeconds"
        ],
        "properties": {
          "deltaSeconds": {
            "type": "integer",
            "minimum": -21600,
            "maximum": 21600,
            "description": "Sekunder att lägga till på inaktiv varaktighet eller aktuell deadline; negativa värden drar ifrån. Kan inte vara 0. Inaktiv varaktighet: 60–21600 sekunder. Live-deadline: framtida, inom sex timmar från `startedAt`.",
            "not": {
              "enum": [
                0
              ]
            }
          }
        }
      }
    }
  }
}
