{
  "openapi": "3.0.3",
  "info": {
    "title": "Kaleo API",
    "version": "2026-10-08",
    "description": "Kaleo AI ofrece una API web para controlar tus sesiones de transmisión, obtener análisis de espectadores y monitorear dispositivos Kaleo Connect. Puedes usar nuestra API para integrarla en tus controles y flujos de trabajo AVL personalizados según sea necesario.\n\nPara comenzar, sigue las instrucciones a continuación para obtener una clave API, encontrar el ID de tu iglesia y autenticar tus solicitudes.\n\n## Obtener una clave API\n\n1. Ve a la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control.\n2. Ingresa un nombre y selecciona **Crear clave API**.\n3. Copia la clave y guárdala de forma segura. La clave completa se muestra solo una vez.\n\nCada clave funciona para una iglesia. Su creador debe seguir siendo miembro de la iglesia.\n\n## Encontrar el ID de tu iglesia\n\nCopia el **ID de la iglesia** desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control. Úsalo como `churchId` en tus solicitudes API.\n\n## Autenticación\n\nEnvía tu clave exactamente como la copiaste desde la página [API](https://app.withkaleo.com/to/integrations/api) con cada solicitud:\n\n```text\nAuthorization: Bearer YOUR_API_KEY\n```\n\nEn el entorno de pruebas de la API, ingresa solo tu clave copiada. Bearer se añade automáticamente."
  },
  "servers": [
    {
      "url": "https://babel.withkaleo.com",
      "description": "API de producción"
    }
  ],
  "tags": [
    {
      "name": "Languages",
      "description": "Idiomas compatibles para oradores y traducción.",
      "x-displayName": "Idiomas"
    },
    {
      "name": "Devices",
      "description": "Dispositivos Kaleo Connect que pueden ser monitoreados y controlados remotamente vía API.",
      "x-displayName": "Dispositivos"
    },
    {
      "name": "Streaming",
      "description": "**Nota: el endpoint Iniciar transmisión solo puede usarse para comenzar a transmitir desde un dispositivo Kaleo Connect.** Este endpoint no puede usarse para iniciar transmisión desde un navegador web. Todos los demás endpoints de transmisión controlan tanto navegadores como dispositivos Kaleo Connect.",
      "x-displayName": "Transmisión"
    },
    {
      "name": "Sessions",
      "description": "Historial de sesiones y análisis de espectadores.",
      "x-displayName": "Sesiones"
    }
  ],
  "security": [
    {
      "ApiKeyBearer": []
    }
  ],
  "paths": {
    "/v1/church/{churchId}/devices": {
      "get": {
        "operationId": "listDevices",
        "summary": "Listar dispositivos",
        "tags": [
          "Devices"
        ],
        "description": "Lista dispositivos Kaleo Connect y su disponibilidad de funciones.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "ID de tu iglesia. Cópialo desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Éxito",
            "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": "Las respuestas no se almacenan en caché.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clave API faltante o inválida, incluyendo expiración, revocación, iglesia incorrecta o creador que ya no es miembro.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Fallo temporal del servicio o autenticación. Reconciliar estado antes de reintentar una solicitud de control.",
            "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": "Obtener dispositivo",
        "tags": [
          "Devices"
        ],
        "description": "Leer un dispositivo Kaleo Connect y su disponibilidad de funciones.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "ID de tu iglesia. Cópialo desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "deviceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "ID del dispositivo desde `GET /devices`."
          }
        ],
        "responses": {
          "200": {
            "description": "Éxito",
            "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": "Las respuestas no se almacenan en caché.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clave API faltante o inválida, incluyendo expiración, revocación, iglesia incorrecta o creador que ya no es miembro.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "404": {
            "description": "El dispositivo no existe en esta iglesia.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "DEVICE_NOT_FOUND"
                }
              }
            }
          },
          "503": {
            "description": "Fallo temporal del servicio o autenticación. Reconciliar estado antes de reintentar una solicitud de control.",
            "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": "Obtener estado de transmisión",
        "tags": [
          "Streaming"
        ],
        "description": "Leer la sesión actual y la configuración compartida de la iglesia. Todos los campos están presentes, incluso en inactividad.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "ID de tu iglesia. Cópialo desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Éxito",
            "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": "Las respuestas no se almacenan en caché.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clave API faltante o inválida, incluyendo expiración, revocación, iglesia incorrecta o creador que ya no es miembro.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Fallo temporal del servicio o autenticación. Reconciliar estado antes de reintentar una solicitud de control.",
            "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": "Iniciar transmisión",
        "tags": [
          "Streaming"
        ],
        "description": "Inicia la transmisión en un dispositivo Kaleo Connect usando la configuración guardada. El cuerpo opcional puede seleccionar un `deviceId` y anular configuraciones para esta sesión. Sin `deviceId`, Kaleo elige la fuente de audio predeterminada configurada en la página [Kaleo Connect](https://app.withkaleo.com/to/integrations/connect) (en Integraciones) en tu panel de control si hay múltiples dispositivos con capacidad de audio disponibles, o la única fuente de audio disponible si solo hay una.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "ID de tu iglesia. Cópialo desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Éxito",
            "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": "Las respuestas no se almacenan en caché.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "JSON mal formado, campos no soportados o valores inválidos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Clave API faltante o inválida, incluyendo expiración, revocación, iglesia incorrecta o creador que ya no es miembro.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "403": {
            "description": "El plan, idioma o límites de uso impiden este inicio.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "PLAN_LIMIT"
                }
              }
            }
          },
          "409": {
            "description": "Conflicto de sesión activa, falta de fuente de audio o selección predeterminada, o dispositivo seleccionado no está listo. Lee el estado de transmisión y la disponibilidad del dispositivo; elige un predeterminado en la página [Kaleo Connect](https://app.withkaleo.com/to/integrations/connect) (en Integraciones) en tu panel de control o proporciona `deviceId` cuando sea necesario.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "ACTIVE_SESSION"
                }
              }
            }
          },
          "503": {
            "description": "Fallo temporal del servicio o autenticación. Reconciliar estado antes de reintentar una solicitud de control.",
            "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": "Usa la fuente de audio predeterminada",
                  "value": {}
                },
                "explicitDevice": {
                  "summary": "Elige un dispositivo para esta sesión",
                  "value": {
                    "deviceId": "00000000-0000-4000-8000-000000000002"
                  }
                }
              }
            }
          },
          "description": "Omitir el cuerpo o enviar `{}` para usar la fuente de audio predeterminada y la configuración guardada. Enviar `deviceId` para elegir otro dispositivo para esta sesión."
        },
        "x-kaleo-anchor": "Start streaming"
      }
    },
    "/v1/church/{churchId}/streaming/stop": {
      "post": {
        "operationId": "stopStreaming",
        "summary": "Detener transmisión",
        "tags": [
          "Streaming"
        ],
        "description": "Detiene la sesión de transmisión actual. No se necesita cuerpo en la solicitud.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "ID de tu iglesia. Cópialo desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Éxito",
            "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": "Las respuestas no se almacenan en caché.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clave API faltante o inválida, incluyendo expiración, revocación, iglesia incorrecta o creador que ya no es miembro.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Fallo temporal del servicio o autenticación. Reconciliar estado antes de reintentar una solicitud de control.",
            "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": "Cambiar voz de traducción",
        "tags": [
          "Streaming"
        ],
        "description": "Cambiar la voz de traducción mientras está inactivo o transmitiendo.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "ID de tu iglesia. Cópialo desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Éxito",
            "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": "Las respuestas no se almacenan en caché.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "JSON mal formado, campos no soportados o valores inválidos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Clave API faltante o inválida, incluyendo expiración, revocación, iglesia incorrecta o creador que ya no es miembro.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "409": {
            "description": "La transmisión cambió o el comando no pudo confirmarse. Lee el estado actual de transmisión antes de enviar otro comando.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "SESSION_CHANGED"
                }
              }
            }
          },
          "503": {
            "description": "Fallo temporal del servicio o autenticación. Reconciliar estado antes de reintentar una solicitud de control.",
            "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": "Cambiar visibilidad",
        "tags": [
          "Streaming"
        ],
        "description": "Mostrar u ocultar subtítulos mientras está inactivo o transmitiendo. Ocultar subtítulos no detiene la sesión.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "ID de tu iglesia. Cópialo desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Éxito",
            "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": "Las respuestas no se almacenan en caché.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "JSON mal formado, campos no soportados o valores inválidos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Clave API faltante o inválida, incluyendo expiración, revocación, iglesia incorrecta o creador que ya no es miembro.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Fallo temporal del servicio o autenticación. Reconciliar estado antes de reintentar una solicitud de control.",
            "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": "Borrar subtítulos",
        "tags": [
          "Streaming"
        ],
        "description": "Borra la fuente actual de subtítulos. No se necesita cuerpo en la solicitud.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "ID de tu iglesia. Cópialo desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Éxito",
            "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": "Las respuestas no se almacenan en caché.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clave API faltante o inválida, incluyendo expiración, revocación, iglesia incorrecta o creador que ya no es miembro.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Fallo temporal del servicio o autenticación. Reconciliar estado antes de reintentar una solicitud de control.",
            "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": "Cambiar fecha límite de auto-detención",
        "tags": [
          "Streaming"
        ],
        "description": "Establece la hora de auto-detención para una sesión activa. Devuelve el estado actualizado de transmisión.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "ID de tu iglesia. Cópialo desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Éxito",
            "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": "Las respuestas no se almacenan en caché.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "JSON mal formado, campos no soportados o valores inválidos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Clave API faltante o inválida, incluyendo expiración, revocación, iglesia incorrecta o creador que ya no es miembro.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "409": {
            "description": "`STREAM_OFFLINE` cuando está inactivo; `INVALID_DEADLINE` para una fecha límite fuera del rango permitido. Lee el estado actual de transmisión antes de enviar otro comando.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_DEADLINE"
                }
              }
            }
          },
          "503": {
            "description": "Fallo temporal del servicio o autenticación. Reconciliar estado antes de reintentar una solicitud de control.",
            "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": "Listar sesiones",
        "tags": [
          "Sessions"
        ],
        "description": "Lista sesiones, las más recientes primero, con análisis de espectadores.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "ID de tu iglesia. Cópialo desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            },
            "description": "Número de página, comenzando en 1. Valores superiores a la última página devuelven la última página."
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 14
            },
            "description": "Sesiones por página. Valores superiores a 100 usan 100."
          },
          {
            "name": "startedAfter",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Incluir sesiones iniciadas en o después de esta hora. Incluye Z o un desplazamiento de zona horaria."
          },
          {
            "name": "startedBefore",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Incluir sesiones iniciadas en o antes de esta hora. Incluye Z o un desplazamiento de zona horaria. Debe ser en o después de `startedAfter`."
          }
        ],
        "responses": {
          "200": {
            "description": "Éxito",
            "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": "Las respuestas de lectura no se almacenan en caché.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Paginación inválida de enteros positivos o rango de tiempo inválido/invertido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_HISTORY_RANGE"
                }
              }
            }
          },
          "401": {
            "description": "Clave API faltante o inválida, incluyendo expiración, revocación, iglesia incorrecta o creador que ya no es miembro de la iglesia.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Servicio de historial o autenticación no disponible. No es un resultado de historial vacío.",
            "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": "Obtener sesión",
        "tags": [
          "Sessions"
        ],
        "description": "Leer una sesión y su análisis de espectadores.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "ID de tu iglesia. Cópialo desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "ID de sesión desde `GET /sessions`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Éxito",
            "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": "Las respuestas de lectura no se almacenan en caché.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clave API faltante o inválida, incluyendo expiración, revocación, iglesia incorrecta o creador que ya no es miembro de la iglesia.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "404": {
            "description": "Sesión faltante, eliminada, ID inválido o de diferente propietario.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "SESSION_NOT_FOUND"
                }
              }
            }
          },
          "503": {
            "description": "Servicio de historial o autenticación no disponible.",
            "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": "Listar idiomas de orador",
        "tags": [
          "Languages"
        ],
        "description": "Lista idiomas de orador compatibles. Usa estos códigos en `speakerLanguage`.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "ID de tu iglesia. Cópialo desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Éxito",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Languages"
                },
                "example": {
                  "languages": [
                    {
                      "code": "en",
                      "name": "English",
                      "nativeName": "English",
                      "emoji": "🌎"
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Las respuestas no se almacenan en caché.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clave API faltante o inválida, incluyendo expiración, revocación, iglesia incorrecta o creador que ya no es miembro.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Servicio de autenticación temporalmente no disponible.",
            "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": "Listar idiomas objetivo",
        "tags": [
          "Languages"
        ],
        "description": "Lista idiomas de traducción compatibles. Usa estos códigos en `targetLanguages`.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "ID de tu iglesia. Cópialo desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Éxito",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Languages"
                },
                "example": {
                  "languages": [
                    {
                      "code": "en",
                      "name": "English",
                      "nativeName": "English",
                      "emoji": "🌎"
                    }
                  ]
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Las respuestas no se almacenan en caché.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clave API faltante o inválida, incluyendo expiración, revocación, iglesia incorrecta o creador que ya no es miembro.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "503": {
            "description": "Servicio de autenticación temporalmente no disponible.",
            "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": "Obtener idioma",
        "tags": [
          "Languages"
        ],
        "description": "Leer los nombres y emoji para un código de idioma compatible.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "ID de tu iglesia. Cópialo desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "code",
            "in": "path",
            "required": true,
            "description": "Código exacto de idioma, como `en` o `zh-Hans`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Éxito",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LanguageDetails"
                },
                "example": {
                  "language": {
                    "code": "fr",
                    "name": "French (General)",
                    "nativeName": "Français",
                    "emoji": "🇫🇷"
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Las respuestas no se almacenan en caché.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clave API faltante o inválida, incluyendo expiración, revocación, iglesia incorrecta o creador que ya no es miembro.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "404": {
            "description": "Código de idioma no soportado.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "LANGUAGE_NOT_FOUND"
                }
              }
            }
          },
          "503": {
            "description": "Servicio de autenticación temporalmente no disponible.",
            "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": "Ajustar tiempo de auto-detención",
        "tags": [
          "Streaming"
        ],
        "description": "Agregar o restar tiempo de auto-detención. Mientras está inactivo, cambia la duración para el próximo inicio manual. Mientras transmite, cambia la fecha límite actual. Cada solicitud aplica un ajuste separado.",
        "parameters": [
          {
            "name": "churchId",
            "in": "path",
            "required": true,
            "description": "ID de tu iglesia. Cópialo desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Éxito",
            "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": "Las respuestas no se almacenan en caché.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "JSON mal formado, campos no soportados o valores inválidos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_REQUEST"
                }
              }
            }
          },
          "401": {
            "description": "Clave API faltante o inválida, incluyendo expiración, revocación, iglesia incorrecta o creador que ya no es miembro.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "API_KEY_INVALID"
                }
              }
            }
          },
          "409": {
            "description": "`INVALID_DEADLINE` para una fecha límite en vivo fuera del rango permitido; `DEADLINE_NOT_SET` cuando la sesión no tiene fecha límite. `SETTINGS_CHANGED` o `SESSION_ACTIVE` cuando la configuración inactiva o la admisión cambian simultáneamente. Lee el estado actual de transmisión antes de enviar otro comando.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "success": false,
                  "error": "INVALID_DEADLINE"
                }
              }
            }
          },
          "503": {
            "description": "Fallo temporal del servicio o autenticación. Reconciliar estado antes de reintentar una solicitud de control.",
            "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": "Ingresa tu clave API exactamente como la copiaste desde la página [API](https://app.withkaleo.com/to/integrations/api) (en Integraciones) en tu panel de control. Bearer se añade automáticamente. Funciona para una iglesia mientras su creador siga siendo miembro."
      }
    },
    "schemas": {
      "Device": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "ID del dispositivo. Pasa este valor como `deviceId` en las solicitudes."
          },
          "name": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "offline",
              "online",
              "maintenance"
            ],
            "description": "Estado de conexión. Desconectado tras 90 segundos sin contacto; mantenimiento significa temporalmente no disponible."
          },
          "capabilities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DeviceCapability"
            },
            "description": "Disponibilidad de cada función en este dispositivo."
          },
          "lastSeenAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Último contacto con Kaleo; `null` si es desconocido."
          }
        },
        "required": [
          "id",
          "name",
          "status",
          "capabilities",
          "lastSeenAt"
        ],
        "additionalProperties": false
      },
      "DeviceCapability": {
        "type": "object",
        "properties": {
          "capability": {
            "type": "string",
            "enum": [
              "audio-source",
              "audio-output",
              "propresenter"
            ],
            "description": "Función local: captura de audio, reproducción de voz traducida o entrada de diapositivas ProPresenter."
          },
          "status": {
            "type": "string",
            "enum": [
              "ready",
              "unavailable",
              "offline"
            ],
            "description": "Si esta función está lista para usarse."
          }
        },
        "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": "Usar el dispositivo ProPresenter predeterminado de la iglesia."
              }
            },
            "required": [
              "mode"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "none"
                ],
                "description": "No usar ProPresenter para esta sesión."
              }
            },
            "required": [
              "mode"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "device"
                ],
                "description": "Usar el dispositivo especificado por `deviceId`."
              },
              "deviceId": {
                "type": "string",
                "description": "ID del dispositivo fuente ProPresenter, desde `GET /devices`. Puede diferir de la fuente de audio."
              }
            },
            "required": [
              "mode",
              "deviceId"
            ],
            "additionalProperties": false
          }
        ],
        "description": "Elige la fuente ProPresenter para esta sesión. Configura su conexión en Connect."
      },
      "StartStreaming": {
        "type": "object",
        "properties": {
          "deviceId": {
            "type": "string",
            "description": "ID opcional del dispositivo fuente de audio desde `GET /devices`. Anula el predeterminado de la iglesia para esta sesión. Si se omite, usa la fuente de audio predeterminada guardada o el único dispositivo emparejado con capacidad de audio; múltiples dispositivos sin predeterminado requieren selección. El dispositivo seleccionado debe estar listo."
          },
          "overrides": {
            "type": "object",
            "properties": {
              "speakerLanguage": {
                "type": "string",
                "description": "Código desde `GET /languages/speaker`. Usa `\"mul\"` para modo multilingüe."
              },
              "targetLanguages": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 1,
                "description": "Códigos desde `GET /languages/target`. Usa `[\"ALL\"]` para todos los objetivos compatibles, dentro del límite de tu plan."
              },
              "duration": {
                "type": "integer",
                "minimum": 60,
                "maximum": 21600,
                "description": "Tiempo hasta la detención automática, en segundos."
              },
              "proPresenter": {
                "$ref": "#/components/schemas/ProPresenterSelection"
              }
            },
            "required": [],
            "additionalProperties": false,
            "description": "Configuraciones solo para esta sesión. Los campos omitidos usan valores predeterminados guardados."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "ChangeVoice": {
        "type": "object",
        "properties": {
          "voice": {
            "type": "string",
            "enum": [
              "male",
              "female"
            ],
            "description": "Voz de traducción. Puede cambiarse mientras está inactivo o transmitiendo."
          }
        },
        "required": [
          "voice"
        ],
        "additionalProperties": false
      },
      "ChangeVisibility": {
        "type": "object",
        "properties": {
          "visible": {
            "type": "boolean",
            "description": "`true` muestra subtítulos; `false` los oculta mientras la transmisión continúa."
          }
        },
        "required": [
          "visible"
        ],
        "additionalProperties": false
      },
      "ChangeDeadline": {
        "type": "object",
        "properties": {
          "deadlineAt": {
            "type": "string",
            "format": "date-time",
            "description": "Hora futura de auto-detención con Z o desplazamiento de zona horaria. No más tarde de seis horas después de `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`: conteos provisionales; `pending`: esperando conteos finales; `finalized`: conteos guardados."
          },
          "viewers": {
            "type": "integer",
            "minimum": 0,
            "nullable": true,
            "description": "Identidades únicas de espectadores para la sesión, no espectadores actuales. `null` si no está disponible; 0 significa sin espectadores."
          },
          "viewerLanguages": {
            "type": "object",
            "nullable": true,
            "additionalProperties": {
              "type": "integer",
              "minimum": 0
            },
            "description": "Análisis de espectadores por código de idioma. Un espectador puede aparecer en varios idiomas. `null` si no está disponible."
          }
        },
        "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": "Hora de finalización de la sesión; `null` si no finalizó o no está disponible."
          },
          "duration": {
            "type": "integer",
            "nullable": true,
            "description": "Duración registrada de la sesión en segundos; `null` si no finalizó o no está disponible."
          },
          "speakerLanguage": {
            "type": "string",
            "nullable": true,
            "description": "Código de idioma del orador; `null` si no se registró."
          },
          "targetLanguages": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Códigos de idiomas de traducción registrados, o `[\"ALL\"]`."
          },
          "transcriptAvailable": {
            "type": "boolean",
            "description": "`true` cuando la transcripción guardada está lista. No otorga acceso público ni URL de descarga."
          },
          "publicSharingEnabled": {
            "type": "boolean",
            "description": "`true` cuando el uso compartido público está habilitado para la sesión completada."
          },
          "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": "Total de sesiones que coinciden con los filtros, en todas las páginas."
          },
          "page": {
            "type": "integer",
            "minimum": 1,
            "description": "Página devuelta; puede ser menor que la solicitada."
          },
          "pageSize": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "description": "Máximo de sesiones por página, limitado a 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": "Usa este código exacto en campos de idioma."
          },
          "name": {
            "type": "string",
            "description": "Nombre para mostrar en inglés."
          },
          "nativeName": {
            "type": "string",
            "description": "Nombre en su propio idioma; inglés si no está disponible."
          },
          "emoji": {
            "type": "string",
            "description": "Emoji para mostrar para este idioma."
          }
        },
        "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` durante una sesión activa, incluyendo inicio, reconexiones y cierre. No confirma que el audio esté llegando."
          },
          "sessionId": {
            "type": "string",
            "nullable": true,
            "description": "ID de sesión actual; `null` mientras está inactivo."
          },
          "startedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Hora de inicio de la sesión actual; `null` mientras está inactivo."
          },
          "deadlineAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Hora de detención automática; `null` mientras está inactivo o si no hay fecha límite registrada."
          },
          "speakerLanguage": {
            "type": "string",
            "nullable": true,
            "description": "Código de idioma del orador actual; `null` mientras está inactivo."
          },
          "targetLanguages": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Códigos de idiomas de traducción actuales; vacío mientras está inactivo."
          },
          "voice": {
            "type": "string",
            "enum": [
              "male",
              "female",
              null
            ],
            "nullable": false,
            "description": "Voz de traducción, incluso mientras está inactivo."
          },
          "visible": {
            "type": "boolean",
            "description": "`true` muestra subtítulos; `false` los oculta. También aplica mientras está inactivo."
          },
          "publisher": {
            "type": "object",
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "browser",
                  "connect"
                ]
              },
              "id": {
                "type": "string",
                "description": "ID del dispositivo cuando `kind` es `connect`; ID del publicador del navegador cuando `kind` es `browser`."
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "kind",
              "id",
              "name"
            ],
            "additionalProperties": false,
            "nullable": true,
            "description": "Dispositivo Kaleo Connect o navegador que envía audio; `null` mientras está inactivo."
          },
          "phase": {
            "type": "string",
            "enum": [
              "idle",
              "starting",
              "streaming",
              "reconnecting",
              "ending"
            ],
            "description": "Etapa de la sesión; inactivo significa que no hay sesión activa."
          },
          "streamSettings": {
            "type": "object",
            "description": "Valores predeterminados de la iglesia para el próximo inicio manual. Las anulaciones de sesión activa no cambian estos valores.",
            "required": [
              "revision",
              "settings"
            ],
            "properties": {
              "revision": {
                "type": "integer",
                "minimum": 0,
                "description": "Aumenta cuando estos valores predeterminados cambian."
              },
              "settings": {
                "type": "object",
                "required": [
                  "speakerLanguage",
                  "targetLanguages",
                  "duration"
                ],
                "properties": {
                  "speakerLanguage": {
                    "type": "string",
                    "description": "Código de idioma predeterminado del orador."
                  },
                  "targetLanguages": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Códigos de idiomas de traducción predeterminados; `[\"ALL\"]` selecciona todos los objetivos compatibles."
                  },
                  "duration": {
                    "type": "integer",
                    "minimum": 60,
                    "maximum": 21600,
                    "description": "Tiempo hasta la detención automática, en segundos."
                  }
                }
              }
            }
          }
        },
        "required": [
          "streaming",
          "phase",
          "sessionId",
          "startedAt",
          "deadlineAt",
          "speakerLanguage",
          "targetLanguages",
          "voice",
          "visible",
          "publisher",
          "streamSettings"
        ],
        "additionalProperties": false,
        "description": "Sesión actual y configuraciones compartidas de la iglesia. Todos los campos están presentes, incluso mientras está inactivo."
      },
      "AdjustDeadline": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "deltaSeconds"
        ],
        "properties": {
          "deltaSeconds": {
            "type": "integer",
            "minimum": -21600,
            "maximum": 21600,
            "description": "Segundos para agregar a la duración inactiva o fecha límite actual; valores negativos restan. No puede ser 0. Duración inactiva: 60–21600 segundos. Fecha límite en vivo: futura, dentro de seis horas de `startedAt`.",
            "not": {
              "enum": [
                0
              ]
            }
          }
        }
      }
    }
  }
}
